はじめに 「cudaとcuDNNをインストールすればChatRWKVが高速に動く」
どうも。モノヒトです。
前回、CPU演算のみでRWKVによる人工知能との対話を楽しむことができましたが、モデルが大きかったりするとメモリが不足してプログラムが実行できなかったり、CPUのみの演算ではAliceの応答速度が比較的のんびりとしていたりと
まだまだ改善の余地があります。そこでGPU演算の手助けを借りたいと思います。これをするとChatRWKVは結構速い応答をしてくれるようになります。
RWKVにてGPUによる演算の補助を得るにはCUDAおよびcuDNNってのをインストールしないといけないようです。本稿ではイチからCUDAとcuDNNをインストールしてGPUの補助を得たChatRWKVの動作する環境構築について記述します。先人がたくさん本件に関する記事をすでに投稿しており、本稿は手垢のついた記事になりますがご容赦ください。
cudaとcuDNNとpytorch
cuda をインストールしないとNVIDIA製のグラフィックカードにアクセスすることができない。これはつまり、C言語かなんかで書かれたそのグラフィックカードを用いたコードを動かすためのコンパイラかなんかのようです。で、cuDNNってのをインストールしないとそのグラフィックカードを用いたディープニューラルネットワーク用のライブラリか何かが動かない。で、pytorchがないとpythonからcudaとcuDNNにアクセスできないし、ChatRWKVも動かない。ってんで、それらをすべてインストールする必要がありますが、問題はそれらのバージョンはすべて適切なものをインストールしないといけないってことです。この記事を書いている現状ではcudaのバージョンは12.2が最新のようですが、これはpytorchに対応していません。罠です。そこで、cudaのバージョンは11.7を選択し、それに対応したcuDNNをインストールし、さらにそれに対応したpytorchのバージョンをインストールし、最終的に高速で快適なRWKVの動作を目指します。
マシンのスペック
CPU:AMD Ryzen 5 3600 6-Core Processor
メモリ: 32GB
グラフィックカード:GeForce GTX 1650
OS: Ubuntu 22.04
本稿はubuntu22.04をインストールした直後のまっ更な状態を想定します。
まずはsudo apt update と sudo apt upgrade
sudo apt update
ubuntuインストール後、まずはとsudo apt updateを入力したらば私の場合、
The following packages have been kept back:
gjs libgjs0g
0 upgraded, 0 newly installed, 0 to remove and 2 not upgraded.
なんてのがコンソール画面に表示されました。gjs libgjs0gがupdateできていないようです。
なので、
sudo apt install -y gjs libgjs0g
なんて入力して、こいつを手動でアップデートします。その後sudo apt upgradeを実行しときます。
NVIDIAデバイスのチェック
lspci | grep -i nvidia
と入力するとマシンにNVIDIAのなんのデバイスが認識されているかどうかがチェックできるようです。
私の場合、
05:00.0 VGA compatible controller: NVIDIA Corporation TU117 [GeForce GTX 1650] (rev a1)
05:00.1 Audio device: NVIDIA Corporation Device 10fa (rev a1)
と表示されました。グラフィックカードの[GeForce GTX 1650] が正しくマシンに存在が認識されているようです。
既存のNVIDIAのドライバを削除したい場合
もし現状のcudaやNVIDIAのドライバを削除したいのなら
sudo apt-get purge nvidia-*
sudo apt remove nvidia-*
sudo apt-get purge cuda-*
sudo apt-get autoremove && sudo apt-get autoclean
とコマンドを打てばいいようです。前述したように本稿はubuntuをインストールした直後のマシン環境を想定していますので本来はこれらのコマンド入力は必要ないはずです。なのでここの文章は備忘録として記述しております。私の場合、どうしてもこれらのコマンド入力だけでは不要なファイルを削除しきれないことが多々ありまして、結局何回もubuntu22.04を再インストールするハメになっております。愚か。努力。精進。
※もしかしたら上記の代わりに
sudo apt-get --purge remove "*nvidia*" "libxnvctrl*"
と打つべきかもしれません。公式
https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#removing-cuda-toolkit-and-driver
にそんなことが書いてありました。
NVIDIAのドライバのインストール
肝心のNVIDIAのドライバのインストールですが、まずaptのリポジトリにNVIDIA GPU Driverリポジトリというのを追加する必要があるそうです。(参考にした記事 https://qiita.com/muramasa2/items/47b337b6e0e808d8a719
のまんまで恐縮です)
まず必要なパッケージをインポートします。
sudo apt-get install g++ freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libglu1-mesa libglu1-mesa-dev
その後、推奨されるドライバを以下のコマンドで確認します。どうも環境ごとに推奨されるドライバが異なるようです。
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
と入力した後、
ubuntu-drivers devices
を実行。すると
vendor : NVIDIA Corporation
model : TU117 [GeForce GTX 1650]
driver : nvidia-driver-418-server - distro non-free
driver : nvidia-driver-470 - distro non-free
driver : nvidia-driver-535-server - distro non-free
driver : nvidia-driver-525-server - distro non-free
driver : nvidia-driver-525 - distro non-free
driver : nvidia-driver-535-server-open - distro non-free
driver : nvidia-driver-525-open - distro non-free
driver : nvidia-driver-535-open - distro non-free
driver : nvidia-driver-470-server - distro non-free
driver : nvidia-driver-450-server - distro non-free
driver : nvidia-driver-535 - distro non-free recommended
driver : xserver-xorg-video-nouveau - distro free builtin
以上のようなリストが応答されました。これを見るとnvidia-driver-535ってのが推奨されているようです。
右にrecommendedって書かれているから。なので、
sudo apt install libnvidia-common-535
sudo apt install libnvidia-gl-535
sudo apt install nvidia-driver-535
でその推奨とされるドライバをインストールします。他人によっては末尾が470だったり525だったりするわけですね。
ここで一旦
reboot
しておきます。
cudaをインストール
とりあえず以下のリンクからcuda11.7.1ダウンロードします。
リンク先ではいろいろ選ぶ項目があります。
この場合、Linuxを選択します。
自分のCPUはRyzenなのでx86_64を選択します。
そのままubuntu→22.04を選択、deb(local)を選択すると
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-ubuntu2204.pin
sudo mv cuda-ubuntu2204.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/11.7.1/local_installers/cuda-repo-ubuntu2204-11-7-local_11.7.1-515.65.01-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu2204-11-7-local_11.7.1-515.65.01-1_amd64.deb
sudo cp /var/cuda-repo-ubuntu2204-11-7-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install cuda
と表示されます。これらがCUDAのインストールコマンドですが最後のsudo apt-get -y install cudaはコピーせず
その代わりに
sudo apt-get -y install cuda-11.7
そしたら
Processing triggers for dbus (1.12.20-2ubuntu4.1) ...
Errors were encountered while processing:
nvidia-dkms-515
cuda-drivers-515
cuda-drivers
nvidia-driver-515
cuda-runtime-11-7
cuda-demo-suite-11-7
cuda-11-7
E: Sub-process /usr/bin/dpkg returned an error code (1)
とエラー表示がありました。何故だ。ドライバは535をインストールしたんじゃないのか。なぜ515になっとんのか。
もうよくわからんので対処法をChatGPT-4に聞きました。
ChatGPT-4の回答
モ:質問
Processing triggers for dbus (1.12.20-2ubuntu4.1) ...
Errors were encountered while processing:
nvidia-dkms-515
cuda-drivers-515
cuda-drivers
nvidia-driver-515
cuda-runtime-11-7
cuda-demo-suite-11-7
cuda-11-7
E: Sub-process /usr/bin/dpkg returned an error code (1)
とubuntu22.04で表示されました。これを解決する方法をおしえてください
アシスタント:回答
「エラーメッセージから判断すると、NVIDIA関連のパッケージで問題が発生しているようです。以下の手順で問題を解決するための一般的な手順を試みてみてください:」
-
カーネルヘッダのインストール
NVIDIAのドライバはカーネルモジュールとして動作するため、適切なカーネルヘッダが必要です。これをインストールすることで、問題が解決することがあります。sudo apt-get update sudo apt-get install linux-headers-$(uname -r)
-
NVIDIAドライバの再インストール
ドライバのインストールに問題がある場合、再インストールすることで修正されることがあります。sudo apt-get purge nvidia-* sudo apt-get autoremove sudo apt-get autoclean sudo apt-get install nvidia-driver-515
-
DPKGの設定の修復
DPKGで問題がある場合、以下のコマンドで修復できることがあります。sudo dpkg --configure -a sudo apt-get -f install
-
依存関係の修復
依存関係が壊れている場合には、以下のコマンドで修復を試みることができます。sudo apt-get update --fix-missing
-
CUDAの再インストール
上記の手順で問題が解決しない場合、CUDA関連のパッケージを一度削除して再インストールすることで、問題が解決することがあります。sudo apt-get purge cuda-* sudo apt-get autoremove sudo apt-get autoclean sudo apt-get install cuda-11-7
上記の手順を試しても問題が解決しない場合、エラーメッセージの詳細な内容やログを確認して、具体的な問題点を特定する必要があります。。。。。。。とのこと。
一つ一つ試してみます。結局nvidia-driver-535をインストールしたのが間違いで、正しくは上記のChatGPTのアドバイスすべてを試したあと、rebootした後
sudo apt install libnvidia-common-515
sudo apt install libnvidia-gl-515
sudo apt install nvidia-driver-515
とコマンドを入力した後にさらにもう一度
sudo apt install cuda-11-7
とするとcudaがインストールできたようです。cudaのバージョンは
nvcc -V
と入力すると確認できるようで、その結果は
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2022 NVIDIA Corporation
Built on Wed_Jun__8_16:49:14_PDT_2022
Cuda compilation tools, release 11.7, V11.7.99
Build cuda_11.7.r11.7/compiler.31442593_0
となりました。長かったな・・・・。
cudaのインストールの後は忘れずに
export PATH="/usr/local/cuda/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"
source ~/.bashrc
sudo ldconfig
と入力して環境設定を行っておきます。
cuDNNのインストール
ここでNVIDIAのアカウントを作成します。そして
ここからcuDNNをダウンロードします。チェックボックスにチェックをいれて先に進むと項目が2つ現れます。ここからダウンロードするcuDNNのバージョンを選んでダウンロードするわけですが、先にインストールしたCUDAのバージョンと一致したcuDNNをダウンロードします。現状cuDNNの最新バージョンは
- Download cuDNN v8.9.4 (August 8th, 2023), for CUDA 11.x
です。(2023/08/12 時点)が、過去の記事を参考にして一つ前のバージョンの
cuDNN v8.9.3 for CUDA 11.x
をダウンロードすることにします。
これをクリックするとさらにcuDNNに関して細やかにバージョン分けされたダウンロード項目のリストが現れます。ここでは自分のマシンスペックに合わせて
- Local Installer for Ubuntu22.04 x86_64 (Deb)
を選択します。もし、この記事を参考にしてCUDAとcuDNNの動作する環境を整える場合、皆様は自分のマシンに合わせたcuDNNをダウンロードしてください。
cuDNNがダウンロードされたら、そのファイルがあるディクトリにて
sudo dpkg -i cudnn-local-repo-ubuntu2204-8.9.3.28_1.0-1_amd64.deb
とコマンドを打ちます。
その後
sudo cp /var/cudnn-local-repo-ubuntu2204-8.9.3.28/cudnn-local-7F7A158C-keyring.gpg /usr/share/keyrings/
とコマンドを入力します。
さらに
sudo apt update
sudo apt-get install libcudnn8=8.5.0.96-1+cuda11.7
sudo apt-get install libcudnn8-dev=8.5.0.96-1+cuda11.7
と入力します。インストール後は
dpkg -l | grep cudnn
でその確認ができるようです。
ninjaのインストール
ここで、ninjaというのをインストールしないとChatRWKVは動かないみたいです。
以下のコマンドでninjaをインストールします。
wget https://github.com/ninja-build/ninja/releases/download/v1.11.1/ninja-linux.zip
sudo unzip ninja-linux.zip -d /usr/local/bin/
sudo update-alternatives --install /usr/bin/ninja ninja /usr/local/bin/ninja 1 --force
/usr/bin/ninja --version
こまったときは以下のコマンドを打ちます。
sudo apt --fix-broken install
pytorchのインストール
これであとはtorchをインポートすればCUDAとcuDNNとpytorchによるpythonのプログラムが動くはずです。
pytorchのインストールコマンドは以下です。この場合、
pip3 install torch torchvision torchaudio
以上です。
最終的に動いた
ここまで頑張った後、
二名川さんの記事
https://qiita.com/Ninagawa_Izumi/items/71daa106ec82d44e05ea
を参考にしてようやくGPUアシストされたChatRWKVが動きました。詳細は割愛しますが会話例を以下に示します。
Bob: hello
Alice: Hello! How are you?
Bob: do you know about wireless power transfering?
Alice: Yes, I do. It is a technology that allows devices to transfer power wirelessly. It can be used for charging mobile phones, tablets, and other devices without cables.
Bob: do you know about wireless in-wheel motor? That is developed by teams of th
e university of Tokyo.
Alice: Yes, I am familiar with it. It is a type of electric vehicle that uses a motor to power the wheels. It is powered by an in-wheel motor, which means that it does not require a battery pack and can be powered by an electric motor directly.
Aliceは無事ワイヤレスインホイールモータについて答えてくれました。
はー・・・・長かったな・・・・・。頑張ったぜ・・・。読んでくださってありがとうございました。