LLM服务开启Prefill-Decode分离部署

随着大语言模型的广泛应用,企业面临着如何高效部署和管理这些模型的挑战。PAI-EAS推理服务平台与PAI-BladeLLM推理引擎提供了一种灵活高效的解决方案,支持多种模型的部署与管理。其中,Prefill-Decode分离是一种重要的架构设计模式,通过将预填充(Prefill)阶段与解码(Decode)阶段分离开来,实现更高效的服务部署。本文为您介绍如何进行Prefill-Decode分离部署。

使用限制

  • Prefill-Decode分离部署仅支持blade-llm:0.10.0及以上版本的镜像。

  • 仅支持使用H20GP7V类型的灵骏智算资源进行Prefill-Decode分离部署。

    说明

    目前,灵骏智算资源仅支持华北6(乌兰察布)、新加坡、华南1(深圳)、华北2(北京)、华东2(上海)和华东1(杭州)地域,供白名单用户受限申请使用,如果您希望使用灵骏智算资源,请联系您的商务经理申请使用权限。

  • 仅支持Qwen系列模型,例如QWQ-32B、Qwen2.5-72B-Instruct等。

基本概念

  • 预填充(Prefill)

    预填充阶段主要负责处理输入文本的初始编码,生成初始的隐藏状态。该阶段通常涉及大量的计算,因为需要对整个输入序列进行编码。预填充阶段的结果可以被缓存,以提高后续请求的响应速度。

  • 解码(Decode)

    解码阶段则负责根据预填充阶段生成的隐藏状态,逐步生成输出文本。这一阶段虽然是逐个Token生成的,但可以并行处理多个请求。解码阶段可以根据您的需求动态调整Token生成长度和策略。

部署PrefillDecode服务

支持以下三种部署方法:

场景化模型部署

请参考以下操作步骤分别部署Prefill服务和Decode服务,这两个服务需要在同一个群组中进行部署。两种服务的部署流程基本相同,但在部署服务时需注意:

  • 选择服务类型:在配置Prefill-Decode分离参数时,选择对应的服务类型(PrefillDecode)。

  • 设置运行命令:在高级配置中,设置相应服务的运行命令

具体操作步骤如下:

  1. 登录PAI控制台,在页面上方选择目标地域,并在右侧选择目标工作空间,然后单击进入EAS

  2. 模型在线服务(EAS)页面,单击部署服务,然后在场景化模型部署区域,单击LLM大语言模型部署

  3. 部署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分离开关,并配置以下参数:image

      参数

      描述

      所属群组

      选择新建群组加入群组,需确保Prefill服务和Decode服务在同一个群组中。例如qwq_32b_pd。

      服务类型

      请选择相应的服务类型:

      • 部署Prefill服务时,请选择Prefill

      • 部署Decode服务时,请选择Decode

      RDMA网络

      默认开启RDMA网络来保证机器之间的高效网络连接。

      说明

      当前仅使用灵骏智算资源部署的服务支持使用RDMA网络。

      环境变量

      保持默认配置。keyENABLE_MESSAGE_BUS:valueon

    • 高级配置

      单击切换为自由编辑模式,并根据部署的服务类型,设置相应的运行命令

      • 部署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服务,这两个服务需要在同一个群组中进行部署。

  1. 登录PAI控制台,在页面上方选择目标地域,并在右侧选择目标工作空间,然后单击进入EAS

  2. 模型在线服务(EAS)页面,单击部署服务,然后在自定义模型部署区域,单击JSON独立部署

  3. 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

    OSSEndpoint地址

    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模型为例,其中关键参数配置说明如下:image

参数

描述

部署方式

选择BladeLLM加速部署,根据部署的服务类型,选择相应的部署方式:

  • 部署Prefill服务时:选择PD分离部署-Prefill

  • 部署Decode服务时:选择PD分离部署-Decode

基本信息

服务名称

自定义服务名称。例如:

  • 部署Prefill服务:qwq_32b_p

  • 部署Decode服务:qwq_32b_d

所属群组

选择新建群组加入群组,需确保Prefill服务和Decode服务在同一个群组中。例如qwq_32b_pd。

资源部署

资源类型

选择资源配额

资源配额

您需要提前购买灵骏智算资源创建资源配额,然后选择相应的资源配额。如果没有可选的资源配额,您可以单击关联资源配额,将已创建的配额关联到该工作空间。

部署资源

设置部署服务所需的资源,以部署QwQ-32B模型为例。对于其他模型,请根据显存需求进行调整:

  • CPU(核数):16

  • 内存(GB):125

  • GPU(卡数):1

专有网络

专有网络(VPC)

请选择与灵骏智算资源一致的专有网络(VPC)、交换机和安全组。您可以前往资源配额(Quota)页面,单击目标资源配额名称,在网络信息区域进行查看。

交换机

安全组名称

访问服务请求

调用Prefill服务的接口即可。您需要在模型在线服务(EAS)页面,单击Prefill服务的服务方式列下的调用信息,获取Prefill服务的访问地址和Token。

说明

您可以选择使用公网地址或VPC内网地址。如果使用VPC内网地址,调用客户端必须与EAS服务位于同一个专有网络内。

image

  • 调用代码示例如下:

    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提升

2Prefill实例+1Decode实例

25.5%

7.1%

3Prefill实例+2Decode实例

20.7%

14.3%

根据业务属性的不同,在不同的TPS指标下,Prefill实例和Decode实例的最佳配比如下:

TPS指标

PD最佳配比

示例配置

20

Prefill : Decode = 1: 2.3

10Prefill实例,23Decode实例

15

Prefill : Decode = 1.4:1

14Prefill实例,10Decode实例