Last Updated on 2024-09-13 by Clay
問題描述
最近我透過微調 Gemma-2 獲得了一些應用的不錯結果,然而卻在佈署上客戶的設備時發生各式各樣的錯誤,搞得我焦頭爛額的,目前網路上還沒有一個比較系統化的疑難雜症排除,故紀錄於此。
簡單來說,我的需求如下:
- 我需要在 V100 的卡上運行模型(客戶的設備就是 V100 的集群)
- 我需要使用 Gemma-2 架構(這是我表現最好的模型)
- 我需要使用 vLLM 加速推理框架(這是最符合客戶需求的加速方案)
而衝突的地方在於:Gemma-2 所需要的模型架構仰賴 FlashInfer 或 FlashAttention 的實現,但是這兩個框架並不支援 V100 的卡;唯一支援 V100 的 xFormers 注意力機制後端,則不支援 Gemma-2 的 soft capping。
解決方案
備註:我所使用的版本為 vLLM v0.5.4。
問題一:V100 並不支援 bfloat16
首先,由於我所必須佈署的卡為 V100,而我遇到的第一個問題就是 V100 並不支援 bfloat16。(bfloat16
是一種浮點數據格式,專門用來提高深度學習模型的計算效率。它是由 Google 開發的,並且經常用於像 TensorFlow 和 TPU 這樣的硬體和軟體中。bfloat16
和標準的 float32
(32位浮點數)相比,能在不顯著降低精度的情況下,減少存儲空間和運算成本)
所以在 vLLM 啟動時,得加入參數 --dtype=float16
或是 --dtype=half
。
但是在我的測試中,如果本身 Gemma-2 儲存為 bfloat16、但是用 vLLM 啟動時轉為 float16,其行為會出現差異;在我實際落地的應用場景中,問題相當嚴重,會多出奇怪的格式(因為我的格式並不能有任何錯誤)。
比較穩妥的解法是使用 float16 微調過 Gemma-2 在我的特定領域任務上,並使用 float16 保存模型權重。
問題二:FlashInfer 和 FlashAttention 並不支援 V100
在 Gemma-2 的 Attention 實現中,FlashInfer 和 FlashAttention 是最適當的、但同時它們也不支援 V100。我翻了兩邊的 GitHub Issues,看起來是沒有後續也沒有預計要開發 V100 的支援的(2024/09/10)。
所以選擇 Attention Backend 時勢必得排除以上兩者,那唯一支援 V100 的 Attention Backend,就只剩下了 xFormers 了。
在 vLLM 一定版本以後,它會自動去偵測 GPU 的 Compute Capability(可參考 https://developer.nvidia.com/cuda-gpus),而自動去設定 Attention Backend 為 xFormers。
但是在 vLLM 一定版本以下,我們需要手動切換 Attention Backend。在啟動 vLLM 時,加入環境變數 export VLLM_ATTENTION_BACKEND=FLASHINFER
。(https://github.com/vllm-project/vllm/issues/6173#issuecomment-2214759644)
但緊接著,我們就會遇到下一個錯誤:xFormers 不支援 Gemma-2 的 soft capping。
問題三:xFormers 並不支援 Gemma-2 的 soft capping
這個問題暫時性的唯一解決方法,便是去 Gemma-2 的設定檔(config.json)內,將 soft capping 的值通通調整為 null
。
兩個值分別為:
- "attn_logit_softcapping": null
- "final_logit_softcapping": null
至此,大部分的問題都排除掉了,Gemma-2 應能順利啟動。但我其實最後還踩到一個小坑,一併紀錄於此。
問題EX: RAM 使用率
我在客戶裝置上佈署時使用了 K8s 的群集,並且由可靠的後端工程師同事設定好了 RAM 的限制,但是由於我事先沒有測試好,佈署的同事控制了每個 Pod 的 RAM 使用上限,導致我的 vLLM + Gemma-2 一直 hang 住而無法真正啟動。(https://github.com/vllm-project/vllm/issues/7303#issuecomment-2348058866)
最後我們終於找到了這個問題,並把 RAM 使用限制放寬為 10GB。這一次,我們終於成功在客戶的裝置上運行我們的 LLM 了。
References
- https://github.com/vllm-project/vllm/issues/7303#issuecomment-2348058866
- https://github.com/vllm-project/vllm/issues/6173#issuecomment-2214759644