零一萬物AI Infra工程師面試經歷:分佈式訓練+GPU優化+集群管理全考察
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參數解決了。
最後問了一個系統設計題:設計一個支持千卡級別大模型訓練的集群管理系統。我從資源管理、任務調度、故障恢復、監控告警、成本優化幾個模塊設計了方案,面試官說架構設計合理,但提醒我要注意網絡拓撲感知的調度和跨機房訓練的網絡優化。
真題匯總
- 數據並行、張量並行、流水線並行的原理和3D並行組合
- ZeRO三個級別的優化內容和通信開銷優化
- Megatron-LM張量並行和序列並行
- 混合精度訓練原理和動態/靜態Loss Scaling
- 訓練OOM排查思路
- CUDA線程層次結構和Warp Divergence
- GPU內存層次結構和Shared Memory Bank Conflict
- 高效矩陣乘法Kernel優化
- CUDA性能Profile工具和常見瓶頸
- 大模型訓練中通信和計算重疊
- GPU集群調度系統設計
- GPU碎片區處理
- 訓練任務容錯機制設計
- Checkpoint保存策略優化
- 千卡級別訓練集群管理系統設計
心得建議
- 分佈式訓練是AI Infra的核心:3D並行、ZeRO、Megatron這些必須深入理解,不只是知道概念,還要能說清楚實現細節和優化策略。
- CUDA編程能力是硬門檻:AI Infra崗位對CUDA要求比其他方向高很多,線程模型、內存層次、性能優化這些都要扎實,面試官會直接讓你寫Kernel。
- 集群管理經驗很加分:GPU調度、容錯恢復、監控告警這些工程經驗面試官很看重,有Kubernetes經驗會加分。
- 要有大規模系統的經驗:AI Infra不只是單機優化,還要考慮千卡級別的集群管理,網絡拓撲、通信優化、故障恢復這些系統級問題面試官會考察。
- 性能調優要有方法論:不是憑感覺優化,而是先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天,節奏偏慢但可以充分準備。

