Azure Machine Learning でのオンライン エンドポイントの自動スケーリング
[アーティクル] 09/03/2024
17 人の共同作成者
フィードバック
この記事の内容
適用対象: Azure CLI ml extension v2 (現行) Python SDK azure-ai-ml v2 (現行)
この記事では、メトリックとスケジュールに基づいて自動スケーリングを構成することで、デプロイでのリソースの使用状況を管理する方法について説明します。 自動スケーリング プロセスを使用すると、アプリケーションの負荷を処理するために適切な量のリソースを自動的に実行できます。 Azure Machine Learning のオンライン エンドポイント では、Azure Monitor の自動スケーリング機能との統合による自動スケーリングがサポートされます。
Azure Monitor の自動スケーリングでは、ルールの条件が満たされたときに 1 つ以上の自動スケーリング アクションをトリガーするルールを設定できます。 メトリックベースのスケーリング (CPU 使用率が 70% を超える場合など)、スケジュールベースのスケーリング (ピーク営業時間のスケーリング ルールなど)、または 2 つの組み合わせを構成できます。 詳細については、「Microsoft Azure の自動スケールの概要 」を参照してください。
現在、自動スケーリングは、Azure CLI、REST API、Azure Resource Manager、Python SDK、またはブラウザー ベースの Azure portal を使用して管理できます。
前提条件
デプロイされたエンドポイント。 詳細については、「オンライン エンドポイントを使用して機械学習モデルをデプロイおよびスコア付けする 」を参照してください。
自動スケーリングを使用するには、自動スケーリングを管理する ID にロール microsoft.insights/autoscalesettings/write
を割り当てる必要があります。 このアクションを許可する組み込みロールまたはカスタム ロールを使用できます。 Azure Machine Learning のロールの管理に関する一般的なガイダンスについては、「ユーザーとロールを管理する 」を参照してください。 Azure Monitor からの自動スケーリング設定の詳細については、「Microsoft.Insights autoscalesettings 」を参照してください。
Python SDK を使用して Azure Monitor サービスを管理するには、次のコマンドを使用して azure-mgmt-monitor
パッケージをインストールします。
pip install azure-mgmt-monitor
自動スケーリング プロファイルを定義する
オンライン エンドポイントに対して自動スケーリングを有効にするには、最初に自動スケーリング プロファイルを定義します。 プロファイルは、既定、最小、および最大スケール セットの容量を指定します。 次の例では、既定、最小、および最大スケール容量の仮想マシン (VM) インスタンスの数を設定する方法を示します。
適用対象: Azure CLI ml 拡張機能 v2 (現行)
まだ Azure CLI の既定値を設定していない場合は、既定の設定を保存する必要があります。 サブスクリプション、ワークスペース、およびリソース グループの値を複数回渡さないようにするには、次のコードを実行します。
az account set --subscription <subscription ID>
az configure --defaults workspace=<Azure Machine Learning workspace name> group=<resource group>
エンドポイントとデプロイの名前を設定します:
# set your existing endpoint name
ENDPOINT_NAME=your-endpoint-name
DEPLOYMENT_NAME=blue
デプロイとエンドポイントの Azure Resource Manager ID を取得します:
# ARM id of the deployment
DEPLOYMENT_RESOURCE_ID=$(az ml online-deployment show -e $ENDPOINT_NAME -n $DEPLOYMENT_NAME -o tsv --query "id")
# ARM id of the deployment. todo: change to --query "id"
ENDPOINT_RESOURCE_ID=$(az ml online-endpoint show -n $ENDPOINT_NAME -o tsv --query "properties.\"azureml.onlineendpointid\"")
# set a unique name for autoscale settings for this deployment. The below will append a random number to make the name unique.
AUTOSCALE_SETTINGS_NAME=autoscale-$ENDPOINT_NAME-$DEPLOYMENT_NAME-`echo $RANDOM`
自動スケーリング プロファイルを作成します:
az monitor autoscale create \
--name $AUTOSCALE_SETTINGS_NAME \
--resource $DEPLOYMENT_RESOURCE_ID \
--min-count 2 --max-count 5 --count 2
適用対象 : Python SDK azure-ai-ml v2 (現行)
必要なモジュールをインポートします:
from azure.ai.ml import MLClient
from azure.identity import DefaultAzureCredential
from azure.mgmt.monitor import MonitorManagementClient
from azure.mgmt.monitor.models import AutoscaleProfile, ScaleRule, MetricTrigger, ScaleAction, Recurrence, RecurrentSchedule
import random
import datetime
ワークスペース、エンドポイント、デプロイの変数を定義します。
subscription_id = "<YOUR-SUBSCRIPTION-ID>"
resource_group = "<YOUR-RESOURCE-GROUP>"
workspace = "<YOUR-WORKSPACE>"
endpoint_name = "<YOUR-ENDPOINT-NAME>"
deployment_name = "blue"
Azure Machine Learning および Azure Monitor のクライアントを取得します。
credential = DefaultAzureCredential()
ml_client = MLClient(
credential, subscription_id, resource_group, workspace
)
mon_client = MonitorManagementClient(
credential, subscription_id
)
エンドポイントとデプロイ オブジェクトを取得します。
deployment = ml_client.online_deployments.get(
deployment_name, endpoint_name
)
endpoint = ml_client.online_endpoints.get(
endpoint_name
)
自動スケーリング プロファイルを作成します。
# Set a unique name for autoscale settings for this deployment. The following code appends a random number to create a unique name.
autoscale_settings_name = f"autoscale-{endpoint_name}-{deployment_name}-{random.randint(0,1000)}"
mon_client.autoscale_settings.create_or_update(
resource_group,
autoscale_settings_name,
parameters = {
"location" : endpoint.location,
"target_resource_uri" : deployment.id,
"profiles" : [
AutoscaleProfile(
name="my-scale-settings",
capacity={
"minimum" : 2,
"maximum" : 5,
"default" : 2
},
rules = []
)
]
}
)
Azure Machine Learning スタジオ で、ワークスペースに移動し、左側のメニューから [エンドポイント] を選択します。
使用可能なエンドポイントの一覧で、構成するエンドポイントを選択します:
選択したエンドポイントの [詳細] タブから、[自動スケーリングの構成] を選択します:
[リソースをスケーリングする方法を選択する] オプションで、[カスタム自動スケーリング] を選択し、構成を開始します。
[既定] スケール条件オプションでは、次の値を構成します:
[スケール モード] : [メトリックに基づいてスケーリングする] を選択します。
インスタンスの制限 >最小 : 値を 2 に設定します。
インスタンスの制限 >最大 : 値を 5 に設定します。
インスタンスの制限 >既定 : 値を 2 に設定します。
構成ウィンドウは開いたままにします。 次のセクションでは、[ルール] 設定を構成します。
デプロイ メトリックに基づいてスケールアウト ルールを作成する
一般的なスケールアウト ルールは、平均 CPU 負荷が高い場合に VM インスタンスの数を増やすことです。 次の例では、CPU の平均負荷が 5 分間で 70% を超える場合に、さらに 2 つのノード (最大値まで) を割り当てる方法を示します。
適用対象: Azure CLI ml 拡張機能 v2 (現行)
az monitor autoscale rule create \
--autoscale-name $AUTOSCALE_SETTINGS_NAME \
--condition "CpuUtilizationPercentage > 70 avg 5m" \
--scale out 2
ルールは my-scale-settings
プロファイルの一部であり、autoscale-name
プロファイルの name
部分と一致します。 引数 condition
ルールの値は、"VM インスタンス間の平均 CPU 消費量が 5 分間で 70% を超える" 場合にルールがトリガーされたことを示します。条件が満たされた場合、さらに 2 つの VM インスタンスが割り当てられます。
適用対象 : Python SDK azure-ai-ml v2 (現行)
ルール定義を作成します。
rule_scale_out = ScaleRule(
metric_trigger = MetricTrigger(
metric_name="CpuUtilizationPercentage",
metric_resource_uri = deployment.id,
time_grain = datetime.timedelta(minutes = 1),
statistic = "Average",
operator = "GreaterThan",
time_aggregation = "Last",
time_window = datetime.timedelta(minutes = 5),
threshold = 70
),
scale_action = ScaleAction(
direction = "Increase",
type = "ChangeCount",
value = 2,
cooldown = datetime.timedelta(hours = 1)
)
)
このルールは、引数 metric_name
、time_window
、および time_aggregation
からの CPUUtilizationpercentage
値の最後の 5 分間の平均を参照します。 メトリックの値が 70 の threshold
より大きい場合、デプロイではさらに 2 つの VM インスタンスが割り当てられます。
my-scale-settings
プロファイルを更新して、この規則を含めます。
mon_client.autoscale_settings.create_or_update(
resource_group,
autoscale_settings_name,
parameters = {
"location" : endpoint.location,
"target_resource_uri" : deployment.id,
"profiles" : [
AutoscaleProfile(
name="my-scale-settings",
capacity={
"minimum" : 2,
"maximum" : 5,
"default" : 2
},
rules = [
rule_scale_out
]
)
]
}
)
次の手順では、自動スケーリングの構成を続行します。
[ルール] オプションで、[ルールの追加] リンクを選択します。 スケール ルール ページが開きます。
スケール ルール ページで、次の値を構成します:
[メトリック名] : [CPU 使用率] を選択します。
[演算子] : [より大きい] に設定します。
メトリックしきい値 : 値を 70 に設定します。
期間 (分) : 値を 5 に設定します。
時間グレイン統計量 : 平均 を選択します。
[操作] : [カウントを増やす量] を選択します。
インスタンス数 : 値を 2 に設定します。
[追加] を選択し、ルールを作成します:
構成ウィンドウは開いたままにします。 次のセクションでは、[ルール] 設定を調整します。
デプロイ メトリックに基づいてスケールイン ルールを作成する
平均 CPU 負荷が軽い場合、スケールイン ルールによって VM インスタンスの数を減らすことができます。 次の例は、CPU 負荷が 5 分間 30% 未満の場合に、1 つのノードを少なくとも 2 つまで解放する方法を示しています。
適用対象: Azure CLI ml 拡張機能 v2 (現行)
az monitor autoscale rule create \
--autoscale-name $AUTOSCALE_SETTINGS_NAME \
--condition "CpuUtilizationPercentage < 25 avg 5m" \
--scale in 1
適用対象 : Python SDK azure-ai-ml v2 (現行)
ルール定義を作成します。
rule_scale_in = ScaleRule(
metric_trigger = MetricTrigger(
metric_name="CpuUtilizationPercentage",
metric_resource_uri = deployment.id,
time_grain = datetime.timedelta(minutes = 1),
statistic = "Average",
operator = "LessThan",
time_aggregation = "Last",
time_window = datetime.timedelta(minutes = 5),
threshold = 30
),
scale_action = ScaleAction(
direction = "Increase",
type = "ChangeCount",
value = 1,
cooldown = datetime.timedelta(hours = 1)
)
)
my-scale-settings
プロファイルを更新して、この規則を含めます。
mon_client.autoscale_settings.create_or_update(
resource_group,
autoscale_settings_name,
parameters = {
"location" : endpoint.location,
"target_resource_uri" : deployment.id,
"profiles" : [
AutoscaleProfile(
name="my-scale-settings",
capacity={
"minimum" : 2,
"maximum" : 5,
"default" : 2
},
rules = [
rule_scale_out,
rule_scale_in
]
)
]
}
)
次の手順では、スケールイン ルールをサポートするように ルール 構成を調整します。
[ルール] オプションで、[ルールの追加] リンクを選択します。 スケール ルール ページが開きます。
スケール ルール ページで、次の値を構成します:
[メトリック名] : [CPU 使用率] を選択します。
[演算子] : [より小さい] に設定します。
メトリックしきい値 : 値を 30 に設定します。
期間 (分) : 値を 5 に設定します。
時間グレイン統計量 : 平均 を選択します。
[操作] : [カウントを減らす量] を選択します。
インスタンス数 : 値を 1 に設定します。
[追加] を選択し、ルールを作成します:
スケールアウト ルールとスケールイン ルールの両方構成する場合、ルールは次のスクリーンショットのようになります。 このルールでは、平均 CPU 負荷が 5 分間で 70% を超える場合は、最大 5 つの上限まで、さらに 2 つのノードを割り当てる必要があることを指定します。 CPU 負荷が 5 分間 30% 未満の場合は、下限 2 まで、1 つのノードを解放する必要があります。
構成ウィンドウは開いたままにします。 次のセクションでは、他のスケール設定を指定します。
エンドポイント メトリックに基づいてスケール ルールを作成する
前のセクションでは、デプロイ メトリックに基づいてスケールインまたはスケールアウトするルールを作成しました。 デプロイ エンドポイントに適用される規則を作成することもできます。 このセクションでは、要求の待機時間が 5 分間の平均 70 ミリ秒を超える場合に、別のノードを割り当てる方法について説明します。
適用対象: Azure CLI ml 拡張機能 v2 (現行)
az monitor autoscale rule create \
--autoscale-name $AUTOSCALE_SETTINGS_NAME \
--condition "RequestLatency > 70 avg 5m" \
--scale out 1 \
--resource $ENDPOINT_RESOURCE_ID
適用対象 : Python SDK azure-ai-ml v2 (現行)
ルール定義を作成します。
rule_scale_out_endpoint = ScaleRule(
metric_trigger = MetricTrigger(
metric_name="RequestLatency",
metric_resource_uri = endpoint.id,
time_grain = datetime.timedelta(minutes = 1),
statistic = "Average",
operator = "GreaterThan",
time_aggregation = "Last",
time_window = datetime.timedelta(minutes = 5),
threshold = 70
),
scale_action = ScaleAction(
direction = "Increase",
type = "ChangeCount",
value = 1,
cooldown = datetime.timedelta(hours = 1)
)
)
このルールの metric_resource_uri
フィールドは、デプロイではなくエンドポイントを参照するようになります。
my-scale-settings
プロファイルを更新して、この規則を含めます。
mon_client.autoscale_settings.create_or_update(
resource_group,
autoscale_settings_name,
parameters = {
"location" : endpoint.location,
"target_resource_uri" : deployment.id,
"profiles" : [
AutoscaleProfile(
name="my-scale-settings",
capacity={
"minimum" : 2,
"maximum" : 5,
"default" : 2
},
rules = [
rule_scale_out,
rule_scale_in,
rule_scale_out_endpoint
]
)
]
}
)
次の手順では、カスタム自動スケーリング ページでルールの構成を続行します。
ページの下部で、[スケール条件の追加] を選択します。
[スケール条件] ページで、[メトリックに基づいてスケール] を選択し、 [ルールの追加] リンクを選択します。 スケール ルール ページが開きます。
スケール ルール ページで、次の値を構成します:
[メトリック ソース] : [その他のリソース] を選択します。
[リソースの種類] : [Machine Learning オンライン エンドポイント] を選択します。
[リソース] : エンドポイントを選択します。
[メトリック名] : [要求待機時間] を選択します。
[演算子] : [より大きい] に設定します。
メトリックしきい値 : 値を 70 に設定します。
期間 (分) : 値を 5 に設定します。
時間グレイン統計量 : 平均 を選択します。
[操作] : [カウントを増やす量] を選択します。
インスタンス数 : 値を 1 に設定します。
[追加] を選択し、ルールを作成します:
サポートされているメトリックの ID を検索する
コードで他のメトリックを使用して Azure CLI または SDK を使用して自動スケール ルールを設定する場合は、「使用可能なメトリック 」のテーブルを参照してください。
スケジュールに基づいてスケール ルールを作成する
特定の日または特定の時間にのみ適用されるルールを作成することもできます。 このセクションでは、週末にノード数を 2 に設定するルールを作成します。
適用対象: Azure CLI ml 拡張機能 v2 (現行)
az monitor autoscale profile create \
--name weekend-profile \
--autoscale-name $AUTOSCALE_SETTINGS_NAME \
--min-count 2 --count 2 --max-count 2 \
--recurrence week sat sun --timezone "Pacific Standard Time"
適用対象 : Python SDK azure-ai-ml v2 (現行)
mon_client.autoscale_settings.create_or_update(
resource_group,
autoscale_settings_name,
parameters = {
"location" : endpoint.location,
"target_resource_uri" : deployment.id,
"profiles" : [
AutoscaleProfile(
name="Default",
capacity={
"minimum" : 2,
"maximum" : 2,
"default" : 2
},
recurrence = Recurrence(
frequency = "Week",
schedule = RecurrentSchedule(
time_zone = "Pacific Standard Time",
days = ["Saturday", "Sunday"],
hours = [],
minutes = []
)
)
)
]
}
)
次の手順では、スタジオの [カスタム自動スケーリング] ページ オプションを使用してルールを構成します。
ページの下部で、[スケール条件の追加] を選択します。
[スケール条件] ページで、[特定のインスタンス数にスケール] を選択し、[ルールの追加] リンクを選択します。 スケール ルール ページが開きます。
スケール ルール ページで、次の値を構成します:
インスタンス数 : 値を 2 に設定します。
[スケジュール] : [特定の日数を繰り返す] を選択します。
スケジュール パターンを設定する: [毎週繰り返す] を選択し、土曜日 と日曜日 を選択します。
[追加] を選択し、ルールを作成します:
自動スケーリングを有効または無効にする
特定の自動スケーリング プロファイルを有効または無効にできます。
適用対象 : Python SDK azure-ai-ml v2 (現行)
mon_client.autoscale_settings.create_or_update(
resource_group,
autoscale_settings_name,
parameters = {
"location" : endpoint.location,
"target_resource_uri" : deployment.id,
"enabled" : False
}
)
リソースを削除する
デプロイを使用しない場合は、次の手順でリソースを削除します。
適用対象: Azure CLI ml 拡張機能 v2 (現行)
# delete the autoscaling profile
az monitor autoscale delete -n "$AUTOSCALE_SETTINGS_NAME"
# delete the endpoint
az ml online-endpoint delete --name $ENDPOINT_NAME --yes --no-wait
適用対象 : Python SDK azure-ai-ml v2 (現行)
mon_client.autoscale_settings.delete(
resource_group,
autoscale_settings_name
)
ml_client.online_endpoints.begin_delete(endpoint_name)
関連するコンテンツ