Воркеры грузят модели при первой задаче

Прогрет был только нулевой воркер, остальные получали пустой конвейер и
роняли задачу с "модели не загружены". В комментарии было написано, что
они греются сами, но кода для этого не было.

Заодно отключены ANSI-цвета uvicorn на Windows: консоль их не разбирает
и печатала управляющие последовательности как мусор.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Vladimir Bryzgalov
2026-08-15 22:51:54 +05:00
co-authored by Claude Opus 5
parent be837bab0b
commit c1ba61fcd5
4 changed files with 51 additions and 4 deletions
+40
View File
@@ -95,3 +95,43 @@ class TestWorkerSettings:
config = tmp_path / "config.toml"
config.write_text('[processing]\nworkers=3\n', encoding="utf-8")
assert load_settings(config).effective_workers() == 3
class TestLazyWarmup:
"""Воркеры создаются заранее, а модели грузят при первой своей задаче."""
def test_transcribe_warms_up_when_needed(self, tmp_path, monkeypatch):
import sys
import types
for name in ("sherpa_onnx", "onnx_asr", "onnxruntime"):
monkeypatch.setitem(sys.modules, name, types.ModuleType(name))
from app.pipeline import Pipeline
p = Pipeline(models_dir=tmp_path, threads=1,
replacements_path=tmp_path / "r.txt", base_dir=tmp_path)
called = {"warmup": 0}
monkeypatch.setattr(p, "warmup", lambda: called.__setitem__("warmup", 1))
# transcribe упадёт дальше на чтении файла, но warmup обязан быть вызван
with pytest.raises(Exception):
p.transcribe(tmp_path / "нет.wav")
assert called["warmup"] == 1
def test_no_runtime_error_about_warmup(self, tmp_path, monkeypatch):
"""Прежде здесь падало «модели не загружены, вызовите warmup()»."""
import sys
import types
for name in ("sherpa_onnx", "onnx_asr", "onnxruntime"):
monkeypatch.setitem(sys.modules, name, types.ModuleType(name))
from app.pipeline import Pipeline
p = Pipeline(models_dir=tmp_path, threads=1,
replacements_path=tmp_path / "r.txt", base_dir=tmp_path)
monkeypatch.setattr(p, "warmup", lambda: None)
try:
p.transcribe(tmp_path / "нет.wav")
except RuntimeError as exc:
assert "warmup" not in str(exc)
except Exception:
pass