Don't purge model with active transcriptions.
This commit is contained in:
42
subgen.py
42
subgen.py
@@ -1,4 +1,4 @@
|
|||||||
subgen_version = '2025.01.03'
|
subgen_version = '2025.02.01'
|
||||||
|
|
||||||
from language_code import LanguageCode
|
from language_code import LanguageCode
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
@@ -156,23 +156,35 @@ class DeduplicatedQueue(queue.Queue):
|
|||||||
if self.unfinished_tasks == 0:
|
if self.unfinished_tasks == 0:
|
||||||
self._processing.clear() # Reset when all tasks are done
|
self._processing.clear() # Reset when all tasks are done
|
||||||
|
|
||||||
|
def is_processing(self):
|
||||||
|
"""Return True if any tasks are being processed."""
|
||||||
|
with self._lock:
|
||||||
|
return len(self._processing) > 0
|
||||||
|
|
||||||
|
def is_idle(self):
|
||||||
|
"""Return True if queue is empty AND no tasks are processing."""
|
||||||
|
return self.empty() and not self.is_processing()
|
||||||
|
|
||||||
#start queue
|
#start queue
|
||||||
task_queue = DeduplicatedQueue()
|
task_queue = DeduplicatedQueue()
|
||||||
|
|
||||||
def transcription_worker():
|
def transcription_worker():
|
||||||
while True:
|
while True:
|
||||||
task = task_queue.get()
|
task = task_queue.get()
|
||||||
|
try:
|
||||||
if "type" in task and task["type"] == "detect_language":
|
if "type" in task and task["type"] == "detect_language":
|
||||||
detect_language_task(task['path'])
|
detect_language_task(task['path'])
|
||||||
elif 'Bazarr-' in task['path']:
|
elif 'Bazarr-' in task['path']:
|
||||||
logging.info(f"Task {task['path']} is being handled by ASR.")
|
logging.info(f"Task {task['path']} is being handled by ASR.")
|
||||||
else:
|
else:
|
||||||
logging.info(f"Task {task['path']} is being handled by Subgen.")
|
logging.info(f"Task {task['path']} is being handled by Subgen.")
|
||||||
gen_subtitles(task['path'], task['transcribe_or_translate'], task['force_language'])
|
gen_subtitles(task['path'], task['transcribe_or_translate'], task['force_language'])
|
||||||
task_queue.task_done()
|
task_queue.task_done()
|
||||||
# show queue
|
# show queue
|
||||||
logging.debug(f"There are {task_queue.qsize()} tasks left in the queue.")
|
logging.debug(f"There are {task_queue.qsize()} tasks left in the queue.")
|
||||||
|
finally:
|
||||||
|
#task_queue.task_done()
|
||||||
|
delete_model() # ✅ Check if safe to purge AFTER finishing work
|
||||||
|
|
||||||
for _ in range(concurrent_transcriptions):
|
for _ in range(concurrent_transcriptions):
|
||||||
threading.Thread(target=transcription_worker, daemon=True).start()
|
threading.Thread(target=transcription_worker, daemon=True).start()
|
||||||
@@ -671,9 +683,9 @@ def start_model():
|
|||||||
model = stable_whisper.load_faster_whisper(whisper_model, download_root=model_location, device=transcribe_device, cpu_threads=whisper_threads, num_workers=concurrent_transcriptions, compute_type=compute_type)
|
model = stable_whisper.load_faster_whisper(whisper_model, download_root=model_location, device=transcribe_device, cpu_threads=whisper_threads, num_workers=concurrent_transcriptions, compute_type=compute_type)
|
||||||
|
|
||||||
def delete_model():
|
def delete_model():
|
||||||
if clear_vram_on_complete and task_queue.qsize() == 0:
|
global model
|
||||||
global model
|
if clear_vram_on_complete and task_queue.is_idle():
|
||||||
logging.debug("Queue is empty, clearing/releasing VRAM")
|
logging.debug("Queue idle; clearing model from memory.")
|
||||||
model = None
|
model = None
|
||||||
gc.collect()
|
gc.collect()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user