コンピューティング リソースを効率的に使用するためのインスタンスの種類の作成と管理

インスタンスの種類は、トレーニングワークロードと推論ワークロードの特定の種類のコンピューティング ノードをターゲットにするために使用する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 つのインスタンスの種類 cpusmalldefaultinstancetype が作成されます。 この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 セクションを定義しない場合、システムはインスタンスの種類を使用してデプロイを作成します。

次のステップ