【Phi-3-Medium】GPU2台構成でローカルLLMを動かす【Ubuntu24】

はじめに

GMO NIKKOの吉岡です。
みなさん、生成AIは活用してますか?
ChatGPTに始まり、Claude3やGeminiなど、実用的なAIがどんどん出てきてますね。
自分も使ってはきましたが、課金が気になってしまいます。
これではサービスに組み込むことは難しいですよね。
そのためローカルで動くLLMを追ってきましたが、今年に入って実用的な日本語を返すことができるモデルがいくつか出てきているので、サーバー構成からインストール方法、LLMの起動まで紹介しようと思います。

ローカルLLMを動かす上で一番重要なのはGPUのVRAMです。
LLMは7B、13B、70Bモデルが多いですが、量子化しない場合、必要なVRAM容量は動かすモデルの大体2倍なので、13Bモデルでは26GのVRAMが必要です。
NVIDIAのGPUを使ったCUDAが前提になっているのですが、一般向けでは24Gモデルが最大で、それ以上必要であれば複数台構成にする必要があります。
マザーボードもそれに合ったものを選ばなければいけないので、サーバー構成も重要です。

サーバー構成

CPU:Core i5-13500T 14core 20thread 1.2GHz TDP35W

マザーボード:PRIME H770-PLUS D4

GPU:NVIDIA RTX 3090 24G

GPU:NVIDIA RTX 3060 12G

Memory: DDR4 32G

電源:Corsair HX1200

CPU

サーバーとして動かすので、CPUに関してはTDPが低く、仮想化しやすいスレッド数の多いものを選んでます。CPUの種類やチップセットに合ったマザーボードを選択する必要があります。

マザーボード

はじめに動かそうとしていたGPUがNVIDIAのサーバー用GPUだったため、BIOSからResizable BARやAvobe 4G Decodingなどの設定ができる新しめのマザーボードを用意する必要がありました。
また、高性能なGPUは複数スロットを占有してしまうため、複数GPUに対応したスロットの多いマザーボードだけでなく、余裕のあるケースも必要です。

GPU

GPUはCUDAの使えるNVIDIA製でメモリの多いものを選びます。
RTX3090は10万円以上するのでNVIDIAのサーバー用GPUで代用しようとしてましたが、頑張って動かしてもGPUパススルーができなかったり、高温になってソフトが落ちたりと多くの問題が発生して諦めました。

Memory

メモリが少ないとLLMロードのタイミングで落ちるので、GPUメモリと同じくらいあると良さそうです。

電源

電源は1000W以上で、電源効率の良いものを選んでおけば問題なさそうです。

準備

OS:Ubuntu Server 24.04 LTS

ドライバ:nvidia-driver-535-server

Ubuntu Server 24.04 LTSインストール

以下のページからUbuntu Server 24.04 LTSをダウンロードしてインストールします。
Ubuntuを入手する | Ubuntu | Ubuntu

インストール後、GPUが物理的に認識されているか確認

nouveauドライバ無効化

LinuxでNvidiaのGPUを使うためにnouveauドライバを無効化します。

NVIDIA Driverインストール

nvidia-smiコマンドでGPU毎の温度や消費電力、使用メモリが表示できます。

cudaインストール

Python関連のパッケージをインストールしておきます。

 

以下のURLからCUDAインストール
CUDA Toolkit Archive | NVIDIA Developer

上記URLからバージョンとOSを選択すればインストール用コマンドが表示されますが、2024年5月30日現在、ubuntu24が選択できないため、コマンドからインストールします。

LLM

LLM:microsoft/Phi-3-medium-128k-instruct · Hugging Face 14B

LLMは14BのPhi-3-Mediumを使ってみます。
Phi-3はSLMと呼ばれるみたいですが、14BであればLLMに含めてもいいのではないでしょうか。

git clone

フォルダを作成し、huggingfaceからcloneします。
大きなファイルがあるため、git lfsが必要です。

パッケージインストール

venvでPython環境を分けてインストールします。

サンプルコード実行

まずはサンプルコードを実行してみます。
vi sample.pyとして以下を保存します。

以下コマンドで実行します。

エラーになってしまいました。
OutOfMemoryと言われているので、VRAMが足りないみたいです。
2台合わせてVRAM36Gあるので足りないことはないと思うのですが、nvidia-smiコマンドで確認します。
watch nvidia-smiコマンドで2秒間隔で確認できます。

どうもRTX3090にしかロードされていないようです。
コードを変更して、複数台構成に対応させてみます。
以下のようにdevice_map=”cuda”をdevice_map=”auto”に変更します。

メモリロードはどうでしょうか?

ちゃんと分散して読み込まれているようです。 

2x + 3 = 7の方程式も説明しながら解いてくれました。

日本語で回答

日本語で回答してもらうようにプロンプトを追加して、再度実行します。

ちゃんと日本語で説明して正しい回答をしてくれましたが、日本語での回答:と同じ内容を繰り返してしまってます。おそらく質問が英語だからだと思います。

計算問題

プロンプトを日本語のみに変更して実行してみます。

今度は日本語の回答のみを返してくれました。
こんな計算までできるんですね。

複数情報を与えて計算

情報を与えて営業キャッシュフローマージンを計算してみます。

営業キャッシュフローマージンという内容を理解して、与えた情報を元に割合まで出してくれました。
GPUの需要が高いのですごい利益になってますが、一般向けGPUはもう少し安くしてほしいものです。

 まとめ

無事サーバーでLLMを動かすことができました。
Phi-3-Mediumは適当に選びましたが、日本語の回答精度も高く、計算もできるLLMがローカルで動かせるのに驚きました。
今回はサンプルを動かすだけなので、毎回LLMを読み込み、回答まで1分近くかかってしまってますが、APIサーバーとして動かしている時は数秒で返すことができてます。
GPUが高価なので動かすハードルは高いですが、ローカルで動作する環境は便利なので、興味ある方はぜひチャレンジしてみてください。