赞
踩
transformers里也有模型部署的相关功能
HuggingFace—transformer
modelscope
量化的对象为以下
现在许多量化是只进行参数量化(Weight Only)
可量化的参数包括: 权重和激活值(Weight and Activation),对于矩阵乘法Y = WX,W为权重,X就是激活值(输入)。
一般不会量化Bias和Normalization:因为这些参数少,而且非常重要
大模型的参数量化包括两类:
推理评估指标为:吞吐量(Throughput)和延迟(Latency)。对于W4A16和W8A8,可以根据业务场景的实际需求分别选用:
GPTQ
AWQ
即对于历史信息的动态分割与融合
输入,输出以及KV Cache会被缓存下来
理论上可以支持无限长的状态存储
空间充足时:token id和k/v block一起存储
空间不充足时:只存储token id,再输入命中时,再重新启动推理得到其k/v value
K/V value作为重要推理中间结果,将K/V value进行缓存,能够避免每次都从头推理,有效加速自回归推理过程。
最简单的K/V Cache就是全量的缓存
将所有K/V value进行分块,并按照状态缓存和使用对应block的K/V value
API-server
Triton inference server
python
gRPC
RESTful
使用 TurboMind 推理模型需要先将模型转化为 TurboMind 的格式,目前支持在线转换和离线转换两种形式。
在线转换可以直接加载 Huggingface 模型,离线转换需需要先保存模型再加载。
lmdeploy 支持直接读取 Huggingface 模型权重,目前共支持三种类型:
# 需要能访问 Huggingface 的网络环境
lmdeploy chat turbomind internlm/internlm-chat-20b-4bit --model-name internlm-chat-20b
lmdeploy chat turbomind Qwen/Qwen-7B-Chat --model-name qwen-7b
上面两行命令分别展示了如何直接加载 Huggingface 的模型,第一条命令是加载使用 lmdeploy 量化的版本,第二条命令是加载其他 LLM 模型。
直接启动本地的 Huggingface 模型,如下所示。
lmdeploy chat turbomind /root/model/Singa_Model/internlm-chat-7b --model-name internlm-chat-7b
以上命令都会启动一个本地对话界面,通过 Bash 可以与 LLM 进行对话。
离线转换需要在启动服务之前,将模型转为 lmdeploy TurboMind 的格式,如下所示。
# 转换模型(FastTransformer格式) TurboMind
lmdeploy convert internlm-chat-7b /path/to/internlm-chat-7b
lmdeploy convert internlm-chat-7b /root/model/Singa_Model/internlm-chat-7b
执行完成后将会在当前目录生成一个 workspace
的文件夹。这里面包含的就是 TurboMind 和 Triton “模型推理”需要到的文件。
我们先尝试本地对话(Bash Local Chat
),下面用(Local Chat 表示)在这里其实是跳过 API Server 直接调用 TurboMind。简单来说,就是命令行代码直接执行 TurboMind。所以说,实际和前面的架构图是有区别的。
这里支持多种方式运行,比如Turbomind、PyTorch、DeepSpeed。但 PyTorch 和 DeepSpeed 调用的其实都是 Huggingface 的 Transformers 包,PyTorch表示原生的 Transformer 包,DeepSpeed 表示使用了 DeepSpeed 作为推理框架。Pytorch/DeepSpeed 目前功能都比较弱,不具备生产能力,不推荐使用。
执行命令如下。
# Turbomind + Bash Local Chat
lmdeploy chat turbomind ./workspace
![请添加图片描述](https://img-blog.csdnimg.cn/direct/8d40734526ac44a5a4d4c8d0df587f9b.png
很奇怪,量化后并没有降低显存,肯定是哪里出了问题。
lmdeploy chat turbomind ./workspace_quant
我们把从架构上把整个服务流程分成下面几个模块。
属于C/S架构:Server端要将Inference和API拆分开,C端即客户端
值得说明的是,以上的划分是一个相对完整的模型,但在实际中这并不是绝对的。比如可以把“模型推理”和“API Server”合并,有的甚至是三个流程打包在一起提供服务。
”模型推理/服务“目前提供了 Turbomind 和 TritonServer 两种服务化方式。此时,Server 是 TurboMind 或 TritonServer,API Server 可以提供对外的 API 服务。我们推荐使用 TurboMind,TritonServer 使用方式详见《附录1》。
首先,通过下面命令启动服务。
# ApiServer+Turbomind api_server => AsyncEngine => TurboMind
lmdeploy serve api_server ./workspace \
--server_name 0.0.0.0 \
--server_port 23333 \
--instance_num 64 \ # 可以认为就是batch slots
--tp 1 # tensor 并行数
上面的参数中 server_name
和 server_port
分别表示服务地址和端口,tp
参数我们之前已经提到过了,表示 Tensor 并行。还剩下一个 instance_num
参数,表示实例数,可以理解成 Batch 的大小
然后,我们可以新开一个窗口,执行下面的 Client 命令。如果使用官方机器,可以打开 vscode 的 Terminal,执行下面的命令。
# ChatApiClient+ApiServer(注意是http协议,需要加http)
lmdeploy serve api_client http://localhost:23333
查看接口:
当然,刚刚我们启动的是 API Server,自然也有相应的接口。可以直接打开 http://{host}:23333
查看
注意,这一步由于 Server 在远程服务器上,所以本地需要做一下 ssh 转发才能直接访问(与第一部分操作一样),命令如下:
ssh -CNg -L 23333:127.0.0.1:23333 root@ssh.intern-ai.org.cn -p <你的ssh端口号>
实际上就是通过gradio
展示推理页面,后端还是TurboMind(命令行 或 API) 推理
这一部分主要是将 Gradio 作为前端 Demo 演示。在上一节的基础上,我们不执行后面的 api_client
或 triton_client
,而是执行 gradio
。
由于 Gradio 需要本地访问展示界面,因此也需要通过 ssh 将数据转发到本地。命令如下:
ssh -CNg -L 6006:127.0.0.1:6006 root@ssh.intern-ai.org.cn -p <你的 ssh 端口号>
本地推理—>API server(23333)—>gradio展示(6006)—>远程转发(6006)
先启动turbomind server建立API服务,再基于API server作为后端
API server不启动也能打开网页,但启动API server后才能推理
API Server 的启动和上一节一样,这里直接启动作为前端的 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
当然,Gradio 也可以直接和 TurboMind 连接,如下所示。
# Gradio+Turbomind(local)
lmdeploy serve gradio ./workspace
可以直接启动 Gradio,此时没有 API Server,TurboMind 直接与 Gradio 通信。
本地API对话
查看API server
server API作为后端
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。