faster-whisper-dgx-spark/README.md
2025-12-23 23:53:33 +09:00

100 lines
5.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# whisper-test (faster-whisper on DGX Spark/ThinkStation PGX)
NVIDIA DGX Spark 相当環境(Lenovo ThinkStation PGX)で、`faster-whisper` を CUDA で確実に動かすための最小構成をまとめたリポジトリです。ホスト側 CUDA 13 が既に入っており変更しづらい研究用マシンでも、Docker 上で CUDA 12.4 + cuDNN 9 でビルドした CTranslate2 を用いて GPU 推論を再現できます。
公式 faster-whisper リポジトリ: https://github.com/SYSTRAN/faster-whisper
## なぜこの構成が必要か
- `faster-whisper` は CTranslate2 を利用し、ビルド時の CUDA/cuDNN と実行環境が一致していないと GPU 版が動作しない。
- ThinkStation PGX ではホストに CUDA 13 が入っており、`pip install ctranslate2` すると CPU 版や CUDA 非対応ビルドが入ることがある。
- 公式手順だけでは CUDA 版が入らず、`ValueError: This CTranslate2 package was not compiled with CUDA support` となるケースがあった。
- そこで CUDA 12.4 + cuDNN 9 を明示した Docker で CTranslate2 をソースビルドし、Python バインディングを明示的に再インストールすることで再現性を確保。
## 提供物
- `docker-compose.yml` と `docker/Dockerfile` による GPU 対応コンテナ構成
- ベース: `nvidia/cuda:12.4.1-cudnn-devel-ubuntu22.04`
- CTranslate2 v4.6.2 を CUDA 有効でソースビルド
- `pip` で入る CPU 版 `ctranslate2` を一度アンインストールし、ビルド済み Python バインディングを再インストール
- FastAPI + Uvicorn の簡易サーバ (`docker/server.py`)
- `POST /transcribe` で音声を受け取り、Whisper 推論結果を返却
- `GET /health` でモデル名・デバイス・compute_type を返却
- サンプル音声とテストスクリプト(`test/`)
## 仕組みのポイント
- CUDA 12.x + cuDNN 9 で CTranslate2 をビルドし、実行時も同一バージョンを保証
- `entrypoint.sh` で `LD_LIBRARY_PATH` を明示設定し、`nvidia.cublas.lib` / `nvidia.cudnn.lib` のパスを動的に追加
- ホスト CUDA 13 と切り離すため Docker を必須とし、NVIDIA Container Toolkit を前提に GPU を渡す
## 前提条件
- NVIDIA Container Toolkit 導入済み
- GPU ドライバがホストに正しく入っていること
- ホスト側 CUDA は 13 系のままで可(変更不要)
### ローカルCPU実行(任意)
Docker を使わず手元の Python (.venv) で CPU 推論だけ試す場合の簡易手順:
```bash
python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
pip install -r docker/requirements.txt
# CPU でサンプル音声を実行
FW_DEVICE=cpu FW_COMPUTE_TYPE=int8 python3 test/transcribe_cpu.py
```
※ CPU のみの確認用。GPU を使う場合は Docker 構成を推奨。
## セットアップ
```bash
# ビルド
docker compose build
# 起動(GPU 必須)
docker compose up -d
# ヘルスチェック
curl http://localhost:8002/health
```
## 推論APIの使い方
```bash
curl -X POST http://localhost:8002/transcribe \
-F "file=@test/003.wav" \
-F "language=ja" \
-F "beam_size=5" \
-F "vad_filter=true"
```
レスポンスには `text` と `segments`(start/end/text)、`language`, `language_probability` が含まれます。
環境変数でモデルや実行設定を変更できます:
- `FW_MODEL` (デフォルト `large-v3`)
- `FW_DEVICE` (デフォルト `cuda`)
- `FW_COMPUTE_TYPE` (デフォルト `float16`)
### Docker コンテナ内で `test/` のスクリプトを実行する例
ホストに Python を入れずに検証したい場合、起動済みコンテナ内でテストスクリプトを実行できます。
```bash
# 1) コンテナに入る(compose が起動している前提)
docker compose exec whisper bash
# 2) GPU 版サンプル(デフォルトの large-v3 / float16)
python3 test/transcribe.py
# 3) CPU で試したい場合(compute_type を切り替え)
FW_DEVICE=cpu FW_COMPUTE_TYPE=int8 python3 test/transcribe_cpu.py
```
いずれも `test/003.wav` を入力にし、標準出力へテキストと各セグメントを表示します。自分の音声で試す場合は `python3 test/transcribe.py /path/to/your.wav` のようにパスを指定してください。
## ディレクトリ構成(抜粋)
- `docker-compose.yml` — サービス定義(GPU リクエスト含む)
- `docker/Dockerfile` — CUDA 12.4 + cuDNN 9 ベースで CTranslate2 をソースビルド
- `docker/entrypoint.sh` — CUDA ライブラリパスを動的設定し uvicorn 起動
- `docker/server.py` — FastAPI サーバ(/health, /transcribe)
- `docker/requirements.txt` — 最小依存: `faster-whisper`, `fastapi`, `uvicorn[standard]`, `python-multipart`
- `test/` — サンプル音声とローカル実行スクリプト
## 再現のための注意点
- `pip install faster-whisper` だけでは CUDA 版 `ctranslate2` は保証されない
- CUDA バージョン不一致だとインストール成功しても実行時に GPU を掴まない
- 本 Dockerfile は一度 CPU 版をアンインストールし、ビルド済み CUDA 版を再インストールして整合性を取る