LLMのための環境構築_wsl2有効化からDockerまで

# 背景

ChatGPT4は圧倒的だが倫理ガードが厳しすぎるのでローカル環境にLLMが欲しくなり挑戦することを決心。
環境構築とかぜんぜんやったことなくて、実は一年前にLLM環境作ろうとして頓挫しています。
再チャレンジがんばります。

なお、自分の環境は以下です。

OS: windows11 pro
CPU: Core(TM) i7-13700K
メモリ: DDR4 128GB
GPU:GEFORCE 4070ti


# やりたいこと

- Linuxでやると推論早いらしいので、windows上にLinux環境が建てられるらしいWSL2とやらを導入する
- 環境構築で楽がしたい＆影響を限定したいので仮想化する
- フレームワークとしてpytorch入れる
- なんらかのLLMを入れて会話する

# やったこと

## GPUドライバーのインストールとCUDA有効化

※ここは一年くらい前にLLM環境構築でやってたのでスキップ。やり方忘れてしまってます。

CUDAというのは、通常はグラフィック処理のために使うGPUをグラフィック以外に使うために必要なやつらしいです。
後述しますが、CUDAのバージョンでLLMが動く、動かないがあるらしいので、仮想化ではCUDAバージョンも分けて使えるようにします。

https://e-words.jp/w/CUDA.html

コマンドラインで
```
nvidia-smi
```

と入れて以下のように出てくればドライバーとCUDAのセットアップはOKのようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565603/57e0352f-9db4-fe81-7353-6a96df67aa32.png)




## wsl2の有効化とLinuxOSインストール

こちらの記事を参考に対応。

https://learn.microsoft.com/ja-jp/windows/wsl/install

https://www.kagoya.jp/howto/it-glossary/develop/wsl2_linux/

詳細は記事を読んでいただくとして、やったことを箇条書き。
- コマンドプロンプトからwslのインストールとアップデート実行
- インストールは適当にUbuntuと入れたら「Ubuntu 22.04.3 LTS (GNU/Linux 5.15.90.1-microsoft-standard-WSL2 x86_64)」が入りました

## BIOSのセキュアブート無効化

@karaage0703 さんの記事より。BIOSのセキュアブートがわるさしてGPUが使えないことがあるようなので無効化しました。
手順は記事参照のこと。

https://qiita.com/karaage0703/items/e79a8ad2f57abc6872aa#docker%E3%81%A7%E3%81%AEgpu%E5%AD%A6%E7%BF%92%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E3%81%AE%E6%B5%81%E3%82%8C

## 仮想化_UbuntuにDockerとnvidia-dockerを入れる

こちらの記事を参考に、Dockerを入れてゆきます。

https://blog.shikoan.com/wsl2-ndivid-docker-pytorch/

https://www.ibm.com/docs/ja/maximo-vi/continuous-delivery?topic=planning-installing-docker-nvidia-docker2

記事に出てくる「nvidia-docker2」というのが何者かわからず調べてみたら、いい感じに説明してくれている記事が。

https://licensecounter.jp/devops-hub/blog/nvidia-2/

抜粋すると以下。あと別記事で「GPUドライババージョンだけ気に知れてれば、あとはnvidia-dockerがよしなにやってくれる」とありました。

- 「PyTorchに限らずGPU利用できるディープラーニングのフレームワークは、フレームワークのバージョンに合わせてCUDA/CuDNNのバージョンも対応させる必要があります（ソフトウェアのビルドの関係）。GPUドライバののバージョンアップが、フレームワークの更新の大きな手間になることがしばしばあります。しかし、nvidia-dockerでは、GPUドライバはDockerイメージ側でやってくれるので、**Dockerイメージの更新（「docker run」のバージョンだけ変える）だけですべて対応**できます。これが非常に嬉しいポイントです。」
- また、各環境はあくまでDockerイメージなので、**異なるCUDAのバージョン/異なるPyTorchのバージョンを1つのPCに共存**させることが可能です。PyTorchではあまり問題になりませんが、バージョンの依存性の強いTensorFlowでは嬉しい仕様ではないでしょうか。

### 問題発生_curlができない

さっそくインストールするぞーと「curl」コマンド打ったがなんかちゃんと動かない。アクセス先が見つからないというエラーがでる。
ChatGPT4さまの助けを借りつつ原因切り分けすると、DNSサーバー設定があやしい。
こんなQAも。

https://teratail.com/questions/c4r7m2dkdhpkr6

QAにあった手順でWSL2のUbuntuのDNSサーバーをgoogleのDNSサーバーに切り替えたら直りました。
ただ、このままだとUbuntuの起動のたびにDNSサーバーの情報が初期化されるので、バッシュファイル作ってそこでgoogleDNSを設定するように記述。あと$(ARCH)という変数がコマンドに出てきたけど定義されていない、ということも多発したので、ARCH=amd64（自分の環境のUbuntuのアーキテクチャ。ほかにも種類あるらしい）を定義しました。

あと色々とコマンドが効かなかったので、パッケージを入れ直し。
記事を見てるとパッケージ入れるときに「yum」とか「apt」とかのコマンドが出てきて混乱したが、これはパッケージマネージャと呼ばれるものらしい。コマンド実行のためにいろいろな依存関係があるのを一括管理してくれるのだとか。
LinuxにはRedHat系とかDebian系とかがあり、それによって使えるパッケージマネージャに違いが出てくるらしい。
なので、yum、apt、rpmとか出てきたら「同じものだから読み替えればいいんだな」と思えば良さそう。ただし記法が違うみたいなのでChatGPTさまに「yumをaptに変えたらどう書きます？」と聞きながら対応します。

※どこかでパッケージマネージャについて整理したい。

### 問題発生_docker hubのバージョンが存在しないと言われる

IBMにあるコマンドのdocker hubのバージョンがなくなっていて実行できなかったので、Docker hubのページを直接見に行った。ここにあるバージョンで指定したらいけました。

https://hub.docker.com/r/nvidia/cuda

### 問題発生_Dockerが動かない

Windows機能のHyperVを有効化する必要があるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565603/d62b424c-f7c0-e1c8-7897-d3fc24215a47.png)

### 問題発生_wsl2が動かない

こちらの記事を参考に.wslconfigファイルを削除したら直りました。

https://zenn.dev/karaage0703/articles/e30c9614a55bdb



## 仮想化_WindowsのVSCodeからUbuntu環境にアクセスできるようにする

いろいろ読んでたら、Windowsで実行しているVScodeから、WSL2上のLinux環境にアクセスして開発と実行ができるらしいです。素敵やん。
以下の記事を参考に実施。

https://docs.docker.jp/desktop/windows/wsl.html#docker-wsl-2

https://learn.microsoft.com/ja-jp/windows/wsl/tutorials/wsl-containers

やったことをざっくり。
- WindowsのVScodeに拡張機能インストール
    - VS Code WSL 拡張機能をインストール
    - VS Code Dev Containers 拡張機能をインストール
    - VS Code Docker 拡張機能をインストール
- Docker Desktop のインストール
    - Docker Desktop の[設定]>[全般] で、「WSL 2 ベースのエンジンを使用する」を有効化
    - Docker Desktop の[設定]>[リソース]>[WSL Integration]\(WSL 統合\) に移動して、Docker 統合を有効にするインストール済みの WSL 2 ディストリビューションから選択

これで設定は完了しました。
以下で動作するかの確認をします。

詳細は上記MS記事
https://learn.microsoft.com/ja-jp/windows/wsl/tutorials/wsl-containers#develop-in-remote-containers-using-vs-code
を参照してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565603/cc01c4f9-7f59-ec80-4ec8-fb9629364934.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565603/f638d181-84de-cc0c-c8f2-4024cb4a96ae.png)


ちゃんと動いてますね。
続きは別記事で書きます。