跳到內容

與 HuggingFace 整合

本文件描述了 vLLM 如何與 HuggingFace 庫整合。我們將逐步解釋執行 vllm serve 時其內部發生了什麼。

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

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

    • 如果 model 引數對應一個現有的本地路徑,vLLM 將直接從該路徑載入配置檔案。
    • 如果 model 引數是包含使用者名稱和模型名稱的 HuggingFace 模型 ID,vLLM 將首先嚐試從 HuggingFace 本地快取中使用配置檔案,其中 model 引數用作模型名稱,--revision 引數用作修訂版本。有關 HuggingFace 快取工作原理的更多資訊,請參見其網站
    • 如果 model 引數是 HuggingFace 模型 ID 但未在快取中找到,vLLM 將從 HuggingFace 模型中心下載配置檔案。有關實現,請參考 此函式。輸入引數包括用作模型名稱的 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 作為引數。請注意

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

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

除此之外,vLLM 還依賴 HuggingFace 來完成兩項任務。

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

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

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

至此,vLLM 與 HuggingFace 的整合已完成。

綜上所述,vLLM 從 HuggingFace 模型中心或本地目錄讀取配置檔案 config.json、分詞器和模型權重。它使用 vLLM、HuggingFace transformers 中的配置類,或者從模型的倉庫中載入配置類。