プリフィルデコード分離は、大規模言語モデル(LLM)のデプロイと管理のための重要なアーキテクチャ設計パターンです。 プリフィルフェーズとデコードフェーズを分離することで、デプロイ効率が向上します。 このトピックでは、プリフィルデコード分離デプロイメントを実装する方法について説明します。新規追加
制限事項
プリフィルデコード分離は、
blade-llm:0.10.0
以降のバージョンのイメージのみをサポートしています。プリフィルデコード分離は、H タイプまたは GP7V タイプの凌雲リソースのみをサポートしています。
説明現在、凌雲リソースは、中国(ウランチャブ)、シンガポール、中国(深セン)、中国(北京)、中国(上海)、中国(杭州)リージョンでご利用いただけます。ホワイトリストユーザー限定です。 凌雲リソースを使用するには、アカウントマネージャーにお問い合わせください。
プリフィルデコード分離は、QWQ-32B、Qwen2.5-72B-Instruct などの Qwen モデルのみをサポートしています。
概念
プリフィル
プリフィルフェーズでは、主に入力テキストの初期エンコーディングを処理し、初期の隠れ状態を生成します。 入力シーケンス全体をエンコードするため、多くの場合、かなりの計算が必要です。 プリフィル結果をキャッシュすると、将来のリクエストに対する応答速度が向上します。
デコード
デコードフェーズでは、生成された隠れ状態から出力テキストを段階的に生成します。 このフェーズではトークンが 1 つずつ生成されますが、複数のリクエストを並行して処理できます。 また、要件に応じて、トークン生成の長さと戦略を動的に調整することもできます。
プリフィルサービスとデコードサービスをデプロイする
次のいずれかの方法を使用します。
シナリオベースのモデルデプロイメント
次の手順に従って、プリフィルサービスとデコードサービスを同じグループ内に個別にデプロイします。 両方のサービスのデプロイプロセスは似ていますが、次の点に注意してください。
サービスタイプの選択: テストメディアをアップロードします。 パラメーターを設定する際に、適切な (プリフィルまたはデコード)を選択します。
詳細設定コマンド で、それぞれ を指定して実行コマンドを設定します。
次の手順に従います。
PAI コンソール にログオンします。 ページ上部でリージョンを選択します。 次に、目的のワークスペースを選択し、[Elastic Algorithm Service (EAS) に入る] をクリックします。
[Elastic Algorithm Service (EAS)] ページで、[サービスのデプロイ] をクリックします。[シナリオベースのモデルデプロイ] セクションの [サービスのデプロイ] ページで、[LLM デプロイ] を選択します。
[LLM デプロイメント] ページで、以下の主要パラメーターを設定し、[デプロイ] をクリックします。
基本情報:
パラメーター
説明
サービス名
サービスの名前を入力します。 例:
プリフィル: qwq_32b_p
デコード: qwq_32b_d
バージョン
[高パフォーマンスデプロイメント] を選択します。
イメージバージョン
blade-llm:0.10.0
以降のバージョンのイメージ(blade-llm:0.10.0-rc12
など)を選択します。モデル設定
モデルを選択します。 たとえば、パブリックモデル QwQ-32B-Preview を選択します。 その他のパブリックモデルまたはカスタムモデルを選択することもできます。
リソースデプロイメント
パラメーター
説明
[リソースタイプ]
[リソースクォータ] を選択します。
[リソースクォータ]
事前に 凌雲リソースを購入 し、リソースクォータを作成 する必要があります。 利用可能なクォータがない場合は、[リソースクォータの関連付け] をクリックして、作成したクォータをワークスペースに関連付けます。
[デプロイリソース]
サービスのリソースを設定します。 たとえば、QwQ-32B-Preview をデプロイするには、次のように設定します。
[vCPU]: 16
[メモリ (GB)]: 125
[GPU]: 1
他のモデルの場合は、メモリ要件に応じて調整します。
機能
[プリフィルデコード分離] をオンにし、以下のパラメーターを設定します。
パラメーター
説明
[グループ]
新規グループ または 参加 を選択します。 プリフィルサービスとデコードサービスが同じグループに属していることを確認してください。 グループ名の例: qwq_32b_pd。
[サービスタイプ]
対応するサービスタイプを選択します。
[プリフィル]。
[デコード]。
[RDMA ネットワーク]
デフォルトでは、[RDMA ネットワーク] は有効になっており、マシン間の効率的なネットワーク接続を保証します。
説明現在、凌雲リソースを使用してデプロイされたサービスのみが RDMA ネットワークをサポートしています。
[環境変数]
デフォルト値
ENABLE_MESSAGE_BUS
:on
を使用します。詳細設定
[フリー編集モードに切り替える] をクリックし、サービスタイプに基づいて [コマンドプレビュー] を設定します。
プリフィル
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
デコード
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
凌雲リソースに合った VPC、vSwitch、セキュリティグループ を選択します。 これらを表示するには、リソースクォータ ページに移動し、目的のクォータ名をクリックして、ネットワーク情報 セクションで詳細を確認します。
JSON デプロイメント
次の手順に従って、プリフィルサービスとデコードサービスを同じグループ内に個別にデプロイします。
PAI コンソール にログオンします。 ページ上部でリージョンを選択します。 次に、目的のワークスペースを選択し、[Elastic Algorithm Service (EAS) に入る] をクリックします。
[Model Online Service (EAS)] ページで、[サービスのデプロイ] をクリックします。 次に、[カスタムモデルデプロイメント] セクションの [JSON デプロイメント] をクリックします。
[JSON デプロイメント] ページで、サービスタイプに基づいて関連パラメーターを更新します。 対応する JSON コンテンツをエディターに貼り付けて、[デプロイ] をクリックします。
主要なパラメーターは次のとおりです。
パラメーター
説明
cloud
networking
凌雲リソースに合った VPC(vpc_id)、vSwitch(vswitch_id)、セキュリティグループ(security_group_id)に設定します。 これらを表示するには、リソースクォータ ページに移動し、目的のクォータ名をクリックして、ネットワーク情報 セクションで詳細を確認します。
containers
image
サービスに使用されるイメージアドレス。 イメージアドレスのリージョン情報を 実際のリージョン ID に置き換えます。 たとえば、中国(ウランチャブ)は cn-wulanchabu です。
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
デコード
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
サービスグループの名前。 プリフィルサービスとデコードサービスが同じグループに属していることを確認してください。
name
サービスの名前。
quota_id
凌雲リソースクォータ ID。 リソースクォータ ページに移動して表示します。
rpc.infer_mode
サービスタイプに設定します。
prefill
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
プリフィルサービスとデコードサービスのサンプルを以下に示します。 上記の表で説明したように、関連パラメーターを更新する必要があります。
プリフィル
{ "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****" } } }
デコード
{ "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```json "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****" } } }
モデルギャラリー ワンクリックデプロイ
モデルギャラリー で、プリフィルサービスとデコードサービスを個別にデプロイします。QwQ-32B を例に説明します:
パラメータ | 説明 | |
デプロイ方法 | [Bladellm Accelerated Deployment] を選択し、サービスタイプに応じて選択します。
| |
基本情報 | サービス名 | サービスの名前を入力します。次に例を示します。
|
グループ | 新しいグループライブラリ または を選択します。プリフィルサービスとデコードサービスが同じグループに属していることを確認します。グループ名の例: qwq_32b_pd。 | |
リソースデプロイ | リソースの種類 | [リソースクォータ] を選択します。 |
リソースクォータ | 凌雲リソースを購入 し、リソースクォータを作成しておく必要があります。使用可能なクォータがない場合は、[リソースクォータの関連付け] をクリックして、作成したクォータをワークスペースに関連付けます。 | |
デプロイリソース | サービスに必要なリソースを設定します。 QwQ-32N をデプロイする場合の例:
他のモデルの場合は、メモリ要件に応じて調整します。 | |
VPC | VPC | 凌雲リソースに合った VPC、vSwitch、セキュリティグループ を選択します。これらを表示するには、[リソースクォータ] ページに移動し、目的のクォータ名をクリックして、[ネットワーク情報] セクションで詳細を確認します。 |
vSwitch | ||
セキュリティグループ名 |
リクエストの送信
リクエストを送信するには、プリフィル サービスを呼び出すだけです。 [Elastic Algorithm Service (EAS)] ページで、[サービスの種類] 列のプリフィル サービスの [呼び出し方法] をクリックします。プリフィル サービスのエンドポイントとトークンを表示します。
パブリックエンドポイントまたは VPC エンドポイントを使用することを選択できます。 VPC エンドポイントを使用する場合は、クライアントがサービスと同じ VPC 内にあることを確認してください。
リクエスト例:
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>: エンドポイントに置き換えます。例:
http://**********.cn-wulanchabu.pai-eas.aliyuncs.com/api/predict/qwq_32b_pd.qwq_32b_p
。<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 インスタンスタイプを使用してデプロイされ、入力トークンと出力トークンの平均比率は 1100:140
です。パフォーマンスの向上は次のとおりです。
構成 | QPS の向上 | TPS の向上 |
2 プリフィル + 1 デコード | 25.5% | 7.1% |
3 プリフィル + 2 デコード | 20.7% | 14.3% |
さまざまなビジネス属性と TPS 目標に基づいて、プリフィルとデコードの最適な比率:
TPS ターゲット | PD 比率 | 構成例 |
20 | プリフィル : デコード = 1: 2.3 | プリフィル 10 とデコード 23 |
15 | プリフィル : デコード = 1.4:1 | プリフィル 14 とデコード 10 |