Monstermango commited on
Commit
ed2f32b
·
verified ·
1 Parent(s): 907c8f2

Keep our own books on the GPU budget

Browse files
Files changed (1) hide show
  1. kern.py +62 -0
kern.py CHANGED
@@ -58,6 +58,68 @@ def _decode_optionen(sprache=None):
58
  return gk
59
 
60
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
61
  def tempo(woerter, verarbeitung_s, audio_s):
62
  """Wie schnell die Kette gearbeitet hat.
63
 
 
58
  return gk
59
 
60
 
61
+ # ------------------------------------------------------------ GPU-Konto
62
+ # Es gibt keine Schnittstelle, die das Restkontingent verrät — der Wunsch
63
+ # ist bei Hugging Face offen. Also selbst Buch führen: gezählt wird die
64
+ # Zeit *innerhalb* der GPU-Funktionen, denn erst dort ist die Karte
65
+ # zugeteilt; Wartezeit in der Schlange kostet nichts. Und wenn doch einmal
66
+ # eine Kontingent-Meldung kommt, steht die echte Restzeit darin und
67
+ # korrigiert die eigene Rechnung.
68
+ KONTINGENT_S = 2400.0 # PRO-Tagesbudget laut Dokumentation (40 min)
69
+ KONTINGENT_FENSTER = 24 * 3600
70
+
71
+
72
+ def kontingent_buchen(konto, sekunden, jetzt):
73
+ """Schreibt verbrauchte GPU-Zeit fort und öffnet nötigenfalls ein Fenster.
74
+
75
+ Das Fenster läuft 24 Stunden ab der ersten Nutzung, nicht ab
76
+ Mitternacht — wer um 14 Uhr anfängt, hat am nächsten Tag um 14 Uhr
77
+ wieder das volle Budget.
78
+ """
79
+ konto = dict(konto or {})
80
+ beginn = konto.get("beginn")
81
+ if not beginn or jetzt - beginn >= KONTINGENT_FENSTER:
82
+ konto = {"beginn": jetzt, "verbraucht": 0.0}
83
+ konto["verbraucht"] = round(konto.get("verbraucht", 0.0)
84
+ + max(0.0, sekunden), 1)
85
+ return konto
86
+
87
+
88
+ def kontingent_korrigieren(konto, rest_s, jetzt, budget=KONTINGENT_S):
89
+ """Übernimmt die Restzeit aus einer Kontingent-Meldung.
90
+
91
+ Die ist im Gegensatz zur eigenen Zählung amtlich: sie kennt auch, was
92
+ andere Spaces verbraucht haben.
93
+ """
94
+ konto = dict(konto or {})
95
+ if not konto.get("beginn"):
96
+ konto["beginn"] = jetzt
97
+ konto["verbraucht"] = round(max(0.0, budget - max(0.0, rest_s)), 1)
98
+ konto["amtlich"] = jetzt
99
+ return konto
100
+
101
+
102
+ def kontingent_stand(konto, jetzt, budget=KONTINGENT_S):
103
+ """Was von heute noch übrig ist — als Anteil und in Sekunden."""
104
+ if not budget or budget <= 0:
105
+ return None
106
+ beginn = (konto or {}).get("beginn")
107
+ verbraucht = (konto or {}).get("verbraucht", 0.0)
108
+ if not beginn or jetzt - beginn >= KONTINGENT_FENSTER:
109
+ beginn, verbraucht = None, 0.0
110
+ rest = max(0.0, budget - verbraucht)
111
+ return {
112
+ "verbraucht_s": round(verbraucht, 1),
113
+ "rest_s": round(rest, 1),
114
+ "budget_s": budget,
115
+ "prozent": round(100.0 * rest / budget, 1),
116
+ # Wann sich das Fenster wieder füllt; ohne Nutzung ist es voll.
117
+ "zuruecksetzung_in_s": (round(beginn + KONTINGENT_FENSTER - jetzt)
118
+ if beginn else None),
119
+ "geschaetzt": not (konto or {}).get("amtlich"),
120
+ }
121
+
122
+
123
  def tempo(woerter, verarbeitung_s, audio_s):
124
  """Wie schnell die Kette gearbeitet hat.
125