見出し画像

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 list

DEG2の中身は 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 -L
Fri 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 8081

llama.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

いいなと思ったら応援しよう!

zephel01 サーバー代とコーヒー代になります☕ 役に立ったら応援よろしくお願いします!