モノヒトの「ChatRWKV用にubuntu22.04でcudaとcuDNNをインストールする」

# はじめに 「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ダウンロードします。

    
https://developer.nvidia.com/cuda-11-7-1-download-archive

リンク先ではいろいろ選ぶ項目があります。
この場合、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関連のパッケージで問題が発生しているようです。以下の手順で問題を解決するための一般的な手順を試みてみてください：」

1. **カーネルヘッダのインストール**
   NVIDIAのドライバはカーネルモジュールとして動作するため、適切なカーネルヘッダが必要です。これをインストールすることで、問題が解決することがあります。
   ```
   sudo apt-get update
   sudo apt-get install linux-headers-$(uname -r)
   ```

2. **NVIDIAドライバの再インストール**
   ドライバのインストールに問題がある場合、再インストールすることで修正されることがあります。
   ```
   sudo apt-get purge nvidia-*
   sudo apt-get autoremove
   sudo apt-get autoclean
   sudo apt-get install nvidia-driver-515
   ```

3. **DPKGの設定の修復**
   DPKGで問題がある場合、以下のコマンドで修復できることがあります。
   ```
   sudo dpkg --configure -a
   sudo apt-get -f install
   ```

4. **依存関係の修復**
   依存関係が壊れている場合には、以下のコマンドで修復を試みることができます。
   ```
   sudo apt-get update --fix-missing
   ```

5. **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のインストール
https://developer.nvidia.com/login

ここでNVIDIAのアカウントを作成します。そして

https://developer.nvidia.com/rdp/cudnn-archive

ここからcuDNNをダウンロードします。チェックボックスにチェックをいれて先に進むと項目が２つ現れます。ここからダウンロードする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は無事ワイヤレスインホイールモータについて答えてくれました。
はー・・・・長かったな・・・・・。頑張ったぜ・・・。読んでくださってありがとうございました。