DAIaryX

【DeepSeek R1】Nvidia GPU2台でAIサーバー構築【Phi-4】

しん

【DeepSeek R1】Nvidia GPU2台でAIサーバー構築【Phi-4】



ローカルLLM

いままで多くのローカルLLMを試してきましたが、DeepSeek-R1がリリースされたことで、やっと日本語でいろいろできる高性能なモデルが出てきたと感じています。
ChatGPT o1と比較しても、推論や数学、コーディングなどのタスクで同等の性能を持っているようです。

次回の記事でDeepSeek-R1を試しますが、今回はローカルLLMをNvidia GPUで使うためのLinux環境構築手順をまとめてみました。

AIサーバー

重要なのはGPUのVRAMで、通常のメモリも同程度ないとLLMをロードしたタイミングで落ちてしまいます。
GPU2台構成だと1000w以上の電源も欲しいところです。
マザーボードも重要で、複数のGPUを取り付けるには対象のマザーボードを選択する必要があります。
最新のNvidia RTX5090は32Gありますが、GPUは多くのスロットを専有するので、ケースも大きめにする必要があります。

GPU

Nvidia RTX3090 24G
Nvidia RTX3060 12G

メモリ

32G

電源

1200w


環境構築

PyTorchでGPUを使うために、PyTorchのCUDAバージョンとNvidiaドライバーの対応するCUDAバージョンを揃える必要があります。
Ubuntuをインストールして環境を構築していきます。

Ubuntu Server 24.04 LTSインストール

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


インストールが完了したら、NvidiaのGPUが物理的に認識されているか確認します。

lspci -nn | grep -i nvidia


nouveauドライバ無効化

Ubuntuインストール後、まずはデフォルトでLinuxにインストールされているGraphicsドライバ(nouveau)を無効化します。
これをしないとNvidiaのGPUと競合してエラーになってしまいます。

echo 'blacklist nouveau' | sudo tee -a /etc/modprobe.d/blacklist-nouveau.conf
echo 'options nouveau modeset=0' | sudo tee -a /etc/modprobe.d/blacklist-nouveau.conf
cat /etc/modprobe.d/blacklist-nouveau.conf
sudo update-initramfs -u


CUDAアンインストール(初回不要)

すでにインストールされている場合は以下のコマンドで確認し、存在すればアンインストールします。

dpkg -l | grep cuda
sudo apt --purge remove -y libnvidia*
sudo apt --purge remove -y nvidia-*
sudo apt --purge remove -y cuda-*
sudo apt --purge remove -y libcudnn*
sudo apt --purge remove -y cudnn-*
sudo apt autoremove -y

Nvidia driverインストール

sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
ubuntu-drivers devices

コマンドを入力すると以下のリストが表示され、recommendedが表示されます。
openがついているものは避けた方が良いみたいです。

model    : GA102 [GeForce RTX 3090]
driver   : nvidia-driver-535-server - distro non-free
driver   : nvidia-driver-470 - third-party non-free
driver   : nvidia-driver-545 - third-party non-free
driver   : nvidia-driver-565-open - third-party non-free
driver   : nvidia-driver-470-server - distro non-free
driver   : nvidia-driver-565 - third-party non-free
driver   : nvidia-driver-535-server-open - distro non-free
driver   : nvidia-driver-550 - third-party non-free
driver   : nvidia-driver-560-open - third-party non-free
driver   : nvidia-driver-535 - third-party non-free
driver   : nvidia-driver-550-open - third-party non-free
driver   : nvidia-driver-560 - third-party non-free recommended
driver   : nvidia-driver-535-open - third-party non-free
driver   : nvidia-driver-545-open - third-party non-free
driver   : xserver-xorg-video-nouveau - distro free builtin


recommendedされたnvidia-driver-560をインストールして再起動します。

sudo apt install -y nvidia-driver-560
sudo reboot


再起動後に以下コマンドで確認します。

nvidia-smi
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 560.35.03              Driver Version: 560.35.03      CUDA Version: 12.6     |
|-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA GeForce RTX 3090        Off |   00000000:05:00.0 Off |                  N/A |
|  0%   42C    P8             12W /  350W |       2MiB /  24576MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
|   1  NVIDIA GeForce RTX 3060        Off |   00000000:07:00.0 Off |                  N/A |
|  0%   33C    P8             12W /  170W |       2MiB /  12288MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

無事認識されたようです。
待機時の電力はそこまで大きくなさそうです。

CUDAインストール

以下のコマンドでインストールできます。

sudo apt install nvidia-cuda-toolkit


個別でインストールする場合は、こちらでバージョンを確認して、CUDA Toolkit Archiveからインストールしていきます。



torchインストール

Torchはpipでインストールするため、今回はvenvを使って環境をわけます。pipで直接インストールしても問題ないです。

必要なプロジェクトにvenvフォルダを作成

python -m venv venv

アクティベートすることで、プロジェクト用のpipを別管理

source venv/bin/activate

venv環境にpipでインストール

pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu124


phi4

GPUメモリが合計36Gあるので、ちょうど良さそうなmicrosoftのphi4を動かしてみます。



ファイルサイズが30G近くあるため、git lfsをインストールする必要があります。
modelsディレクトリに移動してgit cloneします。

git lfs install
git clone https://huggingface.co/microsoft/phi-4

公式のサンプルコードをphi.pyとして作成し、modelをmodels/phi-4に変更しておきます。

import transformers

pipeline = transformers.pipeline(
"text-generation",
model="models/phi-4",
model_kwargs={"torch_dtype": "auto"},
device_map="auto",
)

messages = [
{"role": "system", "content": "You are a medieval knight and must provide explanations to modern people."},
{"role": "user", "content": "How should I explain the Internet?"},
]

outputs = pipeline(messages, max_new_tokens=128)
print(outputs[0]["generated_text"][-1])

足りないものがあれば適宜インストールしていきます。

pip install accelerate


実行

python phi.py

30秒ほどで以下の文が生成されました。

{'role': 'assistant', 'content': 'Ah, greetings, traveler from the future! Thou art inquiring about a wondrous and mystical realm known as the Internet. Allow me to endeavor to explain this marvel in terms that might be more familiar to a knight of the realm.\n\nImagine, if thou wilt, a vast and invisible kingdom, not bound by the physical constraints of land or sea. This kingdom is filled with countless scrolls, tomes, and messages, all accessible at the mere wave of a hand. It is akin to a grand library, but one that stretches across the entire world, and it is ever-growing, with new knowledge and tales being added every moment.\n\nIn'}

文章を日本語で出力するように書き直して再度実行します。

messages = [
{"role": "system", "content": "You are a medieval knight and must provide explanations to modern people.日本語で返答してください。"},
{"role": "user", "content": "How should I explain the Internet?"},
]

日本語で返ってきましたが、途中で途切れているようです。おそらくmax_new_tokenの設定でしょう。

{'role': 'assistant', 'content': 'インターネットを説明するには、中世の概念を使っ説明すると分かりやすいでしょう。\n\nまず、インターネットを「広大な書庫」と考えください。この書庫には、世界中のすべての知識や情報が書かれた書物が無数に収めらています。これらの書物は、遠く離れた場所'}

こちらを512に書き換えて再度実行してみます。

outputs = pipeline(messages, max_new_tokens=512)
print(outputs[0]["generated_text"][-1])


512では以下のエラーが出てしまいました。

torch.OutOfMemoryError: CUDA out of memory

nvidia-smiを確認すると、RTX3090はまだメモリに余裕がありそうですが、RTX3060はギリギリです。

|-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA GeForce RTX 3090        Off |   00000000:05:00.0 Off |                  N/A |
| 47%   64C    P0            180W /  350W |   14087MiB /  24576MiB |     54%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
|   1  NVIDIA GeForce RTX 3060        Off |   00000000:07:00.0 Off |                  N/A |
|  0%   58C    P0             48W /  170W |   11916MiB /  12288MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

異なるGPUメモリでの2台構成なので、device_map="auto"の設定がうまくいってないようです。普段使っているllama-cpp-pythonではどちらも同じ割合で使ってくれますが、今回は諦めて256で出力します。

Token256で実行

outputs = pipeline(messages, max_new_tokens=256)
print(outputs[0]["generated_text"][-1])


こちらも途中までの出力ですが、先ほどより長く出力してくれました。日本語も問題なさそうです。

{'role': 'assistant', 'content': 'インターネットを説明するには、中世の概念を使って説明すると分かりやすいでしょう。\n\nまず、インターネットを「広大な書庫」と考えてください。この書庫には、世界中のすべての知識や情報が書かれた書物が無数に収められています。これらの書物は、遠く離れた場所にあっても、瞬時に手に取ることができるのです。\n\n次に、インターネットを「魔法の使者」と考えてください。この使者は、あなたが書いた手紙を世界中の人々に瞬時に届けることができます。また、他の人々からの手紙もすぐに受け取ることができるのです。\n\nさらに、インターネット'}

まとめ

Linuxサーバーに生成AI環境を構築することができました。
後はGPUの性能次第で、他の大きなモデルや画像生成、動画生成などのモデルも動かすことができます。

電気代以外にコストのかからないAI生成環境は魅力的だと思うので、興味ある方は是非チャレンジしてみてください。

次回はDeepSeek-R1を動かしてみます。

19

記事数

しん

Rails歴は10年以上で、バックエンド・フロントエンド・インフラ・ネットワーク全てやります。