AI 沒有猜錯,但我還是不知道自己在看哪一張 RTX 3060

從 GPU Name、Index、Bus ID 到 VBIOS Version,一場關於「可信觀測點」的除錯旅程

最近在研究 Ollama 與 llama.cpp 的 GPU 排程行為。一開始只是想搞清楚幾個小問題:為什麼 Windows 工作管理員看到的數字,跟 nvidia-smi 看到的不太一樣?為什麼有些模型看起來應該跑在某張卡上,行為卻又不像?

查著查著,我突然發現一個更根本的問題:

我根本不知道自己正在看哪一張 RTX 3060。

我的機殼裡插著三張長得一模一樣的 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 把它接進自動化:

nvidia-smi –query-gpu=index,name,pci.bus_id,vbios_version –format=csv

三張卡的「身分證」完整出列。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 給的每個答案,其實都是對的:

UUID 可以唯一識別 GPU——沒錯。
Bus ID 可以唯一識別當下的 PCIe 裝置——沒錯。
Index 可以定位 CUDA Device——在很多環境也沒錯。

問題在於:我問的是「我手伸進機殼摸到的這張卡,到底是誰」,AI 回答的是「作業系統眼中的這張卡是誰」。兩邊都沒錯,但根本不是同一個問題。

很多 Bug 也是這樣。不是答案錯,而是問題定義錯。

真正的體悟:先建立可信的觀測點

一開始,我只是想知道「到底是哪張 RTX 3060 在工作」。結果最後發現:GPU Name 不可靠、Index 不可靠、連 Bus ID 與肉眼看到的位置都不一定可靠。最後是靠 VBIOS Version 這個平常根本不會注意的資訊,才替三張長得一模一樣的卡建立起身分證系統。

回頭整理,這次破案的方法論其實只有一句話:在一堆長得一樣的欄位裡,抓出那個 different key。一個合格的識別主鍵要同時滿足三個條件:

可區分——三張卡的值必須不同(GPU Name 在這裡就出局了)。
不可變——不隨重開機、換插槽、改 BIOS 設定而漂移(Index 與 Bus ID 在這裡出局)。
程式讀得到——貼紙上的出廠日期再清楚也沒用,軟體看不到就不能當觀測點(VBIOS 正是它的軟體代理)。

而找到它的路徑,是從「肉眼可見但程式不可見」的差異(貼紙出廠日),退一步推導出「跟著它走、而且程式可見」的屬性(韌體版本)。這個退一步,才是整場除錯真正的轉折點。

很多時候,除錯真正困難的地方,不是答案找不到,而是你還沒建立起足夠可信的觀測點。當觀測點錯了,後面的推論全部都會跟著錯。

幾個實務上的落地建議:

程式或監控腳本裡,以 VBIOS Version 或 GPU UUID 作為主鍵,Bus ID 與 Index 只當作「當次開機的暫時座標」。
建立自己的對照表,例如 _GPU_LABELS = {0:"Zotac", 1:"MSI-22", 2:"MSI-25"},並在每次換卡、驅動更新、BIOS 設定變更後重新核對一次。
順帶一提:閒置時 nvidia-smi 顯示 PCIe Gen1.1 是節能降速的正常現象,別誤判成插槽故障。

難怪唐伯虎進華府當差,都要先取個 9527 的代號。同型號的東西一多,沒有獨一無二的識別代號,真的會抓狂。

而主機板設計的 slot 位置,跟你眼睛看到的位置——不一定是同一回事。😄

作者:Mr. τ/風雲網通系統

#GPU識別 #VBIOS #nvidia-smi #RTX3060 #Observability #可信觀測點 #PCPiLOT

Last modified: 2026-06-11

Author

Comments

Write a Reply or Comment

Your email address will not be published.