正文
LMDeploy原生支持
,LMDeploy无缝衔接InternLM2系列的部署,开箱即用,性能也不错;(2)
de-Interleaving Wq, Wk, Wv -> LLaMA
,即先对权重解交织,还原成标准的LLaMA结构和参数保存格式,然后就可以开心地使用现有的众多框架进行部署了。InternLM官方也提供了转换工具,非常nice,具体请参考:
InternLM Convert Tools
https://github.com/InternLM/InternLM/tree/main/tools
其中解交织部分的代码如下。这个gs表示就是上图中有多少个query head和kv的权重交织在一起,num_key_value_groups就是query head的数量,这些query head对应相同的KV,2是指k和v各占一份。torch.split在dim=1按照 [num_key_value_groups, 1, 1] 进行切分,这是由于使用了GQA,多个query head对应一组KV head,在split的时候要符合GQA的要求。split得到Wq,Wk,Wv权重矩阵后,在reshape回原来的二维矩阵的维度。其他剩余的逻辑主要就是权重name的一对一匹配了,这个很好理解。关于rearrange用法,推荐阅读(非常清晰):
科技猛兽:PyTorch 70.einops:优雅地操作张量维度
(
https://zhuanlan.zhihu.com/p/342675997
)
权重解交织逻辑
num_key_value_groups计算逻辑
另外,目前在TensorRT-LLM中,支持直接使用InternLM2原生模型进行checkpoint转换、build engine和推理,我们可以从convert_checkpoint.py中的逻辑可以看到,其中执行了权重解交织操作,然后使用TensorRT-LLM的API进行权重的赋值以及组网操作,并且调用了tensorrt_llm.models.llama中的convert组件,来对权重进行正确的转换。不过,在目前的实现中,还不支持FP8/SQ量化,只支持Weight Only。因此,如果需要走FP8量化部署的方案,还是建议走”de-Interleaving Wq, Wk, Wv -> LLaMA“的方案。TensorRT-LLM中示例见:
https://github.com/NVIDIA/TensorRT-LLM/tree/main/examples/internlm2
TensorRT-LLM InternLM2 权重解交织
另外,我们再回到LMDeploy的源码看下交织后的权重是如何妥善处理,并利用TurboMind后端推理的。具体代码如下。从代码中看到,LMDeploy的实现,实际上也是先将权重进行解交织,并且对权重按照name一对一匹配,接着使用LLaMa结构进行转换,InternLM2Reader继承的是LlamaReader。详细代码见:
https://github.com/InternLM/lmdeploy/blob/main/lmdeploy/turbomind/deploy/source_model/internlm2.py
LMDeploy中的权重解交织
作为LLM推理主流框架之一的vLLM,自然也是支持InternLM2的部署,大致瞄了一眼其中的实现,对于权重解交织的处理和TensorRT-LLM以及LMDeploy是完全一致的。(PS:这么说,权重交织这个事儿对于推理来说是不是有点多余了,实际部署的时候全都是得先解交织一遍...),代码见:
https://github.com/vllm-project/vllm/blob/main/vllm/model_executor/models/internlm2.py#L313
vLLM中的权重解交织
0x02 InternLM2.5简析
2024年7月3日,InternLM团队发布了InternLM2.5,模型结构和InternLM2一样,效果更好。大概看了下,这次主要是更新了7B系列的Chat模型。其中InternLM2.5-7B-Chat-1M模型支持百万长度的上下文窗口。这次发布的主要核心点有三个:
(1)卓越的模型推理能力
,在数学推理的任务上达到了SOTA,超过了同等规模参数量的其他模型,如LLaMA3-8B和Gemma-9B;
(2)支持百万长度上下文长度的推理
,并且可以通过LMDeploy快速部署,开箱即用(PS: 他们家训推一整套无缝衔接做的真的太棒了!赞!LMDeploy性能和用户体验都不错。);
(3)增加了更多的应用工具的支持
,比如快速对大量的网页信息进行聚合,后续也将会整和到Agent工具中。
InternLM2.5
可以看到,InternLM2.5 7B Chat模型在多项任务上都达到了同等参数规模模型的SOTA水平,并且在Math任务上,比LLaMA3-8B-Instruct和Gemma2-9B-IT要高出一大截啊,说实话,有点被震惊到了。
InternLM2.5 Benchmark
0x03 InternViT简析
InternViT-6B
InternViT-6B采用的就是经典的ViT模型结构,作为InternVL的视觉模块进行使用,不单独使用。ViT参考文献:
arxiv.org/abs/2010.1192(
https://arxiv.org/abs/2010.11929
)
9
;ViT经典模型结构如下: