AI 沒有猜錯,但我還是不知道自己在看哪一張 RTX 3060
從 GPU Name、Index、Bus ID 到 VBIOS Version,一場關於「可信觀測點」的除錯旅程
最近在研究 Ollama 與 llama.cpp 的 GPU 排程行為。一開始只是想搞清楚幾個小問題:為什麼 Windows 工作管理員看到的數字,跟 nvidia-smi 看到的不太一樣?為什麼有些模型看起來應該跑在某張卡上,行為卻又不像?
查著查著,我突然發現一個更根本的問題:
我的機殼裡插著三張長得一模一樣的 RTX 3060:同晶片、同 12GB 容量、外觀幾乎沒有差別。當兵時學過「四清、兩點、五查、三找」,裝備識別一個都不能少。沒想到二十年後在自己家裡,我被三張顯示卡逼著把這套紀律重新拿出來用——而且用得比當兵時還狼狽。
GPU 識別其實不是問題本身。它是為了驗證推論系統行為,不得不先解決的前置問題。觀測點如果不可信,後面所有的推論都會跟著錯。以下是這趟除錯的完整過程,包含 AI 助理陪我一起猜錯的每一層。
四層誤判
1第一層誤判:GPU Name
三張卡通通顯示 NVIDIA GeForce RTX 3060。完全沒用,毫無區別。
2第二層誤判:nvidia-smi 的 Index(GPU 0 / 1 / 2)
很多人第一反應是看 Index。但這台機器一路從 GTX 750 Ti、GTX 1050 換到 RTX 3060,我早就見識過:換卡、驅動更新、BIOS 設定變更,Index 順序都可能洗牌。Index 是 CUDA 列舉出來的編號,不是卡的身分。
3第三層誤判:PCI Bus ID
這時 AI 助理開始信心滿滿:「用 PCI Bus ID 就好了,它對應實體插槽。」聽起來很合理,結果踩了兩個坑。
第一個坑:主機板設計的 slot 編號順序,跟你眼睛看到的位置,不一定是同一回事。Bus ID 由主機板的 PCIe 拓樸決定,不保證等於肉眼由左到右的順序。
第二個坑更狠:我在 BIOS 把 PCIe 強制設定為 Gen3 之後,重開機,三張卡的 Bus ID 直接從 01 / 03 / 04 變成 01 / 02 / 03。也就是說,Bus ID 連「跨一次 BIOS 設定變更」都撐不過去。把它當主鍵寫進程式,等於埋一顆定時炸彈。
4第四層轉折:出廠日期是貼紙,程式看不到
真正的麻煩其實在兩張 MSI 身上。Zotac 跟 MSI 至少還能靠品牌欄位分開,但兩張 MSI 3060 12GB 是同廠同型號,軟體能讀到的規格資訊幾乎一模一樣。
肉眼能看到的唯一差別,是卡上貼紙印的出廠日期:一張 2022/12,一張 2025/7。問題是——那是一張貼紙。電腦程式看不到貼紙。
於是退一步想:有沒有什麼屬性,是「跟著出廠時間走」而且「軟體讀得到」的?答案浮出來了:BIOS 版本,或者它的發行日期。出廠批次不同,燒進去的韌體版本幾乎不可能相同。
打開 GPU-Z 逐張檢查,三張卡的 VBIOS 版本數字清清楚楚地分開了,而且跟出廠日期成正比:
| 卡片 | 出廠日期(貼紙) | VBIOS 關鍵碼 |
|---|---|---|
| Zotac | 2021/3 | 94.06.14.80.18 |
| MSI | 2022/12 | 94.06.25.00.87 |
| MSI | 2025/7 | 94.06.2F.40.f7 |
14 → 25 → 2F(十六進位),版本號本身就刻著時間軸。貼紙上的出廠日期,終於有了一個軟體讀得到的對應物。
接下來只要用 nvidia-smi 把它接進自動化:
三張卡的「身分證」完整出列。VBIOS Version 是燒在卡上的韌體版本,跟著卡走,不會因為換插槽、重開機、改主機板 BIOS 設定而改變:
| 物理位置 | 品牌 / 出廠 | PCI Bus ID | VBIOS Version | Index | 角色 |
|---|---|---|---|---|---|
| 最外側 | Zotac(2021/3) | 01:00.0 | 94.06.14.80.18 | 0 | x4 亮機 / 小模型 |
| 中間 | MSI(2022/12) | 02:00.0 | 94.06.25.00.87 | 1 | x16 主推理 |
| 靠 CPU | MSI(2025/7) | 03:00.0 | 94.06.2f.40.f7 | 2 | x16 主推理 |
不是靠某個神奇指令解決問題,而是經歷了完整的一輪:收集證據 → 建立假設 → 驗證假設 → 推翻假設 → 再驗證。最後才找到真正可靠的識別方法。
AI 沒有猜錯,但也沒有回答到我的問題
回頭看這段過程,有個地方特別值得記下來。AI 給的每個答案,其實都是對的:
問題在於:我問的是「我手伸進機殼摸到的這張卡,到底是誰」,AI 回答的是「作業系統眼中的這張卡是誰」。兩邊都沒錯,但根本不是同一個問題。
很多 Bug 也是這樣。不是答案錯,而是問題定義錯。
真正的體悟:先建立可信的觀測點
一開始,我只是想知道「到底是哪張 RTX 3060 在工作」。結果最後發現:GPU Name 不可靠、Index 不可靠、連 Bus ID 與肉眼看到的位置都不一定可靠。最後是靠 VBIOS Version 這個平常根本不會注意的資訊,才替三張長得一模一樣的卡建立起身分證系統。
回頭整理,這次破案的方法論其實只有一句話:在一堆長得一樣的欄位裡,抓出那個 different key。一個合格的識別主鍵要同時滿足三個條件:
而找到它的路徑,是從「肉眼可見但程式不可見」的差異(貼紙出廠日),退一步推導出「跟著它走、而且程式可見」的屬性(韌體版本)。這個退一步,才是整場除錯真正的轉折點。
幾個實務上的落地建議:
_GPU_LABELS = {0:"Zotac", 1:"MSI-22", 2:"MSI-25"},並在每次換卡、驅動更新、BIOS 設定變更後重新核對一次。難怪唐伯虎進華府當差,都要先取個 9527 的代號。同型號的東西一多,沒有獨一無二的識別代號,真的會抓狂。
而主機板設計的 slot 位置,跟你眼睛看到的位置——不一定是同一回事。😄
作者:Mr. τ/風雲網通系統
#GPU識別 #VBIOS #nvidia-smi #RTX3060 #Observability #可信觀測點 #PCPiLOT
Comments