多模態視覺語言模型(VLM)為AI賦予了視覺能力,但推理引擎的最佳化尚未完全跟上。Modal團隊在為客戶最佳化Qwen2.5-VL-3B模型的推理效能時,發現SGLang的吞吐量遠低於GPU的理論上限。經過分析,他們找到了一個關鍵瓶頸——排程器中的主機開銷。
排程器是SGLang中負責編排GPU工作的單執行緒元件,其迴圈速度直接影響整個推理效率。使用py-spy對排程器進行效能剖析後,他們發現process_input_requests函式消耗了約13%的CPU時間,而其中大部分又花在hash_feature函式上。進一步深入,25%的hash_feature時間(佔排程器總時間3%)被用於reconstruct_on_target_device呼叫,最終落到torch.UntypedStorage._new_shared_cuda。
問題根源在於SGLang的多程序架構:分詞器程序將輸入轉化為張量後,需要透過CUDA IPC共享給排程器程序。原先的實現中,排程器在每次迭代時都會為每個張量重新開啟共享控制代碼,重複進行底層CUDA API的引用計數、PyTorch Storage物件建立等操作。這些“賬本”工作在每次排程迴圈後就被丟棄,造成了大量不必要的開銷。
Modal團隊的解決方案出奇簡單:用一個Python字典快取每個記憶體池的控制代碼。由於CUDA記憶體池在程序生命週期內不會重新分配,因此無需考慮快取失效問題。讀寫時僅需在極少見的寫操作上加鎖。實現後,再次使用py-spy分析發現,_new_shared_cuda熱點完全消失,input處理時間減少了一半以上。
端到端基準測試結果令人振奮:在單張H100上執行Qwen2.5-VL-3B,請求吞吐量提升16.2%(從22.2 req/s到25.7 req/s),首Token延遲(TTFT)平均降低13.2%,每Token延遲(TPOT)平均降低17.2%。尾延遲同樣顯著改善,P99端到端延遲下降14.9%。有趣的是,解碼延遲也下降了17%,儘管最佳化僅針對輸入/預填充階段。這得益於排程器的單執行緒特性——減少輸入處理時間意味著更多時間可用於批處理和GPU派發。
該最佳化已透過PR #21418合併至SGLang v0.5.10,任何使用CUDA IPC傳輸的多模態模型都將受益。Modal團隊強調,這一改進只是推理效能工程中“永不阻塞GPU”原則的具體體現。