何の記事
ローカルホストにLLMをインストールし、性能を検証。 またapiを介して利用可能にする方法を検証。 最後に、社内のことを学ばせて、こういう質問が来たらこう答えてねってのを教え込ませる。
背景
自宅には計算資源がたくさんある。 それをネットワーク越しに使えるということがわかったので、LLM等の重い処理も自宅で動かして、軽量なフロントエンドと連携させる、 みたいなことが非常に簡単にできるということがわかった。 LLMで何をしたいか??お客さんからの問い合わせに自動で答えるチャットボットを作りたいのよね。 うん、社内の情報とかを学ばせないといけない。その辺のファインチューニングの仕方も知りたい。
参考記事
[ollamaについて] (https://bhrtaym-blog.com/?p=407)
[ローカルLLMをGPUで動かす] (https://zenn.dev/giana12th/articles/7fc22c8cbdbb5e)
proxmoxで動かすための下準備
GPUをパススルー必要がある。 あと、一番大きいモデルでは何倍とメモリが必要なんだっけ? 64GB以上あれば問題ないらしい。のでとりあえずそれをインストールしようと思う。
あとは、ProxmoxでGPUをパススルーする方法。 あー、「ホストマシンのBIOSにて、VT-x, VT-d を有効にする。(VT-d は PCI Passthrough で必須)」 する必要があるらしい。 しかし、実はCPUの仮想化をした時点でGPUの仮想化もできるようになってたっぽい。
でした準備は完了した。がメモっておくか
proxmoxのコンソールから、add hardware PCIeを選択し、GPUを入れる。
nvidia-driverをインストール
nvidia-smiが使えるか確認。認識されているかも確認 ちなみに、ここでcudaのバージョンが出てくるけど、これは対応しているcudaのバージョンを示しているだけで実際にcudaがインストールされたわけではありません。そこを気を付けてください。
cuda(ランタイム)をインストール しかし、これはdocker等で、cudaが入ったコンテナを配ってもらえれば終わる話なので、無視でいいのかな??ちょっと調べてみよう。
proxmoxのCPUのtypeをhostに変える。これをやらないとavx命令が使えない。これゆえGPUが使われなくなってしまう。
ollamaのインストール
dockerもある。 ollama on docker これを参考にnvidia-container-toolkitをインストールする感じか。
docker install後の苦戦
docker上のollama上で、llama3を動かすことには成功したんですよ。しかし、どうやらGPUでは動かせていいない。これはなんでかわかりました。
time=2024-07-19T00:29:37.242Z level=WARN source=gpu.go:225 msg="CPU does not have minimum vector extensions, GPU inference disabled" required=avx detected="no vector extensions"
CPUがavx命令をサポートしていないとGPUにオフロードされないみたいですね。 ほかのところでも同じことが言われていました。
GPU support requires the AVX instruction set, check your CPU model.
つまり、ProxmoxでどうにかしてavxをOnにする必要があるということです。 これのやり方ですが、cpuのtypeをホストにしたら解決するようです。ってことで変えて再起動します。
次の問題が発生。んー、なんかパススルー周りとかが関係している気がする。
結論
パススルーはできた。 パススルーするには、普通にProxmoxインストールして、biosでvirtualization をonにして、 ってだけで十分だった。今回はdockerとnvidia-container-toolの連携がうまくいってなかったのが問題だった。 だから、VM上に直接インストールして実行することにした。 結論、これたたくだけでollamaを実行できるようになった。
curl -fsSL https://ollama.com/install.sh | sh
web経由で使えるようにしたい
openwebui ってのがchatgpt likeなwebUIを提供してくれているらしい。 素晴らしいね。
どっかー上でアプリを立てるときのコマンドはこちら
docker run -d -p 3000:8080 -e OLLAMA_BASE_URL=https://example.com -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main
んで、OLLAMA_BASE_URLをapiのエンドポイントに変更する感じかな 俺の場合は、 http://100.64.1.17:11434 なんだけど、ollamaはデフォルトではローカルでしかlistenしていない。この設定を変えるために、
systemctl edit ollama.service
で設定ファイル?を開いて
[Service]
Environment="OLLAMA_HOST=0.0.0.0"
を追記すればおっけ
で、ここからはwebUIを追加する段階。なんだけど、フロント側で上のやつを実行すればよさそう
docker run -d -p 3000:8080 -e OLLAMA_BASE_URL=http://100.64.1.17:11434 -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main
うん、-p host:containerって順番だから、気を付けてね。よろぴくーー。 あとは、まあ、性能検証だね。
どれくらい性能が出るのか?問い合わせ対応として使うことはできるのか?そこが非常に気になっているところだ!!
必要な情報を全部入力として与えればちゃんと答えてくれるのか??非常に気になっている
GPTのお勉強
G = generative P = progressive T = transformer
原理は、普通のAIと同じなんよ。 500GBくらいのデータを学習させて、文章の続きをもっともらしいものを確率的に出す、というそういう仕組みになっている。
APIのパラメータ
temperature: テキストの多様性制御(高いと、クリエイティブな会話になる) top_p: 確率の累積値によるフィルタリング
プロンプトエンジニアリング
スタンダートプロンプトーー>非常に一般的な出力しかしてくれない。 そこで、ロールプロンプティングとかを使得るって話だ。
ロールプロンプティング
ex: あなたは一流の料理人です ex: 新人のAとYYYについて非常に知見があるBとの対話系s機で
マークダウン記法での情報伝達
人間が見やすい論理構造になっている文章は、GPTも理解しやすいって話だ。 なるほどな。これは勉強になる。
Chain of Thought
入力から出力までの試行手順を小手氏、再現性を向上
Program of Thought (POT)
論理的に伝えたいところはプログラムを書いてしまう方がいい。 というのも別にGPTはプログラムでも全然理解してくれるからね。
GPTで論理構造を図示する手段は
マーメイドしかない。つまり、絶対にマーメイド記法は覚えておいた方がいい。
マーメイド記法
こちらです。 https://notepm.jp/help/mermaid
ここでlive codingもできる ここでね
エンジニアが論理を説明するためのグラフはほとんどすべてmermaidで出力できる、ので、絶対に覚えておいた方がいいです、って話。
GPT4Oに添付図を再現するコード
これはえぐい。マジで、スクリーンショット2コードみたいなことができるようになる。 ドラフトも作れるようになる。えぐいな。実際これは、Figmaで作ったものをそのままhtml + cssを出力してくれるようになる。 えぐすぎないか??