跳到内容

与 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 的配置类,或者从模型存储库加载配置类。