Exemplaartypen maken en beheren voor efficiënt gebruik van rekenresources

Instantietypen zijn een Azure Machine Learning-concept waarmee bepaalde typen rekenknooppunten kunnen worden gericht voor trainings- en deductieworkloads. In een virtuele Azure-machine is STANDARD_D2_V3bijvoorbeeld een exemplaartype. In dit artikel leert u hoe u exemplaartypen maakt en beheert voor uw rekenvereisten.

In Kubernetes-clusters worden exemplaartypen weergegeven in een aangepaste resourcedefinitie (CRD) die is geïnstalleerd met de Azure Machine Learning-extensie. Twee elementen in de Azure Machine Learning-extensie vertegenwoordigen de exemplaartypen:

  • Gebruik nodeSelector om op te geven op welk knooppunt een pod moet worden uitgevoerd. Het knooppunt moet een bijbehorend label hebben.
  • In de sectie Resources kunt u de rekenresources (CPU, geheugen en NVIDIA GPU) voor de pod instellen.

Als u een nodeSelector-veld opgeeft bij het implementeren van de Azure Machine Learning-extensie, wordt het nodeSelector veld toegepast op alle exemplaartypen. Dit betekent het volgende:

  • Voor elk exemplaartype dat u maakt, moet het opgegeven nodeSelector veld een subset van het extensie-opgegeven nodeSelector veld zijn.
  • Als u een exemplaartype gebruikt nodeSelector, wordt de werkbelasting uitgevoerd op elk knooppunt dat overeenkomt met zowel het opgegeven extensieveld als het opgegeven nodeSelectornodeSelector veld exemplaartype.
  • Als u een exemplaartype zonder veld nodeSelector gebruikt, wordt de werkbelasting uitgevoerd op een knooppunt dat overeenkomt met het opgegeven nodeSelector veld met de extensie.

Een standaardexemplarentype maken

Standaard wordt een exemplaartype gemaakt dat wordt aangeroepen defaultinstancetype wanneer u een Kubernetes-cluster koppelt aan een Azure Machine Learning-werkruimte. Dit is de definitie:

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

Als u geen veld toepast nodeSelector , kan de pod worden gepland op elk knooppunt. De pods van de workload worden standaardresources toegewezen met 0,1 CPU-kernen, 2 GB geheugen en 0 GPU's voor de aanvraag. De resources die de pods van de workload gebruiken, zijn beperkt tot 2 CPU-kernen en 8 GB geheugen.

Het standaardexemplarentype maakt bewust gebruik van weinig resources. Om ervoor te zorgen dat alle machine learning-workloads worden uitgevoerd met de juiste resources (bijvoorbeeld GPU-resource), raden we u ten zeerste aan om aangepaste exemplaartypen te maken.

Houd rekening met de volgende punten over het standaardexemplarentype:

  • defaultinstancetype wordt niet weergegeven als een InstanceType aangepaste resource in het cluster wanneer u de opdracht kubectl get instancetypeuitvoert, maar deze wordt wel weergegeven in alle clients (UI, Azure CLI, SDK).
  • defaultinstancetype kan worden overschreven met de definitie van een aangepast exemplaartype met dezelfde naam.

Een aangepast exemplaartype maken

Als u een nieuw exemplaartype wilt maken, maakt u een nieuwe aangepaste resource voor het exemplaartype CRD. Voorbeeld:

kubectl apply -f my_instance_type.yaml

Dit zijn de inhoud van 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"

Met de voorgaande code wordt een exemplaartype gemaakt met het gelabelde gedrag:

  • Pods worden alleen gepland op knooppunten met het label mylabel: mylabelvalue.
  • Pods worden toegewezen resourceaanvragen voor 700m CPU en 1500Mi voor geheugen.
  • Pods worden toegewezen resourcelimieten voor 1 CPU, 2Gi voor geheugen en 1 voor NVIDIA GPU.

Het maken van aangepaste exemplaartypen moet voldoen aan de volgende parameters en definitieregels, of mislukt:

Parameter Vereist of optioneel Beschrijving
name Vereist Tekenreekswaarden, die uniek moeten zijn in een cluster.
CPU request Vereist Tekenreekswaarden, die niet nul of leeg kunnen zijn.
U kunt de CPU opgeven in millicores; bijvoorbeeld 100m. U kunt deze ook opgeven als volledige getallen. "1" is bijvoorbeeld gelijk aan 1000m.
Memory request Vereist Tekenreekswaarden, die niet nul of leeg kunnen zijn.
U kunt het geheugen opgeven als een volledig getal + achtervoegsel; Bijvoorbeeld 1024Mi voor 1024 mebibytes (MiB).
CPU limit Vereist Tekenreekswaarden, die niet nul of leeg kunnen zijn.
U kunt de CPU opgeven in millicores; bijvoorbeeld 100m. U kunt deze ook opgeven als volledige getallen. "1" is bijvoorbeeld gelijk aan 1000m.
Memory limit Vereist Tekenreekswaarden, die niet nul of leeg kunnen zijn.
U kunt het geheugen opgeven als een volledig getal + achtervoegsel; Bijvoorbeeld 1024Mi voor 1024 MiB.
GPU Optioneel Geheel getalwaarden, die alleen in de limits sectie kunnen worden opgegeven.
Zie de Kubernetes-documentatie voor meer informatie.
nodeSelector Optioneel Toewijzing van tekenreekssleutels en -waarden.

Het is ook mogelijk om meerdere exemplaartypen tegelijk te maken:

kubectl apply -f my_instance_type_list.yaml

Dit zijn de inhoud van 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"

In het voorgaande voorbeeld worden twee exemplaartypen gemaakt: cpusmall en defaultinstancetype. Deze defaultinstancetype definitie overschrijft de defaultinstancetype definitie die is gemaakt toen u het Kubernetes-cluster aan de Azure Machine Learning-werkruimte hebt gekoppeld.

Als u een trainings- of deductieworkload verzendt zonder een exemplaartype, wordt deze gebruikt defaultinstancetype. Als u een standaardexemplarentype voor een Kubernetes-cluster wilt opgeven, maakt u een exemplaartype met de naam defaultinstancetype. Deze wordt automatisch herkend als de standaardwaarde.

Een exemplaartype selecteren om een trainingstaak te verzenden

Als u een exemplaartype voor een trainingstaak wilt selecteren met behulp van de Azure CLI (v2), geeft u de naam op als onderdeel van de resources sectie Eigenschappen in de taak YAML. Voorbeeld:

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

Vervang in het voorgaande voorbeeld door <Kubernetes-compute_target_name> de naam van uw Kubernetes-rekendoel. Vervang door <instance type name> de naam van het exemplaartype dat u wilt selecteren. Als u geen eigenschap opgeeft instance_type , gebruikt defaultinstancetype het systeem om de taak te verzenden.

Een exemplaartype selecteren om een model te implementeren

Als u een exemplaartype voor een modelimplementatie wilt selecteren met behulp van de Azure CLI (v2), geeft u de naam op voor de instance_type eigenschap in de YAML voor de implementatie. Voorbeeld:

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

Vervang in het voorgaande voorbeeld door <instance type name> de naam van het exemplaartype dat u wilt selecteren. Als u geen eigenschap opgeeft instance_type , gebruikt defaultinstancetype het systeem om het model te implementeren.

Belangrijk

Voor de implementatie van MLflow-modellen vereist de resourceaanvraag ten minste 2 CPU-kernen en 4 GB geheugen. Anders mislukt de implementatie.

Validatie van resourcesectie

U kunt de resources sectie gebruiken om de resourceaanvraag en limiet van uw modelimplementaties te definiëren. Voorbeeld:

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>

Als u de resources sectie gebruikt, moet een geldige resourcedefinitie voldoen aan de volgende regels. Een ongeldige resourcedefinitie zorgt ervoor dat de modelimplementatie mislukt.

Parameter Vereist of optioneel Beschrijving
requests:
cpu:
Vereist Tekenreekswaarden, die niet nul of leeg kunnen zijn.
U kunt de CPU opgeven in millicores; bijvoorbeeld 100m. U kunt deze ook opgeven in volledige getallen. "1" is bijvoorbeeld gelijk aan 1000m.
requests:
memory:
Vereist Tekenreekswaarden, die niet nul of leeg kunnen zijn.
U kunt het geheugen opgeven als een volledig getal + achtervoegsel; Bijvoorbeeld 1024Mi voor 1024 MiB.
Geheugen mag niet kleiner zijn dan 1 MB.
limits:
cpu:
Optionele
(alleen vereist wanneer u GPU nodig hebt)
Tekenreekswaarden, die niet nul of leeg kunnen zijn.
U kunt de CPU opgeven in millicores; bijvoorbeeld 100m. U kunt deze ook opgeven in volledige getallen. "1" is bijvoorbeeld gelijk aan 1000m.
limits:
memory:
Optionele
(alleen vereist wanneer u GPU nodig hebt)
Tekenreekswaarden, die niet nul of leeg kunnen zijn.
U kunt het geheugen opgeven als een volledig getal + achtervoegsel; Bijvoorbeeld 1024Mi voor 1024 MiB.
limits:
nvidia.com/gpu:
Optionele
(alleen vereist wanneer u GPU nodig hebt)
Geheel getalwaarden, die niet leeg kunnen zijn en alleen in de limits sectie kunnen worden opgegeven.
Zie de Kubernetes-documentatie voor meer informatie.
Als u alleen CPU nodig hebt, kunt u de hele limits sectie weglaten.

Het exemplaartype is vereist voor modelimplementatie. Als u de resources sectie hebt gedefinieerd en deze wordt gevalideerd op basis van het exemplaartype, zijn de regels als volgt:

  • Met een geldige resource sectiedefinitie moeten de resourcelimieten kleiner zijn dan de limieten van het exemplaartype. Anders mislukt de implementatie.
  • Als u geen exemplaartype definieert, wordt het systeem gebruikt defaultinstancetype voor validatie met de resources sectie.
  • Als u de resources sectie niet definieert, gebruikt het systeem het exemplaartype om de implementatie te maken.

Volgende stappen