零一萬物AI Infra工程師面試經歷:分佈式訓練+GPU優化+集群管理全考察

AI Infra作者: 美歷團隊

3年AI Infra經驗面試零一萬物AI Infra工程師崗位,三輪技術面詳細復盤,涵蓋3D並行與ZeRO優化、CUDA編程與GPU優化、集群調度與容錯設計等核心考點

背景介紹

我做了3年AI Infra相關的工作,之前在一家大廠的AI平台部門負責GPU集群管理和分佈式訓練框架的維護,日常和DeepSpeed、Megatron打交道,也做過CUDA kernel優化。零一萬物是李開復博士創辦的AI公司,技術氛圍很好,他們的AI Infra團隊在招人,我覺得這是個很好的機會,既能繼續做我擅長的方向,又能參與從零構建大模型訓練基礎設施的過程。投簡歷後大概5天約了面試。

面試流程復盤

一面:分佈式訓練 + DeepSpeed/Megatron(約2小時)

一面的面試官是Infra團隊的核心工程師,上來就問分佈式訓練的問題,節奏很快。

第一個問題:數據並行、張量並行、流水線並行的原理分別是什麼?我從三個維度講了:數據並行是每個GPU持有完整模型副本,不同數據切片;張量並行是把模型的權重矩陣切分到不同GPU上;流水線並行是按層切分模型,不同GPU負責不同層。面試官追問了3D並行中這三種並行方式怎麼組合,我說了通常先做流水線並行(層間切分),再在每個stage內做張量並行(層內切分),最後做數據並行。面試官點了點頭。

接下來是DeepSpeed的重點:ZeRO的三個級別分別優化了什麼?我詳細講了ZeRO-1切分優化器狀態、ZeRO-2額外切分梯度、ZeRO-3額外切分模型參數,以及每個級別節省的顯存比例。面試官追問了ZeRO-3的通信開銷怎麼優化,我說了預取參數、通信計算重疊、連續內存分配幾個方法。

然後問Megatron:Megatron-LM的張量並行是怎麼做的?我講了列並行和行並行的切分方式,以及在前向和反向傳播中如何通過All-Reduce同步。面試官追問了Megatron的序列並行是什麼,我說了把LayerNorm和Dropout的激活值也切分到不同GPU上,進一步節省顯存,面試官說理解正確。

還問了一個比較深入的問題:混合精度訓練的原理和注意事項,我講了FP16計算+FP32主權重+Loss Scaling的流程,面試官追問了動態Loss Scaling和靜態Loss Scaling的區別,我說了動態會根據梯度是否溢出自動調整scale,更穩健但稍慢。

最後問了一個實戰題:如果訓練過程中出現OOM,你會怎麼排查?我說了先看是哪個階段OOM(前向/反向/優化器更新),然後分析顯存佔用(模型參數/梯度/優化器狀態/激活值),再根據情況選擇優化策略(ZeRO級別/梯度檢查點/激活重計算)。面試官覺得排查思路比較系統。

二面:GPU優化 + CUDA(約2小時)

二面的面試官是做GPU優化的專家,問得非常硬核。

開場就是:CUDA的線程層次結構是什麼?我講了Grid、Block、Thread三級結構,以及Warp的概念。面試官追問了Warp Divergence是什麼?對性能有什麼影響?我講了同一個Warp內的線程如果執行不同的分支路徑,會串行執行,導致性能下降。面試官追問了怎麼避免Warp Divergence,我說了重新組織線程映射、使用分支消除技巧、調整數據佈局等方法。

然後是重點:GPU的內存層次結構是什麼?各有什麼特點?我講了Global Memory(大但慢)、Shared Memory(小但快,同一Block內共享)、寄存器(最快但最少)、L1/L2 Cache。面試官追問了Shared Memory的Bank Conflict是什麼?怎麼避免?我講了32個Bank的並行訪問機制,如果多個線程訪問同一個Bank的不同地址就會衝突,可以通過Padding、調整訪問模式來避免。

CUDA編程實戰題:寫一個高效的矩陣乘法Kernel。我現場寫了使用Tiling技術的Kernel,利用Shared Memory減少Global Memory訪問。面試官看了之後問了幾個優化點:怎麼進一步優化?我說了使用向量內存訪問(float4)、寄存器分塊、雙緩衝預取、Warp-level矩陣乘法指令。面試官說優化思路不錯。

還問了一個很實際的問題:怎麼Profile CUDA程序的性能?我介紹了Nsight Systems和Nsight Compute兩個工具,前者看全局的時間線和瓶頸,後者看單個Kernel的詳細性能指標。面試官追問了常見的性能瓶頸有哪些,我說了內存帶寬瓶頸、計算瓶頸、啟動開銷、同步開銷。

最後問了一個綜合題:大模型訓練中的通信和計算怎麼重疊?我講了梯度分片後邊計算邊通信、通信域的拓撲優化、NCCL的通信算法選擇。面試官說理解得比較全面。

三面:集群管理 + 項目深挖(約1.5小時)

三面是Infra團隊的負責人,聊集群管理和項目經驗。

GPU集群的調度系統怎麼設計?我講了基於Kubernetes的GPU調度、多租戶隔離、優先級調度、彈性伸縮幾個核心功能。面試官追問了GPU碎片區怎麼處理,我說了碎片整理、任務排隊等待、小任務聚合幾個策略,面試官補充說還可以做GPU時間片共享。

訓練任務的容錯機制怎麼設計?我講了定期保存Checkpoint、故障檢測(進程心跳/NCCL超時)、自動重啟恢復、彈性訓練幾個方面。面試官追問了Checkpoint的保存策略怎麼優化,我說了異步保存、增量保存、分佈式保存幾個方法,面試官覺得方案比較成熟。

項目深挖環節,面試官讓我講之前做的GPU集群管理項目。他問得特別細:集群規模多大?多少個GPU?調度延遲多少?故障恢復時間多少?我一一回答了,還說了我們遇到的一個難題:大規模訓練時NCCL通信經常超時,我們通過調整網絡拓撲和NCCL參數解決了。

最後問了一個系統設計題:設計一個支持千卡級別大模型訓練的集群管理系統。我從資源管理、任務調度、故障恢復、監控告警、成本優化幾個模塊設計了方案,面試官說架構設計合理,但提醒我要注意網絡拓撲感知的調度和跨機房訓練的網絡優化。

真題匯總

1. 數據並行、張量並行、流水線並行的原理和3D並行組合

2. ZeRO三個級別的優化內容和通信開銷優化

3. Megatron-LM張量並行和序列並行

4. 混合精度訓練原理和動態/靜態Loss Scaling

5. 訓練OOM排查思路

6. CUDA線程層次結構和Warp Divergence

7. GPU內存層次結構和Shared Memory Bank Conflict

8. 高效矩陣乘法Kernel優化

9. CUDA性能Profile工具和常見瓶頸

10. 大模型訓練中通信和計算重疊

11. GPU集群調度系統設計

12. GPU碎片區處理

13. 訓練任務容錯機制設計

14. Checkpoint保存策略優化

15. 千卡級別訓練集群管理系統設計

心得建議

1. 分佈式訓練是AI Infra的核心:3D並行、ZeRO、Megatron這些必須深入理解,不只是知道概念,還要能說清楚實現細節和優化策略。

2. CUDA編程能力是硬門檻:AI Infra崗位對CUDA要求比其他方向高很多,線程模型、內存層次、性能優化這些都要扎實,面試官會直接讓你寫Kernel。

3. 集群管理經驗很加分:GPU調度、容錯恢復、監控告警這些工程經驗面試官很看重,有Kubernetes經驗會加分。

4. 要有大規模系統的經驗:AI Infra不只是單機優化,還要考慮千卡級別的集群管理,網絡拓撲、通信優化、故障恢復這些系統級問題面試官會考察。

5. 性能調優要有方法論:不是憑感覺優化,而是先Profile找到瓶頸,再有針對性地優化,面試官很看重你的系統性思維。

FAQ

Q:面試對CUDA編程要求多高?
A:要求比較高,二面直接讓寫矩陣乘法Kernel,還要說優化方案。建議至少寫過幾個常用的Kernel,理解Tiling、Shared Memory優化等基本技術。

Q:需要了解零一萬物的技術棧嗎?
A:面試中沒直接問,但從問題來看,用了DeepSpeed、Megatron、自研的調度系統,了解這些框架會有幫助。

Q:對網絡知識有要求嗎?
A:有,特別是RDMA、InfiniBand、NCCL這些,大規模訓練中網絡通信是瓶頸,面試官會問相關的問題。

Q:面試有手寫代碼嗎?
A:一面有寫偽代碼,二面有寫CUDA Kernel,三面主要是系統設計,代碼量比其他方向多。

Q:面試週期多長?
A:從投遞到三面結束大概三週,每面間隔4-7天,節奏偏慢但可以充分準備。

#AI Infra#分布式训練#DeepSpeed#Megatron#CUDA#GPU優化#集群管理#ZeRO