ZoomAPIでミーティング作成
前の記事
いままで多くのローカルLLMを試してきましたが、DeepSeek-R1がリリースされたことで、やっと日本語でいろいろできる高性能なモデルが出てきたと感じています。
ChatGPT o1と比較しても、推論や数学、コーディングなどのタスクで同等の性能を持っているようです。
次回の記事でDeepSeek-R1を試しますが、今回はローカルLLMをNvidia GPUで使うためのLinux環境構築手順をまとめてみました。
重要なのはGPUのVRAMで、通常のメモリも同程度ないとLLMをロードしたタイミングで落ちてしまいます。
GPU2台構成だと1000w以上の電源も欲しいところです。
マザーボードも重要で、複数のGPUを取り付けるには対象のマザーボードを選択する必要があります。
最新のNvidia RTX5090は32Gありますが、GPUは多くのスロットを専有するので、ケースも大きめにする必要があります。
GPU | Nvidia RTX3090 24G |
---|---|
メモリ | 32G |
電源 | 1200w |
PyTorchでGPUを使うために、PyTorchのCUDAバージョンとNvidiaドライバーの対応するCUDAバージョンを揃える必要があります。
Ubuntuをインストールして環境を構築していきます。
以下のページからUbuntu Server 24.04 LTSをダウンロードしてインストールします。
インストールが完了したら、NvidiaのGPUが物理的に認識されているか確認します。
lspci -nn | grep -i nvidia
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
すでにインストールされている場合は以下のコマンドで確認し、存在すればアンインストールします。
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
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 |
+-----------------------------------------+------------------------+----------------------+
無事認識されたようです。
待機時の電力はそこまで大きくなさそうです。
以下のコマンドでインストールできます。
sudo apt install nvidia-cuda-toolkit
個別でインストールする場合は、こちらでバージョンを確認して、CUDA Toolkit Archiveからインストールしていきます。
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
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で出力します。
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を動かしてみます。