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 angegebenennodeSelector
-Felds sein. - Wenn Sie einen Instanztyp mit
nodeSelector
verwenden, wird der Workload auf jedem Knoten ausgeführt, der sowohl mit dem durch die Erweiterung angegebenennodeSelector
-Feld als auch mit dem durch den Instanztyp angegebenennodeSelector
-Feld übereinstimmt. - Wenn Sie einen Instanztyp ohne
nodeSelector
-Feld verwenden, wird der Workload auf jedem Knoten ausgeführt, der mit dem durch die Erweiterung angegebenennodeSelector
-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 benutzerdefinierteInstanceType
-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 und1500Mi
für den Arbeitsspeicher zugewiesen. - Pods werden Ressourcenlimits von
1
für die CPU,2Gi
für den Arbeitsspeicher und1
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 Abschnittsresources
. - Wenn Sie den Abschnitt
resources
nicht definieren, verwendet das System den Instanztyp, um die Bereitstellung zu erstellen.