debian12環境でpytorchを利用する生成AI系のWhisperとStable-Diffusionが突然動かなくなったので復旧手順を共有する

pytorch

不具合の発生状況と環境

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 GPUs - Compute Capability
Explore your GPU compute capability and CUDA-enabled products.

※「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で確認すると分かりやすい。

CUDA - 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 Archive

cuda-toolkit 12.4 をローカルインストールする場合

CUDA Toolkit 12.4 Update 1 Downloads

先ず、aptパッケージのリポジトリを登録するために公開鍵を確認

Index of /compute/cuda/repos/debian12/x86_64

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で導入すれば復旧した。

GitHub - openai/whisper: Robust Speech Recognition via Large-Scale Weak Supervision
Robust Speech Recognition via Large-Scale Weak Supervision - openai/whisper

※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の説明は省く

Previous PyTorch Versions
Installing previous versions of PyTorch

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環境でもドライバーバージョンが同じであれば、ほぼ同じ手順で復旧できると思うのだが、確認はできていない。