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.
Готовы запустить?
Запустить GPU-сервер