1. 课程笔记
- 部署就是在本地终端设备上能够实现接受输入并返回预测结果。为了更好的在终端使用就需要对模型压缩或者硬件加速。大模型由于其内在的特点,所以内存开销非常大。并且是动态shape的(请求数不固定),但是模型结构相对比较简单。
- 挑战包括:
- 设备的存储以及GPU
- 推理的生成速度快,解决动态shape的问题以及管理好内存
- 服务上如何能够增加上下文长度,并降低响应时间
- LMDeploy:其特色就是创新的Turbomind,并且有很好的性能。
- 量化:省现存,提升推理速度。
2. 学习到的新内容
模型在放到本地或者云端API推理前是需要先转化为TurboMind格式,支持在线和离线转换,只不过在线的需要连接到HuggingFace,所以没翻墙的情况下尽量用离线版本的。其实这里做的就是完成量化部署工作,然后让模型可以在终端可以进行对话测试。本地的话就是把模型先进行转化,转化完再在本地推理。
只有在本地离线转换完,我们才有可能在本地真正进行推理。 本地推理其实也就是lmdeploy chat turbomind ./workspace就可以在终端进行对话了。那我们同样可以考虑在API上进行调用。但是这里其实就要考虑的就是在服务器的话要先开启端口才行。
# ApiServer+Turbomind api_server => AsyncEngine => TurboMind
lmdeploy serve api_server ./workspace \
--server_name 0.0.0.0 \
--server_port 23333 \
--instance_num 64 \
--tp 1
然后我们就能够进入查看了
# ChatApiClient+ApiServer(注意是http协议,需要加http)
lmdeploy serve api_client http://localhost:23333
那假如我们想在本地的gradio连接API的服务,其实可以参考lmdeploy里servce gradio的内容
# Gradio+ApiServer。必须先开启 Server,此时 Gradio 为 Client
lmdeploy serve gradio http://0.0.0.0:23333 \
--server_name 0.0.0.0 \
--server_port 6006 \
--restful_api True
但是这个的前提是端口是对的,假如被占用还是要换个端口。这样就可以上传到API的同时在本地打开了。
当然我们其实不上传的API在本地也可以推理,这个更简单一点。
# Gradio+Turbomind(local)
lmdeploy serve gradio ./workspace
除此之外,我们还可以通过python底本调用
# Gradio+Turbomind(local)
lmdeploy serve gradio ./workspace
我们可以通过本地调用的方式实现。
from lmdeploy import turbomind as tm
# load model
model_path = "/root/share/temp/model_repos/internlm-chat-7b/"
tm_model = tm.TurboMind.from_pretrained(model_path, model_name='internlm-chat-20b')
generator = tm_model.create_instance()
# process query
query = "你好啊兄嘚"
prompt = tm_model.model.get_prompt(query)
input_ids = tm_model.tokenizer.encode(prompt)
# inference
for outputs in generator.stream_infer(
session_id=0,
input_ids=[input_ids]):
res, tokens = outputs[0]
response = tm_model.tokenizer.decode(res.tolist())
print(response)
最佳实践:
- 我想对外提供类似 OpenAI 那样的 HTTP 接口服务。推荐使用 TurboMind推理 + API 服务(2.3)。
- 我想做一个演示 Demo,Gradio 无疑是比 Local Chat 更友好的。推荐使用 TurboMind 推理作为后端的Gradio进行演示(2.4.2)。
- 我想直接在自己的 Python 项目中使用大模型功能。推荐使用 TurboMind推理 + Python(2.5)。
- 我想在自己的其他非 Python 项目中使用大模型功能。推荐直接通过 HTTP 接口调用服务。也就是用本列表第一条先启动一个 HTTP API 服务,然后在项目中直接调用接口。
除了推理以外,还有模型量化部署部分的内容:
- 首先要计算minmax的值(显存不足的话就调小samples)
# 计算 minmax
lmdeploy lite calibrate \
--model /root/share/temp/model_repos/internlm-chat-7b/ \
--calib_dataset "c4" \
--calib_samples 128 \
--calib_seqlen 2048 \
--work_dir ./quant_output
- 通过minmax获取量化参数
# 通过 minmax 获取量化参数
lmdeploy lite kv_qparams \
--work_dir ./quant_output \
--turbomind_dir workspace/triton_models/weights/ \
--kv_sym False \
--num_tp 1
量化最佳实践:
- Step1:优先尝试正常(非量化)版本,评估效果。
- 如果效果不行,需要尝试更大参数模型或者微调。
- 如果效果可以,跳到下一步。
- Step2:尝试正常版本+KV Cache 量化,评估效果。
- 如果效果不行,回到上一步。
- 如果效果可以,跳到下一步。
- Step3:尝试量化版本,评估效果。
- 如果效果不行,回到上一步。
- 如果效果可以,跳到下一步。
- Step4:尝试量化版本+ KV Cache 量化,评估效果。
- 如果效果不行,回到上一步。
- 如果效果可以,使用方案。
https://github.com/InternLM/tutorial/raw/main/lmdeploy/img/quant.drawio.png
根据实践经验,一般情况下:
- 精度越高,显存占用越多,推理效率越低,但一般效果较好。
- Server 端推理一般用非量化版本或半精度、BF16、Int8 等精度的量化版本,比较少使用更低精度的量化版本。
- 端侧推理一般都使用量化版本,且大多是低精度的量化版本。这主要是因为计算资源所限。
以上是针对项目开发情况,如果是自己尝试(玩儿)的话:
- 如果资源足够(有GPU卡很重要),那就用非量化的正常版本。
- 如果没有 GPU 卡,只有 CPU(不管什么芯片),那还是尝试量化版本。
- 如果生成文本长度很长,显存不够,就开启 KV Cache。
建议大家根据实际情况灵活选择方案。
3. 课程作业(300字的小故事)