mirror of
https://github.com/PaddlePaddle/FastDeploy.git
synced 2026-04-23 08:21:53 +08:00
[PD Disaggregation] Update usage of pd disaggregation and data parallel (#5742)
* Update usage of pd disaggregation * up * up * up * up * up * up * up * up * up * up dp docs * up * up * up * fix unittest
This commit is contained in:
@@ -1,83 +1,22 @@
|
||||
[English](../../features/data_parallel_service.md)
|
||||
|
||||
# 数据并行
|
||||
在MOE模型下,开启专家并行(EP)与数据并行(DP)相结合,EP 分摊专家负载,结合 DP 实现请求并行处理。
|
||||
# DP数据并行
|
||||
DP数据并行,是分布式推理的一种方式,指在多个“完全相同的模型副本”之间分发不同的请求,每个副本完成请求推理。
|
||||
|
||||
## 数据分发策略
|
||||
FastDeploy 通过splitwise scheduler 感知各个DP的负载状态,对接收到数据进行分发。
|
||||
通常在部署MOE模型时,数据并行(DP)和 专家并行(EP)相结合,每个DP服务独立完成Attention部分推理,所有DP服务协同完成MOE部分推理,提升整体的推理性能。
|
||||
|
||||
splitwise scheduler 依赖redis存储各个DP的负载状态,对接收到的数据进行分发。
|
||||
Fastdeploy 支持DP数据并行,提供了`multi_api_server`接口可以一次性启动多个推理服务。
|
||||
|
||||
### 专家并行 + 混合式部署
|
||||

|
||||
|
||||
FastDeploy 提供了splitwise scheduler,可以感知各个DP的负载状态,对接收到的数据进行调度。
|
||||
具体调度流程如下图,用户随机请求ip 与端口,通过redis获取负载状态,将数据分发到负载较低的DP进行推理。
|
||||

|
||||
|
||||
#### 离线推理
|
||||
```python
|
||||
|
||||
prompts = [
|
||||
"Hello, my name is",
|
||||
"你好,请问今天是星期",
|
||||
"请写6个以数字开头的成语",
|
||||
"写一个300字的小说大纲,内容是李白穿越到现代,最后成为公司文职人员的故事",
|
||||
"我要采访一位科幻作家,创建一个包含5个问题的列表"
|
||||
]
|
||||
|
||||
sampling_params = SamplingParams(temperature=0.8, top_p=0.95, max_tokens=128)
|
||||
|
||||
llm = LLM(
|
||||
model="ERNIE-4_5-300B-A47B-FP8-Paddle",
|
||||
tensor_parallel_size=1,
|
||||
data_parallel_size=8,
|
||||
max_model_len=8192,
|
||||
num_gpu_blocks_override=1024,
|
||||
engine_worker_queue_port="6077,6078,6079,6080,6081,6082,6083,6084",
|
||||
enable_expert_parallel=True,
|
||||
scheduler_name="splitwise",
|
||||
scheduler_host="127.0.0.1",
|
||||
scheduler_topic="test",
|
||||
scheduler_port=6379
|
||||
)
|
||||
outputs = llm.generate(prompts, sampling_params)
|
||||
|
||||
for output in outputs:
|
||||
prompt = output.prompt
|
||||
generated_text = output.outputs.text
|
||||
print("generated_text: ", generated_text)
|
||||
print("\n")
|
||||
|
||||
|
||||
```
|
||||
|
||||
#### 在线推理
|
||||
```shell
|
||||
python -m fastdeploy.entrypoints.openai.api_server \
|
||||
--model ERNIE-4_5-300B-A47B-FP8-Paddle \
|
||||
--port 8184 --metrics-port 8185 \
|
||||
--engine-worker-queue-port "6077,6078,6079,6080,6081,6082,6083,6084" \
|
||||
--data-parallel-size 8 --tensor-parallel-size 1\
|
||||
--enable-expert-parallel \
|
||||
--scheduler-name "splitwise" \
|
||||
--scheduler-host "127.0.0.1" \
|
||||
--scheduler-port 6379 \
|
||||
--scheduler-topic "test" \
|
||||
--scheduler-ttl 9000
|
||||
```
|
||||
|
||||
### 用户自行调度
|
||||
FastDeploy 提供了multi_api_server,用户可以拉起多个api server,用户自行选择dp 进行请求,在该种情况下用户可以自行添加负载均衡模型进行调度。(目前该种方式只支持在线推理)
|
||||
|
||||
#### 在线推理
|
||||
|
||||

|
||||
## 启动Fastdeploy服务
|
||||
|
||||
以ERNIE-4.5-300B模型为例,启动DP8、TP1、EP8的服务:
|
||||
```shell
|
||||
export FD_ENABLE_MULTI_API_SERVER=1
|
||||
python -m fastdeploy.entrypoints.openai.multi_api_server \
|
||||
--ports "1811,1822,1833,1844,1855,1866,1877,1888" \
|
||||
--num-servers 8 \
|
||||
--ports "1811,1822,1833,1844,1855,1866,1877,1888" \
|
||||
--metrics-ports "3101,3201,3301,3401,3501,3601,3701,3801" \
|
||||
--args --model ERNIE-4_5-300B-A47B-FP8-Paddle \
|
||||
--engine-worker-queue-port "25611,25621,25631,25641,25651,25661,25671,25681" \
|
||||
@@ -89,74 +28,54 @@ python -m fastdeploy.entrypoints.openai.multi_api_server \
|
||||
--enable-expert-parallel
|
||||
```
|
||||
|
||||
### 参数说明
|
||||
- num-servers: 指定拉起的api server 的数量
|
||||
- ports: 指定拉起的api server 的端口
|
||||
- args: 指定拉起的api server 的参数
|
||||
参数说明:
|
||||
- num-servers: 指定拉起的DP服务数量
|
||||
- ports: 指定拉起DP服务的api server端口,数量需要和num-servers一致
|
||||
- metrics-ports: 指定拉起DP服务的metrics server端口,数量需要和num-servers一致;如果为空,则内部自行分配可用端口
|
||||
- args: 指定拉起DP服务的参数,可以参考[文档](../parameters.md);如果端口(除了`ports`)没有手动设置,会自动分配可用端口
|
||||
|
||||
### 数据并行 + 分离式部署
|
||||
## 请求调度
|
||||
|
||||
具体可以参考[分离式部署](disaggregated.md#多机分离式部署)
|
||||
使用DP数据并行策略启动多个DP服务后,用户的请求需要通过调度器来分发到不同的服务,做到负载均衡。
|
||||
|
||||
#### 在线推理
|
||||
### Web 服务器
|
||||
|
||||
多机部署时需要确认当前网卡是否支持RDMA,并且需要集群中所有节点网络互通。
|
||||
获知了DP服务实例的IP和端口后,大家可以通过常用的Web 服务器(比如Nginx),自行实现请求调度,此处不再赘述。
|
||||
|
||||
**注意**:
|
||||
- `KVCACHE_RDMA_NICS` 指定当前机器的RDMA网卡,多个网卡用逗号隔开。
|
||||
- 仓库中提供了自动检测RDMA网卡的脚本 `bash scripts/get_rdma_nics.sh <device>`, 其中 <device> 可以是 `cpu` 或 `gpu`。
|
||||
### FastDeploy Router
|
||||
|
||||
**prefill 实例**
|
||||
FastDeploy提供[Router](https://github.com/PaddlePaddle/FastDeploy/tree/develop/fastdeploy/router)(Python版本)来实现请求收发和请求调度。高性能版本Router正在开发中,敬请期待。
|
||||
|
||||
```bash
|
||||
export FD_LOG_DIR="log_prefill"
|
||||
export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
|
||||
echo "set RDMA NICS"
|
||||
export $(bash scripts/get_rdma_nics.sh gpu)
|
||||
echo "KVCACHE_RDMA_NICS ${KVCACHE_RDMA_NICS}"
|
||||
使用方式和请求调度流程如下:
|
||||
- 启动Router
|
||||
- 启动FastDeploy服务实例(可以单DP或者多DP的服务),向Router进行注册
|
||||
- 用户请求发送到Router
|
||||
- Router根据全局实例的负载情况,为请求选择合适的实例
|
||||
- Router将请求发给选定的实例进行推理
|
||||
- Router接收实例的生成结果,返回给用户
|
||||
|
||||
python -m fastdeploy.entrypoints.openai.api_server \
|
||||
--model ERNIE-4_5-300B-A47B-FP8-Paddle \
|
||||
--port 8180 --metrics-port 8181 \
|
||||
--engine-worker-queue-port "25611,25621,25631,25641,25651,25661,25671,25681" \
|
||||
--cache-queue-port 8183 \
|
||||
--tensor-parallel-size 1 \
|
||||
--data-parallel-size 4 \
|
||||
--enable-expert-parallel \
|
||||
--cache-transfer-protocol "rdma,ipc" \
|
||||
--rdma-comm-ports "7671,7672,7673,7674,7675,7676,7677,7678" \
|
||||
--pd-comm-port "2334" \
|
||||
--splitwise-role "prefill" \
|
||||
--scheduler-name "splitwise" \
|
||||
--scheduler-host "127.0.0.1" \
|
||||
--scheduler-port 6379 \
|
||||
--scheduler-topic "test" \
|
||||
--scheduler-ttl 9000
|
||||
上手示例:
|
||||
- 启动Router服务,日志信息输出在`log_router/router.log`。
|
||||
```
|
||||
export FD_LOG_DIR="log_router"
|
||||
python -m fastdeploy.router.launch \
|
||||
--host 0.0.0.0 \
|
||||
--port 30000 \
|
||||
```
|
||||
|
||||
**decode 实例**
|
||||
|
||||
```bash
|
||||
export FD_LOG_DIR="log_decode"
|
||||
export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
|
||||
echo "set RDMA NICS"
|
||||
export $(bash scripts/get_rdma_nics.sh gpu)
|
||||
echo "KVCACHE_RDMA_NICS ${KVCACHE_RDMA_NICS}"
|
||||
python -m fastdeploy.entrypoints.openai.api_server \
|
||||
--model ERNIE-4_5-300B-A47B-FP8-Paddle \
|
||||
--port 8184 --metrics-port 8185 \
|
||||
--engine-worker-queue-port "25611,25621,25631,25641,25651,25661,25671,25681" \
|
||||
--cache-queue-port 8187 \
|
||||
--tensor-parallel-size 1 \
|
||||
--data-parallel-size 4 \
|
||||
--enable-expert-parallel \
|
||||
--scheduler-name "splitwise" \
|
||||
--cache-transfer-protocol "rdma,ipc" \
|
||||
--rdma-comm-ports "7671,7672,7673,7674,7675,7676,7677,7678" \
|
||||
--pd-comm-port "2334" \
|
||||
--scheduler-host "127.0.0.1" \
|
||||
--scheduler-port 6379 \
|
||||
--scheduler-ttl 9000
|
||||
--scheduler-topic "test" \
|
||||
--splitwise-role "decode"
|
||||
- 同样以ERNIE-4.5-300B模型为例,启动DP8、TP1、EP8的服务,通过`--router`指定Router服务:
|
||||
```shell
|
||||
export FD_ENABLE_MULTI_API_SERVER=1
|
||||
python -m fastdeploy.entrypoints.openai.multi_api_server \
|
||||
--num-servers 8 \
|
||||
--ports "1811,1822,1833,1844,1855,1866,1877,1888" \
|
||||
--metrics-ports "3101,3201,3301,3401,3501,3601,3701,3801" \
|
||||
--args --model ERNIE-4_5-300B-A47B-FP8-Paddle \
|
||||
--tensor-parallel-size 1 \
|
||||
--data-parallel-size 8 \
|
||||
--max-model-len 12288 \
|
||||
--max-num-seqs 64 \
|
||||
--num-gpu-blocks-override 256 \
|
||||
--enable-expert-parallel \
|
||||
--router "0.0.0.0:30000"
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user