Spaces:
Running on Zero
Running on Zero
Keep our own books on the GPU budget
Browse files
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 |
|