Skip to content

Commit 608d4be

Browse files
authored
Merge pull request #2563 from kevincheng2/develop
[llm] update docs
2 parents fd44c00 + f11edc4 commit 608d4be

2 files changed

Lines changed: 86 additions & 45 deletions

File tree

llm/docs/FastDeploy_usage_tutorial.md

Lines changed: 85 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -2,37 +2,53 @@
22
## 目录
33

44
- [部署环境准备](#部署环境准备)
5+
- [基础环境](#基础环境)
56
- [准备部署镜像](#准备部署镜像)
67
- [准备模型](#准备模型)
78
- [创建容器](#创建容器)
8-
- [基于dockerfile创建自己的镜像](#基于dockerfile创建自己的镜像)
99
- [启动服务](#启动服务)
1010
- [配置参数](#配置参数)
11-
- [启动FastDeploy](#启动FastDeploy)
11+
- [启动服务](#启动服务)
1212
- [服务状态查询](#服务状态查询)
1313
- [服务测试](#服务测试)
1414
- [Python 客户端](#Python-客户端)
1515
- [HTTP调用](#HTTP调用)
16+
- [OpenAI 客户端](#OpenAI-客户端)
1617
- [返回示例](#返回示例)
18+
- [基于dockerfile创建自己的镜像](#基于dockerfile创建自己的镜像)
1719
- [模型配置参数介绍](#模型配置参数介绍)
1820
- [请求参数介绍](#请求参数介绍)
1921

2022
## 部署环境准备
2123

24+
### 基础环境
25+
目前 FastDeploy 仅支持在 Linux 系统下部署,部署之前请确保系统有正确的 GPU 环境。
26+
27+
- 安装 docker
28+
请参考 [Install Docker Engine](https://docs.docker.com/engine/install/) 选择对应的 Linux 平台安装 docker 环境。
29+
30+
- 安装 NVIDIA Container Toolkit
31+
请参考 [Installing the NVIDIA Container Toolkit](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html#installing-the-nvidia-container-toolkit) 了解并安装 NVIDIA Container Toolkit。
32+
33+
NVIDIA Container Toolkit 安装成功后,参考 [Running a Sample Workload with Docker](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/sample-workload.html#running-a-sample-workload-with-docker) 测试 NVIDIA Container Toolkit 是否可以正常使用。
34+
2235
### 准备部署镜像
2336

24-
为了方便部署,我们提供了cuda12.3的镜像,可以直接拉取镜像,或者使用dockerfile[构建自定义镜像](#基于dockerfile创建自己的镜像)
37+
为了方便部署,我们提供了 cuda12.3 的镜像,可以直接拉取镜像,或者使用我们提供的 `Dockerfile` [构建自定义镜像](#基于dockerfile创建自己的镜像)
2538
```
26-
docker pull registry.baidubce.com/paddlepaddle/fastdeploy:llm-serving-cuda123-cudnn9-v1.0
39+
docker pull registry.baidubce.com/paddlepaddle/fastdeploy:llm-serving-cuda123-cudnn9-v1.2
2740
```
2841

2942
### 准备模型
3043

31-
模型放在对应文件夹下,以 `/home/workspace/models_dir` 为例
44+
FastDeploy 为 PaddleNLP 静态图模型提供了高效的部署方案,模型静态图导出方案请参考:[LLaMA](https://github.com/PaddlePaddle/PaddleNLP/blob/develop/llm/docs/predict/llama.md)[Qwen](https://github.com/PaddlePaddle/PaddleNLP/blob/develop/llm/docs/predict/qwen.md)[Mixtral](https://github.com/PaddlePaddle/PaddleNLP/blob/develop/llm/docs/predict/mixtral.md) ...
45+
46+
导出后的模型放在任意文件夹下,以 `/home/workspace/models_dir` 为例
47+
3248
```
3349
cd /home/workspace/models_dir
3450
35-
# 模型内目录结构需要整理成特定格式,如下是单卡部署的模型目录结构
51+
# 导出的模型目录结构如下所示,理论上无缝支持 PaddleNLP 导出的静态图模型,无需修改模型目录结构
3652
# /opt/output/Serving/models
3753
# ├── config.json # 模型配置文件
3854
# ├── xxxx.model # 词表模型文件
@@ -46,31 +62,25 @@ cd /home/workspace/models_dir
4662

4763
### 创建容器
4864

65+
创建容器之前,请检查 Docker 版本和 GPU 环境,确保 Docker 支持 `--gpus all` 参数。
66+
67+
将模型目录挂载到容器中,默认模型挂载地址为 `/models/`,服务启动时可通过 `MODEL_DIR` 环境变量自定义挂载地址。
4968
```
5069
docker run --gpus all \
5170
--name fastdeploy_serving \
71+
--privileged \
72+
--cap-add=SYS_PTRACE \
5273
--network=host \
53-
--shm-size=10G \
54-
-v /home/workspace/models_dir:/fastdeploy/models/ \
55-
-dit registry.baidubce.com/paddlepaddle/fastdeploy:llm-serving-cuda123-cudnn9-v1.0 bash
74+
--shm-size=5G \
75+
-v /home/workspace/models_dir:/models/ \
76+
-dit registry.baidubce.com/paddlepaddle/fastdeploy:llm-serving-cuda123-cudnn9-v1.2 bash
5677
5778
# 进入容器,检查GPU环境和模型挂载是否正常
5879
docker exec -it fastdeploy_serving /bin/bash
5980
nvidia-smi
60-
ls /fastdeploy/models/
81+
ls /models/
6182
```
6283

63-
## 基于dockerfile创建自己的镜像
64-
65-
```
66-
git clone https://github.com/PaddlePaddle/FastDeploy.git
67-
cd FastDeploy/llm
68-
69-
docker build --network=host -f ./dockerfiles/Dockerfile_serving_cuda123_cudnn9 -t llm-serving-cu123-self .
70-
```
71-
72-
创建自己的镜像后,可以基于该镜像[创建容器](#创建容器)
73-
7484
## 启动服务
7585

7686
### 配置参数
@@ -93,13 +103,12 @@ export CUDA_VISIBLE_DEVICES=0
93103
# 默认关闭
94104
# export DISABLE_STREAMING=1
95105
96-
# 配置数据服务。需要自行修改HTTP_PORT、GRPC_PORT、METRICS_PORT和INFER_QUEUE_PORT。
97-
# 请事先检查端口可用:执行`netstat -tuln | grep <端口号>`,如果没有log输出,则表示该端口未被占用。
98-
export HTTP_PORT="8751" # 探活服务的http端口(当前仅用于健康检查、探活)
99-
export GRPC_PORT="8752" # 模型推服务的grpc端口
100-
export METRICS_PORT="8753" # 模型服务中监督指标的端口
101-
export INFER_QUEUE_PORT="8754" # 模型服务内部使用的端口
102-
export PUSH_MODE_HTTP_PORT="8143" # 服务请求HTTP端口号,如不配置,默认为-1,即服务只支持GRPC协议
106+
# 配置数据服务。需要自行修改HTTP_PORT、GRPC_PORT、METRICS_PORT和INFER_QUEUE_PORT。(请事先检查端口可用)
107+
export HTTP_PORT="8110" # 探活服务的http端口(当前仅用于健康检查、探活)
108+
export GRPC_PORT="8811" # 模型推服务的grpc端口
109+
export METRICS_PORT="8722" # 模型服务中监督指标的端口
110+
export INFER_QUEUE_PORT="8813" # 模型服务内部使用的端口
111+
export PUSH_MODE_HTTP_PORT="9965" # 服务请求HTTP端口号,如不配置,默认为-1,即服务只支持GRPC协议
103112
104113
# MAX_SEQ_LEN: 服务会拒绝input token数量超过MAX_SEQ_LEN的请求,并返回错误提示
105114
# MAX_DEC_LEN: 服务会拒绝请求中max_dec_len/min_dec_len超过此参数的请求,并返回错误提示
@@ -117,7 +126,7 @@ export PUSH_MODE_HTTP_WORKERS="1" # HTTP服务进程数,在 PUSH_MODE_HTTP_POR
117126

118127
更多请求参数请参考[模型配置参数介绍](#模型配置参数介绍)
119128

120-
### 启动FastDeploy
129+
### 启动服务
121130

122131
```
123132
cd /opt/output/Serving
@@ -130,10 +139,12 @@ bash start_server.sh
130139

131140
```
132141
# port为上面启动服务时候指定的HTTP_PORT
142+
> 测试前请确保服务IP和端口正确
143+
133144
live接口: (服务是否能正常接收请求)
134-
http://{ip}:{HTTP_PORT}/v2/health/live
145+
http://127.0.0.1:8110/v2/health/live
135146
health接口:(模型是否准备好推理)
136-
http://{ip}:{HTTP_PORT}/v2/health/ready
147+
http://127.0.0.1:8110/v2/health/ready
137148
```
138149

139150
## 服务测试
@@ -149,12 +160,12 @@ port = 8811 # 服务配置的GRPC_PORT
149160
chatbot = ChatBot(hostname=hostname, port=port)
150161
151162
# 非流式接口
152-
result = chatbot.generate("你好", topp=0.8, max_dec_len=128, timeout=120)
163+
result = chatbot.generate("hello", topp=0.8, max_dec_len=128, timeout=120)
153164
print(result)
154165
155166
# 流式接口
156167
chatbot = ChatBot(hostname=hostname, port=port)
157-
stream_result = chatbot.stream_generate("你好", max_dec_len=128, timeout=120)
168+
stream_result = chatbot.stream_generate("hello", max_dec_len=128, timeout=120)
158169
for res in stream_result:
159170
print(res)
160171
```
@@ -168,16 +179,33 @@ import uuid
168179
import json
169180
import requests
170181
171-
url = f"http://127.0.0.1:{PUSH_MODE_HTTP_PORT}/v1/chat/completions"
182+
push_mode_http_port = "9965" # 服务配置的PUSH_MODE_HTTP_PORT
183+
url = f"http://127.0.0.1:{push_mode_http_port}/v1/chat/completions"
172184
req_id = str(uuid.uuid1())
173-
data = {
174-
"text": "Hello, how are you?",
175-
"req_id": req_id,
176-
"max_dec_len": 64,
177-
"stream": True,
178-
}
185+
data_single = {
186+
"text": "Hello, how are you?",
187+
"req_id": req_id,
188+
"max_dec_len": 64,
189+
"stream": True,
190+
}
179191
# 逐token返回
180-
res = requests.post(url, json=data, stream=True)
192+
res = requests.post(url, json=data_single, stream=True)
193+
for line in res.iter_lines():
194+
print(json.loads(line))
195+
196+
# 多轮对话
197+
data_multi = {
198+
"messages": [
199+
{"role": "user", "content": "Hello, who are you"},
200+
{"role": "system", "content": "I'm a helpful AI assistant."},
201+
{"role": "user", "content": "List 3 countries and their capitals."},
202+
],
203+
"req_id": req_id,
204+
"max_dec_len": 64,
205+
"stream": True,
206+
}
207+
# 逐token返回
208+
res = requests.post(url, json=data_multi, stream=True)
181209
for line in res.iter_lines():
182210
print(json.loads(line))
183211
```
@@ -205,7 +233,8 @@ for line in res.iter_lines():
205233
```
206234
import openai
207235
208-
client = openai.Client(base_url="http://127.0.0.1:{PUSH_MODE_HTTP_PORT}/v1/chat/completions", api_key="EMPTY_API_KEY")
236+
push_mode_http_port = "9965" # 服务配置的PUSH_MODE_HTTP_PORT
237+
client = openai.Client(base_url=f"http://127.0.0.1:{push_mode_http_port}/v1/chat/completions", api_key="EMPTY_API_KEY")
209238
210239
# 非流式返回
211240
response = client.completions.create(
@@ -267,6 +296,17 @@ for chunk in response:
267296
print("\n")
268297
```
269298

299+
## 基于dockerfile创建自己的镜像
300+
301+
为了方便用户构建自定义服务,我们提供了基于dockerfile创建自己的镜像的脚本。
302+
```
303+
git clone https://github.com/PaddlePaddle/FastDeploy.git
304+
cd FastDeploy/llm
305+
306+
docker build --network=host -f ./dockerfiles/Dockerfile_serving_cuda123_cudnn9 -t llm-serving-cu123-self .
307+
```
308+
创建自己的镜像后,可以基于该镜像[创建容器](#创建容器)
309+
270310
## 模型配置参数介绍
271311

272312
| 字段名 | 字段类型 | 说明 | 是否必填 | 默认值 | 备注 |
@@ -277,7 +317,7 @@ print("\n")
277317
| GRPC_PORT | int | 模型推服务的grpc端口 ||| |
278318
| METRICS_PORT | int | 模型服务中监督指标的端口 ||| |
279319
| INFER_QUEUE_PORT | int | 模型服务内部使用的端口 || 56666 | |
280-
| PUSH_MODE_HTTP_PORT | int | 服务请求HTTP端口号 | 否 | -1 | 如不配置,服务只支持GRPC协议
320+
| PUSH_MODE_HTTP_PORT | int | 服务请求HTTP端口号 || -1 | 如不配置,服务只支持GRPC协议 |
281321
| DISABLE_STREAMING | int | 是否使用流式返回 || 0 | |
282322
| MAX_SEQ_LEN | int | 最大输入序列长度 || 8192 | 服务会拒绝input token数量超过MAX_SEQ_LEN的请求,并返回错误提示 |
283323
| MAX_DEC_LEN | int | 最大decoer序列长度 || 1024 | 服务会拒绝请求中max_dec_len/min_dec_len超过此参数的请求,并返回错误提示 |
@@ -298,7 +338,8 @@ print("\n")
298338
| 字段名 | 字段类型 | 说明 | 是否必填 | 默认值 | 备注 |
299339
| :---: | :-----: | :---: | :---: | :-----: | :----: |
300340
| req_id | str | 请求ID,用于标识一个请求。建议设置req_id,保证其唯一性 || 随机id | 如果推理服务中同时有两个相同req_id的请求,会返回req_id重复的错误信息 |
301-
| text | str | 请求的文本 ||| |
341+
| text | str | 请求的文本 ||| text 和 messages 必须有一个 |
342+
| messages | str | 多轮对话文本 ||| 多轮对话以list方式存储 |
302343
| max_dec_len | int | 最大生成token的长度,如果请求的文本token长度加上max_dec_len大于模型的max_seq_len,会返回长度超限的错误信息 || max_seq_len减去文本token长度 | |
303344
| min_dec_len | int | 最小生成token的长度,最小是1 || 1 | |
304345
| topp | float | 控制随机性参数,数值越大则随机性越大,范围是0~1 || 0.7 | |

llm/server/scripts/start_server.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export ENC_DEC_BLOCK_NUM=${ENC_DEC_BLOCK_NUM:-"4"}
2727
export FIRST_TOKEN_ID=${FIRST_TOKEN_ID:-"1"}
2828
export MAX_PREFILL_BATCH=${MAX_PREFILL_BATCH:-"4"}
2929
export STOP_THRESHOLD=${STOP_THRESHOLD:-"0"}
30-
export MODEL_DIR=${MODEL_DIR:-"/models/"}
30+
export MODEL_DIR=${MODEL_DIR:-"/models"}
3131
export DISTRIBUTED_CONFIG=${DISTRIBUTED_CONFIG:-"${MODEL_DIR}/rank_mapping.csv"}
3232
export CONFIG_JSON_FILE=${CONFIG_JSON_FILE:-"config.json"}
3333
export PUSH_MODE_HTTP_WORKERS=${PUSH_MODE_HTTP_WORKERS:-"4"}

0 commit comments

Comments
 (0)