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```
3349cd /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```
5069docker 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环境和模型挂载是否正常
5879docker exec -it fastdeploy_serving /bin/bash
5980nvidia-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```
123132cd /opt/output/Serving
@@ -130,10 +139,12 @@ bash start_server.sh
130139
131140```
132141# port为上面启动服务时候指定的HTTP_PORT
142+ > 测试前请确保服务IP和端口正确
143+
133144live接口: (服务是否能正常接收请求)
134- http://{ip}:{HTTP_PORT} /v2/health/live
145+ http://127.0.0.1:8110 /v2/health/live
135146health接口:(模型是否准备好推理)
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
149160chatbot = 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)
153164print(result)
154165
155166# 流式接口
156167chatbot = 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)
158169for res in stream_result:
159170 print(res)
160171```
@@ -168,16 +179,33 @@ import uuid
168179import json
169180import 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"
172184req_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)
181209for line in res.iter_lines():
182210 print(json.loads(line))
183211```
@@ -205,7 +233,8 @@ for line in res.iter_lines():
205233```
206234import 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# 非流式返回
211240response = client.completions.create(
@@ -267,6 +296,17 @@ for chunk in response:
267296print("\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 | |
0 commit comments