从vLLM部署大模型推理来看如何加载部署PyTorch类大模型


从vLLM部署大模型推理来看如何加载部署PyTorch类大模型

仅用于站内搜索,没有排版格式,具体信息请跳转上方微信公众号内链接

目前的大模型基本都是基于pytorch开发,训练的;比如Qwen系列、GPT系列、LLaMA系列。vllm这类的推理中间件是如何在重新加载部署训练后的大模型的呢?
PyTorch的开发和训练是很高效的,但是在部署时,由于是动态图的原因,则问题很大。
TensorFlow的模型部署很简单,训练好模型后,保存的模型内部包含了整个静态图结构,可以部署到不同的地方、使用不同的框架加载运行;
但是对于PyTorch来说,可就没有那么简单了,PyTorch一般采用的是只保存模型参数文件(.pt文件)而不会一同保存图结构,这虽然一定程度上方便了Python端的处理,但是却给部署、跨平台等操作带来了很多难题;需要额外import定义模型网络的class。
当然,经过不断的pytorch迭代,现在的部署已经很完善也解决了以前的很多问题。
vllm是常用的,生产级的推理中间件;网上也有很多解析其源码、架构、并行设计等文章,但我个人还是对其如何加载并部署LLM提供API服务这个过程是比较感兴趣的。在这里并不会涉及到太多的源码,而且结合我自己的一些思考和vllm设计,概述的讲解一下。
首先,对于LLM,各个厂商一般都是在modelscope、huggingface等平台放出源码,以qwen3为例:
这些就是厂商提供的LLM文件,也就是开源出来的。
那么vllm是如何基于这些开源的文件,部署起来LLM的呢?
vllm会根据配置文件读取tranform模型普遍的一些参数信息,比如模型层数,激活函数等等;一开始会根据配置文件中的架构去寻找在vllm中已预注册的模型class,比如Qwen3ForCausalLM等;这些class都是预先在vllm中注册好的。根据这些信息,vllm会动态的初始化模型结构,而这个所谓的\“模型结构\“其实就是transformer算法模型的结构,也就是mlp、activatefunction、attention、optimizer等,构造出一个transformer模型。但与标准的tranformer模型不同的是,vllm会根据每个模型的设计,构造不同的transformer结构。同时,根据并行方案(比如张量并行、流水线并行)还会将模型中的一些层留空/占位,而填充设计真正应该运行的模型层。待模型初始化完之后,这就是最后的模型class,也就是pytorch的表示——基于transformer算法的神经网络结构的模型了。
模型权重也就是这些大文件了,一般都是上GB,或是数十GB的文件;在这些文件里面存储的是训练完成后的模型参数,而这些模型参数一般对应于transformer算法模型中的关键变量,比如q,k,v的权重矩阵、mlp层的权重矩阵、输出层的权重矩阵、优化器状态矩阵等等。如下所示:

权重主要包含三部分:Linear的weight,layernorm的weight和rotarypositionalembedding的inv_freq。
当然不同的模型权重,其内容是不一样的,但从模型权重文件中读取出来的数据结构是一样的。
通过前面构造好的模型class,将这些权重矩阵读取后塞入模型class的各个层的相关变量中,就构造好了原开源厂商训练好的大模型了。这个模型包含模型架构class,模型权重参数。
在初始化模型class架构阶段,对于并行策略涉及到的模型层,vLLM会设置占位符,譬如PPMissingLayer,该类不会做什么多余的动作,只是为了保证模型架构的完整性。
然后在模型权重加载时,根据读取到的key与value,决定将不同的模型权重塞入到模型各个层中。
大模型的开发、训练、部署过程,本质上可以看作是\“计算图\“+\“模型参数\“;计算图是pytorch优化后的模型class架构,比如在pytorch中,神经网络模型是以计算图的形式运算的,模型参数就是对应的数据了。
对于详细的模型源码及设计解析可以参考:vLLM的分布式基础、模型初始化、权重导入以及TPPP的实现[ 1]
Reference
vLLM的分布式基础、模型初始化、权重导入以及TPPP的实现:https ://zhuanlan. zhihu.com/p/1912989074316297299


文章作者: ZejunCao
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 ZejunCao !
  目录