与 HuggingFace 集成
本文档描述了 vLLM 如何与 HuggingFace 库集成。我们将逐步解释运行 vllm serve
时内部发生的情况。
假设我们想通过运行 vllm serve Qwen/Qwen2-7B
来提供流行的 QWen 模型服务。
-
参数
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 文件。
- 如果参数
-
确认模型存在后,vLLM 会加载其配置文件并将其转换为字典。请参阅此 代码片段 了解实现细节。
-
接下来,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
时才会执行。
- HuggingFace 也有自己的逻辑来确定要使用的配置类。它会再次使用
-
随后,vLLM 会对配置对象应用一些历史补丁。这些补丁主要与 RoPE 配置相关;请参阅此处了解实现细节。
-
最后,vLLM 可以找到我们要初始化的模型类。vLLM 使用配置对象中的
architectures
字段来确定要初始化的模型类,因为它在其注册表中维护了从架构名称到模型类的映射。如果在注册表中找不到架构名称,则表示 vLLM 不支持此模型架构。对于Qwen/Qwen2-7B
,architectures
字段是["Qwen2ForCausalLM"]
,对应于vLLM 代码中的Qwen2ForCausalLM
类。该类将根据各种配置进行初始化。
除此之外,vLLM 还依赖 HuggingFace 处理另外两件事。
-
分词器:vLLM 使用 HuggingFace 的分词器对输入文本进行分词。使用 AutoTokenizer.from_pretrained 加载分词器,其中
model
参数用作模型名称,--revision
参数用作版本。也可以通过在vllm serve
命令中指定--tokenizer
参数来使用其他模型的分词器。其他相关参数包括--tokenizer-revision
和--tokenizer-mode
。请查看 HuggingFace 的文档以了解这些参数的含义。这部分逻辑可以在 get_tokenizer 函数中找到。获取分词器后,值得注意的是,vLLM 会在 get_cached_tokenizer 中缓存分词器的某些开销较大的属性。 -
模型权重:vLLM 使用
model
参数作为模型名称,--revision
参数作为版本,从 HuggingFace 模型中心下载模型权重。vLLM 提供了--load-format
参数来控制从模型中心下载哪些文件。默认情况下,它会尝试加载 safetensors 格式的权重,如果 safetensors 格式不可用,则回退到 PyTorch bin 格式。我们也可以传递--load-format dummy
以跳过下载权重。
至此,vLLM 与 HuggingFace 的集成完成。
总之,vLLM 从 HuggingFace 模型中心或本地目录读取配置文件 config.json
、分词器和模型权重。它使用的配置类来自 vLLM、HuggingFace transformers,或者从模型仓库加载配置类。