LMDeploy 大模型量化部署实践(实战训练营第五节课笔记作业)

本文介绍了如何将大模型部署到本地终端,涉及模型压缩、硬件加速、动态shape处理和内存管理。重点讨论了LMDeploy的Turbomind特性和量化技术,以及如何通过Gradio和API服务进行模型部署和本地推理。文章还提供了模型量化部署的最佳实践,包括精度、内存使用和不同场景下的推荐策略。
摘要由CSDN通过智能技术生成

1. 课程笔记

- 部署就是在本地终端设备上能够实现接受输入并返回预测结果。为了更好的在终端使用就需要对模型压缩或者硬件加速。大模型由于其内在的特点,所以内存开销非常大。并且是动态shape的(请求数不固定),但是模型结构相对比较简单。

722a0ceb3e574093a47562af483bf4f4.png

- 挑战包括:

        - 设备的存储以及GPU

        - 推理的生成速度快,解决动态shape的问题以及管理好内存

        - 服务上如何能够增加上下文长度,并降低响应时间

5228f35fb4854dedb36509a3799417c5.png

- LMDeploy:其特色就是创新的Turbomind,并且有很好的性能。

- 量化:省现存,提升推理速度。

320c615d85f8426794b58ae183586888.png

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字的小故事)

e652589382fe418cbdc36c1eb4f4bdbe.png

 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值