Whisper в Docker: локальная обработка на CPU и NVIDIA GPU

См. также — глоссарий

Используйте Docker на машине, где вам уже доступен Docker daemon. Арендованный GPU-инстанс сам может быть контейнером без такого доступа. В этом случае подходит обычная установка Python; привилегированный Docker-in-Docker для примера не нужен.

CPU-образ и подготовка модели

Распакуйте архив, перейдите в whisper-transcription/ и положите короткий файл в input/. Команды выполняйте от пользователя, которому принадлежат три подключаемых каталога. Оба образа рассчитаны на Linux x86-64.

mkdir -p input output models
docker build -f Dockerfile.cpu -t whisper-example:cpu .
docker run --rm --user "$(id -u):$(id -g)" \
  --mount "type=bind,src=$PWD/models,dst=/models" \
  whisper-example:cpu --cache /models --model small --download-only
docker run --rm --network none --read-only --cap-drop ALL \
  --security-opt no-new-privileges --tmpfs /tmp:rw,nosuid,nodev,size=1g \
  --user "$(id -u):$(id -g)" \
  --mount "type=bind,src=$PWD/input,dst=/input,readonly" \
  --mount "type=bind,src=$PWD/output,dst=/output" \
  --mount "type=bind,src=$PWD/models,dst=/models" \
  whisper-example:cpu --input /input --output /output --cache /models \
  --model small --device cpu --language auto --offline

Первому запуску нужен доступ к сети для загрузки весов. Распознавание использует --network none и --offline: отсутствие модели в кеше приведёт к ошибке. Исходники подключены только для чтения, результаты сохраняются после удаления контейнера, HTTP-порты не публикуются. UID/GID берутся у пользователя хоста; если запускать команды от root, получится UID 0, поэтому по возможности используйте обычную учётную запись.

NVIDIA GPU

На хосте нужны совместимый драйвер NVIDIA и настроенный NVIDIA Container Toolkit. Библиотеки CUDA внутри образа не устанавливают драйвер хоста. Сначала проверьте пример NVIDIA.

GPU-образ использует CUDA 12.3.2/cuDNN 9 и CTranslate2 4.6.0. Это конкретное сочетание зависимостей, а не гарантия работы на любом поколении NVIDIA; при выборе машины сверяйтесь с требованиями CTranslate2. Команда ниже использует small, загруженную на шаге подготовки CPU:

mkdir -p output-gpu
docker build -f Dockerfile.gpu -t whisper-example:gpu .
docker run --rm --gpus all --network none --read-only --cap-drop ALL \
  --security-opt no-new-privileges --tmpfs /tmp:rw,nosuid,nodev,size=1g \
  --user "$(id -u):$(id -g)" \
  --mount "type=bind,src=$PWD/input,dst=/input,readonly" \
  --mount "type=bind,src=$PWD/output-gpu,dst=/output" \
  --mount "type=bind,src=$PWD/models,dst=/models" \
  whisper-example:gpu --input /input --output /output --cache /models \
  --model small --device cuda --compute-type float16 --language auto --offline

Что происходит при завершении

В примере нет веб-сервера, reverse proxy, очереди, сервиса автоперезапуска и подключения Docker socket. Команда завершается после обработки файлов либо при первой ошибке. Сохраняйте терминальную сессию во время работы: пакет не запускается как фоновый сервис. Удаление контейнера не удаляет каталоги исходников, кеша и результатов на хосте.

Теги базовых образов и системные пакеты могут изменяться. Версии основных Python-зависимостей и коммиты моделей закреплены, но фиксированный digest полностью воспроизводимого образа не обещается. Сохраните ID собранного образа вместе с замерами. См. восстановление пакета и Docker на VPS.

Все инструкции по Whisper · Скачать пример

Готовы запустить?

Запустить GPU-сервер