EVO-X2にeGPUを2台させたら、また地獄があった話 — RTX 5090 + RTX 3090 デュアルeGPU構築記
結論(先に言う)
この構成、また最強になりました。ただし、そこに至るまでにもう一回だけ地獄を通りました。
EVO-X2(AMD Ryzen AI Max+ 395 / RAM 128GB)
+ OCuLink → RTX 5090(32GB) ← 安定稼働中
+ USB4 → RTX 3090(24GB) ← ここで再び地獄
結論:
・地獄の犯人は EVO-X2 でも Strix Halo の USB4 でもなく
・「USB4ドック個体(DEG2)」だった
・ドックを AG02 に替えたら一発で解決前回『EVO-X2 + OCuLink + RTX 3090 で外付けGPUローカルLLM環境を構築したら“地獄→最強“だった話』の続編です。まだの方はこちらからどうぞ
※正確に言うと、AMD AI MAX+ 395 RADEON 9060なのでトリプルGPUです。
今回やりたかったこと
前回、OCuLink + RTX 3090 で「最強」に到達しました。その後 RTX 5090(32GB)を追加し、5090をメインに据えています。そこで欲が出ました。
1台のミニPCに
eGPUを2台ぶら下げて
5090と3090を使い分けたい5090(32GB)はOCuLinkで安定稼働中。これは触らない
空いているUSB4ポートに、もう1枚の3090(24GB)をぶら下げる
用途で使い分け、いずれは2枚を束ねて大型モデルへ
やりたいことはシンプル。……なのですが、前作を読んだ方ならお察しの通り、素直には終わりませんでした。
検証環境

❌ 地獄再び:USB4の3090が「認識するけど1秒で切れる」
USB4ドックの Minisforum DEG2 に 3090 をつないだ瞬間から、雲行きが怪しくなりました。
症状
一瞬認識する → 数秒で切断
→ lspci に 3090 は出てこない切り分けのため、思いつく限りを試しました。
5090を外して、3090単体でDEG2に接続 → ダメ
起動前からケーブルを挿しておく → ダメ
どうやってもリンクが安定しません。前作の「真っ黒画面」とはまた違う、別ベクトルの地獄です。
切り分け:boltctl は通るのに PCIe が張れない
USB4/Thunderbolt の状態は `boltctl` で見えます。ここで正体が判明しました。
boltctl listDEG2の中身は ASMedia 246x(ASM2464PD チップ) でした。そして状態遷移が異様です。
connected → (約1秒後)authorized → 直後に disconnectedつまり USB4の認証層(bolt)まではOK なのに、その先で切れる。案の定、`lspci` に3090は一度も現れませんでした。
lspci | grep -i nvidia # ← 3090が出てこないこれが今回いちばんの学びでした。
boltctl(USB4認証層)はOK
↓
でも PCIe トンネルが張れない
↓
= ドック側のハードウェア実装を疑うフェーズ認証は通っているので、ソフト設定やカーネルよりも「物理層・ドックの実装」が怪しい、という当たりがつきます。
❌ カーネルパラメータでも救えなかった
一応、ソフト側の対策も全部やりました。前回から入れていた `pci=realloc pcie_aspm=off pcie_port_pm=off` に、USB4/Thunderbolt向けの定番を追加します。
# GRUB_CMDLINE_LINUX に追記
iommu=pt pcie_ports=native thunderbolt.clx=0 thunderbolt.host_reset=0結果は——
boltctl 認証:OK(変わらず通る)
PCIe リンク確立:❌ 依然ダメカーネルパラメータをどう盛っても、DEG2ではリンクが立ちませんでした。ここで「これはソフトで殴る問題ではない」と腹をくくります。
この後、Oculinkでも動かないので不良品の可能性が濃厚のため返品に…
解決:ドックを AOOSTAR AG02 に交換したら一発だった
疑いはDEG2個体に向いていたので、ドックを AOOSTAR AG02 に交換しました。

OCuLink・USB4 両対応
内蔵 800W PSU(電源まわりに余裕)
そして——ログイン後にUSB4ケーブルをホットプラグしただけで、あっさり認識しました。
lspci | grep -i nvidia
# 03:00.0 ... GA102 [GeForce RTX 3090] ← 出た!
nvidia-smi
# RTX 5090 と RTX 3090 が2枚並ぶ`dmesg` も完全にクリーンでした。DEG2の時とは別世界です。
thunderbolt: 「ASMedia 246x」検出
→ リタイマー ×2 認識
→ pciehp: Link Up
→ 64bit プリフェッチ窓 [mem 0x7000000000-0x8fffffffff] 確保(128GB分)以後、フル負荷でも切断ゼロ。同じASM2464チップでも、ドックの実装(あるいは電源まわり)でここまで挙動が変わるのかと、正直しびれました。
今回の教訓
犯人は EVO-X2 の設定でも
Strix Halo の USB4 でもなく
DEG2 個体(ASM2464実装 or 電源)だったUSB4ドックは「対応チップが同じ=同じように動く」ではありません。ここは声を大にして言いたいところです。
2枚のGPUを使い分けるコマンド
無事に2枚並んだので、用途で切り替えられるようにしておきます。
# まずUUIDを確認
nvidia-smi -LFri Jul 10 01:03:31 2026
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 610.43.02 KMD Version: 610.43.02 CUDA UMD Version: 13.3 |
+-----------------------------------------+------------------------+----------------------+
| 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:03:00.0 Off | N/A |
| 0% 57C P0 119W / 350W | 0MiB / 24576MiB | 0% Default |
| | | N/A |
+-----------------------------------------+------------------------+----------------------+
| 1 NVIDIA GeForce RTX 5090 On | 00000000:C5:00.0 Off | N/A |
| 0% 46C P8 13W / 600W | 4MiB / 32607MiB | 0% Default |
| | | N/A |
+-----------------------------------------+------------------------+----------------------+
+-----------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=========================================================================================|
| No running processes found |
+-----------------------------------------------------------------------------------------+# 3090だけで llama-server を起動(UUID指定)
CUDA_VISIBLE_DEVICES=<3090のUUID> \
./build/bin/llama-server -m model.gguf -ngl 999 -fa 1 --port 8081llama.cpp 側のデバイス指定でもOKです。
# 見えているデバイスを一覧
./build/bin/llama-server --list-devices
# デバイスを名前で指定
./build/bin/llama-server -dev CUDA0 ...ビルドは両世代(Ampere=86 / Blackwell=120)を1バイナリに詰めておくと楽です。
cmake -B build -DGGML_CUDA=ON \
-DCMAKE_CUDA_ARCHITECTURES="86;120"ベンチマーク:3090(USB4)vs 5090(OCuLink)
せっかく2枚あるので、同一条件で殴り合わせました。
ベンチ内容
独自ベンチ「llmbench」:SWE-bench風のコーディングバグ修正課題 40タスク(easy / medium / hard / expert / frontier)
llama.cpp server(OpenAI互換API)経由
モデル:Qwopus3.6-27B-v2 Q4_K_M(両GPU共通)
全体サマリー

生成トークン総数はほぼ同じ(差 +2.2%)なのに、5090は合計時間が約半分。速度差がそのまま実時間に効いています。
「USB4は定常推論のボトルネックにならない」を実証
前作で立てた仮説の答え合わせです。生成速度の比を見てみます。
速度比(5090 / 3090):1.85倍
メモリ帯域比(1792 / 936 GB/s):約1.91倍速度比がほぼ帯域比に一致しました。つまり生成(トークン出力)はメモリ帯域で律速されていて、接続方式(USB4 か OCuLink か)は定常推論のボトルネックになっていない、ということです。前作の仮説を数字で裏付けられました。
負荷中の実測値

3090はUSB4接続でもきっちり99%まで回りきっています。「USB4だから頭打ち」という現象は、少なくとも27B・Q4_K_Mの推論では観測されませんでした。
面白かった観察:生成は非決定的
品質面はほぼ互角でした。40タスク中、combinedスコアの差が大きかったのは t021 と t004 の2件のみで、残り38タスクは差が±1.5以内です。
そのうえで、面白い1件がありました。
t021(銀行家丸め / banker's rounding):3090で失敗、5090で成功
同一モデル・同一プロンプトなのに結果が割れた
3090は completion_tokens 1162 でテスト不合格、5090は 1715 トークン生成して正解に到達
これはGPUの性能差というより、生成の非決定性の話です(この解釈のみ推測、数値は実データ)。同じ入力でも出力トークン列が変われば、通るテストも変わる。ローカルLLMを評価するときに頭の隅に置いておきたい挙動です。
一方、t020(電卓の演算子優先順位)は両GPUとも失敗しました。これは接続でもGPU世代でもなく、モデル自体の限界と考えるのが自然です。
残課題(正直に書く)
全部が丸く収まったわけではありません。
⚠️ アイドル時、3090が P0 / 113W に張り付く負荷が無いのにパワーステートが下がりきらない現象が残っています。原因は調査中で、まだ答えを持っていません。分かったら追記します。
まとめ
EVO-X2 に OCuLink(5090)+ USB4(3090)のデュアルeGPU は成立する
ただしUSB4ドックは個体で動作が激変する。DEG2はダメ、AG02は一発だった
切り分けの鍵は boltctl は通るのに lspci に出ない → PCIe物理層/ドックを疑う
生成速度は帯域律速。USB4接続でも3090は99%回り、定常推論の足を引っ張らない
速度比 1.85倍 ≒ 帯域比 1.91倍。前作の仮説を実測で確認
USB4のeGPUで「認識するけど切れる」に悩んでいる方は、カーネルパラメータで消耗する前に、一度ドックを疑ってみてください。犯人はケーブルの先にいるかもしれません。
次回予告
2枚並んだからには、次はこれをやります。
# 5090(32GB)+ 3090(24GB)を束ねて 56GB に
./build/bin/llama-server --tensor-split 4,3 ...`--tensor-split` で 合計56GB を作り、単体では載りきらない大型モデルに挑みます。異世代・異接続のGPUを混ぜて束ねたとき、速度と安定性はどうなるのか——次回、検証します。フォローして待っていてください。
#LocalLLM #eGPU #RTX5090 #RTX3090 #USB4 #OCuLink #EVOX2 #Ubuntu #llamacpp #自作PC #AI
いいなと思ったら応援しよう!
サーバー代とコーヒー代になります☕ 役に立ったら応援よろしくお願いします!