🖥

WSL2にCUDA(CUBLAS) + llama-cpp-pythonでローカルllm環境を構築

2024/01/31に公開

はじめに

はじめまして、こちら初記事となります(温かい目で見てください)。
今回の執筆の経緯は以下となります。

最近のローカルllmの流行りに乗っかろう

windowsで環境構築しようとしたら、なんかインストール周りが面倒 & 管理がしづらい

WSL2(ubuntu)に環境構築してみよう

手順を残しておきたい

となりました。
すでにいくつかの記事でllmの環境構築手順は紹介されておりましたが、自分なりに行った手順をまとめましたので展開します。
また今回は使いませんが、せっかくなのでPyTorchのインストールも行います(CUDA_Toolkitをインストールする際に対応バージョンを合わせる必要があるため、後からインストールすると少し面倒になります)。

作業環境

OS: windows11
GPU: GeForce RTX 2080 SUPER
CPU: Corei9-9900KF

環境構築

Nvidiaドライバのインストール

まずはwindowsの方でNvidiaドライバのインストールを行いましょう(WSL2の場合はubuntuではなくwindowsのNvidiaドライバを使います)。

以下のページから自分が使っているGPUなどの項目を選択して「探す」ボタンを押下後、インストーラをダウンロード
https://www.nvidia.co.jp/Download/index.aspx?lang=jp

自分の作業環境では以下のようになりました。

ダウンロードタイプは、SDを選択(安定性と品質を優先する旨がヘルプに記載されていたため)しました。
その後はインストーラーを実行して再起動してください。

再起動後以下のコマンドを入力してバージョンを確認してください

powershell
$ nvidia-smi

Driver Version: 537.34 ← 自分の場合

この後、PyTorch、CUDA_Toolkit、cuDNNの3つをインストールすることになりますが、以下のようにそれぞれ対応(させなきゃいけない)バージョンがあります。

  • NvidiaドライバとCUDA_Toolkit
  • CUDA_ToolkitとPyTorch
  • cuDNNとCUDA_Toolkit

NvidiaドライバとCUDA_Toolkitのバージョン対応に関しては、Nvidiaドライバが最新であれば(後方互換性があるため)CUDA_Toolkitに対応できるため問題ありませんが、他はそれぞれバージョンを合わせる必要があります。

今回は、CUDA_ToolkitとPyTorch → cuDNNとCUDA_Toolkitの順番で合わせていきます。

PyTorch、CUDA_Toolkit、cuDNNはWSL2内でインストールするため、まずはWSL2をセットアップしましょう。

WSL2(ubuntu)セットアップ

以下のコマンドをpowershellで実行するだけでインストールできます。

powershell
$ wsl --install -d Ubuntu-22.04

ディストリビューションを指定しない場合は以下(デフォルトでubuntuがインストールされます)。

powershell
$ wsl --install

参照:WSL を使用して Windows に Linux をインストールする方法
https://learn.microsoft.com/ja-jp/windows/wsl/install

インストールが終わったら、WSL2を起動します。
初回起動のログイン名とパスワードを打ち込んだ後は、とりあえずupdateとupgradeをしておきましょう。

$ sudo apt update -y && sudo apt upgrade -y

llama-cpp-python用にビルドツールのインストール

$ sudo apt install build-essential -y

$ pythonとpipのインストール

$ sudo apt install python3 -y # 標準でインストールされているはずですが一応
$ sudo apt install python3-pip -y

作業ディレクトリの作成

$ mkdir -p ~/work/llm-sample

仮想環境を使う場合、以下の作業(仮想環境のインストール、環境の作成、有効化)も行います。

$ sudo apt install python3-venv -y
$ python3 -m venv ~/work/llm-sample/venv

仮想環境を有効化します。

$ source ~/work/llm-sample/venv/bin/activate

仮想環境を無効化する際は以下のコマンドを実行。

$ deactivate

python環境が出来たので、次はコーディング用のエディタをWSL2内で使用できるようにします。

VSCodeの設定

VSCodeはWinbdowsにインストールされているものを使います。まだインストールされていない場合は以下からインストールしましょう。
https://code.visualstudio.com/download
インストールが完了したら、WSL2内でVSCodeを使用するための拡張機能をインストールします。拡張機能の検索で「wsl」と入力して以下をインストール。

WSL2を開いてる場合は、一度閉じます。

$ exit

powershellで以下のコマンドを打ち込みます。

powershell
$ wsl --shutdown

再度WSL2を立ち上げたら作業ディレクトリに移動。

$ cd ~/work/llm-sample

以下のコマンドでVSCodeを起動。

$ code .


無事立ち上がっているようでしたら成功です。
続いて、pythonの拡張機能もインストールしておきましょう。拡張機能の検索で「python」と入力して以下をインストール。

以上でVSCodeの設定は終了です。

CUDA_Toolkitのインストール

前述のとおり、CUDA_ToolkitとPyTorchはバージョンを合わせます。
以下のサイト(PyTorchの公式サイト)からCUDA_Toolkitの対応バージョンと後にインストールするPyTorchのpipコマンドを確認します。
https://pytorch.org/get-started/locally/#start-locally

CUDA_Toolkitのバージョン: CUDA 12.1
pipコマンド: pip3 install torch torchvision torchaudio

pipコマンドの方は一旦置いといて、CUDA_Toolkitのインストールを先に実施します。
以下のページからPytorchのページで確認したCUDA_Toolkitのバージョンを選択(自分の場合は12.1)。
https://developer.nvidia.com/cuda-toolkit-archive
ダウンロードページに遷移したらOSなどを順に選択していきます。

すると下にコマンドが出てきます。

上記のコマンドを打ち込むことになりますが、先に古いGPGキーの削除をしておきましょう。

古いGPGキーの削除(https://docs.nvidia.com/cuda/wsl-user-guide/index.html#cuda-support-for-wsl-2)

$ sudo apt-key del 7fa2af80

準備ができたのでCUDA_Toolkitのダウンロードページに表示されたコマンドを打ち込みましょう(以下はCUDA_Toolkit 12.1の場合です)。

$ wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-wsl-ubuntu.pin
$ sudo mv cuda-wsl-ubuntu.pin /etc/apt/preferences.d/cuda-repository-pin-600
$ wget https://developer.download.nvidia.com/compute/cuda/12.1.0/local_installers/cuda-repo-wsl-ubuntu-12-1-local_12.1.0-1_amd64.deb
$ sudo dpkg -i cuda-repo-wsl-ubuntu-12-1-local_12.1.0-1_amd64.deb
$ sudo cp /var/cuda-repo-wsl-ubuntu-12-1-local/cuda-*-keyring.gpg /usr/share/keyrings/
$ sudo apt-get update
$ sudo apt-get -y install cuda

もし途中でディレクトリの権限エラーが出た場合は、以下のコマンドで一時的に権限を変更してください。

$ sudo chmod -R 777 ~/.
$ sudo chmod -R 777 /etc/apt/preferences.d/
$ sudo chmod -R 777 /usr/share/keyrings/

権限を変更した場合は、インストール後に以下のコマンドで権限を戻してください。

$ sudo chmod -R 755 ~/.
$ sudo chmod -R 755 /etc/apt/preferences.d/
$ sudo chmod -R 755 /usr/share/keyrings/

インストールが終わったら.bashrcにパスと環境変数を追加します。
以下で.bashrcファイルを編集します。

$ nano ~/.bashrc

カーソルキー↓で下に行き以下を追加

export PATH="/usr/local/cuda/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"

追加後、ctrl+oを押下してenterで保存。ctrl+xでファイルを閉じます。
そのあと以下のコマンドで.bashrcの再読み込みを行います。

$ source ~/.bashrc

ここまでくればCUDA_Toolkitの準備は完了です。きちんとインストール出来ているか確認してみましょう。

$ nvcc -V

以下のようになればOKです。

$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2023 NVIDIA Corporation
Built on Tue_Feb__7_19:32:13_PST_2023
Cuda compilation tools, release 12.1, V12.1.66
Build cuda_12.1.r12.1/compiler.32415258_0

Pytorchのインストール

Pytorchはなくとも今回の環境構築には問題ありませんが、pipでインストールするだけなので特に問題なければ実施しておきましょう。

$ # source ~/work/llm-sample/venv/bin/activate # 仮想環境の有効化
$ pip3 install torch torchvision torchaudio

cuDNNのインストール

cuDNNはCUDA_Toolkitとバージョンを合わせます。以下のページに対応表があります。
https://docs.nvidia.com/deeplearning/cudnn/support-matrix/index.html#abstract

自分の場合、先ほどインストールしたCUDA_Toolkitのバージョンは12.1でしたので上記の表を確認するとcuDNN 8.9.7 for CUDA 12.xをインストールすればいいということがわかります。

バージョンを確認できたのでインストール手順に移ります。
cuDNNは、まずWindowsにインストーラーをダウンロードしてからWSL2内に配置してインストールを行います。

cuDNNのダウンロードサイトに移動しましょう。
https://developer.nvidia.com/login

アカウント登録(無料)を行います。

アカウント登録後、上記の画面に遷移するのでDownload cuDNN Libraryを選択してください。

先ほど確認したバージョン(自分の場合はcuDNN 8.9.7 for CUDA 12.x)を選択。

表示されたダウンロードリンクから以下のようなUbuntuのDebファイルを選択します。

  • Local Installer for Ubuntu22.04 x86_64 (Deb)

ダウンロードが終わったらファイルをWSL2内に移動させます。
ファイルエクスプローラーで、以下のようなURLを入れるとWSL2内のホームディレクトリに移動します。そこにファイルを配置しておきましょう。

  • \wsl.localhost\Ubuntu-22.04\home\<ユーザー名>

もし権限エラーでファイルが配置できない場合は、以下のコマンドをWSL2で実行して一時的に権限を変更してください。

$ sudo chmod -R 777 ~/.

配置したらWSL2内で以下のコマンドを打ち込み、インストールを行います。

$ cd ~
$ sudo apt install ./cudnn-local-repo-ubuntu2204-8.9.5.29_1.0-1_amd64.deb # 配置したファイル

権限を変更した場合は、以下のコマンドで権限を戻してください。

$ sudo chmod -R 755 ~/.

以上でインストールは終了ですが一度、再起動します。

$ exit

powershellで以下のコマンドを打ち込みます。

powershell
$ wsl --shutdown

その後、再度WSL2を立ち上げましょう。

llama-cpp-pythonのインストール

CUDAまわりのインストールが終わったため、次はllama-cpp-pythonのインストールを行います。
インストール自体はpipで出来ますが、その前に環境変数を設定しておく必要があります。

CUDA Toolkiの手順でも行いましたが、ほぼ同じように(設定する環境変数以外は同じ).bashrcファイルに環境変数を追加しましょう。

$ nano ~/.bashrc

カーソルキー↓で下に行き以下を追加

export LLAMA_CUBLAS=1
export FORCE_CMAKE=1
export CMAKE_ARGS="-DLLAMA_CUBLAS=on" 

追加後、ctrl+oを押下してenterで保存。ctrl+xでファイルを閉じます。
そのあと以下のコマンドで.bashrcの再読み込みを行います。

$ source ~/.bashrc

準備ができたのでllama-cpp-pythonをインストールしましょう。

$ # source ~/work/llm-sample/venv/bin/activate # 仮想環境の有効化
$ pip3 install llama-cpp-python

動作確認

以上で環境構築が完了したので、簡単な動作確認を行います。
以下からモデルをダウンロードしましょう。
https://huggingface.co/mmnga/ELYZA-japanese-Llama-2-7b-fast-instruct-gguf/blob/main/ELYZA-japanese-Llama-2-7b-fast-instruct-q4_K_M.gguf
上記は、以下をggufというllama.cppで動かせる形式に変換したモデル(の4bit量子化バージョン[1])です。

https://huggingface.co/elyza/ELYZA-japanese-Llama-2-7b-fast-instruct
ダウンロードしたらWSL2内の作業ディレクトリ(\home\<ユーザー名>/work/llm-sample/)に配置しましょう。

準備が整ったのでコードを書いていきます。

$ cd ~/work/llm-sample # 作業ディレクトリに移動
$ # source ~/work/llm-sample/venv/bin/activate # 仮想環境を有効化
$ code . # VSCode起動

以下、単純に日本の首都を聞くだけのサンプルコードです。

sample.py
from llama_cpp import Llama

# モデルの準備
llm = Llama(model_path="./ELYZA-japanese-Llama-2-7b-fast-instruct-q4_K_M.gguf",
    n_gpu_layers=20 # gpuに処理させるlayerの数(設定しない場合はCPUだけで処理を行う)
)

# プロンプトの準備
prompt = """
質問: 日本の首都はどこですか?
答え: """

# 推論の実行
output = llm(
    prompt=prompt,
    stop=["質問:", "答え:", "\n"], # 停止文字列を設定
    echo=True, # 解答だけでなくpromptも出力する
)

print(output["choices"][0]["text"]) # 結果を出力

上記を張り付けて実行しましょう。
実行結果のログから「BLAS = 1」を探します。

「BLAS = 1」 なら成功、「BLAS = 0」なら失敗(CPU実行になっています)です。
「BLAS = 0」になった場合は手順(環境変数まわりの設定を中心に)を再確認後、llama-cpp-pythonを(前述の再度インストールする際のコマンドで)再インストールしてください。

llmからの回答は以下となりました。

ん?
再度実行します。

問題なさそうです(何度か実行しましたがほとんどの回答は東京でした。時々はこういうこともあります・・・)。

おまけ

WSL2、Nvidiaドライバ、cuDNNのインストール後、VSCode以外は以下のようなシェルスクリプト(コマンドを列挙しただけですが)を実行 & 再起動することで設定が完了します。
一行一行実行してもそんなに変わりませんが、2回目以降の構築の際などある程度の時短にはなります。
CUDA_Toolkitのインストール、作業ディレクトリの作成、Python仮想環境に関してはそれぞれの環境に合わせて書き換えてください。

setup.sh
#!/bin/bash

# updateとupgrade
sudo apt update && sudo apt upgrade -y

# ビルドツールのインストール
sudo apt install build-essential -y

# python関連のインストール
sudo apt install python3 -y
sudo apt install python3-pip -y
sudo apt install python3-venv -y

# 古いGPGキーの削除
sudo apt-key del 7fa2af80

# ディレクトリの権限を一時的に変更
sudo chmod -R 777 ~/.
sudo chmod -R 777 /etc/apt/preferences.d/
sudo chmod -R 777 /usr/share/keyrings/

# CUDA_Toolkitのインストール(以下は12.1の場合です。インストールしたいバージョンのインストールコマンドを設定してください。)
wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-wsl-ubuntu.pin
sudo mv cuda-wsl-ubuntu.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/12.1.0/local_installers/cuda-repo-wsl-ubuntu-12-1-local_12.1.0-1_amd64.deb
sudo dpkg -i cuda-repo-wsl-ubuntu-12-1-local_12.1.0-1_amd64.deb
sudo cp /var/cuda-repo-wsl-ubuntu-12-1-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install cuda

# ディレクトリの権限を修正
sudo chmod -R 755 ~/.
sudo chmod -R 755 /etc/apt/preferences.d/
sudo chmod -R 755 /usr/share/keyrings/

# ~/.bashrcのコピー(バックアップ)を作成
cp ~/.bashrc ~/.org_bashrc

# 環境変数の設定(「>>」を「>」にすると上書きになってしまうため注意)
echo 'export PATH="/usr/local/cuda/bin:$PATH"' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"' >> ~/.bashrc
echo 'export LLAMA_CUBLAS=1' >> ~/.bashrc
echo 'export FORCE_CMAKE=1' >> ~/.bashrc
echo 'export CMAKE_ARGS="-DLLAMA_CUBLAS=on"' >> ~/.bashrc

# 作業ディレクトリの作成
mkdir -p ~/work/llm-sample

# Python仮想環境(作成と有効化)
# python3 -m venv ~/work/llm-sample/venv
# source ~/work/llm-sample/venv/bin/activate

# PyTorchのインストール
pip3 install torch torchvision torchaudio

# llama-cpp-pythonのインストール
pip3 install llama-cpp-python
nano setup.sh # ファイルを作成
bash setup.sh # 実行

再起動。

おわりに

長くなってしまいましたが以上です。
今回、llama-cpp-pythonのみ動作確認を行いましたが、CUDA環境が整えられたのでPytorch、langchainもGPU環境で実行可能です。

今後は、langchainやRAGについての記事を投稿予定(llmとは関連のない記事も徐々に書いていきたい・・・)です。
また機会があればよろしくお願いします。

参考

https://www.insurtechlab.net/run_llm_on_localmachine_using_lama_cpp_python/
https://qiita.com/cacaoMath/items/65d6a76b545eb662f581
https://tech.nkhn37.net/cuda-cudnn-install-windows/
https://note.com/npaka/n/n0ad63134fbe2

脚注
  1. 量子化することで軽量化したりメモリ使用量を抑えることができます。
    ですが、小さい値にすればするほど精度が低下します。gpuに余裕がある場合は、8bitなどより大きな値を選択しましょう。 ↩︎

Discussion