インスタンスの種類は、トレーニングワークロードと推論ワークロードの特定の種類のコンピューティング ノードをターゲットにするために使用するAzure Machine Learning概念です。 たとえば、Azure 仮想マシンでは、インスタンスの種類は STANDARD_D2_V3 です。 この記事では、計算要件に合わせてインスタンスの種類を作成および管理する方法について説明します。
Kubernetes クラスターでは、Azure Machine Learning拡張機能はインスタンスの種類を、インストールするカスタム リソース定義 (CRD) として表します。 Azure Machine Learning 拡張機能の 2 つの要素は、インスタンスの種類を表します。
- nodeSelector: nodeSelector を使用して、ポッドを実行するノードを指定します。 ノードには、対応するラベルが必要です。
- resources: resources セクションで 、ポッドのコンピューティング リソース (CPU、メモリ、NVIDIA GPU) を設定します。
Azure Machine Learning 拡張機能のデプロイ時に nodeSelector フィールドを指定した場合、nodeSelector フィールドはすべてのインスタンスの種類に適用されます。 この構成は、次のことを意味します。
- 作成するインスタンスの種類ごとに、指定する
nodeSelectorフィールドを、拡張機能で指定したnodeSelectorフィールドのサブセットにする必要があります。 -
nodeSelectorでインスタンスの種類を使用する場合、ワークロードは、拡張機能で指定されたnodeSelectorフィールドとインスタンス型で指定されたnodeSelectorフィールドの両方に一致する任意のノードで実行されます。 -
nodeSelectorフィールドのないインスタンスの種類を使用する場合、ワークロードは拡張機能で指定されたnodeSelectorフィールドと一致する任意のノードで実行されます。
既定のインスタンスの種類を作成する
Kubernetes クラスターを Azure Machine Learning ワークスペースにアタッチすると、サービスによって既定で defaultinstancetype という名前のインスタンスの種類が作成されます。 定義を次に示します。
resources:
requests:
cpu: "100m"
memory: "2Gi"
limits:
cpu: "2"
memory: "2Gi"
nvidia.com/gpu: null
nodeSelector フィールドを適用しない場合は、ポッドを任意のノードでスケジュールできます。 ワークロードのポッドには、要求に対して 0.1 CPU コア、2 GiB のメモリ、0 個の GPU を持つ既定のリソースが割り当てられます。 ワークロードのポッドで使用されるリソースは、2 つの CPU コアと 2 GiB のメモリに制限されます。
既定のインスタンス型では、最小限のリソースが意図的に使用されます。 すべての機械学習ワークロードが適切なリソース (GPU リソースなど) で実行されるようにするには、 カスタム インスタンスの種類を作成します。
既定のインスタンスの種類について、以下の点に注意してください。
-
defaultinstancetypeコマンドInstanceTypeを実行すると、クラスター内のkubectl get instancetypeカスタム リソースとして表示されませんが、すべてのクライアント (UI、Azure CLI、SDK) に表示されます。 - 同じ名前でカスタム インスタンスの種類を定義することで、
defaultinstancetypeをオーバーライドできます。
カスタム インスタンスの種類を作成する
新しいインスタンスの種類を作成するには、CRD というインスタンスの種類の新しいカスタム リソースを作成します。 例えば次が挙げられます。
kubectl apply -f my_instance_type.yaml
my_instance_type.yaml の内容を次に示します。
apiVersion: amlarc.azureml.com/v1alpha1
kind: InstanceType
metadata:
name: myinstancetypename
spec:
nodeSelector:
mylabel: mylabelvalue
resources:
limits:
cpu: "1"
nvidia.com/gpu: 1
memory: "2Gi"
requests:
cpu: "700m"
memory: "1500Mi"
上記のコードは、次の動作でインスタンス型を作成します。
- ラベルが
mylabel: mylabelvalueされているノードでのみポッドをスケジュールします。 - CPU の
700mのリソース要求とメモリの1500Miをポッドに割り当てます。 - CPU の
1のリソース制限、メモリの2Gi、NVIDIA GPU の1をポッドに割り当てます。
カスタム インスタンス型の作成は、次のパラメーターと定義規則を満たしている必要があります。または、失敗します。
| Parameter | 必須または省略可能 | Description |
|---|---|---|
name |
Required | クラスター内で一意である必要がある文字列値。 |
CPU request |
Required | 0 または空にできない文字列値。 CPU はミリコア単位で、たとえば 100m のように指定できます。 完全数として指定することもできます。 たとえば、"1" は、1000m と同じです。 |
Memory request |
Required | 0 または空にできない文字列値。 メモリは完全数 + サフィックスとして指定できます。たとえば、1024 メビバイト (MiB) の場合は 1024Mi です。 |
CPU limit |
Required | 0 または空にできない文字列値。 CPU はミリコア単位で、たとえば 100m のように指定できます。 完全数として指定することもできます。 たとえば、"1" は、1000m と同じです。 |
Memory limit |
Required | 0 または空にできない文字列値。 メモリは完全数 + サフィックスとして指定できます。たとえば、1024 MiB の場合は 1024Mi です。 |
GPU |
Optional |
limits セクションでのみ指定できる整数値。 詳細については、 Kubernetes のドキュメントを参照してください。 |
nodeSelector |
Optional | 文字列のキーと値のマップ。 |
複数のインスタンス型を一度に作成することもできます。
kubectl apply -f my_instance_type_list.yaml
my_instance_type_list.yaml の内容を次に示します。
apiVersion: amlarc.azureml.com/v1alpha1
kind: InstanceTypeList
items:
- metadata:
name: cpusmall
spec:
resources:
requests:
cpu: "100m"
memory: "100Mi"
limits:
cpu: "1"
nvidia.com/gpu: 0
memory: "1Gi"
- metadata:
name: defaultinstancetype
spec:
resources:
requests:
cpu: "1"
memory: "1Gi"
limits:
cpu: "1"
nvidia.com/gpu: 0
memory: "1Gi"
上記の例では、2 つのインスタンスの種類 cpusmall と defaultinstancetype が作成されます。 このdefaultinstancetype定義は、Kubernetes クラスターを Azure Machine Learning ワークスペースにアタッチしたときに作成したdefaultinstancetype定義をオーバーライドします。
インスタンスの種類を指定せずにトレーニングまたは推論のワークロードを送信すると、defaultinstancetype が使用されます。 Kubernetes クラスターに既定のインスタンスの種類を指定するには、名前が defaultinstancetype というインスタンスの種類を作成します。 これは自動的に既定値として認識されます。
インスタンスの種類を選んでトレーニング ジョブを送信する
Azure CLI (v2) を使用してトレーニング ジョブのインスタンスの種類を選択するには、ジョブ YAML の resources プロパティ セクションの一部として、その名前を指定します。 例えば次が挙げられます。
$schema: https://azuremlschemas.azureedge.net/latest/commandJob.schema.json
command: python -c "print('Hello world!')"
environment:
image: library/python:latest
compute: azureml:<Kubernetes-compute_target_name>
resources:
instance_type: <instance type name>
上記の例では、<Kubernetes-compute_target_name> を Kubernetes コンピューティング先の名前に置き換えます。
<instance type name> は、選択したいインスタンスの種類の名前に置き換えます。
instance_type プロパティを指定しない場合、システムは defaultinstancetype を使用してジョブを送信します。
インスタンスの種類を選んでモデルをデプロイする
Azure CLI (v2) を使用してモデル デプロイのインスタンスの種類を選択するには、デプロイ YAML のinstance_type プロパティの名前を指定します。 例えば次が挙げられます。
$schema: https://azuremlschemas.azureedge.net/latest/kubernetesOnlineDeployment.schema.json
name: blue
app_insights_enabled: true
endpoint_name: <endpoint name>
model:
path: ./model/sklearn_mnist_model.pkl
code_configuration:
code: ./script/
scoring_script: score.py
instance_type: <instance type name>
environment:
conda_file: file:./model/conda.yml
image: mcr.microsoft.com/azureml/openmpi3.1.2-ubuntu18.04:latest
上記の例では、<instance type name> を選択したいインスタンスの種類の名前に置き換えます。
instance_type プロパティを指定しない場合、システムは defaultinstancetype を使用してモデルをデプロイします。
Important
MLflow モデルをデプロイする場合、リソース要求には少なくとも 2 CPU コアと 4 GB のメモリが必要です。 そうでない場合、デプロイは失敗します。
リソース セクションの検証
resources セクションを使用して、モデル デプロイのリソース要求と制限を定義します。 例えば次が挙げられます。
$schema: https://azuremlschemas.azureedge.net/latest/kubernetesOnlineDeployment.schema.json
name: blue
app_insights_enabled: true
endpoint_name: <endpoint name>
model:
path: ./model/sklearn_mnist_model.pkl
code_configuration:
code: ./script/
scoring_script: score.py
environment:
conda_file: file:./model/conda.yml
image: mcr.microsoft.com/azureml/openmpi3.1.2-ubuntu18.04:latest
resources:
requests:
cpu: "0.1"
memory: "0.2Gi"
limits:
cpu: "0.2"
#nvidia.com/gpu: 0
memory: "0.5Gi"
instance_type: <instance type name>
resources セクションを使用する場合は、有効なリソース定義が次の規則を満たしている必要があります。 リソース定義が無効な場合、モデル デプロイは失敗します。
| Parameter | 必須または省略可能 | Description |
|---|---|---|
requests:cpu: |
Required | 0 または空にできない文字列値。 CPU はミリコア単位で、たとえば 100m のように指定できます。 完全数で指定することもできます。 たとえば、"1" は、1000m と同じです。 |
requests:memory: |
Required | 0 または空にできない文字列値。 メモリは完全数 + サフィックスとして指定できます。たとえば、1024 MiB の場合は 1024Mi です。 メモリは 1 MB 未満にすることはできません。 |
limits:cpu: |
Optional (GPU が必要な場合にのみ必要) |
0 または空にできない文字列値。 CPU はミリコア単位で、たとえば 100m のように指定できます。 完全数で指定することもできます。 たとえば、"1" は、1000m と同じです。 |
limits:memory: |
Optional (GPU が必要な場合にのみ必要) |
0 または空にできない文字列値。 メモリは完全数 + サフィックスとして指定できます。たとえば、1,024 MiB の場合は 1024Mi です。 |
limits:nvidia.com/gpu: |
Optional (GPU が必要な場合にのみ必要) |
空にすることはできないため、 limits セクションでのみ指定できる整数値。 詳細については、 Kubernetes のドキュメントを参照してください。 CPU のみを必要とする場合は、 limits セクション全体を省略できます。 |
モデルのデプロイにはインスタンスの種類が 必要 です。
resources セクションを定義すると、次の規則に従ってインスタンスの種類に対して検証されます。
- 有効な
resourceセクションの定義では、リソースの制限がインスタンスの種類の制限を下回る必要があります。 それ以外の場合、デプロイは失敗します。 - インスタンス タイプを定義しない場合、システムは
defaultinstancetypeセクションでの検証にresourcesを使用します。 -
resourcesセクションを定義しない場合、システムはインスタンスの種類を使用してデプロイを作成します。