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

インスタンスの種類とは、トレーニング ワークロードと推論ワークロード用に特定の種類の計算ノードをターゲットにできる、Azure Machine Learning の概念です。 たとえば、Azure 仮想マシンでは、インスタンスの種類は STANDARD_D2_V3 です。 この記事では、評価要件に合わせてインスタンスの種類を作成および管理する方法について説明します。

Kubernetes クラスターの場合、インスタンスの種類は、Azure Machine Learning 拡張機能と共にインストールされるカスタム リソース定義 (CRD) で表されます。 Azure Machine Learning 拡張機能の 2 つの要素は、インスタンスの種類を表します。

  • nodeSelector を使用して、ポッドを実行するノードを指定します。 ノードには、対応するラベルが必要です。
  • リソース セクションでは、ポッドのコンピューティング リソース (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 GB のメモリ、0 GPU という既定のリソースがワークロードのポッドに割り当てられます。 ワークロードのポッドが使用するリソースは、2 CPU コアと 8 GB メモリに制限されます。

既定のインスタンスの種類では、意図的にリソースがほとんど使用されません。 すべての機械学習ワークロードに適切なリソース (たとえば GPU リソース) が割り当てられるように、カスタム インスタンスの種類を作成することを強くお勧めします。

既定のインスタンスの種類について、以下の点に注意してください。

  • コマンド kubectl get instancetype を実行しても、defaultinstancetype はクラスター内で 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 が付いたノードでのみスケジュールされます。
  • ポッドには、700m 個の CPU と 1500Mi のメモリのリソース要求が割り当てられます。
  • ポッドに、1 個の CPU、2Gi のメモリ、1 個の NVIDIA GPU のリソース制限が割り当てられます。

カスタム インスタンスの種類の作成は、次のパラメーターと定義規則を満たす必要があります。そうしないと、失敗します。

パラメーター 必須または省略可能 説明
name 必須 文字列値。クラスター内で一意にする必要があります。
CPU request 必須 文字列値。0 や空にすることはできません。
CPU はミリコア単位で、たとえば 100m のように指定できます。 完全数として指定することもできます。 たとえば、"1" は、1000m と同じです。
Memory request 必須 文字列値。0 や空にすることはできません。
メモリは完全数 + サフィックスとして指定できます。たとえば、1024 メビバイト (MiB) の場合は 1024Mi です。
CPU limit 必須 文字列値。0 や空にすることはできません。
CPU はミリコア単位で、たとえば 100m のように指定できます。 完全数として指定することもできます。 たとえば、"1" は、1000m と同じです。
Memory limit 必須 文字列値。0 や空にすることはできません。
メモリは完全数 + サフィックスとして指定できます。たとえば、1024 MiB の場合は 1024Mi です。
GPU 省略可能 整数値。limits セクションでのみ指定できます。
詳細については、Kubernetes のドキュメントを参照してください。
nodeSelector 省略可能 文字列のキーと値のマップ。

複数のインスタンス型を一度に作成することもできます。

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 プロパティ セクションの一部としてその名前を指定します。 次に例を示します。

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 プロパティにその名前を指定します。 次に例を示します。

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 を使用してモデルをデプロイします。

重要

MLflow モデルをデプロイする場合、リソース要求には少なくとも 2 CPU コアと 4 GB のメモリが必要です。 そうしない場合は、展開が失敗します。

リソース セクションの検証

resources セクションを使用して、モデル デプロイのリソース要求と制限を定義できます。 次に例を示します。

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 セクションを使用する場合は、有効なリソース定義が次の規則を満たしている必要があります。 リソース定義が無効な場合、モデル デプロイは失敗します。

パラメーター 必須または省略可能 説明
requests:
cpu:
必須 文字列値。0 や空にすることはできません。
CPU はミリコア単位で、たとえば 100m のように指定できます。 完全数で指定することもできます。 たとえば、"1" は、1000m と同じです。
requests:
memory:
必須 文字列値。0 や空にすることはできません。
メモリは完全数 + サフィックスとして指定できます。たとえば、1024 MiB の場合は 1024Mi です。
メモリは 1 MB 未満にすることはできません。
limits:
cpu:
省略可能
(GPU が必要な場合にのみ必要)
文字列値。0 や空にすることはできません。
CPU はミリコア単位で、たとえば 100m のように指定できます。 完全数で指定することもできます。 たとえば、"1" は、1000m と同じです。
limits:
memory:
省略可能
(GPU が必要な場合にのみ必要)
文字列値。0 や空にすることはできません。
メモリは完全数 + サフィックスとして指定できます。たとえば、1,024 MiB の場合は 1024Mi です。
limits:
nvidia.com/gpu:
省略可能
(GPU が必要な場合にのみ必要)
整数値。空にすることはできません。limits セクションでのみ指定できます。
詳細については、Kubernetes のドキュメントを参照してください。
CPU のみを必要とする場合は、limits セクション全体を省略できます。

インスタンスの種類は、モデル デプロイに必須です。 resources セクションを定義し、それがインスタンスの種類に照らして検証される場合、規則は次のようになります。

  • 有効な resource セクションの定義では、リソースの制限がインスタンスの種類の制限を下回る必要があります。 正しいサブネットを選択しないと、展開に失敗します。
  • インスタンス タイプを定義しない場合、システムは resources セクションでの検証に defaultinstancetype を使用します。
  • resources セクションを定義しない場合、システムはインスタンスの種類を使用してデプロイを作成します。

次のステップ