LMDeploy 量化部署 LLM-VLM 实践——笔记
一、大模型部署背景
1.1、定义
在人工智能领域,模型部署是实现深度学习算法落地应用的关键步骤。简单来说,模型部署就是将训练好的深度学习模型在特定环境中运行的过程。
1.2、场景
- 服务器端。服务器端部署同样也分很多场景啊,包括 CPU 部署,单 GPU / TPU / NPU 部署,多卡部署或是集群部署,如果是集群部署,又如何分布式推理大模型
- 移动端 / 边缘端。比如部署到移动机器人或者是手机等。但同样面临一些问题,这些端次的计算能力如何,因为大模型无论是参数量还是计算量都是非常巨大的,如何在有限的资源里面来加载、推理大模型,都是难点
1.3、挑战
1.3.1、计算量
大模型参数量巨大,前向推理时需要进行大量计算。
根据 OpenAI 团队 在 Scaling Laws for Neural Language Models 这篇论文中所给出的,大模型前向推理所需计算机大致为:
其中,N 为模型参数量,nlayer 为模型参数,nctx 为上下文长度(默认1024),dattn 为注意力输出维度。
以 InternLM 官方给出的技术报告为例:
经过计算,对于 20B 的模型,每生成一个 token,就要进行约 406亿 次浮点运算,那么,如果是要生成 128 个 token,大概需要进行 5.2 万亿 次计算,这是一个相当大的计算量了。
而实际上, 20B 的大小已经算是“小”模型了,如果模型参数量达到 175B,即 Chat-GPT 级别,同时,Batch-Size 再大一些,那么每次推理量就会达到惊人的 千万亿 量级。
与此同时,以 NVIDIA 100 为例,单张理论 FP16 运算性能为每秒 77.97 TFLOPs,即 77万亿,在 千万亿 量级面前,还是捉襟见肘。
1.3.2、内存开销
以 FP16 为例,20B 模型仅加载参数就需 40G+ 显存,175B 模型(如GPT-3)更是需要 350G+ 显存。
同时,大模型在推理过程中,为避免重复计算,会将计算注意力(Attention) 得到的 KV 进行缓存。根据 InternLM2 技术报告提供的模型参数数据,以及 KV Cache 空间估算方法[2],以 FP16 为例,在 batch-size 为16、输入 512 tokens、输出32 tokens 的情境下,仅 20B 模型就会产生 10.3GB 的缓存。
目前,以 NVIDIA RTX 4060 消费级显卡为例(参考零售价¥2399),单卡显存仅有 8GB;NVIDIA A100 单卡显存仅有 80GB。
1.3.3、访存瓶颈
大模型推理是“访存密集”型任务。目前硬件计算速度 “远快于” 显存带宽,存在严重的访存性能瓶颈。
以 RTX 4090 推理 175B 大模型为例,BS 为 1 时计算量为 6.83 TFLOPs,远低于 82.58 TFLOPs 的 FP16 计算能力,也就是说,只考虑计算能力这一块,那 4090 是要稳稳起飞的节奏,但奈何,4090 的访存带宽只有 1008 GB/s,而访存量为 32.62 TB,是显存带宽每秒处理能力的30倍。所以虽然 CPU 的计算能力是强,但很可惜,大部分情况都是摸鱼的状态,因为主要的时间都花在了数据交换上。
同时,对于动态请求方面,大模型也存在一定的问题,包括:
- 请求量不确定。
- 请求时间不确定。
- Token逐个生成,生成数量不确定。
二、大模型部署方法
2.1、模型剪枝
剪枝指移除模型中不必要或多余的组件,比如参数,以使模型更加高效。通过对模型中贡献有限的冗余参数进行剪枝,在保证性能最低下降的同时,可以减小存储需求、提高计算效率。
2.1.1、结构化剪枝
根据预定义规则移除连接或分层结构,同时保持整体网络结构。
这种方法一次性地针对整组权重,优势在于降低模型复杂性和内存使用,同时保持整体的LLM结构完整。
2.1.2、非结构化剪枝
指移除个别参数,而不考虑整体网络结构。
这种方法通过将低于阔值的参数置零的方式对个别权重或神经元进行处理。
2.2、知识蒸馏
知识蒸馏 ( Knowledge Distillation, KD ) 是一种经典的模型压缩方法,核心思想是通过引导轻量化的学生模型 “模仿” 性能更好、结构更复杂的教师模型,在不改变学生模型结构的情况下提高其性能。
2.3、模型量化
量化技术将传统的表示方法中的浮点数转换为整数或其他离散形式,以减轻深度学习模型的存储和计算负担。
之所以这么做是因为模型参数本身一般是以 32 位的浮点数在计算机中保存的,一个数占据四个字节,那 32 位的浮点数能表示的数据范围是相当大的,很多时候我们可能用不到这么大,于是我们可以选择稍微地损失一些表示的精度,在不怎么影响模型回答效果的前提下,把浮点数量化为定点数或者是 16 位、8 位、4 位、甚至平均 1 位的整数来存储模型参数,从而大幅减少模型参数所占据的存储空间。
同时,模型量化是可以提高计算效率的,也就是说,可以提升速度。有很多人会认为,在计算机中,对于整数或者定点数的计算是要大于浮点数的,上面又说道量化技术可以将浮点数转换为整数或其他形式,那计算速度不就快起来了吗?确实,如果大模型参数真的是这样计算,那这么想是没有问题的,关键在于,大模型参数在计算的时候不是真的用刚刚量化过后的结果来直接计算的,所谓定点数形式只是一种存储时候的形式,实际在计算时,是需要将这些数据再 反量化 为浮点数格式计算的,以尽可能地减少计算误差与精度的损失。
所以,相比于正常而言,是多了一个量化和反量化的过程的,那为什么反而还说计算效率提高了呢?这主要还是因为大模型在推理的时候,是一种访存密集型任务,访存性能瓶颈远大于计算瓶颈,通过量化可以把访存量降低,从而显著降低数据传输需要的时间。
量化也分为很多种,包括:
- 量化感知训练 ( QAT )
量化目标无缝地集成到模型的训练过程中。这种方法使 LLM 在训练过程中适应低精度表示。 - 量化感知微调 ( QAF )
QAF 涉及在微调过程中对LLM进行量化。主要目标是确保经过微调的LLM在量化为较低位宽后仍保持性能。 - 训练后量化 ( PTQ )
在 LLM 的训练阶段完成后对其参数进行量化。PTQ 的主要目标是减少 LLM 的存储和计算复杂性,而无需对 LLM 架构进行修改或进行重新训练。
三、LMDeploy
3.1、简介
LMDeploy 由 MMDeploy 和 MMRazor 团队联合开发,是涵盖了 LLM 任务的全套轻量化、部署和服务解决方案。核心功能包括高效推理、可靠量化、便捷服务和有状态推理。
- 高效的推理
LMDeploy 开发了 Continuous Batch,Blocked K/V Cache,动态拆分和融合,张量并行,高效的计算 kernel 等重要特性。InternLM2 推理性能是 vLLM 的 1.8 倍。 - 可靠的量化
LMDeploy 支持权重量化和 k/v 量化。4bit 模型推理效率是 FP16 下的 2.4 倍。量化模型的可靠性已通过 OpenCompass 评测得到充分验证。 - 便捷的服务
通过请求分发服务,LMDeploy 支持多模型在多机、多卡上的推理服务。 - 有状态推理
通过缓存多轮对话过程中 Attention 的 k/v,记住对话历史,从而避免重复处理历史会话。显著提升长文本多轮对话场景中的效率。