跳到內容

與 Hugging Face 整合

本文件描述了 vLLM 如何與 Hugging Face 庫整合。我們將逐步解釋當我們在執行時 vllm serve 幕後會發生什麼。

假設我們想透過執行 vllm serve Qwen/Qwen2-7B 來服務流行的 Qwen 模型。

  1. model 引數是 Qwen/Qwen2-7B。vLLM 透過檢查相應的配置檔案 config.json 來確定該模型是否存在。有關實現,請參閱此程式碼片段。在此過程中

    • 如果 model 引數對應於現有的本地路徑,vLLM 將直接從該路徑載入配置檔案。
    • 如果 model 引數是一個包含使用者名稱和模型名稱的 Hugging Face 模型 ID,vLLM 將首先嚐試使用 Hugging Face 本地快取中的配置檔案,使用 model 引數作為模型名稱,--revision 引數作為修訂版本。有關 Hugging Face 快取工作原理的更多資訊,請參閱他們的網站
    • 如果 model 引數是 Hugging Face 模型 ID,但在快取中未找到,vLLM 將從 Hugging Face 模型中心下載配置檔案。有關實現,請參閱此函式。輸入引數包括作為模型名稱的 model 引數、作為修訂版本的 --revision 引數,以及作為訪問模型中心的令牌的環境變數 HF_TOKEN。在本例中,vLLM 將下載config.json 檔案。
  2. 在確認模型存在後,vLLM 載入其配置檔案並將其轉換為字典。有關實現,請參閱此程式碼片段

  3. 接下來,vLLM 檢查配置字典中的 model_type 欄位以生成要使用的配置物件。vLLM 直接支援一些 model_type 值;請參閱此處獲取列表。如果 model_type 不在列表中,vLLM 將使用 AutoConfig.from_pretrained 來載入配置類,並將 model--revision--trust_remote_code 作為引數。請注意

    • Hugging Face 也有自己的邏輯來確定要使用的配置類。它將再次使用 model_type 欄位在 transformers 庫中搜索類名;有關支援的模型列表,請參閱此處。如果找不到 model_type,Hugging Face 將使用配置檔案中的 auto_map 欄位來確定類名。具體來說,它是 auto_map 下的 AutoConfig 欄位。例如,請參閱DeepSeek
    • auto_map 下的 AutoConfig 欄位指向模型儲存庫中的模組路徑。要建立配置類,Hugging Face 將匯入模組並使用 from_pretrained 方法載入配置類。這通常可能導致任意程式碼執行,因此只有在啟用了 --trust_remote_code 時才會執行。
  4. 隨後,vLLM 對配置物件應用了一些歷史補丁。這些主要與 RoPE 配置相關;有關實現,請參閱此處

  5. 最後,vLLM 可以訪問我們要初始化的模型類。vLLM 使用配置物件中的 architectures 欄位來確定要初始化的模型類,因為它在其登錄檔中維護從體系結構名稱到模型類的對映。如果登錄檔中找不到體系結構名稱,則表示 vLLM 不支援此模型體系結構。對於 Qwen/Qwen2-7Barchitectures 欄位是 ["Qwen2ForCausalLM"],它對應於vLLM 程式碼中的 Qwen2ForCausalLM 類。此類將根據各種配置自行初始化。

除此之外,vLLM 還有另外兩項依賴於 Hugging Face。

  1. 分詞器:vLLM 使用 Hugging Face 的分詞器對輸入文字進行分詞。分詞器使用 AutoTokenizer.from_pretrained 載入,並將 model 引數作為模型名稱,--revision 引數作為修訂版本。還可以透過在 vllm serve 命令中指定 --tokenizer 引數來使用另一個模型的分詞器。其他相關引數是 --tokenizer-revision--tokenizer-mode。請查閱 Hugging Face 的文件以瞭解這些引數的含義。這部分邏輯可以在 get_tokenizer 函式中找到。獲得分詞器後,值得注意的是,vLLM 會在 vllm.tokenizers.hf.get_cached_tokenizer 中快取分詞器的一些昂貴屬性。

  2. 模型權重:vLLM 使用 model 引數作為模型名稱,--revision 引數作為修訂版本,從 Hugging Face 模型中心下載模型權重。vLLM 提供 --load-format 引數來控制要從模型中心下載哪些檔案。預設情況下,它將嘗試載入 safetensors 格式的權重,如果 safetensors 格式不可用,則回退到 PyTorch bin 格式。我們也可以透過傳遞 --load-format dummy 來跳過下載權重。

    • 建議使用 safetensors 格式,因為它在分散式推理中載入效率高,並且還能防止任意程式碼執行。有關 safetensors 格式的更多資訊,請參閱文件。這部分邏輯可以在此處找到。請注意

至此,vLLM 和 Hugging Face 的整合完成。

總而言之,vLLM 從 Hugging Face 模型中心或本地目錄讀取配置檔案 config.json、分詞器和模型權重。它使用來自 vLLM、Hugging Face transformers 的配置類,或者從模型儲存庫載入配置類。