大規模言語モデル (LLM) シナリオでは、不確実なリソース需要やバックエンド推論インスタンスの不均衡な負荷などの問題が存在します。 これらの問題を解決するために、Elastic Algorithm Service (EAS) はLLMインテリジェントルーターコンポーネントを提供し、LLMシナリオのメトリックに基づいてリクエストスケジューリング層でリクエストを動的に配信します。 これにより、バックエンド推論インスタンス全体でコンピューティングパワーとGPUメモリを均等に割り当てることができ、クラスターのリソース使用量を改善できます。
背景情報
LLMシナリオでは、単一の要求によって占有されるGPUリソースの量は、ユーザ要求の長さとモデル応答の長さとの間の差、ならびに入力および出力生成フェーズにおいてモデルによって生成されるトークンの数のランダム性のために不確実である。 Round RobinやLeast Connectionsなどの従来のゲートウェイの負荷分散ポリシーでは、バックエンドコンピューティングリソースの負荷をリアルタイムで検出できません。 その結果、バックエンド推論インスタンスの負荷が不均衡になり、システムのスループットとレスポンスレイテンシに影響します。 特に、時間がかかり、大量のGPUコンピューティングを必要とし、または大量のGPUメモリを占有するロングテール要求は、不均一なリソース割り当てを悪化させ、クラスタ全体のパフォーマンスを低下させます。
前述の問題を解決するために、EASはLLMインテリジェントルータを要求スケジューリング層の基本コンポーネントとして提供する。 コンポーネントは、LLMシナリオのメトリックに基づいて要求を動的に分散します。 これにより、推論インスタンス全体でのコンピューティングパワーとGPUメモリの均等な割り当てが保証され、クラスターリソースの効率と安定性が大幅に向上します。
LLMインテリジェントルーターは、推論サービスの速度とスループットを大幅に向上させます。 詳細については、「付録1: テスト結果の比較」をご参照ください。
仕組み
LLMインテリジェントルーターは本質的に、バックエンド推論サービスへのリクエストをインテリジェントにスケジュールできる特別なEASサービスです。 LLMインテリジェントルーターは、サービスグループを介して推論インスタンスに関連付けられます。 次のセクションでは、LLMインテリジェントルーターの仕組みについて説明します。
デフォルトでは、LLM Intelligent Routerサービスには、推論インスタンスのメトリックを収集するために使用される組み込みのLLMスケジューラオブジェクトがあり、特定のアルゴリズムを使用して、メトリックに基づいてグローバルに最適なインスタンスを選択します。 LLMインテリジェントルーターは、最適なインスタンスにリクエストを転送します。 Metrics APIの詳細については、「付録2: Metrics API」をご参照ください。
LLMスケジューラはまた、推論インスタンスとのキープアライブ接続を確立する。 推論インスタンスで例外が発生した場合、LLMスケジューラはすぐに例外を検出し、インスタンスへのトラフィックの配信を停止できます。
LLMゲートウェイは、LLMスケジューラによって指示されるように要求を転送する。 HTTPベースのサーバー送信イベント (SSE) およびWebSocketプロトコルがサポートされています。
制限事項
LLMインテリジェントルーターは、LLM推論シナリオに適用されます。 バックエンドインスタンスの推論フレームワークとして使用できるのは、BladeLLMまたはvLLMのみです。
LLMインテリジェントルーターの値は、LLMインテリジェントルーターと複数の推論インスタンスが同じサービスグループにデプロイされている場合にのみ実現できます。
サービスのデプロイ
LLM Intelligent Routerサービスの展開
次の配置方法がサポートされています。
方法1: PAIコンソールでのサービスのデプロイ
PAI コンソールにログインします。 リージョンとワークスペースを選択します。 次に、[Elastic Algorithm Service (EAS) の入力] をクリックします。
[Elastic Algorithm Service (EAS)] ページで、[サービスのデプロイ] をクリックします。
[サービスのデプロイ] ページで、次のいずれかのデプロイ方法を選択します。
[カスタムモデルのデプロイ] > [カスタムデプロイ] を選択します。
[シナリオベースのモデル展開] > [LLM展開] を選択します。 [LLMデプロイ] ページの [基本情報] セクションで、推論アクセラレーションをサポートするモデルタイプ (Qwen2-7b、Qwen1.5-1.8b、Qwen1.5-7b、Qwen1.5-14b、llama3-8b、llama2-7b、llama2-13b、chatglm3-6b、baichuan2-7b、baichuan2-13b、falcon-7b、yi-6b、mistral-7b-instruct-v0.2、gemma-2b-it、gemma-7b-it、deepseek-coder-7b-instruct-v1.5など) を選択します。
[機能] セクションで、[LLMインテリジェントルーター] をオンにします。 次に、ドロップダウンリストで [LLMインテリジェントルーターの作成] をクリックします。
[LLMインテリジェントルーターの作成] パネルでパラメーターを設定し、[デプロイ] をクリックします。 下表に、各パラメーターを説明します。
パラメーター
説明
基本情報
サービス名
プロンプトに従って、LLM Intelligent Routerサービスの名前を指定します。 例: llm_router.
リソース設定
デプロイ
LLM Intelligent Routerサービスのリソースを設定します。 デフォルト設定:
最小インスタンス数: 2 LLM Intelligent Routerサービスを複数のインスタンスで実行できるようにするには、[最小インスタンス] を2に設定することを推奨します。
CPU: 2コア。
メモリ: 4 GB。
スケジュールリソース
LLMスケジューラのスケジューリングリソースを設定します。 デフォルト設定:
CPU: 2コア。
メモリ: 4 GB。
推論の加速
イメージで使用する推論フレームワークを選択します。 LLMゲートウェイは、次の2つのフレームワークをサポートします。
BladeLLM推論の加速
オープンソースvLLM推論アクセラレーション
LLM Intelligent Routerサービスがデプロイされると、同時にサービスグループが作成されます。 [Elastic Algorithm service (EAS)] ページの [Canary Release] タブでサービスグループを表示できます。 サービスグループの名前は、group_Name of an LLM Intelligent Router service形式で指定されます。
インテリジェントルーティングとサービスキューが競合します。 サービスグループにはキューサービスを作成しないことを推奨します。
方法2: JSONを使用したサービスのデプロイ
PAI コンソールにログインします。 リージョンとワークスペースを選択します。 次に、[Elastic Algorithm Service (EAS) の入力] をクリックします。
Elastic Algorithm Service (EAS) ページで、[サービスのデプロイ] をクリックします。
[サービスのデプロイ] ページの [カスタムモデルのデプロイ] セクションで、[JSONデプロイ] をクリックします。
JSON Deploymentページの設定エディターセクションで、パラメーターを設定し、[デプロイ] をクリックします。
次のサンプルコードに例を示します。
説明単一障害点 (SPOF) を防ぐには、metadata.instanceパラメーターを少なくとも2に設定して、LLMインテリジェントルーターを複数のインスタンスで実行できるようにすることを推奨します。
LLMサービスがデプロイされる前にLLMインテリジェントルーターサービスがデプロイされている場合、LLMインテリジェントルーターサービスは、LLMサービスがデプロイされるまで待機状態のままです。
基本設定
{ "cloud": { "computing": { "instance_type": "ecs.c7.large" } }, "metadata": { "type": "LLMGatewayService", "cpu": 4, "group": "llm_group", "instance": 2, "memory": 4000, "name": "llm_router" } }
LLM Intelligent Routerサービスをデプロイするには、metadata.typeパラメーターをLLMGatewayServiceに設定します。 その他のパラメーターについては、「モデルサービスのパラメーター」をご参照ください。 サービスが展開されると、EASはLLMインテリジェントルーターとLLMスケジューラを含む複合サービスを自動的に作成します。 LLM Intelligent Routerは、LLM Intelligent Routerサービスに指定したリソース設定を使用します。 LLMスケジューラのデフォルトのリソース設定は、4 vCPUと4 GiBのメモリです。
詳細設定: 基本設定がビジネス要件を満たせない場合は、JSONファイルを準備して次の詳細設定を指定できます。
{ "cloud": { "computing": { "instance_type": "ecs.c7.large" } }, "llm_gateway": { "infer_backend": "vllm", "max_queue_size": 128, "retry_count": 2, "wait_schedule_timeout": 5000, "wait_schedule_try_period": 500 }, "llm_scheduler": { "cpu": 4, "memory": 4000 }, "metadata": { "cpu": 2, "group": "llm_group", "instance": 2, "memory": 4000, "name": "llm_router", "type": "LLMGatewayService" } }
次の表に、主要なパラメーターを示します。 その他のパラメーターについては、「モデルサービスのパラメーター」をご参照ください。
パラメーター
説明
llm_gateway.infer_バックエンド
LLMによって使用される推論フレームワーク。有効な値:
vllm (デフォルト)
bladellm
llm_gateway.max_queue_サイズ
LLMインテリジェントルータのキャッシュキューの最大長。 デフォルト値: 128
バックエンド推論フレームワークの処理能力を超えると、LLMインテリジェントルータはリクエストをキューにキャッシュし、推論インスタンスが利用可能になったときにキャッシュされたリクエストを転送します。
llm_gateway.retry_count
リトライの回数。 デフォルト値:2 リクエストの転送先のバックエンド推論インスタンスが異常な場合、LLMインテリジェントルーターはリクエストを別のインスタンスに転送しようとします。
llm_gateway.wait_schedule_timeout
タイムアウト期間。 デフォルト値: 5000。 単位:ミリ秒。 LLMスケジューラがタイムアウト期間中使用できない場合、LLMインテリジェントルータは単純なラウンドロビンポリシーを使用して要求を分散します。
llm_gateway.wait_schedule_try_ピリオド
wait_schedule_timeoutパラメーターで指定されたタイムアウト期間中に、LLMインテリジェントルータがLLMスケジューラへの接続を再試行する間隔。 デフォルト値: 500。 単位:ミリ秒。
llm_scheduler.cpu
LLMスケジューラのvCPUの数。 デフォルト値: 4。
llm_scheduler.memory
LLMスケジューラのメモリ。 デフォルト値: 4。 単位:GiB
llm_scheduler.instance_型
LLMスケジューラのインスタンスタイプ。 インスタンスタイプは、vCPUとメモリの数を定義します。 このパラメーターを指定した場合、vCPUとメモリの数を個別に指定する必要はありません。
LLMサービスのデプロイ
次の配置方法がサポートされています。
方法1: PAIコンソールでのサービスのデプロイ
PAI コンソールにログインします。 リージョンとワークスペースを選択します。 次に、[Elastic Algorithm Service (EAS) の入力] をクリックします。
[Elastic Algorithm Service (EAS)] ページで、[サービスのデプロイ] をクリックします。
[サービスのデプロイ] ページで、次のいずれかのデプロイ方法を選択し、重要なパラメーターを設定します。 その他のパラメーターについては、「PAIコンソールでのモデルサービスのデプロイ」をご参照ください。
[カスタムモデルの配置] セクションで、[カスタム配置] を選択します。 [サービスの作成] ページで、次の表に示す主要なパラメーターを設定します。
パラメーター
説明
環境情報
デプロイ方法
[イメージベースのデプロイ] および [Webアプリの有効化] を選択します。
画像の選択
Alibaba Cloudイメージとカスタムイメージがサポートされています。
Alibaba Cloud Imageを選択した場合、chat-llm-webui:3.0-vllmまたはchat-llm-webui:3.0-bladeを使用します。
[画像アドレス] を選択した場合、フィールドにカスタム画像アドレスを入力します。 カスタムイメージの推論フレームワークは、BladeLLMまたはvllmである必要があります。
機能
LLMインテリジェントルーター
LLM Intelligent Routerをオンにし、展開したLLM Intelligent Routerサービスを選択します。
[シナリオベースのモデル展開] セクションで、[LLM展開] をクリックします。 [LLM展開] ページで、次の表に示す主要なパラメーターを設定します。
パラメーター
説明
基本情報
モデルタイプ
推論アクセラレーションをサポートするモデルタイプを、Qwen2-7b、Qwen1.5-1.8b、Qwen1.5-7b、Qwen1.5-14b、llama3-8b、llama2-7b、llama2-13b、chatglm3-6b、baichuan2-7b、baichuan2-13b、falcon-7b、yi-6b、mistral-7b-instruct-v0.2、gemma-2b-it、gemma-7b-it、deepseek-coder-7b-instruct-v1.5から選択します。
サービス設定
LLMインテリジェントルーター
LLM Intelligent Routerをオンにし、展開したLLM Intelligent Routerサービスを選択します。
パラメーターを設定したら、[デプロイ] をクリックします。
方法2: JSONを使用したサービスのデプロイ
この例では、PAIによって提供される組み込みイメージであるオープンソースのvLLM-0.3.3イメージが使用される。 以下の手順を実行します。
Elastic Algorithm Service (EAS) ページで、[サービスのデプロイ] をクリックします。
[サービスのデプロイ] ページの [カスタムモデルのデプロイ] セクションで、[JSONデプロイ] をクリックします。
JSON Deploymentページの設定エディターセクションで、パラメーターを設定し、[デプロイ] をクリックします。
次のサンプルコードに例を示します。
{ "cloud": { "computing": { "instance_type": "ecs.gn7i-c16g1.4xlarge" } }, "containers": [ { "image": "eas-registry-vpc.<regionid>.cr.aliyuncs.com/pai-eas/chat-llm:vllm-0.3.3", "port": 8000, "script": "python3 -m vllm.entrypoints.openai.api_server --served-model-name llama2 --model /huggingface/models--meta-llama--Llama-2-7b-chat-hf/snapshots/c1d3cabadba7ec7f1a9ef2ba5467ad31b3b84ff0/" } ], "features": { "eas.aliyun.com/extra-ephemeral-storage": "50Gi" }, "metadata": { "cpu": 16, "gpu": 1, "instance": 5, "memory": 60000, "group": "llm_group", "name": "vllm_service" } }
次の表に、主要なパラメーターを示します。 その他のパラメーターについては、「モデルサービスのパラメーター」をご参照ください。
metadata.group: LLMサービスが属するサービスグループの名前。 LLMサービスは、LLMインテリジェントルーターサービスと同じサービスグループに属している必要があります。 このようにして、LLMサービスはLLMスケジューラに登録し、関連するメトリックを報告することができ、LLMインテリジェントルータはトラフィックを転送することができます。
コンソールでLLM Intelligent Routerサービスを展開する場合は、[Elastic Algorithm service (EAS)] ページの [グループサービス] タブで、LLM Intelligent Routerサービスが属するサービスグループの名前を表示する必要があります。 サービスグループの名前は、group_Name of an LLM Intelligent Router service形式です。
JSONを使用してLLMサービスをデプロイする場合は、サービスグループの名前をllm_groupとして指定します。
containers.image: この例では、PAIによって提供されるプリセットイメージが使用されます。 <regionid> は、サービスをデプロイするリージョンのIDに置き換える必要があります。 たとえば、サービスを中国 (北京) リージョンにデプロイする場合は、<regionid> をcn-Beijingに置き換えます。
LLMインテリジェントルーターサービスへのアクセス
LLM Intelligent Routerサービスにアクセスするためのエンドポイントとトークンの取得
PAI コンソールにログインします。 ページ上部のリージョンを選択します。 次に、目的のワークスペースを選択し、[Elastic Algorithm Service (EAS) の入力] をクリックします。
デプロイしたLLM Intelligent Routerサービスを見つけ、[サービスタイプ] 列の [呼び出し方法] をクリックします。
[呼び出しメソッド] ダイアログボックスの [パブリックエンドポイント] タブで、サービスにアクセスするためのエンドポイントとトークンを表示します。
LLM Intelligent Routerサービスにアクセスするためのエンドポイントを設定します。
設定ルール
例
形式:
{domain}/api/predict/{group_name}.{router_service_name}_llm_gateway/{endpoint}
{endpoint} を、LLMサービスでサポートされているAPIエンドポイントに置き換えます。 例:
v1/completions
この例では、JSONを使用してデプロイされるLLM Intelligent Routerサービスが使用されています。 手順3で取得したエンドポイントが
http:// 175805416243 **** .cn-beijing.pai-eas.aliyuncs.com/api/predict/llm_group.llm_router
の場合。 LLMインテリジェントルーターサービスにアクセスするためのエンドポイントはhttp:// 175805416243 **** .cn-beijing.pai-eas.aliyuncs.com/api/predict/llm_group.llm_router_llm_gateway/v1/completions
です。
アクセスのテストTest the access
ターミナルで、次のコマンドを実行してLLMインテリジェントルーターサービスにアクセスします。
$curl -H "Authorization: xxxxxx" -H "Content-Type: application/json" http://***http://********.cn-beijing.pai-eas.aliyuncs.com/api/predict/{group_name}.{router_service_name}_llm_gateway/v1/completions -d '{"model": "llama2", "prompt": "I need your help writing an article. I will provide you with some background information to begin with. And then I will provide you with directions to help me write the article.", "temperature": 0.0, "best_of": 1, "n_predict": 34, "max_tokens": 34, "stream": true}'
前述のコマンドでは:
"Authorization: xxxxxx": 前の手順で取得したトークンを指定します。
http:// ******** .cn-beijing.pai-eas.aliyuncs.com/api/predict/{group_name}.{router_service_name}_llm_gateway/v1/completions
: 値を前の手順で取得したエンドポイントに置き換えます。
レスポンス例:
data: {"id":"0d9e74cf-1025-446c-8aac-89711b2e9a38","choices":[{"finish_reason":"","index":0,"logprobs":null,"text":"\n"}],"object":"text_completion","usage":{"prompt_tokens":36,"completion_tokens":1,"total_tokens":37},"error_info":null}
data: {"id":"0d9e74cf-1025-446c-8aac-89711b2e9a38","choices":[{"finish_reason":"","index":0,"logprobs":null,"text":"\n"}],"object":"text_completion","usage":{"prompt_tokens":36,"completion_tokens":2,"total_tokens":38},"error_info":null}
data: {"id":"0d9e74cf-1025-446c-8aac-89711b2e9a38","choices":[{"finish_reason":"","index":0,"logprobs":null,"text":""}],"object":"text_completion","usage":{"prompt_tokens":36,"completion_tokens":3,"total_tokens":39},"error_info":null}
...
[DONE]
サービスモニタリング指標の表示
テストが完了したら、サービスのモニタリング指標を表示して、サービスのパフォーマンスを把握できます。 以下の手順を実行します。
Elastic Algorithm Service (EAS) ページで、展開したLLM Intelligent Routerサービスを見つけ、[モニタリング] 列のアイコンをクリックします。
表示されるページの [モニタリング] タブで、次のメトリックを表示します。
トークンスループット
LLMの入力トークンと出力トークンのスループットです。
IN: LLMの入力トークンのスループット。
OUT: LLMの出力トークンのスループット。
GPUキャッシュ使用量
キー値 (KV) キャッシュによって消費されたGPUメモリの割合。
エンジンの現在の要求
リアルタイムでのLLMエンジン上の同時リクエストの数。
実行中: LLMエンジンが処理している要求の数。
待機中: LLMエンジンでキューイングされている要求の数。
ゲートウェイの現在のリクエスト
リアルタイムでのLLMインテリジェントルーターのリクエスト数。
合計: LLMインテリジェントルーターがリアルタイムで受信したリクエストの合計数。
Pending: LLMインテリジェントルータにキャッシュされ、LLMエンジンによって処理されるのを待っている要求の数。
最初のトークン
最初の出力トークンのレイテンシ。
Max: 最初の出力トークンの最大レイテンシ。
Avg: 最初の出力トークンの平均レイテンシ。
Min: 最初の出力トークンの最小レイテンシ。
TPxx: 最初の出力トークンのレイテンシのパーセンタイル。
出力トークンあたりの時間
出力トークンのレイテンシ。
Max: 出力トークンの最大レイテンシ。
Avg: 出力トークンの平均レイテンシ。
Min: 出力トークンの最小レイテンシ。
TPxx: 出力トークンのレイテンシのパーセンタイル。