Эндпоинт подбора числа потоков

Масштабирование ONNX зависит от процессора: замеры на Apple M4 не
переносятся на Ryzen, а подбирать конфигурацию перезапусками мучительно.
Теперь /v1/benchmark гоняет минуту записи на 1, 2, 4, 8 и 16 потоках
и говорит, что поставить в config.toml.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Vladimir Bryzgalov
2026-08-15 23:01:55 +05:00
co-authored by Claude Opus 5
parent c1ba61fcd5
commit 42a98bd703
4 changed files with 112 additions and 1 deletions
+25
View File
@@ -229,6 +229,31 @@ async def create_job(
"queue_position": store.queue_position(job_id)}
@app.post("/v1/benchmark", dependencies=[Depends(guard)], summary="Подобрать число потоков",
description="Прогоняет минуту из присланной записи на разном числе потоков "
"и показывает, где быстрее. Занимает пару минут и на это время "
"нагружает процессор.")
async def benchmark(file: UploadFile = File(...)) -> dict:
from app.bench import run_benchmark
from app.pipeline import read_wav
if not _state["ready"]:
raise HTTPException(status_code=503, detail=_state["error"] or "сервис ещё не готов")
with tempfile.TemporaryDirectory() as tmp:
src = Path(tmp) / (file.filename or "audio")
with src.open("wb") as out:
while chunk := await file.read(1 << 20):
out.write(chunk)
wav = Path(tmp) / "audio.wav"
to_wav16k(src, wav, pipeline.ffmpeg)
samples = read_wav(wav)
return run_benchmark(samples, models_dir=settings.models_dir,
base_dir=settings.base_dir,
replacements_path=settings.replacements_path)
@app.get("/v1/jobs/{job_id}", dependencies=[Depends(guard)], summary="Забрать результат",
description="Пока задача не готова, возвращает статус и место в очереди. "
"Готовый результат содержит реплики с говорящими и тайм-кодами, "