教程视频:LMDeploy 量化部署 LLM-VLM 实践_哔哩哔哩_bilibili
模型部署文档:教程/lmdeploy/README.md 在 camp2 ·实习生/教程 (github.com)
大模型的部署背景
在软件工程中,部署通常指的是将开发完毕的软件投入使用的过程。
在人工智能领域,模型部署是实现深度学习算法落地应用的关键步骤。简单来说,模型部署就是将训练好的深度学习模型在特定环境中运行的过程。
模型部署的跳转
计算量巨大:根据InternLM2技术报告[1]提供的模型参数数据,以及OpenAl团队提供的计算量估算方法[21,20B模型每生成1个token,就要进行约406亿次浮点运算:照此计算,若生成128个token,就要进行5.2万亿次运算:
20B算是大模型里的“小”模型了,若模型参数规模达到175B(GPT-3),Batch-Size(BS)再大一点,每次推理计算量将达到干万亿量级。
以NVIDIA A100为例,单张理论FP16运算性能为每秒77.97 TFLOPs[3](77万亿),性能捉紧。
访存瓶颈:模型推理是“访存密集”型任务。目前硬件计算速度“远快于”显存带宽,存在严重的访存性能瓶颈。
以RTX 4090推理175B大模型为例,BS为1时计算量为6.83TFLOPS,远低于82.58 TFLOPs的FP16计算能力;但访存量为32.62 TB,是显存带宽每秒处理能力的30倍。
动态请求:请求量不确定,
请求时间不确定;
Token逐个生成,生成数量不确定
大模型部署方法
模型剪枝(pruning):剪枝指移除模型中不必要或多余的组件,比如参数,以使模型更加高效。通过对模型中贡献有限的冗余参数进行剪枝,在保证性能最低下降的同时,可以减小存储需求、提高计算效率。
非结构化剪枝 SparseGPTI,LoRAPruneR),Wanda3]:
指移除个别参数,而不考虑整体网络结构。这种方法通过将低于阈值的参数置零的方式对个别权重或神经元进行处理。
结构化剪枝LLM-Pruner[4]:
根据预定义规则移除连接或分层结构,同时保持整体网络结构。这种方法一次性地针对整组权重,优势在于降低模型复杂性和内存使用,同时保持整体的LLM结构完整。
知识蒸馏(Knowledge distillation,KD):
知识蒸馏是一种经典的模型压缩方法,核心思想是通过引导轻量化的学生模型“模仿”性能更好、结构更复杂的教师模型,在不改变学生模型结构的情况下提高其性能。
量化(quantization):量化技术将传统的表示方法中的浮点数转换为整数或其他离散形式,以减轻深度学习模型的存储和计算负担。
量化感知训练(QAT)LLM-QATI
量化目标无缝地集成到模型的训练过程中。这种方法使LLM在训练过程中适应低精度表示.
量化感知微调(QAF)PEQA2,QLORAB]
QAF涉及在微调过程中对LLM进行量化。主要目标是确保经过微调的LLM在量化为较低位宽后仍保持性能。
训练后量化(PTQ)LLM.int84,AWQ[5]
在LLM的训练阶段完成后对其参数进行量化。PTQ的主要目标是减少LLM的存储和计算复杂性,而无需对LLM架构进行修改或进行重新训练。
而量化和反量化是在保证数据计算精度的同时在答案选择精简取整或者降低浮点数来保证空间的合理。
LMDeploy介绍
LMDeploy 由 MMDeploy 和 MMRazor 团队联合开发,是涵盖了 LLM 任务的全套轻量化、部署和服务解决方案。 这个强大的工具箱提供以下核心功能1 :
高效推理引擎 TurboMind:基于 FasterTransformer,我们实现了高效推理引擎 TurboMind,支持 InternLM、LLaMA、vicuna等模型在 NVIDIA GPU 上的推理。
**交互推理方式:**通过缓存多轮对话过程中 attention 的 k/v,记住对话历史,从而避免重复处理历史会话。
多 GPU 部署和量化:我们提供了全面的模型部署和量化支持,已在不同规模上完成验证。
persistent batch 推理:进一步优化模型执行效率。
LMDeploy部署
有关LMDeploy的聊天功能的更多参数可通过-h命令查看。
通过输入:lmdeploy chat -h
得到:
usage: lmdeploy chat [-h] [--backend {pytorch,turbomind}] [--trust-remote-code] [--meta-instruction META_INSTRUCTION]
[--cap {completion,infilling,chat,python}] [--adapters [ADAPTERS ...]] [--tp TP] [--model-name MODEL_NAME]
[--session-len SESSION_LEN] [--max-batch-size MAX_BATCH_SIZE]
[--cache-max-entry-count CACHE_MAX_ENTRY_COUNT] [--model-format {hf,llama,awq}]
[--quant-policy QUANT_POLICY] [--rope-scaling-factor ROPE_SCALING_FACTOR]
model_path
Chat with pytorch or turbomind engine.
positional arguments:
model_path The path of a model. it could be one of the following options: - i) a local directory path of a
turbomind model which is converted by `lmdeploy convert` command or download from ii) and iii). - ii)
the model_id of a lmdeploy-quantized model hosted inside a model repo on huggingface.co, such as
"internlm/internlm-chat-20b-4bit", "lmdeploy/llama2-chat-70b-4bit", etc. - iii) the model_id of a model
hosted inside a model repo on huggingface.co, such as "internlm/internlm-chat-7b", "qwen/qwen-7b-chat
", "baichuan-inc/baichuan2-7b-chat" and so on. Type: str
options:
-h, --help show this help message and exit
--backend {pytorch,turbomind}
Set the inference backend. Default: turbomind. Type: str
--trust-remote-code Trust remote code for loading hf models. Default: True
--meta-instruction META_INSTRUCTION
System prompt for ChatTemplateConfig. Deprecated. Please use --chat-template instead. Default: None.
Type: str
--cap {completion,infilling,chat,python}
The capability of a model. Deprecated. Please use --chat-template instead. Default: chat. Type: str
PyTorch engine arguments:
--adapters [ADAPTERS ...]
Used to set path(s) of lora adapter(s). One can input key-value pairs in xxx=yyy format for multiple
lora adapters. If only have one adapter, one can only input the path of the adapter.. Default: None.
Type: str
--tp TP GPU number used in tensor parallelism. Should be 2^n. Default: 1. Type: int
--model-name MODEL_NAME
The name of the to-be-deployed model, such as llama-7b, llama-13b, vicuna-7b and etc. You can run
`lmdeploy list` to get the supported model names. Default: None. Type: str
--session-len SESSION_LEN
The max session length of a sequence. Default: None. Type: int
--max-batch-size MAX_BATCH_SIZE
Maximum batch size. Default: 128. Type: int
--cache-max-entry-count CACHE_MAX_ENTRY_COUNT
The percentage of gpu memory occupied by the k/v cache. Default: 0.8. Type: float
TurboMind engine arguments:
--tp TP GPU number used in tensor parallelism. Should be 2^n. Default: 1. Type: int
--model-name MODEL_NAME
The name of the to-be-deployed model, such as llama-7b, llama-13b, vicuna-7b and etc. You can run
`lmdeploy list` to get the supported model names. Default: None. Type: str
--session-len SESSION_LEN
The max session length of a sequence. Default: None. Type: int
--max-batch-size MAX_BATCH_SIZE
Maximum batch size. Default: 128. Type: int
--cache-max-entry-count CACHE_MAX_ENTRY_COUNT
The percentage of gpu memory occupied by the k/v cache. Default: 0.8. Type: float
--model-format {hf,llama,awq}
The format of input model. `hf` meaning `hf_llama`, `llama` meaning `meta_llama`, `awq` meaning the
quantized model by awq. Default: None. Type: str
--quant-policy QUANT_POLICY
Whether to use kv int8. Default: 0. Type: int
--rope-scaling-factor ROPE_SCALING_FACTOR
Rope scaling factor. Default: 0.0. Type: float