Erstellen und Verwalten von Instanztypen für eine effiziente Nutzung von Computeressourcen

Instanztypen sind ein Azure Machine Learning, das es ermöglicht, bestimmte Arten von Serverknoten für Trainings- und Rückschluss-Workloads als Ziel zu verwenden. In einem virtuellen Azure-Computer ist beispielsweise ein Instanztyp STANDARD_D2_V3. In diesem Artikel erfahren Sie, wie Sie Instanztypen für Ihre Berechnungsanforderungen erstellen und verwalten.

In Kubernetes-Clustern werden die Instanztypen in einer benutzerdefinierten Ressourcendefinition (Custom Resource Definition, CRD) dargestellt, die mit der Azure Machine Learning-Erweiterung installiert wird. Zwei Elemente in der Azure Machine Learning-Erweiterung repräsentieren die Instanztypen:

  • Verwenden Sie nodeSelector, um anzugeben, auf welchem Knoten ein Pod ausgeführt werden soll. Der Knoten muss über eine entsprechende Bezeichnung verfügen.
  • Im Abschnitt Resourcen können Sie die Computeressourcen (CPU, Arbeitsspeicher und NVIDIA-GPU) für den Pod festlegen.

Wenn Sie beim Bereitstellen der Azure Machine Learning-Erweiterung ein nodeSelector-Feld angeben, wird das nodeSelector-Feld auf alle Instanztypen angewendet. Dies bedeutet Folgendes:

  • Für jeden Instanztyp, den Sie erstellen, sollte das angegebene nodeSelector-Feld eine Teilmenge des durch die Erweiterung angegebenen nodeSelector-Felds sein.
  • Wenn Sie einen Instanztyp mit nodeSelector verwenden, wird der Workload auf jedem Knoten ausgeführt, der sowohl mit dem durch die Erweiterung angegebenen nodeSelector-Feld als auch mit dem durch den Instanztyp angegebenen nodeSelector-Feld übereinstimmt.
  • Wenn Sie einen Instanztyp ohne nodeSelector-Feld verwenden, wird der Workload auf jedem Knoten ausgeführt, der mit dem durch die Erweiterung angegebenen nodeSelector-Feld übereinstimmt.

Erstellen eines Standardinstanztyps

Standardmäßig wird Instanztyp namens defaultinstancetype erstellt, wenn Sie einen Kubernetes-Cluster an einen Azure Machine Learning-Arbeitsbereich anfügen. Dies ist die Definition:

resources:
  requests:
    cpu: "100m"
    memory: "2Gi"
  limits:
    cpu: "2"
    memory: "2Gi"
    nvidia.com/gpu: null

Wenn Sie kein nodeSelector-Feld anwenden, bedeutet dies, dass der Pod auf jedem Knoten geplant werden kann. Den Pods der Workload werden für die Anforderung Standardressourcen mit 0,1 CPU-Kernen, 2 GB Arbeitsspeicher und 0 GPUs zugewiesen. Die Ressourcen, die die Pods der Workload verbrauchen können sind auf 2 CPU-Kerne und 8 GB Arbeitsspeicher beschränkt.

Der Standardinstanztyp verwendet gezielt wenig Ressourcen. Um sicherzustellen, dass alle Machine Learning-Workloads mit entsprechenden Ressourcen (z. B. GPU-Ressource) ausgeführt werden, wird dringend empfohlen, benutzerdefinierte Instanztypen zu erstellen.

Berücksichtigen Sie beim Erstellen eines Standardinstanztyps folgende Punkte:

  • defaultinstancetype wird nicht als benutzerdefinierte InstanceType-Ressource im Cluster angezeigt, wenn Sie den Befehl „kubectl get instancetype“ ausführen, sondern in allen Clients (UI, CLI, SDK).
  • defaultinstancetype kann mit der Definition eines benutzerdefinierten Instanztyps mit demselben Namen überschrieben werden.

Erstellen eines benutzerdefinierten Instanztyps

Um einen neuen Instanztyp zu erstellen, müssen Sie eine neue benutzerdefinierte Ressource für den Instanztyp CRD erstellen. Beispiel:

kubectl apply -f my_instance_type.yaml

Dies sind die Inhalte von 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"

Der vorherige Code erstellt einen Instanztyp mit dem bezeichneten Verhalten:

  • Pods werden nur auf Knoten mit der Bezeichnung „mylabel: mylabelvalue“ geplant.
  • Pods werden Ressourcenanforderungen von 700m für die CPU und 1500Mi für den Arbeitsspeicher zugewiesen.
  • Pods werden Ressourcenlimits von 1 für die CPU, 2Gi für den Arbeitsspeicher und 1 für die Nvidia-GPU zugewiesen.

Die Erstellung benutzerdefinierter Instanztypen muss die folgenden Parameter und Definitionsregeln erfüllen, andernfalls kommt es zu einem Fehler:

Parameter Erforderlich oder optional BESCHREIBUNG
name Erforderlich Zeichenfolgenwerte, die in einem Cluster eindeutig sein müssen.
CPU request Erforderlich Zeichenfolgenwerte, die nicht Null oder leer sein dürfen.
Sie können die CPU in MilliCores angeben, z. B. 100m. Sie können es auch ganze Zahlen angeben. "1" entspricht beispielsweise 1000m.
Memory request Erforderlich Zeichenfolgenwerte, die nicht Null oder leer sein dürfen.
Sie können den Arbeitsspeicher als ganze Zahl + Suffix angeben, z. B. 1024Mi für 1,024 Mebibytes (MiB).
CPU limit Erforderlich Zeichenfolgenwerte, die nicht Null oder leer sein dürfen.
Sie können die CPU in MilliCores angeben, z. B. 100m. Sie können es auch ganze Zahlen angeben. "1" entspricht beispielsweise 1000m.
Memory limit Erforderlich Zeichenfolgenwerte, die nicht Null oder leer sein dürfen.
Sie können den Arbeitsspeicher als ganze Zahl + Suffix angeben, z. B. 1024Mi für 1.024 MiB.
GPU Optional Ganzzahlige Werte können nur im Abschnitt limits angegeben werden.
Weitere Informationen finden Sie in der Kubernetes-Dokumentation.
nodeSelector Optional Zuordnung von Zeichenfolgenschlüsseln und -werten.

Es ist auch möglich, mehrere Instanztypen gleichzeitig zu erstellen:

kubectl apply -f my_instance_type_list.yaml

Dies sind die Inhalte von 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"

Im vorherigen Beispiel werden zwei Instanztypen erstellt: cpusmall und defaultinstancetype. Diese defaultinstancetype-Definition setzt die defaultinstancetype-Definition außer Kraft, die erstellt wurde, als Sie den Kubernetes-Cluster an den Azure Machine Learning-Arbeitsbereich angefügt haben.

Wird ein Trainings- oder Rückschlussworkload ohne Instanztyp übermittelt, wird der defaultinstancetype verwendet. Um einen Standardinstanztyp für einen Kubernetes-Cluster festzulegen, erstellen Sie einen Instanztyp mit dem Namen defaultinstancetype. Dieser wird automatisch als Standard erkannt.

Auswählen eines Instanztyps zum Übermitteln eines Trainingsauftrags

Um einen Instanztyp für einen Trainingsauftrag mithilfe der Azure CLI (v2) auszuwählen, geben Sie seinen Namen im Abschnitt mit den resources-Eigenschaften in der Auftrags-YAML an. Beispiel:

command: python -c "print('Hello world!')"
environment:
  image: library/python:latest
compute: azureml:<Kubernetes-compute_target_name>
resources:
  instance_type: <instance type name>

Ersetzen Sie im vorherigen Beispiel <Kubernetes-compute_target_name> durch den Namen Ihres Kubernetes-Computeziels. Ersetzen Sie <instance type name> durch den Namen des Instanztyps, den Sie auswählen möchten. Wenn Sie keine instance_type-Eigenschaft angeben, verwendet das System defaultinstancetype, um den Auftrag zu übermitteln.

Auswählen eines Instanztyps zum Bereitstellen eines Modells

Um einen Instanztyp für eine Modellbereitstellung mithilfe der Azure CLI (v2) auszuwählen, geben Sie den Namen für die instance_type-Eigenschaft in der Bereitstellungs-YAML an. Beispiel:

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

Ersetzen Sie im vorherigen Beispiel <instance type name> durch den Namen des Instanztyps, den Sie auswählen möchten. Wenn Sie keine instance_type-Eigenschaft angeben, verwendet das System defaultinstancetype, um das Modell bereitzustellen.

Wichtig

Für die MLflow-Modellbereitstellung beträft die Ressourcenanforderung mindestens 2 CPU-Kerne und 4 GB Arbeitsspeicher. Andernfalls funktioniert die Bereitstellung nicht.

Überprüfung des Ressourcenabschnitts

Sie können den Abschnitt resources verwenden, um die Ressourcenanforderung und das Limit Ihrer Modellbereitstellungen zu definieren. Beispiel:

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>

Wenn Sie den Abschnitt resources verwenden, muss eine gültige Ressourcendefinition die folgenden Regeln erfüllen. Eine ungültige Ressourcendefinition führt dazu, dass bei der Modellbereitstellung ein Fehler auftritt.

Parameter Erforderlich oder optional BESCHREIBUNG
requests:
cpu:
Erforderlich Zeichenfolgenwerte, die nicht Null oder leer sein dürfen.
Sie können die CPU in MilliCores angeben, z. B. 100m. Sie können auch ganze Zahlen angeben. "1" entspricht beispielsweise 1000m.
requests:
memory:
Erforderlich Zeichenfolgenwerte, die nicht Null oder leer sein dürfen.
Sie können den Arbeitsspeicher als ganze Zahl + Suffix angeben, z. B. 1024Mi für 1.024 MiB.
Der Arbeitsspeicher darf nicht kleiner als 1 MB sein.
limits:
cpu:
Optional
(nur erforderlich, wenn Sie eine GPU benötigen)
Zeichenfolgenwerte, die nicht Null oder leer sein dürfen.
Sie können die CPU in MilliCores angeben, z. B. 100m. Sie können auch ganze Zahlen angeben. "1" entspricht beispielsweise 1000m.
limits:
memory:
Optional
(nur erforderlich, wenn Sie eine GPU benötigen)
Zeichenfolgenwerte, die nicht Null oder leer sein dürfen.
Sie können den Arbeitsspeicher als ganze Zahl + Suffix angeben, z. B. 1024Mi für 1,024 MiB.
limits:
nvidia.com/gpu:
Optional
(nur erforderlich, wenn Sie eine GPU benötigen)
Ganzzahlige Werte, die nicht leer sein dürfen und nur im Abschnitt limits angegeben werden können.
Weitere Informationen finden Sie in der Kubernetes-Dokumentation.
Wenn Sie nur eine CPU benötigen, können Sie den gesamten Abschnitt limits weglassen.

Der Instanztyp ist für die Modellbereitstellung erforderlich. Wenn Sie den Abschnitt resources definiert haben, und er anhand des Instanztyps überprüft wird, gelten die folgenden Regeln:

  • Bei einer gültigen Abschnittsdefinition von resource müssen die Ressourcengrenzwerte kleiner als die Grenzwerte für den Instanztyp sein. Andernfalls tritt bei der Bereitstellung ein Fehler auf.
  • Wenn Sie keinen Instanztyp definieren, verwendet das System defaultinstancetype für die Überprüfung des Abschnitts resources.
  • Wenn Sie den Abschnitt resources nicht definieren, verwendet das System den Instanztyp, um die Bereitstellung zu erstellen.

Nächste Schritte