与 Hugging Face 的集成¶
本文档介绍了 vLLM 如何与 Hugging Face 库进行集成。我们将逐步解释在运行 vllm serve 时系统底层发生了什么。
假设我们想要通过运行 vllm serve Qwen/Qwen2-7B 来服务流行的 Qwen 模型。
-
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 文件。
- 如果
-
确认模型存在后,vLLM 会加载其配置文件并将其转换为字典。请参阅此代码片段了解实现。
-
接下来,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 将使用配置 JSON 文件中的auto_map字段来确定类名。具体来说,它是auto_map下的AutoConfig字段。以 DeepSeek 为例。 auto_map下的AutoConfig字段指向模型存储库中的模块路径。为了创建配置类,Hugging Face 会导入该模块并使用from_pretrained方法来加载配置类。这通常会导致任意代码执行,因此仅在启用--trust_remote_code时才会执行。
- Hugging Face 也有自己确定所用配置类的逻辑。它会再次使用
-
随后,vLLM 将一些历史补丁应用到配置对象上。这些主要与 RoPE 配置有关;实现请参阅此处。
-
最后,vLLM 可以找到我们要初始化的模型类。vLLM 使用配置对象中的
architectures字段来确定要初始化的模型类,因为它在其注册表中维护了架构名称到模型类的映射。如果注册表中没有找到架构名称,则意味着 vLLM 不支持此模型架构。对于Qwen/Qwen2-7B,architectures字段为["Qwen2ForCausalLM"],对应于 vLLM 代码中的Qwen2ForCausalLM类。该类将根据各种配置进行自我初始化。
除此之外,vLLM 在以下两个方面还依赖于 Hugging Face:
-
分词器 (Tokenizer):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 中。 -
模型权重 (Model weight):vLLM 从 Hugging Face 模型中心下载模型权重,使用
model参数作为模型名称,--revision参数作为修订版本。vLLM 提供了--load-format参数来控制从模型中心下载哪些文件。默认情况下,它会尝试以 safetensors 格式加载权重,如果该格式不可用,则回退到 PyTorch bin 格式。我们还可以传递--load-format dummy来跳过权重下载。
至此完成了 vLLM 与 Hugging Face 的集成。
总之,vLLM 从 Hugging Face 模型中心或本地目录读取 config.json 配置文件、分词器和模型权重。它使用来自 vLLM 或 Hugging Face transformers 的配置类,或者从模型存储库中加载配置类。