书生·浦语大模型全链路开源体系-第5课

书生·浦语大模型全链路开源体系-第5课

书生·浦语大模型全链路开源体系-第5课

为了推动大模型在更多行业落地应用,让开发人员更高效地学习大模型的开发与应用,上海人工智能实验室重磅推出书生·浦语大模型实战营,为开发人员提供大模型学习和开发实践的平台。

本文是书生·浦语大模型全链路开源体系-第5课的课程实战。

相关资源

  • InternLM项目地址

https://github.com/InternLM/InternLM

https://github.com/InternLM/LMDeploy

  • InternLM2技术报告

https://arxiv.org/pdf/2403.17297.pdf

  • 书生·万卷 数据

https://opendatalab.org.cn/

  • 课程链接

https://www.bilibili.com/video/BV1tr421x75B/

LMDeploy基础

配置LMDeploy运行环境

执行命令,创建一个新的虚拟环境,安装必要的库。

bash 复制代码
studio-conda -t lmdeploy -o pytorch-2.1.2

conda activate lmdeploy

pip install lmdeploy[all]==0.3.0

创建conda环境。

安装lmdeploy库,指定版本0.3.0

下载internlm2-chat-1_8b模型

执行命令,下载模型。在InternLM的开发机上,可以通过以下命令直接创建软链接来下载模型。

bash 复制代码
ln -s /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b /root/models/internlm2-chat-1_8b

使用Transformer来直接运行InternLM2-Chat-1.8B模型

创建路径/root/code/lmdeploy,并在该目录下创建脚本文件pipeline_transformer.py

bash 复制代码
mkdir -p /root/code/lmdeploy && cd /root/code/lmdeploy

vi pipeline_transformer.py

cat pipeline_transformer.py

文件内容为:

python 复制代码
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM

tokenizer = AutoTokenizer.from_pretrained("/root/models/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/models/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 pipeline_transformer.py

使用LMDeploy以命令行方式与InternLM2-Chat-1.8B模型对话

使用LMDeploy与模型进行对话的通用命令格式为:

bash 复制代码
lmdeploy chat [HF格式模型路径/TurboMind格式模型路径]

直接输入命令开始进行对话。

bash 复制代码
lmdeploy chat /root/models/internlm2-chat-1_8b

对模型进行提问。

此时,可以看到显存占用 7856 MB

如果想了解lmdeploy chat的更多参数信息,可以执行命令

bash 复制代码
lmdeploy chat -h

设置KV Cache最大占用比例为0.4

KV Cache是一种缓存技术,通过存储键值对的形式来复用计算结果,以达到提高性能和降低内存消耗的目的。在大规模训练和推理中,KV Cache可以显著减少重复计算量,从而提升模型的推理速度。理想情况下,KV Cache全部存储于显存,以加快访存速度。当显存空间不足时,也可以将KV Cache放在内存,通过缓存管理器控制将当前需要使用的数据放入显存。

模型在运行时,占用的显存可大致分为三部分:模型参数本身占用的显存、KV Cache占用的显存,以及中间运算结果占用的显存。LMDeploy的KV Cache管理器可以通过设置--cache-max-entry-count参数,控制KV缓存占用剩余显存的最大比例。默认的比例为0.8。

这里,我们将参数--cache-max-entry-count设置为0.4

执行命令

bash 复制代码
lmdeploy chat /root/models/internlm2-chat-1_8b --cache-max-entry-count 0.4

与模型进行对话。

此时,可以看到显存占用降低为 6192 MB

设置KV Cache最大占用比例为0.4,开启W4A16量化,以命令行方式与模型对话。

使用W4A16量化模型

LMDeploy使用AWQ算法,实现模型4bit权重量化。推理引擎TurboMind提供了非常高效的4bit推理cuda kernel,性能是FP16的2.4倍以上。它支持以下NVIDIA显卡:

  • 图灵架构(sm75):20系列、T4
  • 安培架构(sm80,sm86):30系列、A10、A16、A30、A100
  • Ada Lovelace架构(sm90):40 系列

运行前,首先安装一个依赖库。

bash 复制代码
pip install einops==0.7.0

然后运行命令对模型进行量化,量化后的模型输出到/root/models/internlm2-chat-1_8b-4bit

bash 复制代码
lmdeploy lite auto_awq /root/models/internlm2-chat-1_8b --calib-dataset 'ptb' --calib-samples 128 --calib-seqlen 1024 --w-bits 4 --w-group-size 128 --work-dir /root/models/internlm2-chat-1_8b-4bit

设置KV Cache最大占用比例为0.4,以命令行方式与模型对话

执行命令,设置KV Cache最大占用比例为0.4,以命令行方式与量化后的模型对话。

bash 复制代码
lmdeploy chat /root/models/internlm2-chat-1_8b-4bit --model-format awq --cache-max-entry-count 0.4

此时,可以看到显存占用进一步降低为 4936 MB

有关LMDeploy的lite功能的更多参数可通过-h命令查看。

bash 复制代码
lmdeploy lite -h

以API Server方式启动 lmdeploy,开启W4A16量化,调整KV Cache的占用比例为0.4

通过以下命令启动API服务器,推理量化后的internlm2-chat-1_8b-4bit模型:

bash 复制代码
lmdeploy serve api_server /root/models/internlm2-chat-1_8b-4bit --model-format awq --quant-policy 0 --server-name 0.0.0.0 --server-port 23333 --tp 1 --cache-max-entry-count 0.4

使用命令行客户端与模型对话

执行命令,使用命令行客户端与模型对话。

bash 复制代码
lmdeploy serve api_client http://localhost:23333

使用网页方式与模型对话

建立本地端口与开发机的端口映射后,通过浏览器访问相关端口,打开API页面。

在接口/v1/chat/comletions中设置相应的参数,调用接口与模型对话。

使用Gradio网页客户端与模型对话

使用Gradio作为前端,启动网页客户端。

bash 复制代码
lmdeploy serve gradio http://localhost:23333 --server-name 0.0.0.0 --server-port 6006

在本地打开浏览器,访问Gradio界面,与模型进行对话。

使用Python代码集成的方式运行

首先,创建一个文件pipeline_kv.py

bash 复制代码
mkdir -p /root/code/lmdeploy && cd /root/code/lmdeploy

vi pipeline_kv.py

cat pipeline_kv.py

在文件pipeline_kv.py中输入代码,设置cache_max_entry_count=0.4

python 复制代码
from lmdeploy import pipeline, TurbomindEngineConfig

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

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

执行命令运行代码。

bash 复制代码
python pipeline_kv.py

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

在conda虚拟环境中安装必要的依赖库。

bash 复制代码
pip install git+https://github.com/haotian-liu/LLaVA.git@4e2277a060da264c4f21b364c867cc622c945874

切换到24GB显存的开发机。

通过命令行方式运行视觉多模态大模型 llava

创建文件pipeline_llava.py

bash 复制代码
mkdir -p /root/code/lmdeploy && cd /root/code/lmdeploy

vi pipeline_llava.py

cat pipeline_llava.py

在文件pipeline_llava.py中输入代码。

python 复制代码
from lmdeploy.vl import load_image
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)

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

运行代码。

python 复制代码
python pipeline_llava.py

通过Gradio运行视觉多模态大模型 llava

创建文件 gradio_llava.py

bash 复制代码
mkdir -p /root/code/lmdeploy && cd /root/code/lmdeploy

vi gradio_llava.py

cat gradio_llava.py

在文件 gradio_llava.py中输入代码。

python 复制代码
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()

运行代码。

bash 复制代码
python gradio_llava.py

打开浏览器,访问Gradio界面,选择图片,进行对话。

图片描述。

营销文案。

相关推荐
qzhqbb14 分钟前
基于统计方法的语言模型
人工智能·语言模型·easyui
冷眼看人间恩怨39 分钟前
【话题讨论】AI大模型重塑软件开发:定义、应用、优势与挑战
人工智能·ai编程·软件开发
2401_8830410840 分钟前
新锐品牌电商代运营公司都有哪些?
大数据·人工智能
AI极客菌2 小时前
Controlnet作者新作IC-light V2:基于FLUX训练,支持处理风格化图像,细节远高于SD1.5。
人工智能·计算机视觉·ai作画·stable diffusion·aigc·flux·人工智能作画
阿_旭2 小时前
一文读懂| 自注意力与交叉注意力机制在计算机视觉中作用与基本原理
人工智能·深度学习·计算机视觉·cross-attention·self-attention
王哈哈^_^2 小时前
【数据集】【YOLO】【目标检测】交通事故识别数据集 8939 张,YOLO道路事故目标检测实战训练教程!
前端·人工智能·深度学习·yolo·目标检测·计算机视觉·pyqt
IT规划师2 小时前
开源 - Ideal库 - 常用时间转换扩展方法(二)
开源·.net core·时间转换·ideal库
Power20246663 小时前
NLP论文速读|LongReward:基于AI反馈来提升长上下文大语言模型
人工智能·深度学习·机器学习·自然语言处理·nlp
数据猎手小k3 小时前
AIDOVECL数据集:包含超过15000张AI生成的车辆图像数据集,目的解决旨在解决眼水平分类和定位问题。
人工智能·分类·数据挖掘
好奇龙猫3 小时前
【学习AI-相关路程-mnist手写数字分类-win-硬件:windows-自我学习AI-实验步骤-全连接神经网络(BPnetwork)-操作流程(3) 】
人工智能·算法