【体験談】Pascal世代GPU(CC6.0)でkotoba-whisper・qwen3-asrを動かそうとしてハマった話

IT

型落ちGPUだから、で片付けられると思っていた

過去記事でTesla P100でLLMを使用していた記事は書いたけど、P100で音声認識(STT)を試みた話、 医療系ドキュメント生成システムの一部として、音声認識(STT)パイプラインを構築している。 既存の構成は ReazonSpeech-k2-v2 を sherpa-onnx 経由でCPU推論させるというもので、精度は十分だったが、リアルタイム性を上げるために新しいモデルへの置き換えを検討し始めた。

候補に挙がったのが、比較的新しい日本語対応モデルである kotoba-whisper v2.2 と qwen3-asr-1.7b だ。 どちらもGPU推論を前提とした設計になっており、当然自分の環境でもGPUに乗せるつもりでいた。

ところがここで、Tesla P100(Pascal世代、Compute Capability 6.0)という古いGPUを使っていることが、想像以上に大きな壁になった。

環境

  • GPU: Tesla P100-PCIE-12GB(CC6.0、eGPU経由でOptiPlex 3090に接続)
  • 用途: LLM推論(Nemotron-Nano-9B-v2-Japanese)と併用
  • VRAM: 12GB(LLM側で約7〜8GB使用中のため、STTに割ける余裕は限られる)

問題1: CTranslate2がPascal向けカーネルを切り捨てていた

kotoba-whisper は faster-whisper(内部でCTranslate2を使用)経由で動かすのが一般的な構成だ。 そこでまず CTranslate2 の最新版を入れて試したところ、推論時にエラーが出て起動すらしない。

調べていくと、CTranslate2 の比較的新しいビルドでは float16 / int8 の量子化カーネルについて、Pascal世代(sm_60)向けのサポートが打ち切られていることが分かった。 Turing以降の世代を前提にビルドが最適化されており、古いアーキテクチャは実質的に置き去りにされている状態だった。

回避策としては float32 で動かすしかない。ただし float32 は当然ながらVRAM消費も計算量も増えるため、ただでさえLLMと共存させる必要がある12GBのVRAMには厳しい選択になる。

問題2: sherpa-onnxのCUDA版もsm_60非対応

「それなら sherpa-onnx 側でGPU推論すればいいのでは」と思い、qwen3-asr-1.7b を ONNX化して sherpa-onnx のCUDA版で動かそうとしたが、ここでも壁にぶつかった。

Windows向けに配布されている sherpa-onnx のプリビルドCUDAバイナリには、そもそも sm_60 のカーネルが含まれていない。 実行すると

cudaErrorNoKernelImageForDevice

というエラーが出て終わる。GPU自体は認識されているのに、対応する演算カーネルがバイナリに含まれていないので実行できない、という状態だ。

自前でソースからビルドし直せば sm_60 を含めることは理論上可能だが、CUDA Toolkitのバージョン依存やビルド環境の整備を考えると、検証コストに見合わないと判断し、いったん保留にした。

妥協案: CPU推論に回帰

結局、既存構成と同じく CPU推論に戻すことにした。 sherpa-onnx + ONNX Runtime のCPU版であれば sm_60云々は関係なく普通に動く。GPUリソースはLLM推論に全振りし、STTはCPUで確定テキスト(confirmed_text)と暫定テキスト(provisional_text)を分離して返す既存のFastAPI構成をそのまま活かす形に落ち着いた。

kotoba-whisper v2.2 と qwen3-asr-1.7b については、CPU推論での速度・精度を比較検証中。GPUに乗せられない以上、この2択は「CPUでどれだけ実用速度が出るか」という観点で評価し直す必要がある。

Pascalという世代の限界

今回の一件で改めて痛感したのは、Pascal(CC6.0)がAI推論の分野ではすでに「型落ち」どころか「非対応領域」に入りつつあるということだ。 NVIDIA公式のサポートというより、周辺のOSSライブラリ(CTranslate2、sherpa-onnx等)側が、最適化とビルドサイズの都合で古い世代のカーネルを次々に切り捨てている。

VRAM容量だけを見ればP100の12GBはまだ現役でも通用する数値だが、「動くかどうか」はアーキテクチャ世代に左右される場面が増えてきている。

まとめ

  • kotoba-whisper(CTranslate2経由)は float16/int8 カーネルがPascal非対応、float32のみ動作
  • sherpa-onnxのプリビルドCUDA版もsm_60カーネル非搭載で cudaErrorNoKernelImageForDevice
  • 結論としてSTTはCPU推論を継続、GPUはLLM推論に集中させる構成に
  • 次のステップとして、Ampere/Ada世代(CC7.0以降)のGPUを追加してSTT専用に割り当てるデュアルGPU構成を検討中

同じようにPascal世代のGPUを使い続けている方の参考になれば幸いです。

コメント

タイトルとURLをコピーしました