推理部署工程師面試題庫
共 5058字,需瀏覽 11分鐘
·
2024-04-19 21:14
最近團隊在招人,記錄一些常用的面試問題,持續(xù)更新中。
1. 描述一下SM的結構?
(INT32/FP32/FP64)CUDA core,Tensor Core,LD/ST, Warp Scheduler
RegisterFile,ShareMemory,L1 Cache
2. 共享內(nèi)存和寄存器分別應該存放哪些數(shù)據(jù)。
局部變量、臨時變量,場景:高頻訪問、空間較小。
3. bank沖突是什么?描述具體結構,如何解決?
為了并行處理,NVIDIA GPU的共享內(nèi)存被劃分為多個“bank”來支持并發(fā)訪問。然而,當多個線程同時訪問同一個bank內(nèi)的不同地址時,可能會導致bank沖突,從而降低內(nèi)存訪問的性能。
數(shù)據(jù)對齊:確保共享內(nèi)存中的數(shù)據(jù)元素(例如數(shù)組或結構體)是按照bank大小對齊的。這樣,多個線程可以同時訪問不同的banks,而不會產(chǎn)生沖突。
線程束(warp)的對齊訪問:盡可能地組織線程,使得在同一個warp內(nèi)的線程訪問的數(shù)據(jù)都來自不同的banks。例如,如果一個warp有32個線程,并且每個線程訪問不同的bank,那么整個warp的訪問將是無沖突的。
數(shù)據(jù)填充:Padding方式避免bank沖突。
4. 說一下分支沖突,如果warp內(nèi)有沖突,部分符合if條件,部分符合else條件,是否需要等待?
當一個warp中的線程在執(zhí)行一個條件分支時,如果不是所有的線程都滿足相同的條件(例如,部分線程滿足if條件,而其他線程滿足else條件),這將導致warp內(nèi)的線程分裂成多個執(zhí)行路徑,從而增加了計算的開銷。當warp中的線程分裂到不同的執(zhí)行路徑時,它們不能再同時執(zhí)行相同的指令,因為它們需要執(zhí)行不同的指令集。這導致了一種情況,其中部分線程在某個時刻被激活,而其他線程則被暫停。
在warp內(nèi)部,所有的線程都是硬件級別上同步的。當一個warp中的線程分裂到不同的執(zhí)行路徑時,這個warp內(nèi)的所有線程都需要等待,直到所有的分支條件都被滿足。具體來說:
如果部分線程滿足
if條件而其他線程滿足else條件,那么這個warp會被分裂成兩個獨立的warp。每個新的warp都會獨立地執(zhí)行其指定的指令路徑,不需要等待其他warp。
5. 項目中用過TensorCore嗎?了解TensorCore的原理嗎?
進擊的Killua:Tensor Cores 使用介紹
https://zhuanlan.zhihu.com/p/671312675
6. 為什么用float4向量來存取數(shù)據(jù)?有什么好處?
數(shù)據(jù)對齊:在許多GPU和其他并行處理器上,訪問對齊的數(shù)據(jù)是更加高效的。使用float4向量,數(shù)據(jù)被自動對齊到4字節(jié)的邊界,從而提高了訪問速度。
內(nèi)存事務優(yōu)化:現(xiàn)代GPU架構和其他并行處理器優(yōu)化了內(nèi)存事務。當連續(xù)地讀取或寫入float4向量時,它們可以在一個內(nèi)存事務中處理多個數(shù)據(jù)元素,從而減少了內(nèi)存訪問的開銷。
內(nèi)存帶寬利用率:通過減少內(nèi)存事務的數(shù)量和增加每個事務的數(shù)據(jù)量,float4向量可以更有效地利用內(nèi)存帶寬,從而提高整體系統(tǒng)的性能。
7. 了解cuda流和cuda graph嗎?
CUDA流(CUDA Streams):CUDA流是CUDA編程模型中用于管理和調度并行操作的抽象概念。使用CUDA流,可以將多個GPU操作組織成不同的流,并發(fā)地執(zhí)行這些流中的操作。CUDA流提供了一種靈活的方式來管理GPU資源并優(yōu)化并行計算。
CUDA圖(CUDA Graphs):CUDA圖是一種高級的CUDA編程技術,用于提前定義和優(yōu)化GPU操作的執(zhí)行順序。通過創(chuàng)建和使用CUDA圖,可以減少GPU操作之間的依賴關系,從而提高并行性和性能。CUDA圖允許開發(fā)者以圖的形式表示和管理GPU操作,這使得在某些情況下可以實現(xiàn)更高級的優(yōu)化和調度。
8. 在Nsight Computing中,經(jīng)常關注的與內(nèi)存相關的指標?
內(nèi)存帶寬(Memory Bandwidth):內(nèi)存帶寬指標告訴你GPU的內(nèi)存子系統(tǒng)每秒可以傳輸?shù)臄?shù)據(jù)量。高帶寬通常表示內(nèi)存子系統(tǒng)的性能良好。
L1、L2和L3緩存命中率(Cache Hit Rate):這些指標告訴你在訪問緩存時命中的次數(shù)與嘗試訪問緩存的總次數(shù)之間的比例。高的緩存命中率通常表示算法和數(shù)據(jù)訪問模式對緩存友好。
內(nèi)存利用率(Memory Utilization):內(nèi)存利用率指標告訴你GPU內(nèi)存的使用情況。了解內(nèi)存的使用情況可以幫助你識別內(nèi)存使用過多或過少的問題。
內(nèi)存延遲(Memory Latency):內(nèi)存延遲指標告訴你從發(fā)出內(nèi)存請求到收到響應所需的時間。理解內(nèi)存延遲可以幫助你優(yōu)化數(shù)據(jù)訪問和計算模式,從而減少延遲并提高性能。
9.cutlass中如何對GEMM進行優(yōu)化的嗎?
進擊的Killua:CUTLASS 基礎介紹
https://zhuanlan.zhihu.com/p/671324125
10. 了解Transformer嗎?底層是什么結構?知道Faster Transformer嗎?cuda中如何優(yōu)化?
進擊的Killua:FasterTransformer Decoding 源碼分析(一)-整體框架介紹
https://zhuanlan.zhihu.com/p/669257891
進擊的Killua:FasterTransformer Decoding 源碼分析(二)-Decoder框架介紹
https://zhuanlan.zhihu.com/p/669303360
進擊的Killua:FasterTransformer Decoding 源碼分析(三)-LayerNorm介紹
https://zhuanlan.zhihu.com/p/669440844
進擊的Killua:FasterTransformer Decoding 源碼分析(四)-SelfAttention實現(xiàn)介紹
https://zhuanlan.zhihu.com/p/669648527
進擊的Killua:FasterTransformer Decoding 源碼分析(五)-AddBiasResidualLayerNorm介紹
https://zhuanlan.zhihu.com/p/670656687
11. Paged Attention有了解嗎?
紫氣東來:NLP(十七):從 FlashAttention 到 PagedAttention, 如何進一步優(yōu)化 Attention 性能
https://zhuanlan.zhihu.com/p/638468472
12. TensorFlow和Pytorch設計思路有何不同?
TensorFlow:最初采用靜態(tài)計算圖的方式進行計算,用戶需要先定義計算圖,然后執(zhí)行計算。
PyTorch:采用動態(tài)計算圖的方式進行計算,允許用戶在運行時動態(tài)地構建和修改計算圖。
13. Nsight Compute和Nsight System使用場景和區(qū)別?
NVIDIA Nsight Compute
針對性:Nsight Compute 主要針對 CUDA 應用進行深入的性能分析,特別是核函數(shù)(kernel)的性能特性和瓶頸。
特性分析:Nsight Compute 提供詳細的核函數(shù)性能分析,包括指令級統(tǒng)計、內(nèi)存訪問模式、計算吞吐量等。
NVIDIA Nsight Systems
全局視圖:Nsight Systems 提供全局視圖的性能分析,包括整體的應用執(zhí)行流程、資源使用和性能特性。
系統(tǒng)級分析:Nsight Systems 不僅分析 GPU 性能,還分析 CPU、內(nèi)存和系統(tǒng)級的性能特性,提供全面的系統(tǒng)性能視圖。
使用場景:
Nsight Compute 適用針對核函數(shù)性能優(yōu)化和調試的需求。
Nsight Systems 適用需要全面系統(tǒng)性能分析和優(yōu)化的應用場景。
14.模型導出fp32的trt engine沒有明顯精度損失,導出fp16損失很明顯,可能的原因有哪些?
比較突出的幾個可能性就是:對一些敏感層進行了量化導致掉精度比較嚴重,或者權重的分布沒有集中導致量化的dynamic range的選擇讓很多有數(shù)值的權重都歸0了。另外,minmax, entropy, percentile這些計算scale的選擇沒有根據(jù)op進行針對性的選擇也會出現(xiàn)掉點。
15.onnx模型推理結果正確,但tensorRT量化后的推理結果不正確,大概原因有哪些?
可能原因有:
a. calibrator的算法選擇不對;
b. calibration過程使用的數(shù)據(jù)不夠;
c. 對網(wǎng)絡敏感層進行了量化;
d. 對某些算子選擇了不適合OP特性的scale計算。
16.采用tensorRT PTQ量化時,若用不同batchsize校正出來模型精度不一致,這個現(xiàn)象是否正常?
正常的,因為calibration(校正)是以tensor為單位計算的。對于每次計算,如果histogram的最大值需要更新,那么PTQ會把histogram的range進行翻倍。不考慮內(nèi)存不足的問題,推薦使用更大的batch_size,這樣每個batch中包含樣本更加豐富,校準后的精度會更好。但具體設置多大,需要通過實驗確定(從大的batch size開始測試。一點一點往下減)。需要注意的是batch_size越大,校準時間越長。
17.模型量化到INT8后,推理時間反而比FP16慢,這正常嗎?
正常的,這可能是tensorrt中內(nèi)核auto tuning機制作怪(會把所有的優(yōu)化策略都運行一遍,結果發(fā)現(xiàn)量化后涉及一堆其他的操作,反而效率不高,索性使用cuda core,而非tensorrt core)。當網(wǎng)絡參數(shù)和模型架構設計不合理時,trt會添加額外的處理,導致INT8推理時間比FP16長。我們可以通過trt-engine explorer工具可視化engine模型看到。
- The End -
長按二維碼關注我們
本公眾號專注:
1. 技術分享;
2. 學術交流;
3. 資料共享。
歡迎關注我們,一起成長!
