Skip to content

使用 vLLM 在 V100 GPU 上加速推理 Gemma-2 疑難雜症排除

Last Updated on 2024-09-13 by Clay

問題描述

最近我透過微調 Gemma-2 獲得了一些應用的不錯結果,然而卻在佈署上客戶的設備時發生各式各樣的錯誤,搞得我焦頭爛額的,目前網路上還沒有一個比較系統化的疑難雜症排除,故紀錄於此。

簡單來說,我的需求如下:

  1. 我需要在 V100 的卡上運行模型(客戶的設備就是 V100 的集群)
  2. 我需要使用 Gemma-2 架構(這是我表現最好的模型)
  3. 我需要使用 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


Read More

Leave a Reply