0xf

日記だよ

諸事情によりWhisperをEC2で動かすあれこれをやっていた

whisperは OpenAI がリリースした音声書き起こしモデル。とその実装。実装? 「モデル」と「実装」って言葉が乱舞しがちな分野である。正直わからん。

whisper

いくつか亜種がある。

  • openai-whisper(本家)
    • 音声ファイル読み込み周りで FFmpeg への依存がある。AWSのGraviton系CPUでもセットアップできる。
  • whisper.cppC++で再実装されCPUサポート強化されたもの)
    • Apple Silicon (+Metal) 向けの最適実装とかがある。Macで動かすならこれぽい。
  • faster-whisper (CTranslate2使って再実装したもの)
    • CTranslate2とかの依存がある。x86アーキテクチャのみ。まだ py314 向けの依存関係が出揃ってない。

わりとFFmpegのビルドがめんどい(時間がかかる)んだけど、そこクリアできるなら本家はけっこう環境に対してポータブルである。

ホストが nvidia-smi をセットアップできていれば、コンテナ起動する時に gpu サポート有効にして起動してあげることで内部からGPUをつかめる。nvtop とかで動きを把握できる。くらいの理解をしている。

初回で利用するモデルがないとダウンロードを勝手に始めるのでコンテナに焼き込むとか共有ストレージにおくなどするのがよさそう。(数Gくらい)

短い音声データだとGPUのメモリにモデルを転送する時間の方がかかるので、モデルをロードしたままデーモンを待機させておくのが正解ぽい。whisper.cpp だとM1Maxの仕事PCで十分リアルタイムに近い速度で書き起こし処理ができる。(別件で RTX5060ti を載せたPCで試したら所要が実時間の1/15くらいで爆速でした。GPU強い)

EC2

GPU付きモデルがいろいろある。NVidiaのチップを積んだインスタンスタイプをチョイスして、AMIとしてCUDA入りのやつを選べばとりあえずは問題ない。

Amazon Linux 2023ベースです。containerdとかgitとかはあらかじめセットアップされているので、困ることは少ないはず。

Dockerfile

いろいろ試行錯誤してたけど、nvidiaの公式イメージから共有オブジェクトを抜き出すのが楽だった。

FROM nvidia/cuda:12.9.0-cudnn-runtime-ubuntu22.04 AS cuda

FROM ubuntu:latest

RUN mkdir -p /opt/cuda12/lib
COPY --from=cuda /usr/local/cuda-12.9/targets/x86_64-linux/lib/libcudart*.so* /opt/cuda12/lib/
COPY --from=cuda /usr/local/cuda-12.9/targets/x86_64-linux/lib/libcublas*.so* /opt/cuda12/lib/
COPY --from=cuda /usr/lib/x86_64-linux-gnu/libcudnn*.so*  /opt/cuda12/lib/

ENV LD_LIBRARY_PATH=/opt/cuda12/lib
RUN echo "/opt/cuda12/lib" > /etc/ld.so.conf.d/cuda12.conf && ldconfig

あとは device="auto" と指定しておけば、whisper 側が自動的にGPUを使ってくれる。