Skip to content

Commit

Permalink
update suffix for PIR(ON/OFF)
Browse files Browse the repository at this point in the history
  • Loading branch information
DrownFish19 committed Feb 6, 2025
1 parent 8fc77d1 commit 5696e9b
Show file tree
Hide file tree
Showing 11 changed files with 448 additions and 374 deletions.
34 changes: 20 additions & 14 deletions llm/predict/predictor.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
import numpy as np
import paddle
import paddle.incubate.multiprocessing as mp
from paddle.base.framework import in_cinn_mode, in_pir_executor_mode, use_pir_api
from paddle.base.framework import in_cinn_mode, in_pir_executor_mode
from paddle.distributed import fleet

try:
Expand All @@ -51,7 +51,12 @@
PretrainedTokenizer,
)
from paddlenlp.trl import llm_utils
from paddlenlp.utils.env import MAX_BSZ, MAX_DRAFT_TOKENS
from paddlenlp.utils.env import (
MAX_BSZ,
MAX_DRAFT_TOKENS,
PADDLE_INFERENCE_MODEL_SUFFIX,
PADDLE_INFERENCE_WEIGHTS_SUFFIX,
)
from paddlenlp.utils.import_utils import is_paddlenlp_ops_available
from paddlenlp.utils.log import logger

Expand Down Expand Up @@ -657,10 +662,11 @@ def _create_predictor(self, predictor_args: PredictorArgument):
infer_model_path = llm_utils.get_infer_model_path(
predictor_args.model_name_or_path, predictor_args.model_prefix
)
if use_pir_api():
config = paddle.inference.Config(infer_model_path + ".json", infer_model_path + ".pdiparams")
else:
config = paddle.inference.Config(infer_model_path + ".pdmodel", infer_model_path + ".pdiparams")

config = paddle.inference.Config(
infer_model_path + PADDLE_INFERENCE_MODEL_SUFFIX,
infer_model_path + PADDLE_INFERENCE_WEIGHTS_SUFFIX,
)

config.switch_ir_optim(True)
# remove `gpu_cpu_map_matmul_v2_to_matmul_pass` to avoid mapping matmul_v2 -> matmul op
Expand Down Expand Up @@ -1084,7 +1090,7 @@ def predict(self, input_texts: list[str], return_tokens=False):
self.full_hidden_states = self._infer(self.model_inputs)
else:
self._infer(self.model_inputs)
logger.info(f"running spend {time.time() - s_time}")
logger.info(f"running spend {time.time() - s_time}")

if self.tensor_parallel_rank == 0:
outputs = []
Expand Down Expand Up @@ -1168,10 +1174,10 @@ def _create_predictor(self, predictor_args: PredictorArgument):
predictor_args.model_name_or_path, predictor_args.model_prefix
)

if use_pir_api():
config = paddle.inference.Config(infer_model_path + ".json", infer_model_path + ".pdiparams")
else:
config = paddle.inference.Config(infer_model_path + ".pdmodel", infer_model_path + ".pdiparams")
config = paddle.inference.Config(
infer_model_path + PADDLE_INFERENCE_MODEL_SUFFIX,
infer_model_path + PADDLE_INFERENCE_WEIGHTS_SUFFIX,
)

config.switch_ir_optim(False)
if predictor_args.device in paddle.device.get_all_custom_device_type():
Expand Down Expand Up @@ -1208,7 +1214,7 @@ def predict(self, input_texts: list[str], return_tokens=False):
self.proposer.insert_query(
base_model_inputs=self.model_inputs, real_bs=len(input_texts), seq_lens=self.seq_lens
)
logger.info(f"preprocess spend {time.time() - s_time}")
logger.info(f"preprocess spend {time.time() - s_time}")

result_queue = mp.Queue()
tensor_queue = mp.Queue()
Expand Down Expand Up @@ -1247,7 +1253,7 @@ def predict(self, input_texts: list[str], return_tokens=False):
self.full_hidden_states = self.predictor.run(list(self.model_inputs.values()))[0]
else:
self.predictor.run(list(self.model_inputs.values()))
logger.info(f"running spend {time.time() - s_time}")
logger.info(f"running spend {time.time() - s_time}")

if self.proposer is not None:
self.proposer.postprocess(base_model_inputs=self.model_inputs)
Expand Down Expand Up @@ -1281,7 +1287,7 @@ def create_predictor(
config: PretrainedConfig,
model_args: ModelArgument,
tokenizer: PretrainedTokenizer = None,
**kwargs
**kwargs,
):
"""
Create a predictor
Expand Down
66 changes: 33 additions & 33 deletions llm/server/docs/deploy_usage_tutorial.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,10 @@
- [服务状态查询](#服务状态查询)
- [服务测试](#服务测试)
- [Python 客户端](#Python-客户端)
- [HTTP调用](#HTTP调用)
- [HTTP 调用](#HTTP 调用)
- [OpenAI 客户端](#OpenAI-客户端)
- [返回示例](#返回示例)
- [基于dockerfile创建自己的镜像](#基于dockerfile创建自己的镜像)
- [基于 dockerfile 创建自己的镜像](#基于 dockerfile 创建自己的镜像)
- [模型配置参数介绍](#模型配置参数介绍)
- [请求参数介绍](#请求参数介绍)

Expand All @@ -34,7 +34,7 @@

### 准备部署镜像

为了方便部署,我们提供了 cuda12.3 的镜像,可以直接拉取镜像,或者使用我们提供的 `Dockerfile` [构建自定义镜像](#基于dockerfile创建自己的镜像)
为了方便部署,我们提供了 cuda12.3 的镜像,可以直接拉取镜像,或者使用我们提供的 `Dockerfile` [构建自定义镜像](#基于 dockerfile 创建自己的镜像)
```
docker pull registry.baidubce.com/paddlepaddle/fastdeploy:llm-serving-cuda123-cudnn9-v1.2
```
Expand All @@ -57,7 +57,7 @@ cd /home/workspace/models_dir
# ├── rank_mapping.csv # 多卡模型会有此文件,如为单卡模型,则无此文件(可选,仅在多卡部署模式下需要)
# └── rank_0 # 保存模型结构和权重文件的目录
# ├── model.pdiparams
# └── model.pdmodel
# └── model.pdmodel 或者 model.json # Paddle 3.0 版本模型为model.json,Paddle 2.x 版本模型为model.pdmodel
```

### 创建容器
Expand Down Expand Up @@ -149,9 +149,9 @@ health接口:(模型是否准备好推理)

## 服务测试

### HTTP调用
### HTTP 调用

提示:HTTP调用接口使用变量 PUSH_MODE_HTTP_PORT 配置!HTTP_PORT 仅用于探活接口使用!
提示:HTTP 调用接口使用变量 PUSH_MODE_HTTP_PORT 配置!HTTP_PORT 仅用于探活接口使用!

```
import uuid
Expand Down Expand Up @@ -217,21 +217,21 @@ client = openai.Client(base_url=f"http://127.0.0.1:{push_mode_http_port}/v1/chat
# 非流式返回
response = client.completions.create(
model="default",
prompt="Hello, how are you?",
max_tokens=50,
stream=False,
model="default",
prompt="Hello, how are you?",
max_tokens=50,
stream=False,
)
print(response)
print("\n")
# 流式返回
response = client.completions.create(
model="default",
prompt="Hello, how are you?",
max_tokens=100,
stream=True,
model="default",
prompt="Hello, how are you?",
max_tokens=100,
stream=True,
)
for chunk in response:
Expand Down Expand Up @@ -275,9 +275,9 @@ for chunk in response:
print("\n")
```

## 基于dockerfile创建自己的镜像
## 基于 dockerfile 创建自己的镜像

为了方便用户构建自定义服务,我们提供了基于dockerfile创建自己的镜像的脚本
为了方便用户构建自定义服务,我们提供了基于 dockerfile 创建自己的镜像的脚本
```
git clone https://github.com/PaddlePaddle/PaddleNLP.git
cd PaddleNLP/llm/server
Expand All @@ -292,35 +292,35 @@ docker build --network=host -f ./dockerfiles/Dockerfile_serving_cuda123_cudnn9 -
| :---: | :-----: | :---: | :---: | :-----: | :----: |
| MP_NUM | int | 模型并行度 || 8 | CUDA_VISIBLE_DEVICES 需配置对应卡数 |
| CUDA_VISIBLE_DEVICES | str | 使用 GPU 编号 || 0,1,2,3,4,5,6,7 | |
| HTTP_PORT | int | 探活服务的http端口 ||| 当前仅用于健康检查、探活 |
| GRPC_PORT | int | 模型推服务的grpc端口 ||| |
| HTTP_PORT | int | 探活服务的 http 端口 ||| 当前仅用于健康检查、探活 |
| GRPC_PORT | int | 模型推服务的 grpc 端口 ||| |
| METRICS_PORT | int | 模型服务中监督指标的端口 ||| |
| INFER_QUEUE_PORT | int | 模型服务内部使用的端口 || 56666 | |
| PUSH_MODE_HTTP_PORT | int | 服务请求HTTP端口号 || -1 | 如不配置,服务只支持GRPC协议 |
| PUSH_MODE_HTTP_PORT | int | 服务请求 HTTP 端口号 || -1 | 如不配置,服务只支持 GRPC 协议 |
| DISABLE_STREAMING | int | 是否使用流式返回 || 0 | |
| MAX_SEQ_LEN | int | 最大输入序列长度 || 8192 | 服务会拒绝input token数量超过MAX_SEQ_LEN的请求,并返回错误提示 |
| MAX_DEC_LEN | int | 最大decoer序列长度 || 1024 | 服务会拒绝请求中max_dec_len/min_dec_len超过此参数的请求,并返回错误提示 |
| BATCH_SIZE | int | 最大Batch Size || 50 | 模型可同时并发处理的最大输入数量,不能高于128 |
| BLOCK_BS | int | 缓存Block支持的最大Query Batch Size || 50 | 如果出现out of memeory 错误,尝试减少该数值 |
| BLOCK_RATIO | float | || 0.75 | 建议配置 输入平均Token数/(输入+输出平均Token数) |
| MAX_SEQ_LEN | int | 最大输入序列长度 || 8192 | 服务会拒绝 input token 数量超过 MAX_SEQ_LEN 的请求,并返回错误提示 |
| MAX_DEC_LEN | int | 最大 decoer 序列长度 || 1024 | 服务会拒绝请求中 max_dec_len/min_dec_len 超过此参数的请求,并返回错误提示 |
| BATCH_SIZE | int | 最大 Batch Size || 50 | 模型可同时并发处理的最大输入数量,不能高于128 |
| BLOCK_BS | int | 缓存 Block 支持的最大 Query Batch Size || 50 | 如果出现 out of memeory 错误,尝试减少该数值 |
| BLOCK_RATIO | float | || 0.75 | 建议配置 输入平均 Token 数/(输入+输出平均 Token 数) |
| MAX_CACHED_TASK_NUM | int | 服务缓存队列最大长度 || 128 | 队列达到上限后,会拒绝新的请求 |
| PUSH_MODE_HTTP_WORKERS | int | HTTP服务进程数 || 1 | 在 PUSH_MODE_HTTP_PORT 配置的情况下有效,高并发下提高该数值,建议最高配置为8 |
| PUSH_MODE_HTTP_WORKERS | int | HTTP 服务进程数 || 1 | 在 PUSH_MODE_HTTP_PORT 配置的情况下有效,高并发下提高该数值,建议最高配置为8 |
| USE_WARMUP | int | 是否进行 warmup || 0 | |
| USE_HF_TOKENIZER | int | 是否进行使用huggingface的词表 || 0 | |
| USE_CACHE_KV_INT8 | int | 是否将INT8配置为KV Cache的类型 || 0 | c8量化模型需要配置为1 |
| USE_HF_TOKENIZER | int | 是否进行使用 huggingface 的词表 || 0 | |
| USE_CACHE_KV_INT8 | int | 是否将 INT8配置为 KV Cache 的类型 || 0 | c8量化模型需要配置为1 |
| MODEL_DIR | str | 模型文件路径 || /models/ | |
| FD_MODEL_CONFIG_PATH | str | 模型config文件路径 || ${model_dir}/config.json | |
| FD_MODEL_CONFIG_PATH | str | 模型 config 文件路径 || ${model_dir}/config.json | |
| DISTRIBUTED_CONFIG | str | 模型分布式配置文件路径 || ${model_dir}/rank_mapping.csv | |

## 请求参数介绍

| 字段名 | 字段类型 | 说明 | 是否必填 | 默认值 | 备注 |
| :---: | :-----: | :---: | :---: | :-----: | :----: |
| req_id | str | 请求ID,用于标识一个请求。建议设置req_id,保证其唯一性 || 随机id | 如果推理服务中同时有两个相同req_id的请求,会返回req_id重复的错误信息 |
| req_id | str | 请求 ID,用于标识一个请求。建议设置 req_id,保证其唯一性 || 随机 id | 如果推理服务中同时有两个相同 req_id 的请求,会返回 req_id 重复的错误信息 |
| text | str | 请求的文本 ||| text 和 messages 必须有一个 |
| messages | str | 多轮对话文本 ||| 多轮对话以list方式存储 |
| max_dec_len | int | 最大生成token的长度,如果请求的文本token长度加上max_dec_len大于模型的max_seq_len,会返回长度超限的错误信息 || max_seq_len减去文本token长度 | |
| min_dec_len | int | 最小生成token的长度,最小是1 || 1 | |
| messages | str | 多轮对话文本 ||| 多轮对话以 list 方式存储 |
| max_dec_len | int | 最大生成 token 的长度,如果请求的文本 token 长度加上 max_dec_len 大于模型的 max_seq_len,会返回长度超限的错误信息 || max_seq_len 减去文本 token 长度 | |
| min_dec_len | int | 最小生成 token 的长度,最小是1 || 1 | |
| topp | float | 控制随机性参数,数值越大则随机性越大,范围是0~1 || 0.7 | |
| temperature | float | 控制随机性参数,数值越小随机性越大,需要大于 0 || 0.95 | |
| frequency_score | float | 频率分数 || 0 | |
Expand All @@ -330,5 +330,5 @@ docker build --network=host -f ./dockerfiles/Dockerfile_serving_cuda123_cudnn9 -
| timeout | int | 请求等待的超时时间,单位是秒 || 300 | |
| return_usage | bool | 是否返回输入、输出 token 数量 || False | |

* 在正确配置PUSH_MODE_HTTP_PORT字段下,服务支持 GRPC 和 HTTP 两种请求服务
* 在正确配置 PUSH_MODE_HTTP_PORT 字段下,服务支持 GRPC 和 HTTP 两种请求服务
* stream 参数仅对 HTTP 请求生效
Loading

0 comments on commit 5696e9b

Please sign in to comment.