不具合の発生状況と環境
OSはdebian12環境で、GeforceRTX3060を使用してWhisperとStable Diffusionを定期稼働させていたのだが。
ある日、Whisperが動作していなことに気づいて、調査するとtorch関連のアプリケーションが全て動かなくなっており、Stable Diffusionも動作しなくなっていた。
不具合の症状
torchが動かない、torchを動作させるためのcuda-driverが認識していない。
nvidia-driverはインストールされている筈なのだが、nvidia-smiコマンド自体が消えていた。
$nvidia-smi
-bash: nvidia-smi: コマンドが見つかりません
nvidia-driverはインストールされている状態だったがドライバに同梱されているコマンドセット(nvidia-smi等)は全て消えていた。
ChatGPTやGithub-Copilotへ質問して復旧を試みる
古い情報やドライバの整合性があわないバージョンの情報を含めた回答ばかりで解決せず。
LLMは参考程度に頼らず自分でドライバーバージョンを調査して解決することにした。
python環境には問題がなかったのだが、nvidia-driver, cuda-driverそれぞれとpytorch関連のバージョンを合わせる必要があるため全てのインストールをやり直した。
復旧作業の前にcronを止める
パッケージの更新で動かなくなったことは確認できているので、
cron-aptやcronで稼働させているアップデートが発生すると、また動かなくなる可能性があるので先にcronを止めておく。
sudo systemctl stop cron
sudo systemctl disable cron
復旧方法(結論)
前処理(nvidia関連のドライバを完全に削除する)
sudo apt remove --purge '^nvidia-.*' '^libnvidia-.*' '^cuda.*' '^libcuda.*' '^nsight.*'
sudo apt autoremove --purge
sudo rm -f /etc/modprobe.d/nvidia.conf /etc/modprobe.d/blacklist-nvidia.conf /etc/modprobe.d/blacklist-nouveau.conf
sudo rm -f /etc/apt/sources.list.d/cuda*
OSS版ドライバが割り当てられないようにする
## Nouveau の無効化
sudo sh -c "echo 'blacklist nouveau' > /etc/modprobe.d/blacklist-nouveau.conf"
sudo sh -c "echo 'options nouveau modeset=0' >> /etc/modprobe.d/blacklist-nouveau.conf"
sudo update-initramfs -u
nvidia関連のドライバーを完全に削除するために再起動
sudo shutdown -r now
nvidiaドライバーの再インストール
GPUのCompute Capabilityを確認
※「CUDA-Enabled GeForce and TITAN Products」を開く
自分の場合はRTX3060だったので Compute Capability8.6 が該当する。
(※RTX3050~3090まで=Ampereアーキテクチャは全てCompute Capability8.6になる)
※RTX20x0系以前のGPUの場合は合致するCompute Capabilityにあわせてドライバーバージョンを調整すれば、このドキュメントを参考に復旧できるかもしれない
※RTX40x0系のAda Lovelace=Compute Capability8.9は、2024年11月時点では動作条件よりも新しいドライバが出ていないのでこの不具合には合致しないハズ。
cudaドライバーの再インストール
Compute Capabilityに対応するCuda/Cuda-toolkitのバージョンは英語版wikipediaで確認すると分かりやすい。
AmpereアーキテクチャはCuda12.5まで対応している事がわかる
cudaドライバに対応するtorchバージョンを確認しておく
https://pytorch.org/
https://pytorch.org/get-started/previous-versions/
torchコンポーネントは全てのcudaに対応しているわけではないので、公式がアナウンスしているcudaバージョンを選定しておく
cuda12.4, cuda12.1 辺りが候補になる。
cudaドライバの取得
cuda公式URLのトップページからは最新版cuda12.6のcuda-toolkitしかダウンロードできない
https://developer.nvidia.com/cuda-toolkit
アーカイブからcuda-toolkitの過去バージョンを取得する
cuda-toolkit 12.4 をローカルインストールする場合
先ず、aptパッケージのリポジトリを登録するために公開鍵を確認
2024-11-14時点では "3bf863cc.pub" が公開鍵
公開鍵をインストール
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/debian12/x86_64/3bf863cc.pub
cuda-toolkit12.4をaptリポジトリからインストール
公式の手順ママ
wget https://developer.download.nvidia.com/compute/cuda/12.4.1/local_installers/cuda-repo-debian12-12-4-local_12.4.1-550.54.15-1_amd64.deb
sudo dpkg -i cuda-repo-debian12-12-4-local_12.4.1-550.54.15-1_amd64.deb
sudo cp /var/cuda-repo-debian12-12-4-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo add-apt-repository contrib
sudo apt-get update
sudo apt-get -y install cuda-toolkit-12-4
nvidia-driverとcuda-driverのインストール(公式と異なる)
cuda-driverのインストール時にnvida関連のドライバーのバージョンを合わせる必要がある。
前項のcuda-toolkitインストール時のURLにベースのバージョン情報が含まれており「550.54.15-1」が合致すると分る。
cudaに必要なnvidia-driver関連のaptパッケージを、バージョンを指定してインストールする。
sudo apt install -y \
--allow-downgrades \
nvidia-smi=550.54.15-1 \
nvidia-driver=550.54.15-1 \
nvidia-driver-libs=550.54.15-1 \
nvidia-vdpau-driver=550.54.15-1 \
nvidia-driver-bin=550.54.15-1 \
nvidia-kernel-dkms=550.54.15-1 \
nvidia-legacy-check=550.54.15-1 \
nvidia-opencl-icd=550.54.15-1 \
nvidia-settings=550.54.15-1 \
libnvidia-pkcs11=550.54.15-1 \
libxnvctrl-dev=550.54.15-1 \
nvidia-libopencl1=550.54.15-1 \
nvidia-xconfig=550.54.15-1 \
libcuda1=550.54.15-1 \
libnvidia-nvvm4=550.54.15-1 \
libxnvctrl0=550.54.15-1 \
libnvidia-ptxjitcompiler1=550.54.15-1 \
libcudadebugger1=550.54.15-1 \
libnvcuvid1=550.54.15-1 \
libnvidia-fbc1=550.54.15-1 \
libnvoptix1=550.54.15-1 \
libnvcuvid1=550.54.15-1 \
libnvcuvid1=550.54.15-1 \
nvidia-egl-icd=550.54.15-1 \
libglx-nvidia0=550.54.15-1 \
libegl-nvidia0=550.54.15-1 \
libnvidia-encode1=550.54.15-1 \
libnvidia-opticalflow1=550.54.15-1 \
nvidia-alternative=550.54.15-1 \
libgl1-nvidia-glvnd-glx=550.54.15-1 \
xserver-xorg-video-nvidia=550.54.15-1 \
libnvidia-eglcore=550.54.15-1 \
libnvidia-cfg1=550.54.15-1 \
libnvidia-ml1=550.54.15-1 \
libnvidia-glcore=550.54.15-1 \
nvidia-modprobe=550.54.15-1 \
nvidia-kernel-support=550.54.15-1 \
firmware-nvidia-gsp=550.54.15-1
nvidia-driverのインストールに成功したら、cuda-driverもバージョン指定でインストールする
sudo apt install -y \
--allow-downgrades \
nvidia-kernel-open-dkms=550.54.15-1 \
cuda-drivers=550.54.15-1 \
nvidia-driver=550.54.15-1 \
cuda-drivers-550=550.54.15-1 \
nvidia-opencl-icd=550.54.15-1 \
nvidia-egl-icd=550.54.15-1
ここまででnvidia-driverが正常に動作している筈
nvidia-smi
whisperの動作確認
whisperは公式通りにpipで導入すれば復旧した。
※whisper用のpython環境を構築済みである前提、venv/pyenvの説明は省く
pip install -U openai-whisper
pip install --upgrade --no-deps --force-reinstall git+https://github.com/openai/whisper.git
torchが機能するかどうかテスト
python -c "import torch; print(torch.cuda.is_available())"
「True」が返却されたら成功
whisperの動作テスト
whisper --help
whisperはCLIで利用できるので、適当な音声/動画ファイルがあれば直ぐにテストできる
whisper test.mp3 --model base
whisperの復旧は以上で終了。
Stable Diffusionの動作確認
※Stable Diffusion用のpython環境を構築済みである前提、venv/pyenvの説明は省く
cuda12.4に合致するpytorchを選定する
pytorch公式通りだと以下になるのだが
#pip install torch==2.4.1 torchvision==0.19.1 torchaudio==2.4.1 --index-url https://download.pytorch.org/whl/cu124
torch2.4.0以降はpydataやpytextが廃止されているのでStableDiffusionでは動かなくなっている。
かつ、Stable Diffusionでxformersが必要になる前提でpytorchをインストールすると以下のようなpipの組み合わせになる。
## インストール前にtorch関連モジュールを削除しておく
pip uninstall torch torchvision torchaudio torchdata torchtext -y
## torch関連をインストール
pip install torch==2.0.1 torchaudio==2.0.2 torchvision==0.15.2 xformers==0.0.22 torchtext torchdata
torchが機能するかどうかテスト
python -c "import torch; print(torch.cuda.is_available())"
「True」が返却されたら成功
webui.sh やapiを実行して動作確認する
動作確認後、aptの自動更新を制限する
ドライバと関連ファイルが最新版にアップグレードされると、WhisperやStable Diffusionがまた動かなくなるので、aptの更新を制限する
sudo vim /etc/apt/apt.conf.d/50unattended-upgrades
Unattended-Upgrade::Package-Blacklist {
"nvidia-";
"libnvidia-";
"cuda-";
"libcuda";
}
※「apt-mark hold パッケージ名」を利用すると依存関係全てがアップグレードできなくなりセキュリティリスクになるので、パッケージ名で制限している
※「sudo apt upgrade パッケージ名」で個別にアップグレードすると、パッケージ名での制限が無視されてインストールできてしまうので注意が必要
packagekitも自動更新が発生するので停止させておく
X-Windowを使わない場合はpackagekitも停止させておく
sudo systemctl stop packagekit
sudo systemctl disable packagekit
sudo systemctl stop packagekit-offline-update
sudo systemctl disable packagekit-offline-update
設定した後にaptを更新。
sudo apt update -y
sudo apt upgrade -y
最後にcronを復旧
sudo systemctl enable cron
sudo systemctl start cron
補足
ubuntu環境でもドライバーバージョンが同じであれば、ほぼ同じ手順で復旧できると思うのだが、確認はできていない。