太原模板建站平台,旅游企业网站建设工作的通知,什么网站做推广农产品比较好,文化传媒公司起名字大全免费1 配置LMDeploy环境
1.1 InternStudio开发机创建与环境搭建
打开InternStudio平台#xff0c;进入如下界面创建环境 在终端中#xff0c;让我们输入以下指令#xff0c;来创建一个名为lmdeploy的conda环境#xff0c;python版本为3.10#xff0c;创建成功后激活环境并安…1 配置LMDeploy环境
1.1 InternStudio开发机创建与环境搭建
打开InternStudio平台进入如下界面创建环境 在终端中让我们输入以下指令来创建一个名为lmdeploy的conda环境python版本为3.10创建成功后激活环境并安装0.5.3版本的lmdeploy及相关包。
conda create -n lmdeploy python3.10 -y
conda activate lmdeploy
conda install pytorch2.1.2 torchvision0.16.2 torchaudio2.1.2 pytorch-cuda12.1 -c pytorch -c nvidia -y
pip install timm1.0.8 openai1.40.3 lmdeploy[all]0.5.3pip install datasets2.19.2
1.2 InternStudio环境获取模型
为方便文件管理我们需要一个存放模型的目录本教程统一放置在/root/models/目录。
运行以下命令创建文件夹并设置开发机共享目录的软链接。
mkdir /root/models
ln -s /root/share/new_models/Shanghai_AI_Laboratory/internlm2_5-7b-chat /root/models
ln -s /root/share/new_models/Shanghai_AI_Laboratory/internlm2_5-1_8b-chat /root/models
ln -s /root/share/new_models/OpenGVLab/InternVL2-26B /root/models
1.2.1基础任务完成此任务即完成闯关
使用结合W4A16量化与kv cache量化的internlm2_5-1_8b-chat模型封装本地API并与大模型进行一次对话作业截图需包括显存占用情况与大模型回复
1.3 LMDeploy验证启动文件
在量化工作正式开始前我们还需要验证一下获取的模型文件能否正常工作以免竹篮打水一场空。
让我们进入创建好的conda环境并启动internlm2_5-1_8b-chat
conda activate lmdeploy
lmdeploy chat /root/models/internlm2_5-1_8b-chat
此时我们可以在CLI(“命令行界面” Command Line Interface的缩写)中和InternLM2.5尽情对话了注意输入内容完成后需要按两次回车才能够执行以下为示例。 InternStudio提供的资源监控。 此外如果想要实现显存资源的监控我们也可以新开一个终端输入如下两条指令的任意一条查看命令输入时的显存占用情况。
nvidia-smi
studio-smi 注释实验室提供的环境为虚拟化的显存nvidia-smi是NVIDIA GPU驱动程序的一部分用于显示NVIDIA GPU的当前状态故当前环境只能看80GB单卡 A100 显存使用情况无法观测虚拟化后30%或50%A100等的显存情况。针对于此实验室提供了studio-smi 命令工具能够观测到虚拟化后的显存使用情况。
2 LMDeploy与InternLM2.5
2.1 LMDeploy API部署INternLM2.5
在上一章节我们直接在本地部署InternLM2.5。而在实际应用中我们有时会将大模型封装为API接口服务供客户端访问。
2.1.1 启动API服务器
首先让我们进入创建好的conda环境并通下命令启动API服务器部署InternLM2.5模型
conda activate lmdeploy
lmdeploy serve api_server \/root/models/internlm2_5-7b-chat \--model-format hf \--quant-policy 0 \--server-name 0.0.0.0 \--server-port 23333 \--tp 1
命令解释
lmdeploy serve api_server这个命令用于启动API服务器。/root/models/internlm2_5-7b-chat这是模型的路径。--model-format hf这个参数指定了模型的格式。hf代表“Hugging Face”格式。--quant-policy 0这个参数指定了量化策略。--server-name 0.0.0.0这个参数指定了服务器的名称。在这里0.0.0.0是一个特殊的IP地址它表示所有网络接口。--server-port 23333这个参数指定了服务器的端口号。在这里23333是服务器将监听的端口号。--tp 1这个参数表示并行数量GPU数量。
这一步由于部署在远程服务器上所以本地需要做一下ssh转发才能直接访问。在你本地打开一个cmd或powershell窗口输入命令如下 ssh -CNg -L 23333:127.0.0.1:23333 rootssh.intern-ai.org.cn -p 你的ssh端口号
输入后首次访问可能会询问你是否继续连接敲入yes并回车即可。
然后打开浏览器访问http://127.0.0.1:23333看到如下界面即代表部署成功。 2.1.2 以命令行形式连接API服务器
关闭http://127.0.0.1:23333网页但保持终端和本地窗口不动新建一个终端。
运行如下命令激活conda环境并启动命令行客户端。
conda activate lmdeploy
lmdeploy serve api_client http://localhost:23333
稍待片刻等出现double enter to end input 的输入提示即启动成功此时便可以随意与InternLM2.5对话同样是两下回车确定输入exit退出。 2.1.3 以Gradio网页形式连接API服务器
保持第一个终端不动在新建终端中输入exit退出。
输入以下命令使用Gradio作为前端启动网页。
lmdeploy serve gradio http://localhost:23333 \--server-name 0.0.0.0 \--server-port 6006
关闭之前的cmd/powershell窗口重开一个再次做一下ssh转发(因为此时端口不同)。在你本地打开一个cmd或powershell窗口输入命令如下。
ssh -CNg -L 6006:127.0.0.1:6006 rootssh.intern-ai.org.cn -p 你的ssh端口号 打开浏览器访问地址http://127.0.0.1:6006然后就可以与模型尽情对话了。 2.2 LMDeploy Lite
随着模型变得越来越大我们需要一些大模型压缩技术来降低模型部署的成本并提升模型的推理性能。LMDeploy 提供了权重量化和 k/v cache两种策略。
2.2.1 设置最大kv cache缓存大小
kv cache是一种缓存技术通过存储键值对的形式来复用计算结果以达到提高性能和降低内存消耗的目的。在大规模训练和推理中kv cache可以显著减少重复计算量从而提升模型的推理速度。理想情况下kv cache全部存储于显存以加快访存速度。
模型在运行时占用的显存可大致分为三部分模型参数本身占用的显存、kv cache占用的显存以及中间运算结果占用的显存。LMDeploy的kv cache管理器可以通过设置--cache-max-entry-count参数控制kv缓存占用剩余显存的最大比例。默认的比例为0.8。
显存占用情况: 2.2.2 设置在线 kv cache int4/int8 量化
自 v0.4.0 起LMDeploy 支持在线 kv cache int4/int8 量化量化方式为 per-head per-token 的非对称量化。此外通过 LMDeploy 应用 kv 量化非常简单只需要设定 quant_policy 和cache-max-entry-count参数。目前LMDeploy 规定 quant_policy4 表示 kv int4 量化quant_policy8 表示 kv int8 量化。
我们通过2.1 LMDeploy API部署InternLM2.5的实践为例输入以下指令启动API服务器。
lmdeploy serve api_server \/root/models/internlm2_5-1_8b-chat \--model-format hf \--quant-policy 4 \--cache-max-entry-count 0.4\--server-name 0.0.0.0 \--server-port 23333 \--tp 1
稍待片刻显示如下即代表服务启动成功。 2.2.3 W4A16 模型量化和部署
准确说模型量化是一种优化技术旨在减少机器学习模型的大小并提高其推理速度。量化通过将模型的权重和激活从高精度如16位浮点数转换为低精度如8位整数、4位整数、甚至二值网络来实现。
那么标题中的W4A16又是什么意思呢
W4这通常表示权重量化为4位整数int4。这意味着模型中的权重参数将从它们原始的浮点表示例如FP32、BF16或FP16Internlm2.5精度为BF16转换为4位的整数表示。这样做可以显著减少模型的大小。A16这表示激活或输入/输出仍然保持在16位浮点数例如FP16或BF16。激活是在神经网络中传播的数据通常在每层运算之后产生。
因此W4A16的量化配置意味着
权重被量化为4位整数。激活保持为16位浮点数。
让我们回到LMDeploy在最新的版本中LMDeploy使用的是AWQ算法能够实现模型的4bit权重量化。输入以下指令执行量化工作。(不建议运行在InternStudio上运行需要8小时)
完成作业时请使用1.8B模型进行量化(建议运行以下命令)
lmdeploy lite auto_awq \/root/models/internlm2_5-1_8b-chat \--calib-dataset ptb \--calib-samples 128 \--calib-seqlen 2048 \--w-bits 4 \--w-group-size 128 \--batch-size 1 \--search-scale False \--work-dir /root/models/internlm2_5-1_8b-chat-w4a16-4bit
命令解释
lmdeploy lite auto_awq: lite这是LMDeploy的命令用于启动量化过程而auto_awq代表自动权重量化auto-weight-quantization。/root/models/internlm2_5-7b-chat: 模型文件的路径。--calib-dataset ptb: 这个参数指定了一个校准数据集这里使用的是’ptb’Penn Treebank一个常用的语言模型数据集。--calib-samples 128: 这指定了用于校准的样本数量—128个样本--calib-seqlen 2048: 这指定了校准过程中使用的序列长度—2048--w-bits 4: 这表示权重weights的位数将被量化为4位。--work-dir /root/models/internlm2_5-7b-chat-w4a16-4bit: 这是工作目录的路径用于存储量化后的模型和中间结果。
等终端输出如下时说明正在推理中稍待片刻。 如果此处出现报错TypeError: NoneType object is not callable原因是 当前版本的 datasets3.0 无法下载calibrate数据集 在命令前加一行 pip install datasets2.19.2 可以解决
等待推理完成便可以直接在你设置的目标文件夹看到对应的模型文件。
那么推理后的模型和原本的模型区别在哪里呢最明显的两点是模型文件大小以及占据显存大小。
我们可以输入如下指令查看在当前目录中显示所有子目录的大小。
cd /root/models/
du -sh *那么原模型大小呢输入以下指令查看。
cd /root/share/new_models/Shanghai_AI_Laboratory/
du -sh *那么显存占用情况对比呢输入以下指令启动量化后的模型。
lmdeploy chat /root/models/internlm2_5-1_8b-chat-w4a16-4bit/ --model-format awq
稍待片刻我们直接观测右上角的显存占用情况。 2.2.4 W4A16 量化 KV cacheKV cache 量化
输入以下指令让我们同时启用量化后的模型、设定kv cache占用和kv cache int4量化。
lmdeploy serve api_server \/root/models/internlm2_5-1_8b-chat-w4a16-4bit/ \--model-format awq \--quant-policy 4 \--cache-max-entry-count 0.4\--server-name 0.0.0.0 \--server-port 23333 \--tp 1 此时显存占比如下 3 LMDeploy与InternVL2
3.1 LMDeploy Lite
InternVL2-26B需要约70GB显存但是为了让我们能够在30%A100上运行需要先进行量化操作这也是量化本身的意义所在——即降低模型部署成本。
针对InternVL系列模型让我们先进入conda环境并输入以下指令执行模型的量化工作。(本步骤耗时较长请耐心等待)
conda activate lmdeploy
lmdeploy lite auto_awq \/root/models/InternVL2-26B \--calib-dataset ptb \--calib-samples 128 \--calib-seqlen 2048 \--w-bits 4 \--w-group-size 128 \--batch-size 1 \--search-scale False \--work-dir /root/models/InternVL2-26B-w4a16-4bit 等终端输出如下时说明正在推理中稍待片刻。 4 LMDeploy之FastAPI与Function call
之前在2.1.1 启动API服务器与3.2 LMDeploy API部署InternVL2均是借助FastAPI封装一个API出来让LMDeploy自行进行访问在这一章节中我们将依托于LMDeploy封装出来的API进行更加灵活更具DIY的开发。
4.1 API开发
与之前一样让我们进入创建好的conda环境并输入指令启动API服务器。
完成作业时请使用以下命令
conda activate lmdeploy
lmdeploy serve api_server \/root/models/internlm2_5-1_8b-chat-w4a16-4bit \--model-format awq \--cache-max-entry-count 0.4 \--quant-policy 4 \--server-name 0.0.0.0 \--server-port 23333 \--tp 1
保持终端窗口不动新建一个终端。
在新建终端中输入如下指令新建internlm2_5.py。
touch /root/internlm2_5.py
将以下内容复制粘贴进internlm2_5.py。
# 导入openai模块中的OpenAI类这个类用于与OpenAI API进行交互
from openai import OpenAI# 创建一个OpenAI的客户端实例需要传入API密钥和API的基础URL
client OpenAI(api_keyYOUR_API_KEY, # 替换为你的OpenAI API密钥由于我们使用的本地API无需密钥任意填写即可base_urlhttp://0.0.0.0:23333/v1 # 指定API的基础URL这里使用了本地地址和端口
)# 调用client.models.list()方法获取所有可用的模型并选择第一个模型的ID
# models.list()返回一个模型列表每个模型都有一个id属性
model_name client.models.list().data[0].id# 使用client.chat.completions.create()方法创建一个聊天补全请求
# 这个方法需要传入多个参数来指定请求的细节
response client.chat.completions.create(modelmodel_name, # 指定要使用的模型IDmessages[ # 定义消息列表列表中的每个字典代表一个消息{role: system, content: 你是一个友好的小助手负责解决问题.}, # 系统消息定义助手的行为{role: user, content: 帮我讲述一个关于狐狸和西瓜的小故事}, # 用户消息询问时间管理的建议],temperature0.8, # 控制生成文本的随机性值越高生成的文本越随机top_p0.8 # 控制生成文本的多样性值越高生成的文本越多样
)# 打印出API的响应结果
print(response.choices[0].message.content)
按CtrlS键保存Mac用户按CommandS。
现在让我们在新建终端输入以下指令激活环境并运行python代码。
conda activate lmdeploy
python /root/internlm2_5.py
终端会输出如下结果。 4.2 Function call
关于Function call即函数调用功能它允许开发者在调用模型时详细说明函数的作用并使模型能够智能地根据用户的提问来输入参数并执行函数。完成调用后模型会将函数的输出结果作为回答用户问题的依据。
首先让我们进入创建好的conda环境并启动API服务器。
conda activate lmdeploy
lmdeploy serve api_server \/root/models/internlm2_5-1_8b-chat \--model-format hf \--quant-policy 0 \--server-name 0.0.0.0 \--server-port 23333 \--tp 1 目前LMDeploy在0.5.3版本中支持了对InternLM2, InternLM2.5和llama3.1这三个模型故我们选用InternLM2.5 封装API。
让我们使用一个简单的例子作为演示。输入如下指令新建internlm2_5_func.py。
touch /root/internlm2_5_func.py
from openai import OpenAIdef add(a: int, b: int):return a bdef mul(a: int, b: int):return a * btools [{type: function,function: {name: add,description: Compute the sum of two numbers,parameters: {type: object,properties: {a: {type: int,description: A number,},b: {type: int,description: A number,},},required: [a, b],},}
}, {type: function,function: {name: mul,description: Calculate the product of two numbers,parameters: {type: object,properties: {a: {type: int,description: A number,},b: {type: int,description: A number,},},required: [a, b],},}
}]
messages [{role: user, content: Compute (35)*2}]client OpenAI(api_keyYOUR_API_KEY, base_urlhttp://0.0.0.0:23333/v1)
model_name client.models.list().data[0].id
response client.chat.completions.create(modelmodel_name,messagesmessages,temperature0.8,top_p0.8,streamFalse,toolstools)
print(response)
func1_name response.choices[0].message.tool_calls[0].function.name
func1_args response.choices[0].message.tool_calls[0].function.arguments
func1_out eval(f{func1_name}(**{func1_args}))
print(func1_out)messages.append({role: assistant,content: response.choices[0].message.content
})
messages.append({role: environment,content: f35{func1_out},name: plugin
})
response client.chat.completions.create(modelmodel_name,messagesmessages,temperature0.8,top_p0.8,streamFalse,toolstools)
print(response)
func2_name response.choices[0].message.tool_calls[0].function.name
func2_args response.choices[0].message.tool_calls[0].function.arguments
func2_out eval(f{func2_name}(**{func2_args}))
print(func2_out)
按CtrlS键保存Mac用户按CommandS。
现在让我们输入以下指令运行python代码
python /root/internlm2_5_func.py