Monstermango commited on
Commit
2e783b7
·
verified ·
1 Parent(s): ed2f32b

Count the GPU call from outside, where the result survives

Browse files
Files changed (1) hide show
  1. app.py +23 -10
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 *innerhalb* der GPU-Funktion.
 
 
 
 
 
165
 
166
- Muss unterhalb von @spaces.GPU stehen: der Rumpf läuft erst, wenn die
167
- Karte zugeteilt ist. Die Wartezeit davor kostet kein Kontingent und
168
- darf deshalb nicht mitgezählt werden.
169
  """
170
  def huelle(*a, **kw):
171
  t0 = time.time()
172
  try:
173
  return fn(*a, **kw)
174
  finally:
175
- _konto["daten"] = kontingent_buchen(_konto_laden(),
176
- time.time() - t0, time.time())
 
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