Spaces:
Running on Zero
Running on Zero
Count the GPU call from outside, where the result survives
Browse files
app.py
CHANGED
|
@@ -160,20 +160,33 @@ def _konto_sichern():
|
|
| 160 |
traceback.print_exc()
|
| 161 |
|
| 162 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 163 |
def bucht_gpu(fn):
|
| 164 |
-
"""Zählt die Zeit
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 165 |
|
| 166 |
-
|
| 167 |
-
|
| 168 |
-
|
| 169 |
"""
|
| 170 |
def huelle(*a, **kw):
|
| 171 |
t0 = time.time()
|
| 172 |
try:
|
| 173 |
return fn(*a, **kw)
|
| 174 |
finally:
|
| 175 |
-
|
| 176 |
-
|
|
|
|
| 177 |
_konto["schmutzig"] = True
|
| 178 |
huelle.__name__ = fn.__name__
|
| 179 |
return huelle
|
|
@@ -187,8 +200,8 @@ def _diar_dauer(audio_path, num_speakers):
|
|
| 187 |
return int(min(120, max(30, 20 + laenge / 40)))
|
| 188 |
|
| 189 |
|
| 190 |
-
@spaces.GPU(duration=_diar_dauer)
|
| 191 |
@bucht_gpu
|
|
|
|
| 192 |
def _diarize_gpu(audio_path, num_speakers):
|
| 193 |
kwargs = {}
|
| 194 |
if num_speakers and int(num_speakers) > 0:
|
|
@@ -228,8 +241,8 @@ def _diarize_gpu(audio_path, num_speakers):
|
|
| 228 |
return turns, stats, overlaps, abdruecke
|
| 229 |
|
| 230 |
|
| 231 |
-
@spaces.GPU(duration=30)
|
| 232 |
@bucht_gpu
|
|
|
|
| 233 |
def _sprache_gpu(audio_path, ab):
|
| 234 |
"""Erkennt die Sprache einmalig anhand von 30 s ab der ersten Sprechstelle."""
|
| 235 |
wellenform, sr = loader.crop(audio_path, Segment(ab, ab + 30.0), mode="pad")
|
|
@@ -327,8 +340,8 @@ def _asr_dauer(audio_path, start, ende, sprache=None, kontext=""):
|
|
| 327 |
return int(min(200, max(60, 40 + (ende - start) / 2)))
|
| 328 |
|
| 329 |
|
| 330 |
-
@spaces.GPU(duration=_asr_dauer)
|
| 331 |
@bucht_gpu
|
|
|
|
| 332 |
def _transkribiere_gpu(audio_path, start, ende, sprache=None, kontext=""):
|
| 333 |
"""Transkribiert ein Fenster am Stück — voller Kontext, beste Qualität.
|
| 334 |
|
|
@@ -456,8 +469,8 @@ def _fa_dauer(audio_path, worte, start, block_ende, rate, gesamt):
|
|
| 456 |
return int(min(200, max(30, 20 + (block_ende - start) / 10)))
|
| 457 |
|
| 458 |
|
| 459 |
-
@spaces.GPU(duration=_fa_dauer)
|
| 460 |
@bucht_gpu
|
|
|
|
| 461 |
def _align_gpu(audio_path, worte, start, block_ende, rate, gesamt):
|
| 462 |
"""Passt Wörter fortlaufend in einen Audioblock ein.
|
| 463 |
|
|
|
|
| 160 |
traceback.print_exc()
|
| 161 |
|
| 162 |
|
| 163 |
+
# Obergrenze je Aufruf. Die Wartezeit in der Schlange kostet kein
|
| 164 |
+
# Kontingent, ist von aussen aber nicht von der Rechenzeit zu trennen —
|
| 165 |
+
# und weiter als bis zur Reservierung kann ein Aufruf nie laufen, weil er
|
| 166 |
+
# dort abgebrochen wird. Also deckeln statt masslos überschätzen.
|
| 167 |
+
GPU_DECKEL_S = 200.0
|
| 168 |
+
|
| 169 |
+
|
| 170 |
def bucht_gpu(fn):
|
| 171 |
+
"""Zählt die Zeit über einem GPU-Aufruf.
|
| 172 |
+
|
| 173 |
+
Muss OBERHALB von @spaces.GPU stehen. Darunter liefe die Zählung im
|
| 174 |
+
Kindprozess, den der Dekorator intern aufspannt — die Buchung wäre mit
|
| 175 |
+
dessen Ende verloren. Genau so war es zuerst gebaut, und das Konto
|
| 176 |
+
blieb nach einem echten Lauf auf null stehen.
|
| 177 |
|
| 178 |
+
Gezählt wird damit Wartezeit mit. Deshalb der Deckel, deshalb die
|
| 179 |
+
Kennzeichnung als Schätzung, und deshalb schlägt eine echte
|
| 180 |
+
Kontingent-Meldung diese Rechnung jederzeit.
|
| 181 |
"""
|
| 182 |
def huelle(*a, **kw):
|
| 183 |
t0 = time.time()
|
| 184 |
try:
|
| 185 |
return fn(*a, **kw)
|
| 186 |
finally:
|
| 187 |
+
gebraucht = min(time.time() - t0, GPU_DECKEL_S)
|
| 188 |
+
_konto["daten"] = kontingent_buchen(_konto_laden(), gebraucht,
|
| 189 |
+
time.time())
|
| 190 |
_konto["schmutzig"] = True
|
| 191 |
huelle.__name__ = fn.__name__
|
| 192 |
return huelle
|
|
|
|
| 200 |
return int(min(120, max(30, 20 + laenge / 40)))
|
| 201 |
|
| 202 |
|
|
|
|
| 203 |
@bucht_gpu
|
| 204 |
+
@spaces.GPU(duration=_diar_dauer)
|
| 205 |
def _diarize_gpu(audio_path, num_speakers):
|
| 206 |
kwargs = {}
|
| 207 |
if num_speakers and int(num_speakers) > 0:
|
|
|
|
| 241 |
return turns, stats, overlaps, abdruecke
|
| 242 |
|
| 243 |
|
|
|
|
| 244 |
@bucht_gpu
|
| 245 |
+
@spaces.GPU(duration=30)
|
| 246 |
def _sprache_gpu(audio_path, ab):
|
| 247 |
"""Erkennt die Sprache einmalig anhand von 30 s ab der ersten Sprechstelle."""
|
| 248 |
wellenform, sr = loader.crop(audio_path, Segment(ab, ab + 30.0), mode="pad")
|
|
|
|
| 340 |
return int(min(200, max(60, 40 + (ende - start) / 2)))
|
| 341 |
|
| 342 |
|
|
|
|
| 343 |
@bucht_gpu
|
| 344 |
+
@spaces.GPU(duration=_asr_dauer)
|
| 345 |
def _transkribiere_gpu(audio_path, start, ende, sprache=None, kontext=""):
|
| 346 |
"""Transkribiert ein Fenster am Stück — voller Kontext, beste Qualität.
|
| 347 |
|
|
|
|
| 469 |
return int(min(200, max(30, 20 + (block_ende - start) / 10)))
|
| 470 |
|
| 471 |
|
|
|
|
| 472 |
@bucht_gpu
|
| 473 |
+
@spaces.GPU(duration=_fa_dauer)
|
| 474 |
def _align_gpu(audio_path, worte, start, block_ende, rate, gesamt):
|
| 475 |
"""Passt Wörter fortlaufend in einen Audioblock ein.
|
| 476 |
|