55 lines
2.9 KiB
Python
55 lines
2.9 KiB
Python
"""Идемпотентная предзагрузка модели faster-whisper.
|
||
|
||
Без предзагрузки первая транскрибация после старта воркера сама тянет веса
|
||
модели из HuggingFace Hub в рантайме (минуты простоя пайплайна на первом
|
||
сеансе) — раньше предзагрузки не было вовсе.
|
||
|
||
Использует ТУ ЖЕ функцию, что и сам faster-whisper при ленивой загрузке
|
||
модели (`faster_whisper.utils.download_model`, см.
|
||
`backend/core/plugins/faster_whisper.py::_get_model` — `WhisperModel(...,
|
||
download_root=...)` внутри вызывает её с `cache_dir=download_root`), поэтому
|
||
создаёт кэш `huggingface_hub`, полностью совместимый с тем, что ожидает
|
||
плагин в `WHISPER_CACHE_DIR` (`config/plugins.yaml`,
|
||
`transcriber.options.download_root`) — повторный запуск (в т.ч. сам запуск
|
||
воркера) ничего не перекачивает: `snapshot_download` идемпотентен по факту
|
||
наличия файлов в кэше.
|
||
|
||
Запускается init-контейнером `whisper-model-init` (сборка backend-образа,
|
||
профили compose `transcribe`/`transcribe-gpu`, см. `deploy/docker-compose.yml`)
|
||
— faster-whisper уже есть в зависимостях backend/worker (`pyproject.toml`).
|
||
|
||
Путь кэша — КОНТРАКТ с `backend/services/ai_tiers.py` (см. докстринг модуля):
|
||
детект доступности уровня AI (`services/ai_levels.py`) и сам плагин
|
||
транскрибера (`transcriber.options.download_root` в `config/plugins.yaml`)
|
||
ожидают модель именно по пути `{WHISPER_MODELS_ROOT}/{модель}` (например,
|
||
`/models/whisper/small`) — НЕ по плоскому корню тома. `WHISPER_MODELS_ROOT`
|
||
здесь должен буквально совпадать со значением одноимённой константы в
|
||
`ai_tiers.py`.
|
||
"""
|
||
|
||
import os
|
||
import sys
|
||
|
||
WHISPER_MODEL = os.environ.get("WHISPER_MODEL", "small")
|
||
WHISPER_MODELS_ROOT = os.environ.get("WHISPER_MODELS_ROOT", "/models/whisper")
|
||
|
||
|
||
def main() -> None:
|
||
from faster_whisper.utils import download_model
|
||
|
||
cache_dir = f"{WHISPER_MODELS_ROOT}/{WHISPER_MODEL}"
|
||
print(
|
||
f"[download-whisper-model] модель '{WHISPER_MODEL}' -> {cache_dir}",
|
||
flush=True,
|
||
)
|
||
path = download_model(WHISPER_MODEL, cache_dir=cache_dir)
|
||
print(f"[download-whisper-model] готово: {path}", flush=True)
|
||
|
||
|
||
if __name__ == "__main__":
|
||
try:
|
||
main()
|
||
except Exception as exc: # noqa: BLE001
|
||
print(f"[download-whisper-model] ошибка: {exc}", file=sys.stderr)
|
||
sys.exit(1)
|