提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
目录
第五节课基础作业
一、LMDeploy环境部署
跟着教程创建完开发机之后首先创建conda环境。
由于环境依赖项存在torch,下载过程可能比较缓慢。InternStudio上提供了快速创建conda环境的方法。打开命令行终端,创建一个名为lmdeploy
的环境:
studio-conda -t lmdeploy -o pytorch-2.1.2
创建完环境之后就可以 安装LMDeploy了,先激活刚刚创建的虚拟环境:
conda activate lmdeploy
安装0.3.0版本的lmdeploy:
pip install lmdeploy[all]==0.3.0
作业截图:
环境准备:
安装LMDEploy:
二、LMDeploy模型对话(chat)
2.1 下载模型
开发机的共享目录中准备好了常用的预训练模型,可以运行如下命令查看:
ls /root/share/new_models/Shanghai_AI_Laboratory/
笔记:
国内和国外都有一些托管模型和数据集的社区,比如HuggingFace。托管在HuggingFace社区的模型通常采用HuggingFace格式存储,简写为HF格式。
但是HuggingFace社区的服务器在国外,国内访问不太方便。国内可以使用阿里巴巴的MindScope社区,或者上海AI Lab搭建的OpenXLab社区,上面托管的模型也通常采用HF格式。
TurboMind是LMDeploy团队开发的一款关于LLM推理的高效推理引擎,它的主要功能包括:LLaMa 结构模型的支持,continuous batch 推理模式和可扩展的 KV 缓存管理器。
TurboMind推理引擎仅支持推理TurboMind格式的模型。因此,TurboMind在推理HF格式的模型时,会首先自动将HF格式模型转换为TurboMind格式的模型。该过程在新版本的LMDeploy中是自动进行的,无需用户操作。
简而言之就是搞清楚模型采用TurboMInd引擎推理时候需要进行模型格式的转换!
2.2 使用Transformer库运行模型
笔记:Transformer库是Huggingface社区推出的用于运行HF模型的官方库
按照官方教程在VScode中创建一个新代码文件,将以下内容复制进去,并运行:
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
tokenizer = AutoTokenizer.from_pretrained("/root/internlm2-chat-1_8b", trust_remote_code=True)
# Set `torch_dtype=torch.float16` to load model in float16, otherwise it will be loaded as float32 and cause OOM Error.
model = AutoModelForCausalLM.from_pretrained("/root/internlm2-chat-1_8b", torch_dtype=torch.float16, trust_remote_code=True).cuda()
model = model.eval()
inp = "hello"
print("[INPUT]", inp)
response, history = model.chat(tokenizer, inp, history=[])
print("[OUTPUT]", response)
inp = "please provide three suggestions about time management"
print("[INPUT]", inp)
response, history = model.chat(tokenizer, inp, history=history)
print("[OUTPUT]", response)
激活环境后运行代码:
python /root/pipeline_transformer.py
笔记:Hugging Face 的 Transformers 库中的 pipeline
是一个高级接口,它允许用户轻松地使用预训练模型来执行各种自然语言处理(NLP)任务,而无需深入了解模型的内部工作原理。pipeline
将模型的加载、文本的预处理(分词)、模型的推理(预测)以及后处理结果封装在一起,提供了一个简单的函数调用接口。
作业截图:
这里运行速度还是有点慢的。
2.3使用LMDeploy与模型对话
笔记:使用LMDeploy与模型进行对话的通用命令格式为:
lmdeploy chat [HF格式模型路径/TurboMind格式模型路径]
这里执行如下命令运行下载的1.8B模型:
lmdeploy chat /root/internlm2-chat-1_8b
作业截图:
模型加载完成:
使用模型进行对话:
三.LMDeploy模型量化(lite)
笔记:
量化是一种以参数或计算中间结果精度下降换空间节省(以及同时带来的性能提升)的策略。
有两个跟量化有关的概念十分重要:
3.1 设置最大KV Cache缓存大小
KV Cache是一种缓存技术,通过存储键值对的形式来复用计算结果,以达到提高性能和降低内存消耗的目的。在大规模训练和推理中,KV Cache可以显著减少重复计算量,从而提升模型的推理速度。理想情况下,KV Cache全部存储于显存,以加快访存速度。当显存空间不足时,也可以将KV Cache放在内存,通过缓存管理器控制将当前需要使用的数据放入显存。
模型在运行时,占用的显存可大致分为三部分:模型参数本身占用的显存、KV Cache占用的显存,以及中间运算结果占用的显存。LMDeploy的KV Cache管理器可以通过设置--cache-max-entry-count
参数,控制KV缓存占用剩余显存的最大比例。默认的比例为0.8。
当直接运行 internlm2-chat-1_8b模型的时候,显存占用是7856MB:
下面运行:
lmdeploy chat /root/internlm2-chat-1_8b --cache-max-entry-count 0.5
改变KV cache的大小,可以看到,运行后显存得到了降低,变为6608MB:
3.2 使用W4A16量化
MDeploy使用AWQ算法,实现模型4bit权重量化。推理引擎TurboMind提供了非常高效的4bit推理cuda kernel,性能是FP16的2.4倍以上。它支持以下NVIDIA显卡:
- 图灵架构(sm75):20系列、T4
- 安培架构(sm80,sm86):30系列、A10、A16、A30、A100
- Ada Lovelace架构(sm90):40 系列
首先按照依赖库:
pip install einops==0.7.0
仅需执行一条命令,就可以完成模型量化工作:
lmdeploy lite auto_awq \
/root/internlm2-chat-1_8b \
--calib-dataset 'ptb' \
--calib-samples 128 \
--calib-seqlen 1024 \
--w-bits 4 \
--w-group-size 128 \
--work-dir /root/internlm2-chat-1_8b-4bit
笔记:
量化工作结束后,新的HF模型被保存到internlm2-chat-1_8b-4bit
目录。下面使用Chat功能运行W4A16量化后的模型。
lmdeploy chat /root/internlm2-chat-1_8b-4bit --model-format awq
作业截图:
量化后命令行客户端对话:
推理速度貌似快了一些(不明显)
网页客户端对话:
总结
量化操作是一种优化模型大小和加速推理过程的技术,通过减少模型权重和激活的精度来实现。我这篇博客完成了实战营中的基础作业内容,部署了量化前后的模型,并生成300字故事,感受一下量化前后的推理速度差异。