Windows + WSL2 + VSCode + RemoteContainers + LLM(Phi2/elyza ...)
ローカル環境でサクッと HuggingFace の Llm を動かすための設定など。 nvidiaのグラボがあることと、WSL2 + Docker Desktop + VSCode が利用できることが前提です。
Windows 11 だと以下のコマンドと再起動
wsl --install
winget install -h Microsoft.VisualStudioCode
winget install -h Docker.DockerDesktop
うまくいかない場合は、アプリの更新をしてみる(winget自体が古いことが原因だったりするので。。)
code --install-extension ms-vscode-remote.remote-containers
コンテナからGPUを使うために、各レイヤーに必要なソフトを入れる。
それぞれに必要なものと対処をまとめるとこんな感じ。
レイヤー | 必要なもの | 対処 |
---|---|---|
Container | cuda-toolkit | インストール済みイメージを使用する |
WSL + Docker | nvidia-container-toolkit | インストールする |
Windows | nvidia driver | インストールする |
下から順に設定していく
通常のグラフィックボードのドライバー更新を行う(GeforceExperienceから最新のドライバに更新など)
手動でのダウンロードはここ
WSLを起動して以下のコマンドを実行。
# ダウンロード元のレポジトリを追加
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
&& curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
# パッケージリストを更新
sudo apt-get update
# コンテナツールキットをインストール
sudo apt-get install -y nvidia-container-toolkit
参考
以下のページから、使いたいOSとCUDAバージョンのイメージを確認する
現時点で最新の Cuda 12.3.1 Ubuntu 22.04 の場合は nvidia/cuda:12.3.1-base-ubuntu22.04
なので以下のコマンドを実行
sudo docker run --rm --gpus all nvidia/cuda:12.3.1-base-ubuntu22.04 nvidia-smi
GPUの情報が表示されれば準備は完了です。
- コマンドパレット(Ctrl + Shitf + P)から、「Dev Containers: ReOpen in Container」を選択
- ターミナルから実行したいプログラムを起動
サンプルとして、 phi-2 と ELYZA-japanese-Llama-2-7b の起動サンプルを含んでいる。
※各サンプルプログラムのライセンスは、それぞれの著作者にしたがう。
phi-2 の サンプルを起動する場合は以下のように入力する。
python3 phi2.py
コンテナ起動の都度モデルのダウンロードが不要なように、Transformers のモデルのキャッシュは hfCache というディレクトリに配置するようにしている。
VRAM 8GB の環境では、ダウンロード不要になる変わりにメモリへのロードで時間がかかるためそれほどメリットはなかった。。
キャッシュの保存が不要な場合は devconainer.json の以下をコメントアウトすることで都度ダウンロードするようになる。
{"type":"bind","source":"${localWorkspaceFolder}/hfCache", "target":"/root/.cache/huggingface", "consistency": "delegated"}