💭

Rinna-3.6B のLoRAファインチューニングをWindows11上でやってみた

2023/07/17に公開

はじめに

npakaさんのGoogle Colab で Rinna-3.6B のLoRAファインチューニングを試すの記事を拝見して、手持ちのGeForce RTX 4090搭載PCでどれくらい時間かかるかやってみたいと思ったのでやってみました。

Windows11 + Anacondaで同じようにできると高をくくってたんですが、後述の理由でうまく動作せず、結果 WSL上のUbuntu環境でやる羽目になって面倒だったのでセットアップを含むログを残しておこうと思います。

試した環境は以下のとおりです。

  • Core i9-13900
  • 64GB RAM
  • GeForce RTX 4090
  • Windows 11 Pro

うまくいった結果

npakaさんの記事をほぼ写経したnotebookを実行してうまくいきました。学習時間は1時間50分くらい。GPUフル回転です。

learning_steps

task_manager

学習後のモデルで推論した結果はこちら。記事の通り質問に対して端的に回答できているので、学習できてるっぽい感じがします。

generate("自然言語処理とは?")
### 指示:<NL>自然言語処理とは?<NL><NL>### 回答:<NL>言語モデルとは、自然な言語を生成するために使用される数学的モデルです。自然語処理は、人間が話す自然で自然に感じられる言語で、コンピューターが理解できる言語に変換するプロセスです</s>

言語モデルとは、自然な言語を生成するために使用される数学的モデルです。自然語処理は、人間が話す自然で自然に感じられる言語で、コンピューターが理解できる言語に変換するプロセスです
generate("日本の首都は?")
### 指示:<NL>日本の首都は?<NL><NL>### 回答:<NL>東京</s>

東京
generate("ステイルメイトとはなんですか?")
### 指示:<NL>ステイルメイトとはなんですか?<NL><NL>### 回答:<NL>チェスでは、ステイルズメイトは引き分けを意味します。  チェスの引き分けは、ゲームの開始時に、双方がチェックメイトになるまで駒を動かさず、相手が動かした駒が自分の駒にチェックされるまで続く。</s>

チェスでは、ステイルズメイトは引き分けを意味します。  チェスの引き分けは、ゲームの開始時に、双方がチェックメイトになるまで駒を動かさず、相手が動かした駒が自分の駒にチェックされるまで続く。

Windows11ローカルでだめだった理由

この部分でエラーが発生しました。

from transformers import AutoModelForCausalLM

# モデルの準備
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    load_in_8bit=True,
    device_map="auto",
)

transformers.AutoModelForCausalLM.from_pretrainedload_in_8bit=Trueを立てると内部でbitsandbytesが使われるようですが、bitsandbytesは現状Windowsに対応しておらず、8bit量子化で読み込むことができません。ここで詰みました。

bitsandbytesはLinux上では動作するため、WSL環境に切り替えることにしました。

WSL Ubuntu 22.04 LTSに環境構築する

Windows 11で WSLを利用して簡単にUbuntu 22.04 LTSをセットアップすることができます。セットアップ後にUbuntu上でCUDAを動作させる必要があるため、そのためのセットアップを行います。

CUDA 12.x をセットアップする

こちらのWindows 11 で CUDA on WSL2 環境を構築するを参考にCUDAをセットアップします。記事のとおりWindows上にCUDAドライバをセットアップした後に、Ubuntu上でシェルスクリプトを起動してUbuntu上にドライバをセットアップします。当方の環境ではすでにCUDA 12.1がセットアップ済みだったため、Ubuntu上でのセットアップシェルの実行からやりました。

ただ、CUDAレポジトリの仕様が変わったためか、こちらの記事に掲載されているシェルスクリプトではエラーが発生し、正常にセットアップすることができませんでした。そのため、CUDA 12をダウンロードしてセットアップできるようシェルスクリプトを更新しました。更新したスクリプトを以下に掲載します。

install-cuda-on-wsl.sh

セットアップが成功したあと、Ubuntu上でnvcc -Vを叩くとバージョン情報が返ります。

nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2023 NVIDIA Corporation
Built on Tue_Jun_13_19:16:58_PDT_2023
Cuda compilation tools, release 12.2, V12.2.91
Build cuda_12.2.r12.2/compiler.32965470_0

Ubuntu上のドライバは12.2がセットアップされ、当方のWindows11上のドライバは12.1と差が出ましたが、問題なく動作しています。

動作確認が必要な場合は記事にもあるようにcuda-samplesをCloneしてSamples/1_Utilities/deviceQueryあたりをコンパイルして実行してみると良いと思います。

pyenv + Jupyter-Labをセットアップする

Ubuntu上にpyenvをセットアップします。Pythonは3.10.12にしました。

sudo apt install -y gcc make build-essential libssl-dev libffi-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev liblzma-dev

git clone https://github.com/pyenv/pyenv.git ~/.pyenv

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.profile
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.profile
echo 'eval "$(pyenv init -)"' >> ~/.profile

source ~/.profile

pyenv -v
pyenv 2.3.22-6-gb81204c0

pyenv install 3.10.12
pyenv global 3.10.12

python -V
Python 3.10.12

Jupyter-Labをセットアップします

python -m pip install --upgrade pip
pip install jupyterlab ipywidgets

Jupyter-Labを起動してhttp://localhost:8888にアクセスします

jupyter-lab --ip='0.0.0.0'

ファインチューニングを実行する

上記にも掲載したNotebookをJupyter上で実行するとファインチューニング&推論が実行できます。

Finetuning_Rinna3_6b.ipynb, UseTunedRinna.ipynb

おわりに

ちょっと回り道した感がありましたが、LinuxのCUDA環境も構築できたので良しとします。今回のようにWindowsだと動かないとか、その逆のケースが発生する可能性があるので両方が評価できるWindows + WSLはとても便利だと感じました。

Discussion