随着大语言模型的广泛应用,企业面临着如何高效部署和管理这些模型的挑战。PAI-EAS推理服务平台与PAI-BladeLLM推理引擎提供了一种灵活高效的解决方案,支持多种模型的部署与管理。其中,Prefill-Decode分离是一种重要的架构设计模式,通过将预填充(Prefill)阶段与解码(Decode)阶段分离开来,实现更高效的服务部署。本文为您介绍如何进行Prefill-Decode分离部署。
使用限制
Prefill-Decode分离部署仅支持
blade-llm:0.10.0
及以上版本的镜像。仅支持使用H20或GP7V类型的灵骏智算资源进行Prefill-Decode分离部署。
说明目前,灵骏智算资源仅支持华北6(乌兰察布)、新加坡、华南1(深圳)、华北2(北京)、华东2(上海)和华东1(杭州)地域,供白名单用户受限申请使用,如果您希望使用灵骏智算资源,请联系您的商务经理申请使用权限。
仅支持Qwen系列模型,例如QWQ-32B、Qwen2.5-72B-Instruct等。
基本概念
预填充(Prefill)
预填充阶段主要负责处理输入文本的初始编码,生成初始的隐藏状态。该阶段通常涉及大量的计算,因为需要对整个输入序列进行编码。预填充阶段的结果可以被缓存,以提高后续请求的响应速度。
解码(Decode)
解码阶段则负责根据预填充阶段生成的隐藏状态,逐步生成输出文本。这一阶段虽然是逐个Token生成的,但可以并行处理多个请求。解码阶段可以根据您的需求动态调整Token生成长度和策略。
部署Prefill和Decode服务
支持以下三种部署方法:
场景化模型部署
请参考以下操作步骤分别部署Prefill服务和Decode服务,这两个服务需要在同一个群组中进行部署。两种服务的部署流程基本相同,但在部署服务时需注意:
选择服务类型:在配置Prefill-Decode分离参数时,选择对应的服务类型(Prefill或Decode)。
设置运行命令:在高级配置中,设置相应服务的运行命令。
具体操作步骤如下:
登录PAI控制台,在页面上方选择目标地域,并在右侧选择目标工作空间,然后单击进入EAS。
在模型在线服务(EAS)页面,单击部署服务,然后在场景化模型部署区域,单击LLM大语言模型部署。
在部署LLM大语言模型页面,配置以下关键参数,参数配置完成后,单击部署。
基本信息:
参数
描述
服务名称
自定义服务名称。例如:
部署Prefill服务:qwq_32b_p
部署Decode服务:qwq_32b_d
版本选择
选择高性能部署。
镜像版本
选择
blade-llm:0.10.0
及以上版本镜像,例如blade-llm:0.10.0-rc12
。模型配置
配置模型。以公共模型为例,选择QwQ-32B-Preview。您也可以选择其他模型或自定义模型。
资源部署
参数
描述
资源类型
选择资源配额。
资源配额
您需要提前购买灵骏智算资源并创建资源配额,然后选择相应的资源配额。如果没有可选的资源配额,您可以单击关联资源配额,将已创建的配额关联到该工作空间。
部署资源
设置部署服务所需的资源,以部署QwQ-32B-Preview模型为例。对于其他模型,请根据显存需求进行调整:
CPU(核数):16
内存(GB):125
GPU(卡数):1
服务功能
打开Prefill-Decode分离开关,并配置以下参数:
参数
描述
所属群组
选择新建群组或加入群组,需确保Prefill服务和Decode服务在同一个群组中。例如qwq_32b_pd。
服务类型
请选择相应的服务类型:
部署Prefill服务时,请选择Prefill。
部署Decode服务时,请选择Decode。
RDMA网络
默认开启RDMA网络来保证机器之间的高效网络连接。
说明当前仅使用灵骏智算资源部署的服务支持使用RDMA网络。
环境变量
保持默认配置。key为
ENABLE_MESSAGE_BUS
:value为on
。高级配置
单击切换为自由编辑模式,并根据部署的服务类型,设置相应的运行命令:
部署Prefill服务
blade_llm_server --disable_prompt_cache --disable_cuda_graph --ragged_flash_max_batch_tokens=8000 --metric_export_interval_sec=5 --port 8001 -tp 1 --model /mnt/bladellm/model --enable_disagg --metric_exporters logger eas --disable_frontend_multiprocessing --disagg_pd.disagg_transfer_type rdma --disagg_pd.select_decode_max_batched 5 --disagg_pd.token_port 10030 --disagg_pd.inst_role prefill --naming_url eas:http://127.0.0.1:9900
部署Decode服务
blade_llm_server --disable_prompt_cache --disable_cuda_graph --ragged_flash_max_batch_tokens=8000 --metric_export_interval_sec=5 --port 8001 -tp 1 --model /mnt/bladellm/model --enable_disagg --metric_exporters logger eas --disable_frontend_multiprocessing --disagg_pd.disagg_transfer_type rdma --disagg_pd.select_decode_max_batched 5 --disagg_pd.token_port 10030 --disagg_pd.inst_role decode --naming_url eas:http://127.0.0.1:9900
专有网络
请选择与灵骏智算资源一致的专有网络(VPC)、交换机和安全组。您可以前往资源配额(Quota)页面,单击目标资源配额名称,在网络信息区域进行查看。
JSON独立部署
请参考以下操作步骤分别部署Prefill服务和Decode服务,这两个服务需要在同一个群组中进行部署。
登录PAI控制台,在页面上方选择目标地域,并在右侧选择目标工作空间,然后单击进入EAS。
在模型在线服务(EAS)页面,单击部署服务,然后在自定义模型部署区域,单击JSON独立部署。
在JSON独立部署页面,根据部署的服务类型,更新JSON配置中的相关参数,并将相应的JSON内容粘贴到JSON文本编辑框中,然后单击部署。
关键参数配置说明如下:
参数
描述
cloud
networking
配置为与灵骏智算资源一致的专有网络(vpc_id)、交换机(vswitch_id)和安全组(security_group_id)。您可以前往资源配额(Quota)页面,单击目标资源配额名称,在网络信息区域进行查看。
containers
image
部署服务使用的镜像地址。请将镜像地址中的地域信息替换为实际部署服务的地域。例如华北6(乌兰察布)为cn-wulanchabu。
script
服务启动命令。请根据部署的服务类型,配置相应的运行命令:
部署Prefill服务
gpu_count=$(nvidia-smi --query-gpu=count --format=csv,noheader | wc -l); blade_llm_server --model /model_dir --host 0.0.0.0 --port 8001 -tp $gpu_count --metric_exporters logger eas --enable_disagg --disable_frontend_multiprocessing --disagg_pd.disagg_transfer_type rdma --disagg_pd.select_decode_max_batched 5 --disagg_pd.token_port 10030 --disagg_pd.inst_role prefill --naming_url eas:http://127.0.0.1:9900
部署Decode服务
gpu_count=$(nvidia-smi --query-gpu=count --format=csv,noheader | wc -l); blade_llm_server --model /model_dir --host 0.0.0.0 --port 8001 -tp $gpu_count --metric_exporters logger eas --enable_disagg --disable_frontend_multiprocessing --disagg_pd.disagg_transfer_type rdma --disagg_pd.select_decode_max_batched 5 --disagg_pd.token_port 10030 --disagg_pd.inst_role decode --naming_url eas:http://127.0.0.1:9900
metadata
group
服务群组名称。请确保Prefill服务和Decode服务在同一个群组中。
name
服务名称。
quota_id
灵骏智算资源配额ID。请前往资源配额(Quota)页面进行查看。
rpc.infer_mode
配置相应的服务类型:
prefill:部署Prefill服务
decode:部署Decode服务
workspace_id
工作空间ID。请前往工作空间详情页面进行查看。
cpu
部署服务使用的资源,以部署QwQ-32B-Preview模型为例,配置如下,对于其他模型,请根据显存需求进行调整:
cpu:16
memory(MB):128000
gpu:1
gpu
memory
storage
oss.path
模型所在的OSS路径。以公共模型为例,配置为
oss://pai-quickstart-cn-wulanchabu/modelscope/models/QwQ-32B/
,您也可以配置其他公共模型或您自己的微调训练模型。oss.endpoint
Prefill服务和Decode服务分别对应的JSON配置如下。您需要参考上述参数说明更新JSON配置中的相关参数。
Prefill服务JSON配置
{ "metadata": { "resource_burstable": false, "instance": 1, "rdma": 1, "rpc": { "infer_mode": "prefill" }, "name": "qwq_32b_p", "group": "qwq_32b_pd", "quota_id": "quota1s47n5z****", "quota_type": "Lingjun", "workspace_id": "3**", "cpu": 16, "memory": 128000, "gpu": 1 }, "containers": [ { "image": "eas-registry-vpc.cn-wulanchabu.cr.aliyuncs.com/pai-eas/blade-llm:0.10.0rc12", "port": 8001, "env": [ { "name": "ENABLE_MESSAGE_BUS", "value": "on" } ], "script": "gpu_count=$(nvidia-smi --query-gpu=count --format=csv,noheader | wc -l); blade_llm_server --model /model_dir --host 0.0.0.0 --port 8001 -tp $gpu_count --metric_exporters logger eas --enable_disagg --disable_frontend_multiprocessing --disagg_pd.disagg_transfer_type rdma --disagg_pd.select_decode_max_batched 5 --disagg_pd.token_port 10030 --disagg_pd.inst_role prefill --naming_url eas:http://127.0.0.1:9900" } ], "storage": [ { "mount_path": "/model_dir/", "properties": { "resource_type": "model", "resource_use": "base" }, "oss": { "path": "oss://pai-quickstart-cn-wulanchabu/modelscope/models/QwQ-32B/", "endpoint": "oss-cn-wulanchabu-internal.aliyuncs.com" } } ], "options": { "priority": 9 }, "cloud": { "networking": { "vpc_id": "vpc-0jl65jioii2v72bh9****", "vswitch_id": "vsw-0jlh0drtahzsooq3q****", "security_group_id": "sg-0jlcs30nnyf50o2x****" } } }
Tab 2 正文
Decode服务JSON配置
{ "metadata": { "resource_burstable": false, "instance": 1, "rdma": 1, "rpc": { "infer_mode": "decode" }, "name": "qwq_32b_d", "group": "qwq_32b_pd", "quota_id": "quota1s47n5z****", "quota_type": "Lingjun", "workspace_id": "3***", "cpu": 16, "memory": 128000, "gpu": 1 }, "containers": [ { "image": "eas-registry-vpc.cn-wulanchabu.cr.aliyuncs.com/pai-eas/blade-llm:0.10.0rc12", "port": 8001, "env": [ { "name": "ENABLE_MESSAGE_BUS", "value": "on" } ], "script": "gpu_count=$(nvidia-smi --query-gpu=count --format=csv,noheader | wc -l); blade_llm_server --model /model_dir --host 0.0.0.0 --port 8001 -tp $gpu_count --metric_exporters logger eas --enable_disagg --disable_frontend_multiprocessing --disagg_pd.disagg_transfer_type rdma --disagg_pd.select_decode_max_batched 5 --disagg_pd.token_port 10030 --disagg_pd.inst_role decode --naming_url eas:http://127.0.0.1:9900" } ], "storage": [ { "mount_path": "/model_dir/", "properties": { "resource_type": "model", "resource_use": "base" }, "oss": { "path": "oss://pai-quickstart-cn-wulanchabu/modelscope/models/QwQ-32B/", "endpoint": "oss-cn-wulanchabu-internal.aliyuncs.com" } } ], "options": { "priority": 9 }, "cloud": { "networking": { "vpc_id": "vpc-0jl65jioii2v72bh9****", "vswitch_id": "vsw-0jlh0drtahzsooq3q****", "security_group_id": "sg-0jlcs30nnyf50o2x****" } } }
Model Gallery一键部署
通过Model Gallery分别部署Prefill服务和Decode服务,以部署QwQ-32B模型为例,其中关键参数配置说明如下:
参数 | 描述 | |
部署方式 | 选择BladeLLM加速部署,根据部署的服务类型,选择相应的部署方式:
| |
基本信息 | 服务名称 | 自定义服务名称。例如:
|
所属群组 | 选择新建群组或加入群组,需确保Prefill服务和Decode服务在同一个群组中。例如qwq_32b_pd。 | |
资源部署 | 资源类型 | 选择资源配额。 |
资源配额 | 您需要提前购买灵骏智算资源并创建资源配额,然后选择相应的资源配额。如果没有可选的资源配额,您可以单击关联资源配额,将已创建的配额关联到该工作空间。 | |
部署资源 | 设置部署服务所需的资源,以部署QwQ-32B模型为例。对于其他模型,请根据显存需求进行调整:
| |
专有网络 | 专有网络(VPC) | 请选择与灵骏智算资源一致的专有网络(VPC)、交换机和安全组。您可以前往资源配额(Quota)页面,单击目标资源配额名称,在网络信息区域进行查看。 |
交换机 | ||
安全组名称 |
访问服务请求
调用Prefill服务的接口即可。您需要在模型在线服务(EAS)页面,单击Prefill服务的服务方式列下的调用信息,获取Prefill服务的访问地址和Token。
您可以选择使用公网地址或VPC内网地址。如果使用VPC内网地址,调用客户端必须与EAS服务位于同一个专有网络内。
调用代码示例如下:
curl -v <service_url>/v1/chat/completions \ -H "Authorization: <token>" \ -H "Content-Type: application/json" \ -d '{ "messages": [ { "role": "system", "content": "You are a helpful assistant." }, { "role": "user", "content": "Hello!" } ], "max_tokens": 10, "stream": true }'
其中:
<service_url>:需要替换为Prefill服务访问地址。例如
http://**********.cn-wulanchabu.pai-eas.aliyuncs.com/api/predict/qwq_32b_pd.qwq_32b_p
。<token>:需要替换为Prefill服务Token。
调用结果示例如下:
data: {"id":"2d14****-697b-43f3-9d62-1bb4dde6****","choices":[{"finish_reason":"","index":0,"logprobs":null,"delta":{"role":"assistant","content":"Hello"}}],"object":"chat.completion.chunk","usage":{"prompt_tokens":21,"completion_tokens":1,"total_tokens":22},"error_info":null} data: {"id":"2d14****-697b-43f3-9d62-1bb4dde6****","choices":[{"finish_reason":"","index":0,"logprobs":null,"delta":{"content":" there"}}],"object":"chat.completion.chunk","usage":{"prompt_tokens":21,"completion_tokens":2,"total_tokens":23},"error_info":null} data: {"id":"2d14****-697b-43f3-9d62-1bb4dde6****","choices":[{"finish_reason":"","index":0,"logprobs":null,"delta":{"content":"!"}}],"object":"chat.completion.chunk","usage":{"prompt_tokens":21,"completion_tokens":3,"total_tokens":24},"error_info":null} data: {"id":"2d14****-697b-43f3-9d62-1bb4dde6****","choices":[{"finish_reason":"","index":0,"logprobs":null,"delta":{"content":" How"}}],"object":"chat.completion.chunk","usage":{"prompt_tokens":21,"completion_tokens":4,"total_tokens":25},"error_info":null} data: {"id":"2d14****-697b-43f3-9d62-1bb4dde6****","choices":[{"finish_reason":"","index":0,"logprobs":null,"delta":{"content":" can"}}],"object":"chat.completion.chunk","usage":{"prompt_tokens":21,"completion_tokens":5,"total_tokens":26},"error_info":null} data: {"id":"2d14****-697b-43f3-9d62-1bb4dde6****","choices":[{"finish_reason":"","index":0,"logprobs":null,"delta":{"content":" I"}}],"object":"chat.completion.chunk","usage":{"prompt_tokens":21,"completion_tokens":6,"total_tokens":27},"error_info":null} data: {"id":"2d14****-697b-43f3-9d62-1bb4dde6****","choices":[{"finish_reason":"","index":0,"logprobs":null,"delta":{"content":" assist"}}],"object":"chat.completion.chunk","usage":{"prompt_tokens":21,"completion_tokens":7,"total_tokens":28},"error_info":null} data: {"id":"2d14****-697b-43f3-9d62-1bb4dde6****","choices":[{"finish_reason":"","index":0,"logprobs":null,"delta":{"content":" you"}}],"object":"chat.completion.chunk","usage":{"prompt_tokens":21,"completion_tokens":8,"total_tokens":29},"error_info":null} data: {"id":"2d14****-697b-43f3-9d62-1bb4dde6****","choices":[{"finish_reason":"","index":0,"logprobs":null,"delta":{"content":" today"}}],"object":"chat.completion.chunk","usage":{"prompt_tokens":21,"completion_tokens":9,"total_tokens":30},"error_info":null} data: {"id":"2d14****-697b-43f3-9d62-1bb4dde6****","choices":[{"finish_reason":"","index":0,"logprobs":null,"delta":{"content":"?"}}],"object":"chat.completion.chunk","usage":{"prompt_tokens":21,"completion_tokens":10,"total_tokens":31},"error_info":null} data: {"id":"2d14****-697b-43f3-9d62-1bb4dde6****","choices":[{"finish_reason":"length","index":0,"logprobs":null,"delta":{"content":""}}],"object":"chat.completion.chunk","usage":{"prompt_tokens":21,"completion_tokens":11,"total_tokens":32},"error_info":null} data: [DONE]
性能测试
以下性能测试结果仅供参考,您的结果以实际为准。
以Qwen2.5-72B-Instruct模型评测为例,使用灵骏多租的GP7V机型部署时,在输入和输出的tokens均值比为1100:140
的情况下,不同部署配置下的性能提升情况如下表所示:
部署配置 | QPS提升 | TPS提升 |
2个Prefill实例+1个Decode实例 | 25.5% | 7.1% |
3个Prefill实例+2个Decode实例 | 20.7% | 14.3% |
根据业务属性的不同,在不同的TPS指标下,Prefill实例和Decode实例的最佳配比如下:
TPS指标 | PD最佳配比 | 示例配置 |
20 | Prefill : Decode = 1: 2.3 | 10个Prefill实例,23个Decode实例 |
15 | Prefill : Decode = 1.4:1 | 14个Prefill实例,10个Decode实例 |