🖥️

LLMの推論用にRTX3090 2台構成のPCを組んだので覚え書き

に公開

LLMの推論用にRTX 3090を2台搭載したPCを構築したので、その時の構成やセットアップの内容などを記録しておきます。

PC構成

今回構築したPCの構成は下記表の通りです。
CPUは前から使っていたものをそのまま流用しているので、ちょっとバランスが悪い構成になっちゃっています。

カテゴリ パーツ名
CPU Ryzen 5 3600
GPU VRAM 48GB / RTX 3090 VENTUS 3X 24G OC x 2
メモリ 128GB / Crucial 32GB DDR4-3200 UDIMM CT32G4DFD832A x 4
M.2 SSD 2TB / WD_Black SN850X NVMe SSD WDS200T2X0E
マザーボード ProArt B550-CREATOR
電源ユニット 1200W / Thermaltake TOUGHPOWER GF1 1200W PS-TPD-1200FNFAGJ-1
PCケース Fractal Design Define R5

あとはケースファンをケース標準のものから交換&増設していたりします。

OSのインストール

WindowsよりLinuxのほうがLLMの推論が早いそうなのでLinuxを入れることにしました。
ディストリビューションは DistroWatch.com のランキング を参考にしつつ、 Pop!_OS を選定してみました。

https://system76.com/pop/

他には Ubuntu、Linux Mint、EndeavourOS あたりのディストリビューションが候補でしたが、ネット上に情報が多いUbuntuの派生であることと、NVIDIAのドライバが標準でインストールされるという点を重視して Pop!_OS を選んでいます。

以下のような流れでセットアップしました。

  1. 公式サイトから Pop!_OS 22.04 LTS with NVIDIA のisoイメージをダウンロード
  2. isoイメージを、 Rufus を使用してUSBメモリ書き込み
  3. UEFIのセットアップ画面からセキュアブートを無効化する
  4. USBメモリからPCを起動する
    • UEFIブートで起動するとうまくOSが立ち上がらなかったのですが(起動途中に停止してしまう)、レガシーブートで起動させるとうまくいきました
  5. 画面の指示に従ってインストールを進める

LLM推論環境を整える

とりあえず使える程度に環境を構築します。

docker

入っていると何かと便利なので、 docker をインストールしておきます。
公式マニュアルに記載されている、Ubuntuへの導入方法に従ってインストールします。

https://docs.docker.com/engine/install/ubuntu/

ollama

LLMの推論環境としてはひとまず ollama を入れます。

https://ollama.com

公式サイトの記述に従ってインストールすれば systemd に登録されて、システム起動時に ollama が自動的に立ち上がるようにしてくれます。

インストールしたあとは /etc/systemd/system/ollama.service を編集して設定を追記します。

[Unit]
Description=Ollama Service
After=network-online.target

[Service]
ExecStart=/usr/local/bin/ollama serve
User=ollama
Group=ollama
Restart=always
RestartSec=3
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin"

# ↓ここから
Environment="OLLAMA_HOST=0.0.0.0"
Environment="OLLAMA_FLASH_ATTENTION=1"
Environment="OLLAMA_KEEP_ALIVE=4h"
Environment="OLLAMA_KV_CACHE_TYPE=q8_0"
Environment="OLLAMA_CONTEXT_LENGTH=32768"
# ↑ここまでを追記

[Install]
WantedBy=default.target

このあたりの設定はお好みで調整してください。

編集がおわったら下記コマンドで反映します。

sudo systemctl daemon-reload
sudo systemctl restart ollama

モデルはとりあえず google/gemma-3-27b-itQwen/Qwen3-32BQwen/Qwen3-30B-A3B あたりをダウンロードしておきます。

僕は unsloth 版の量子化モデルをダウンロードしました。

ollama pull hf.co/unsloth/gemma-3-27b-it-GGUF:Q4_K_XL
ollama pull hf.co/unsloth/Qwen3-32B-GGUF:Q4_K_XL
ollama pull hf.co/unsloth/Qwen3-30B-A3B-GGUF:Q4_K_XL

Open WebUI

LLM推論のフロントエンドとしてOpen WebUIを入れます。

https://github.com/open-webui/open-webui

リポジトリの README.md に記載されているdockerでの立ち上げ手順を参考にしつつ、以下内容で docker-compose.yml を作成します。

services:
  open-webui:
    image: ghcr.io/open-webui/open-webui:main
    container_name: open-webui
    ports:
      - 3000:8080
    extra_hosts:
      - host.docker.internal:host-gateway
    volumes:
      - open-webui:/app/backend/data
    restart: always

volumes:
  open-webui:

こちらのファイルを適当なディレクトリに保存したら、同じディレクトリ内で docker compose up -d を実行するとコンテナが立ち上がります。
コンテナの起動が完了したら、ブラウザで http://localhost:3000 を開くとOpen WebUIにアクセスできます。

Open WebUIにアクセスできたら、 管理者パネル を開いて 設定 > 接続 から Ollama APIManage Ollama API Connectionshttp://host.docker.internal:11434 と入力します。

これで 管理者パネルモデル の画面を開くと ollama で pull されているモデルが表示されると思います。

何も表示されない場合は、ホスト側のファイアーウォールでコンテナからの通信がブロックされている可能性があるため、sudo ufw allow 11434などで通信を許可しておきます。

僕は面倒なので sudo ufw disable でファイアウォール自体を無効化していますが自己責任で。


とりあえずここまで設定すればollamaでダウンロードしたLLMをOpen WebUIから使えるようになるはずです。やったね!

その他の設定

以下はお好みで設定します。

GPUのPowerLimit

GPUを2台も載せていると消費電力が気になるのでPowerLimitの設定します。

設定には以下リポジトリのスクリプトを使用しました。
nvpl.shをダウンロードして実行すると、システム起動時にGPUを指定した電力に制限するスクリプトを systemd に登録してくれます。

https://github.com/dbkinghorn/nv-gpu-powerlimit-setup

僕は 240W(80%) に制限するように設定しました。
この値は下記の投稿を参考にしています。

https://www.reddit.com/r/LocalLLaMA/comments/17tvg6e/rtx_3090_34b_inference_vs_power_setting/

Tailscaleを入れる

VPNサービスであるTailscaleを入れておくと、出先からでもマシンにアクセスできて便利です。

https://tailscale.com


おわりに

一般的な構成ではないのであまり参考にならないかと思いますが、もし同様の環境を構築しようと検討されている方などのお役に立ちましたら幸いです。
お疲れ様でした。

Discussion