導入
vLLMは、大規模言語モデル(LLM)の高速推論を実現するオープンソースライブラリです。その高いパフォーマンスは、NVIDIA GPUとCUDAに強く依存しています。インストール後や環境構築後にいざ起動しようとすると、「CUDAバージョン不一致」や「CUDA runtime error」といったエラーに直面することがあります。このエラーは、システムにインストールされているCUDAツールキットのバージョンと、vLLMがビルド・インストールされた際に想定されていたCUDAバージョンが異なるために発生します。本記事では、この問題の根本原因を解説し、確実な解決手順をコード例とともに詳しく説明します。
原因説明
vLLMのような高性能なGPUアクセラレーションライブラリは、インストール時にシステムのCUDA環境を検出し、その特定のバージョンに対してネイティブコード(カーネル)をコンパイルします。この時、PyPIからインストールするvllmパッケージは、一般的に事前コンパイルされたバイナリ(wheel)として配布されています。問題は、このwheelファイルが「特定のCUDAバージョン用」にビルドされている点です。例えば、CUDA 12.1用にビルドされたvLLMを、CUDA 11.8がメインのシステムで実行しようとすると、ライブラリやドライバレベルで互換性がなく、起動時にエラーが発生します。根本原因は、「利用可能なCUDAランタイムのバージョン」と「vLLMバイナリが要求するCUDAバージョン」のミスマッチにあります。
解決方法
この問題を解決するには、vLLMの要求とシステムのCUDA環境を一致させる必要があります。主に2つのアプローチがあります:1) システムのCUDAツールキットをvLLMが要求するバージョンにアップグレードする、2) vLLMをシステムのCUDAバージョンに合わせてソースから再ビルドする。後者がより現実的で一般的な解決策です。以下に、詳細な診断と解決の手順を説明します。
ステップ1: 環境情報の確認
まず、現在のシステム環境を正確に把握することが第一歩です。以下のコマンドで、NVIDIAドライバ、CUDAツールキット、および現在インストールされているvLLMの情報を確認します。
# NVIDIAドライバーバージョンの確認
nvidia-smi
# CUDAツールキットのバージョン確認 (コンパイラの存在確認)
nvcc --version
# または、CUDAランタイムのバージョンをPythonから確認
python -c "import torch; print(torch.version.cuda)"
# インストールされているvLLMパッケージの詳細確認
pip show vllm
nvidia-smiで表示されるCUDA Versionは、ドライバーがサポートする最大のCUDAランタイムバージョンです。実際にアプリケーションが利用するのは、nvcc --versionやtorch.version.cudaで表示される「CUDAツールキット」または「PyTorchにリンクされたCUDAランタイム」のバージョンです。ここで得られたCUDAバージョン(例: 11.8)をメモします。
ステップ2: 互換性のあるvLLMバージョンの選択と再インストール
vLLMは、異なるCUDAバージョン用にビルドされたwheelを提供しています。まず、既存のvLLMをアンインストールし、システムのCUDAバージョンに合った正しいwheelを指定して再インストールします。PyPIのvLLMプロジェクトページでは、ファイル名にcu118(CUDA 11.8用)やcu121(CUDA 12.1用)といった接頭辞が付いています。
# 既存のvLLMをアンインストール
pip uninstall vllm -y
# システムのCUDAバージョンに基づいてvLLMをインストール
# 例1: CUDA 11.8 環境の場合
pip install vllm --extra-index-url https://pypi.nvidia.com
# 例2: より明示的にCUDA 11.8用のwheelを指定する場合 (バージョンは適宜変更)
# pip install vllm==0.3.3 --extra-index-url https://pypi.nvidia.com
# 例3: CUDA 12.1 環境の場合
# pip install vllm
ポイント: CUDA 11.x環境では、NVIDIAが提供する--extra-index-url https://pypi.nvidia.comを指定することが必須です。これにより、CUDA 11.8用の正しいwheel(vllm-0.3.3+cu118-cp310-cp310-manylinux1_x86_64.whlなど)がダウンロードされます。CUDA 12.1環境の場合は、デフォルトのPyPIインデックスからインストール可能です。
ステップ3: ソースからのビルド(オプション)
上記の方法で適切なwheelが見つからない場合、または最新の開発版を利用したい場合は、ソースコードから直接ビルドする方法が確実です。これにより、現在の環境に完全に最適化されたvLLMがインストールされます。
# 1. 必要なビルドツールと依存関係をインストール
pip install -U setuptools wheel
# 2. vLLMのリポジトリをクローン(またはソースアーカイブをダウンロード)
git clone https://github.com/vllm-project/vllm.git
cd vllm
# 3. システムのCUDAバージョンを指定してビルド・インストール
# VLLM_CUDA_VERSION 環境変数で明示的に指定(例: 11.8)
VLLM_CUDA_VERSION=11.8 pip install -e .
# または、pip install 時にオプションとして渡す(バージョン0.3.3以降の一部の手法)
# pip install -e . --build-option="--cuda-version=11.8"
このプロセスには時間がかかりますが、環境との互換性問題はほぼ解消されます。ビルド中にエラーが発生した場合は、CUDAツールキットやninjaビルドシステムが正しくインストールされているか確認してください。
ステップ4: 動作確認
再インストールまたはビルド後、簡単なスクリプトでvLLMが正しく起動し、GPUを認識しているかを確認します。
import torch
from vllm import LLM
# 1. PyTorchのCUDA確認
print(f"PyTorch CUDA Available: {torch.cuda.is_available()}")
print(f"PyTorch CUDA Version: {torch.version.cuda}")
print(f"GPU Device Count: {torch.cuda.device_count()}")
# 2. vLLMの簡単な初期化テスト(軽量なモデルを指定するか、スキップ可能)
try:
# テスト用の小さなモデル名や、ローカルのモデルパスを指定。
# 実際には利用したいモデルを指定してください。ここでは確認のため短いタイムアウト付きで試します。
print("vLLMインポートと最低限の初期化チェックを開始...")
# 注: 実際のモデルロードは時間とリソースがかかるため、環境チェックのみの場合はコメントアウトしても良い。
# llm = LLM(model="gpt2", max_model_len=128) # 非常に軽量なモデルでテスト
# print("vLLMの初期化に成功しました。")
print("vLLMのインポートは正常です。")
except Exception as e:
print(f"vLLM初期化エラー: {e}")
このスクリプトでCUDAが利用可能と表示され、vLLMのインポート時にエラーが発生しなければ、問題は解決しています。モデルを実際にロードする際に別のエラーが発生する場合は、モデルファイルのダウンロードやディスク容量など、他の要因を調査する必要があります。
トラブルシューティングの補足
- エラーメッセージの具体例:
CUDA error: no kernel image is available for execution on the deviceというエラーは、ビルド時のGPUアーキテクチャ(SM)と実行環境のGPUが合わない場合にも発生しますが、根本原因はCUDAバージョンの不一致であることが多いです。 - 仮想環境の活用: CUDAバージョンの異なる複数のプロジェクトを扱う場合は、
condaやvenvを用いてプロジェクトごとに独立したPython環境を作成し、それぞれに適したvLLMバージョンをインストールすることを強く推奨します。 - Dockerの利用: 環境構築の複雑さを避ける最も確実な方法は、vLLMプロジェクトが提供する公式Dockerイメージ(
vllm/vllm-openai:latestなど)を利用することです。これにより、CUDA、ドライバー、vLLMの互換性が保証された状態で実行できます。
まとめ
vLLM起動時のCUDAバージョン不一致エラーは、ライブラリのインストール方法に起因する一般的な問題です。解決の鍵は、nvidia-smiとnvcc --versionでシステムの実際のCUDA環境を正確に把握し、それに合ったvLLMのwheelを--extra-index-urlオプションを付けて再インストールすることにあります。これで解決しない場合、ソースからのビルドという最終手段があります。環境管理のベストプラクティスとして、仮想環境やDockerを活用することで、再発を防ぎ、安定したLLM推論環境を構築することができます。