ローカルLLMを運用しようと思って購入したEVO-X2。
届いてから半月ぐらい放置しちゃってたんだけど、ようやっと時間と気力とが揃って触れたので、Ollamaを動かすまでにやったことのメモと実際に運用してみた感触について書いてみようと思う。
なぜEVO-X2なのか?
LLMをはじめとしたディープラーニング技術というのは、超ざっくり説明すると巨大な"あみだくじ"=モデルを作成・調整して、"ある入力"に対する"適切な出力"を導き出すようにしたものであるといえる。
より正確・精細な回答を求めようとするということ=入力・出力の解像度を上げていくということであり、あみだくじの紙面がどんどん大きくなっていくわけだ。
ことLLMの動作においては、その巨大なあみだくじを広げるに足るだけの大きな作業机=VRAM(GPUのメモリ)容量が必要となってくるのだが、ここが一般人にはネックになってくる。
グラフィックボードではメモリはオンボードになっており(通常の手段では)メインメモリのように買い足しての増設するようなことはできないし、近年のGPUメーカーのラインナップを眺めてみても手を出しやすい価格帯のGPUのVRAM容量が劇的に増えていくことは期待できそうにない。
大きなVRAMを搭載したグラフィックボードは相応に高額で一般家庭が手を出せるものではないし、LLMの水準でVRAM容量を考えると高価格帯でも1枚では十分とはいえず、複数枚刺しをするとなると電源や筐体・マザーボードなどGPU以外の部分でも出費や運用環境でハードルが高い。
VRAM容量を渇望するローカルLLM界隈ではグラフィックボード以外の道として
- Apple Sillicorn機のMacのユニファイドメモリ(メインメモリとVRAMとが共用=VRAMとしては大きな容量を割り当てられる)を頼る
- Nvidia DGX Sparkを待つ
という択もあったが、前者もこれはこれでかなりの出費を強いられるし、Apple Sillicornの機械学習系の対応にはちょっと不安感がある。
AppleのMLX(Mac版のCUDAみたいなもん)が崩壊しかけたとかいうウワサがtwitterで出回ってるとか。もしMLX無くなったらAppleのAI戦力はボロボロ。ソースはブルームバーグの記事で、MLXチームのエンジニアたちが「辞めま~す」とか言い出して、Appleは慌てて「辞めないで」つってまあ給料上げるかなんか…
— うみゆき@AI研究 (@umiyuki_ai) 2025年7月1日
後者はある意味「間違いない」選択肢ではあるものの、やはり価格面は高く付きそう(アカデミックで70万円って話を聞いた)だし、そもそもいつ手に入るも怪しい。(「価格や納期については要問合せ。」ってなかなか圧あるよな)
アーキテクチャはArm系でUbuntuベースとはいえカスタムOSというのも、なかなか別用途には使いまわしずらそうである。
そんな中で登場したのがEVO-X2で、
- Apple Sillicornと同様にメインメモリとVRAMが共有なので大容量を割り当てられる(128Gモデルなら96Gまでいける)
- (あくまで主観的な印象ではあるけど)元々Nvidiaへの対応軸であるAMDのdGPUなのでApple Sillicornよりは機械学習系の対応(ROCm)に期待が持てそう
- 肝心のGPU性能自体も十分高そう
- 筐体がコンパクトで置き場所に困らなそう
- 通常のPCと同じアーキテクチャなので最悪LLM用途で使わなくなっても普通のゲーミングPCとして潰しが効く
- クーポン込みで30万円は相対的には安価
ということで、決して安い買い物ではなかったけれどLLMへの興味とある種の投資として購入に至った。
セットアップメモ
ローカルLLMとは全く関係ない部分もあるが個人的なメモということでご容赦を。
SSDの換装
Ubuntuとして運用しようと考えているのとプリインストールのWindowsはバックアップとして取っておきたいということで、別で買ったSSDに換装することに。
筐体下部のゴム脚を外すと金属パーツ部分を固定しているネジが出てくる。(粘着剤が着いてるのがちょっと嫌っぽいが・・・)
これの幅の厚い方の計4つを外すことでSSD等にアクセスできる。
コンパクトな筐体にしては割と空間に余裕があるので、ガッツリしたヒートシンクがあるSSDなんかでも大丈夫そう。
特段こだわりなく値段で↑選んだ。
設置できないリスクを考えて薄めのを選んだけど、もっとゴツいのでも良かったかも。
BIOSでVRAMサイズを96Gに指定
ver. 1.04からVRAMサイズの指定ができるようになったらしいんだけど、
幸いにしてうちのは最初から1.04だったのでBIOSアプデ作業は不要そう。
AdvancedのGFX ConfigurationからVRAMサイズを最大の96Gに指定してSAVE&再起動。
Ubuntu24.04 Desktopインストール
Ollamaとかの運用だけでいうとServerの方でも良かったんだけど、何かしらでデスクトップ的な使い方をする機会もあるかもなーということでDesktop版を選択。
https://jp.ubuntu.com/download
別のPCでISOファイルをダウンロードしてUSBメモリにインストールメディアを作成してインストール。
universal-usb-installer.jp.uptodown.com
vim/sshd/net-tools/nvtopをインストール
ひとまず使い慣れたエディタとしてvimとリモートからの接続にsshd、あとネットワークまわりの確認のためにnet-toolsとGPUの使用状況確認にnvtopを導入。
$ sudo apt update $ sudo apt-get install vim opensshd-server net-tools nvtop
CapsとCtrlの入れ替え
ちょっとした操作性改善ということで定番のCapsと左Ctrlを入れ替える。
$ sudo vim /etc/default/keyboard --- /etc/default/keyboardに以下の記述を加える XKBOPTIONS="ctrl:swapcaps" --- $ sudo systemctl restart console-setup
メモリのスワップ領域の増量
$ sudo swapoff -a $ sudo fallocate -l 32G /swapfile $ sudo chmod 600 /swapfile $ sudo mkswap /swapfile $ sudo swapon $ /swapfile none swap sw 0 0 $ sudo /swapfile none swap sw 0 0 $ sudo vim /etc/fstab --- /etc/fstabに以下を記述 /swapfile none swap sw 0 0 ---
AMDGPUドライバとROCmのセットアップ
当然いるよねということで。
やることはまんまコピペになるんだけど↓の感じ。
$ wget https://repo.radeon.com/amdgpu-install/6.4.1/ubuntu/noble/amdgpu-install_6.4.60401-1_all.deb $ sudo apt install ./amdgpu-install_6.4.60401-1_all.deb $ sudo apt update $ sudo apt install python3-setuptools python3-wheel $ sudo usermod -a -G render,video $LOGNAME $ sudo apt install rocm $ sudo apt install "linux-headers-$(uname -r)" "linux-modules-extra-$(uname -r)" $ sudo apt install amdgpu-dkms
ここまでやって念の為再起動。
Dockerをインストール
個人的には素で色々なものを動かすよりは、手軽に作り壊しができる方が好きなのでDocker導入。
これまたまんま公式コピペで。
$ sudo apt update $ sudo apt-get install ca-certificates curl $ sudo install -m 0755 -d /etc/apt/keyrings $ sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc $ sudo chmod a+r /etc/apt/keyrings/docker.asc $ echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null $ sudo apt-get update $ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin $ sudo apt-get update
あと毎度sudoするの面倒なのでdockerグループへの追加など。
$ sudo groupadd docker $ sudo usermod -a -G docker $USER
ここまでやって再起動。
Ollama+WebUIをDocker Composeで動かす
以下のようなcompose.ymlを作成。
# compose.yml services: ollama: restart: always image: ollama/ollama:rocm ports: - "11434:11434" devices: - /dev/kfd:/dev/kfd - /dev/dri:/dev/dri volumes: - ollama:/root/.ollama open-webui: depends_on: - ollama restart: always image: ghcr.io/open-webui/open-webui:main volumes: - open-webui:/app/backend/data ports: - 3000:8080 extra_hosts: - host.docker.internal:host-gateway volumes: ollama: open-webui:
このcompose.ymlのあるディレクトリで起動。
$ docker compose up -d
ROCmまわりは触るの始めてだったので不安だったのだが、devicesまわりの記述だけすれば存外すんなり動かせてしまった。
Syncthing導入
家庭内の他のPCとのファイル同期なんかで。
$ sudo apt install syncthing $ sudo systemctl enable syncthing@$USER $ sudo systemctl start syncthing@$USER
すんなりaptで入った。
あとはGUIの方で色々と設定。
Obsidian導入
これまた最近すっかり手放せなくなったエディタのObsidian導入。
最初はSnap版の方を使おうと思ったんだけど、どうにも日本語入力に問題がありそうなのでFlatpakの方で。
色々試行錯誤しての記録なんで不要な手順あるかもだけど。
$ sudo apt-get install fuse libnss3-dev $ sudo apt install flatpak gnome-software-plugin-flatpak $ flatpak install flathub md.obsidian.Obsidian $ flatpak run md.obsidian.Obsidian
デスクトップでメニューから起動できるように.desktopファイルを配置&改変。
$ cp /var/lib/flatpak/app/md.obsidian.Obsidian/current/active/files/share/applications/md.obsidian.Obsidian.desktop ~/.local/share/applications/ $ vi .local/share/applications/md.obsidian.Obsidian.desktop --- # Exec項とIcon項を改変 Exec=flatpak run md.obsidian.Obsidian %u Icon=/var/lib/flatpak/app/md.obsidian.Obsidian/current/active/files/share/icons/hicolor/512x512/apps/md.obsidian.Obsidian.png ---
実際にOllamaを運用してみた雑感
nvtopコマンドで確認してみると、ちゃんと96GのVRAMが使われていることやP-modeボタンで消費電力が変わることが確認できる。
筐体のファン音もそこまで気になるほどのもあのではなく、今のところは期待通りかな。
普段使い用途
チャットで何かしらの情報を検索させたりまとめさせるような普段遣い用途で使ってみた感じ、Llama3.3:70bとかもっと大きなモデルも動かせなくはないんだけど、Gemma3:27bが動作速度的にも回答内容的にも、あと並列動作を見越しての余裕を考えてもちょうど良い感じがする。
コーディングエージェント
今アツい分野であるコード生成もやってみようということでVisualStuido CodeにClineを入れて色々と試してみた。
チャットの方のように「モデルさえロードできればとりあえず動く」という世界観では無さそうで、色々シビアでそもそもちゃんと動くモデル・設定を模索している最中という感じではあるが、とりあえずPhi4:14bのコンテキストだけ延ばしたもの(↓のModelfileでcreate)である程度コード生成はしてくれた。
FROM phi4:14b PARAMETER num_ctx 16384
Cline側のRequest Timeout設定はデフォルトは30000msなんだけど、そのままだと厳しい雰囲気があるんでガッツリ長めに600000msとかで設定した方が良さそうではある。
スペックの余力でいえばもっと大きいモデルも動かせるはずだし、それである程度ちゃんとしたものができるようになるとローカルLLMを運用する具体的なメリットにもなってくるので、引き続きこのへんは研究していきたい。
今後やってみたいこと
手近なところではtodoや日記などをobsidianに集約すればテキストデータとしてLLMに読ませることができるので、それを前提知識として日常の受け答えをさせるようなこともできるかもしれない。
Webカメラなんかを接続して定期的に撮影して、それを画像を解釈してくれるllama3.2-visionなんかを使っての文字データに変換してライフログ(この語も昨今すっかり聞かなくなったなあ)にするようなこともできるかもしれない。
自分の中では画像生成系はあんまり食指が動かないんだけど、FramePackで画像を動画として動かす方は面白いなと思っているので、そっちはROCm環境で動かせるのかチャレンジしてみたい。