学习笔记:书生·浦语实战营第二期第五课

目录

1. 相关视频和文档

2. 视频学习笔记

2.1 大模型部署的背景

2.2 大模型部署的方法

2.3 LMDeploy简介

3. 课后作业

3.1 配置LMDeploy,与 InternLM2-Chat-1.8B 模型对话

3.2 LMDeploy模型量化

3.3 使用API+Gradio推理InternLM2-Chat-1.8B模型

3.4 Python代码集成运行InternLM2-Chat-1.8B模型

3.5 使用LMDeploy运行视觉多模态大模型LLava

3.6 通过Gradio运行LLava模型


1. 相关视频和文档

2. 视频学习笔记

2.1 大模型部署的背景

面临的挑战:计算量巨大、内存开销巨大、存在访存瓶颈、动态请求有难度

① 计算量巨大:大模型参数量巨大,前向推理时需要进行大量计算,例如,根据InternLM2技术报告提供的模型参数数据,以及OpenAl团队提供的计算量估算方法,20B模型每生成1个token,就要进行约406亿次浮点运算,以此类推,若生成128个token,就要进行5.2万亿次运算。而20B算是大模型里的“小”模型了,若模型参数规模达到175B(GPT-3),Batch-Size(BS)再大一点,每次推理的计算量将达到干万亿量级。以NVIDIA A100为例,单张理论FP16运算性能为每秒77.97 TFLOPS(77万亿次)。

② 内存开销巨大:以FP16为例,20B模型仅加载参数就需40G+显存,而175B模型(如GPT-3)更是需要350G+显存。另一方面,大模型在推理过程中,为避免重复计算,会将计算注意力(Attention)得到的KV进行缓存,据InternLM2技术报告提供的模型参数数据,以及KVCache空间估算方法,以FP16为例,在batch-size为16、输入512 tokens、输出32 tokens的情境下,仅20B模型就会产生10.3GB的缓存。目前,以NVIDIA RTX 4060消费级显卡为例,单卡显存仅有8GB,NVIDIA A100单卡显存仅有80GB。

③ 访存瓶颈:大模型推理是“访存密集”型任务。目前硬件计算速度“远快于”显存带宽,存在严重的访存性能瓶颈。

④ 动态请求:同一时间的请求量不确定,请求时间不确定,Token逐个生成,生成数量不确定。

2.2 大模型部署的方法

2.2.1 模型剪枝(Pruning)

剪枝指移除模型中不必要或多余的组件,比如参数,以使模型更加高效。通过对模型中贡献有限的冗余参数进行枝,在保证性能最低下降的同时,可以减小存储需求、提高计算效率。可分为非结构化剪枝和结构化剪枝

  • 非结构化剪枝:指移除个别参数,而不考虑整体网络结构。这种方法通过将低于阈值的参数置零的方式对个别权重或神经元进行处理
  • 结构化剪枝:根据预定义规则移除连接或分层结构,同时保持整体网络结构,这种方法一次性地针对整组权重,优势在于降低模型复杂性和内存使用,同时保持整体的LLM结构完整

2.2.2 知识蒸馏(Knowledge Distillation, KD)

知识蒸馏是一种经典的模型压缩方法,核心思想是通过引导轻量化的学生模型“模仿”性能更好、结构更复杂的教师模型,在不改变学生模型结构的情况下提高其性能

2.2.3 量化(Quantization)

量化技术将传统的表示方法中的浮点数转换为整数或其他离散形式,以减轻深度学习模型的存储和计算负担

  • 量化感知训练(QAT):量化目标无缝地集成到模型的训练过程中,使LLM在训练过程中适应低精度表示
  • 量化感知微调(QAF):涉及在微调过程中对LLM进行量化,主要目标是确保经过微调的LLM在量化为较低位宽后仍保持性能
  • 训练后量化(PTQ):在LLM的训练阶段完成后对其参数进行量化,主要目标是减少LLM的存储和计算复杂性,而无需对LLM架构进行修改或进行重新训练

2.3 LMDeploy简介

核心功能:

  • 模型高效推理:TurboMind是LMDeploy团队开发的一款关于LLM推理的高效推理引擎,其主要功能包括LLaMa结构模型的支持、continuous batch推理模式、可扩展的 KV 缓存管理
  • 模型量化压缩:W4A16量化(AWQ),将 FP16 的模型权重量化为 INT4,Kernel 计算时,访存量直接降为 FP16 模型的 1/4,大幅降低了访存成本。Weight Only 是指仅量化权重,数值计算依然采用 FP16(需要将 INT4 权重反量化)
  • 服务化部署:将LLM封装为HTTP API服务,支持Triton扩展

LMDeploy支持的模型:

3. 课后作业

3.1 配置LMDeploy,与 InternLM2-Chat-1.8B 模型对话

3.1.1 创建开发机及配置环境

开发机创建过程可以参考 学习笔记:书生·浦语实战营第二期第二课-CSDN博客 的3.1.1部分,注意本次实验需要10% A100,镜像为 Cuda12.2-conda。进入开发机,在 Terminal 中创建环境(需要时间,耐心等待)

studio-conda -t lmdeploy -o pytorch-2.1.2

激活环境,安装LMDeploy(需要时间,耐心等待)

conda activate lmdeploy
pip install lmdeploy[all]==0.3.0

3.1.2 下载模型

本次实战营已经在开发机的共享目录中准备好了常用的预训练模型,因此可通过如下代码快速下载(在本地场景中,可以从OpenXLabHuggingFaceMindScope下载模型,模型均为HF格式)

ls /root/share/new_models/Shanghai_AI_Laboratory/
cd ~
ln -s /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b /root/
ls

3.1.3 使用Transformer库运行模型

刚才已经下载好InternLM2-Chat-1.8B的HF模型,先体验用Transformer来直接运行InternLM2-Chat-1.8B模型(Transformer库是Huggingface社区推出的用于运行HF模型的官方库)。首先打开VSCode,然后在左边栏的空白区域单击鼠标右键,点击Open in Intergrated Terminal,等待终端打开,输入命令,新建pipeline_transformer.py文件

touch /root/pipeline_transformer.py

打开pipeline_transformer.py文件,复制以下内容并保存

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)

在VSCode的终端激活环境,运行pipeline_transformer.py文件(需要时间,耐心等待)

conda activate lmdeploy
python /root/pipeline_transformer.py

运行结果:

3.1.4 使用LMDeploy与模型对话

在VSCode的终端使用LMDeploy与模型进行对话,命令如下:

lmdeploy chat /root/internlm2-chat-1_8b

启动完成后,即可与InternLM2-Chat-1.8B大模型对话,比如输入“请创作一个300字的睡前故事”,然后按两下回车键(输入“exit”并按两下回车,可以退出对话),输出结果:

使用体验:LMDeploy官方声称速度会明显比Transformer快,但这一点在实验中其实没有太明显的体会,好像没有快很多(也有可能是因为共用开发机,所以速度优势体现不出来?)。二者相比,使用Transformer时,需要把问题写入到代码中,代码中有几个问题,结果就回答几个,而使用LMDeploy时,是可以交互式问答的,这一点更好一些

3.2 LMDeploy模型量化

3.2.1 控制KV Cache占用的显存比例,观察显存变化

相关背景:模型在运行时,占用的显存可大致分为三部分:模型参数本身占用的显存、KV Cache占用的显存,以及中间运算结果占用的显存。KV Cache是一种缓存技术,通过存储键值对的形式来复用计算结果,以达到提高性能和降低内存消耗的目的。在大规模训练和推理中,KV Cache可以显著减少重复计算量,从而提升模型的推理速度。当显存空间不足时,也可以将KV Cache放在内存,通过缓存管理器控制将当前需要使用的数据放入显存。LMDeploy的KV Cache管理器可以通过设置--cache-max-entry-count参数,控制KV缓存占用剩余显存的最大比例

首先保持不加该参数(默认0.8),运行1.8B模型,与模型对话,并查看显存使用情况

lmdeploy chat /root/internlm2-chat-1_8b

改变--cache-max-entry-count参数,设为0.5,运行1.8B模型,与模型对话,并查看显存使用情况

lmdeploy chat /root/internlm2-chat-1_8b --cache-max-entry-count 0.5

把--cache-max-entry-count参数设置为0.01,约等于禁止KV Cache占用显存,运行模型

lmdeploy chat /root/internlm2-chat-1_8b --cache-max-entry-count 0.01

三种方式对应的显存使用情况:

占用比例为0.8占用比例为0.5占用比例为0.01

3.2.2 使用W4A16对模型进行量化

安装依赖库

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

使用Chat功能运行W4A16量化后的模型,并将KV Cache比例再次调为0.01,查看显存占用情况

lmdeploy chat /root/internlm2-chat-1_8b-4bit --model-format awq --cache-max-entry-count 0.01

结果:显存占用变为2472MB,明显再次降低

3.3 使用API+Gradio推理InternLM2-Chat-1.8B模型

3.3.1 启动API服务器(在lmdeploy环境下)

lmdeploy serve api_server \
    /root/internlm2-chat-1_8b \
    --model-format hf \
    --quant-policy 0 \
    --server-name 0.0.0.0 \
    --server-port 23333 \
    --tp 1

3.3.2 网页客户端连接API服务器

新建一个VSCode终端,激活conda环境,使用Gradio作为前端,启动网页客户端

conda activate lmdeploy
lmdeploy serve gradio http://localhost:23333 \
    --server-name 0.0.0.0 \
    --server-port 6006

运行成功后,需要在本地配置一个转发端口,打开cmd,输入以下命令:

# 需要将下方端口号 43890 替换成自己开发机的端口号
ssh -CNg -L 6006:127.0.0.1:6006 root@ssh.intern-ai.org.cn -p 43890

** 补充:开发机端口和密码的查询方式见 学习笔记:书生·浦语实战营第二期第二课-CSDN博客 的3.2.3部分

3.3.3 从本地浏览器进入http://127.0.0.1:6006,与模型进行对话

3.4 Python代码集成运行InternLM2-Chat-1.8B模型

3.4.1 激活环境,新建Python源代码文件pipeline.py

conda activate lmdeploy
touch /root/pipeline.py

3.4.2 打开pipeline.py,输入以下内容并保存

from lmdeploy import pipeline

pipe = pipeline('/root/internlm2-chat-1_8b')
response = pipe(['Hi, pls intro yourself', '上海是'])
print(response)

3.4.3 运行pipeline.py文件

3.4.4 调整KV Cache占用比例

在Python代码中,可以通过创建TurbomindEngineConfig,向LMDeploy传递参数。以设置KV Cache占用比例为例进行实验,先新建pipeline_kv.py文件,再打开此文件并填入以下内容,再运行pipeline_kv.py文件,查看显存占用情况的变化

from lmdeploy import pipeline, TurbomindEngineConfig

# 调低 k/v cache内存占比调整为总显存的 20%
backend_config = TurbomindEngineConfig(cache_max_entry_count=0.2)

pipe = pipeline('/root/internlm2-chat-1_8b',
                backend_config=backend_config)
response = pipe(['Hi, pls intro yourself', '上海是'])
print(response)

3.5 使用LMDeploy运行视觉多模态大模型LLava

3.5.1 关闭开发机,升级配置到 30% A100,启动开发机并进入

可参考 学习笔记:书生·浦语实战营第二期第二课-CSDN博客 的3.3.1部分

3.5.2 激活环境,安装依赖库(需要时间,耐心等待)

conda activate lmdeploy
pip install git+https://github.com/haotian-liu/LLaVA.git@4e2277a060da264c4f21b364c867cc622c945874

3.5.3 新建pipeline_llava.py文件,填入以下内容

from lmdeploy.vl import load_image
from lmdeploy import pipeline, TurbomindEngineConfig


backend_config = TurbomindEngineConfig(session_len=8192)
# pipe = pipeline('liuhaotian/llava-v1.6-vicuna-7b', backend_config=backend_config) 非开发机运行此命令
pipe = pipeline('/share/new_models/liuhaotian/llava-v1.6-vicuna-7b', backend_config=backend_config)

image = load_image('https://raw.githubusercontent.com/open-mmlab/mmdeploy/main/tests/data/tiger.jpeg')
response = pipe(('describe this image', image))
print(response)

载入的图片:https://raw.githubusercontent.com/open-mmlab/mmdeploy/main/tests/data/tiger.jpeg

3.5.4 运行pipeline_llava.py文件(需要很长时间,耐心等待)

3.6 通过Gradio运行LLava模型

3.6.1 新建gradio_llava.py文件,填入以下内容

import gradio as gr
from lmdeploy import pipeline, TurbomindEngineConfig


backend_config = TurbomindEngineConfig(session_len=8192) # 图片分辨率较高时请调高session_len
# pipe = pipeline('liuhaotian/llava-v1.6-vicuna-7b', backend_config=backend_config) 非开发机运行此命令
pipe = pipeline('/share/new_models/liuhaotian/llava-v1.6-vicuna-7b', backend_config=backend_config)

def model(image, text):
    if image is None:
        return [(text, "请上传一张图片。")]
    else:
        response = pipe((text, image)).text
        return [(text, response)]

demo = gr.Interface(fn=model, inputs=[gr.Image(type="pil"), gr.Textbox()], outputs=gr.Chatbot())
demo.launch()   

3.6.2 运行gradio_llava.py文件

python /root/gradio_llava.py

运行成功后,需要在本地配置一个转发端口,打开cmd,输入以下命令:

# 需要将下方端口号 43890 替换成自己开发机的端口号
ssh -CNg -L 7860:127.0.0.1:7860 root@ssh.intern-ai.org.cn -p 43890

** 补充:开发机端口和密码的查询方式见 学习笔记:书生·浦语实战营第二期第二课-CSDN博客 的3.2.3部分

3.6.3 从本地浏览器进入http://127.0.0.1:7860,与模型进行对话

写在最后:这一节课的老师真的讲得特别详细特别清楚,推荐大家去看视频教程哦~

  • 39
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值