Skapa och hantera instanstyper för effektiv användning av beräkningsresurser

Instanstyper är ett Azure Machine Learning begrepp som du använder för att rikta in dig på specifika typer av beräkningsnoder för tränings- och slutsatsdragningsarbetsbelastningar. På en virtuell Azure-dator är STANDARD_D2_V3till exempel en instanstyp . Den här artikeln visar hur du skapar och hanterar instanstyper för dina beräkningskrav.

I Kubernetes-kluster representerar Azure Machine Learning-tillägget instanstyper som en anpassad resursdefinition (CRD) som installeras. Två element i Azure Machine Learning-tillägget representerar instanstyper:

  • nodeSelector: Använd nodeSelector för att ange vilken nod en podd ska köras på. Noden måste ha en motsvarande etikett.
  • resurser: I avsnittet resurser anger du beräkningsresurserna (CPU, minne och NVIDIA GPU) för podden.

Om du anger ett nodeSelector-fält när du distribuerar Azure Machine Learning-tillägget gäller fältet nodeSelector för alla instanstyper. Den här konfigurationen innebär:

  • För varje instanstyp som du skapar ska det angivna nodeSelector fältet vara en delmängd av det angivna nodeSelector fältet för tillägget.
  • Om du använder en instanstyp med nodeSelector körs arbetsbelastningen på vilken nod som helst som matchar både det tilläggsspecificerade nodeSelector fältet och det instanstypsspecificerade nodeSelector fältet.
  • Om du använder en instanstyp utan fältet nodeSelector körs arbetsbelastningen på vilken nod som helst som matchar det tilläggsspecifika nodeSelector-fältet.

Skapa en standardinstanstyp

När du kopplar ett Kubernetes-kluster till en Azure Machine Learning arbetsyta skapar tjänsten en instanstyp med namnet defaultinstancetype som standard. Här är definitionen:

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

Om du inte använder ett nodeSelector fält kan podden schemaläggas på valfri nod. Arbetsbelastningens poddar tilldelas standardresurser med 0,1 CPU-kärna, 2 GiB i minne och 0 GPU:er i resursbegäran. De resurser som arbetsbelastningens poddar använder är begränsade till 2 CPU-kärnor och 2 GiB arbetsminne.

Standardinstanstypen använder avsiktligt minimala resurser. Skapa anpassade instanstyper för att säkerställa att alla maskininlärningsarbetsbelastningar körs med lämpliga resurser (till exempel GPU-resurser).

Tänk på följande punkter om standardinstanstypen:

  • defaultinstancetype visas inte som en InstanceType anpassad resurs i klustret när du kör kommandot kubectl get instancetype, men det visas i alla klienter (UI, Azure CLI, SDK).
  • Du kan åsidosätta defaultinstancetype genom att definiera en anpassad instanstyp med samma namn.

Skapa en anpassad instanstyp

Skapa en ny instanstyp genom att skapa en ny anpassad resurs för instanstypen CRD. Ett exempel:

kubectl apply -f my_instance_type.yaml

Här är innehållet i 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"

Föregående kod skapar en instanstyp med följande beteende:

  • Schemalägg endast poddar på noder som har etiketten mylabel: mylabelvalue.
  • Tilldela resursbegäranden 700m för cpu och 1500Mi minne till poddar.
  • Tilldela poddar resursgränser på 1 för CPU, 2Gi för minne och 1 för NVIDIA GPU.

Skapande av anpassad instanstyp måste uppfylla följande parametrar och definitionsregler, annars misslyckas det:

Parameter Obligatorisk eller valfri Description
name Required Strängvärden som måste vara unika i ett kluster.
CPU request Required Strängvärden som inte får vara noll eller tomma.
Du kan ange processorn i millicores. till exempel 100m. Du kan också ange det som fullständiga tal. "1" motsvarar till exempel 1000m.
Memory request Required Strängvärden som inte får vara noll eller tomma.
Du kan ange minnet som ett fullständigt tal + suffix. till exempel 1024Mi för 1 024 mebibyte (MiB).
CPU limit Required Strängvärden som inte får vara noll eller tomma.
Du kan ange processorn i millicores. till exempel 100m. Du kan också ange det som fullständiga tal. "1" motsvarar till exempel 1000m.
Memory limit Required Strängvärden som inte får vara noll eller tomma.
Du kan ange minnet som ett fullständigt tal + suffix. till exempel 1024Mi för 1024 MiB.
GPU Optional Heltalsvärden som du bara kan ange i avsnittet limits .
Mer information finns i Kubernetes-dokumentationen.
nodeSelector Optional Karta över strängnycklar och värden.

Du kan också skapa flera instanstyper samtidigt:

kubectl apply -f my_instance_type_list.yaml

Här är innehållet i 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"

I föregående exempel skapas två instanstyper: cpusmall och defaultinstancetype. Den här defaultinstancetype definitionen åsidosätter definitionen defaultinstancetype som du skapade när du kopplade Kubernetes-klustret till Azure Machine Learning arbetsytan.

Om du skickar en tränings- eller inferensarbetsbelastning utan en instanstyp använder den defaultinstancetype. Om du vill ange en standardinstanstyp för ett Kubernetes-kluster skapar du en instanstyp med namnet defaultinstancetype. Den identifieras automatiskt som standard.

Välj en instanstyp för att skicka ett träningsjobb

Om du vill välja en instanstyp för ett träningsjobb med hjälp av Azure CLI (v2) anger du dess namn som en del av egenskapsavsnittet resources i jobbet YAML. Ett exempel:

$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>

I föregående exempel ersätter du <Kubernetes-compute_target_name> med namnet på ditt Kubernetes-beräkningsmål. Ersätt <instance type name> med namnet på den instanstyp som du vill välja. Om du inte anger en instance_type egenskap använder defaultinstancetype systemet för att skicka jobbet.

Välj en instanstyp för att distribuera en modell

Om du vill välja en instanstyp för en modelldistribution med hjälp av Azure CLI (v2) anger du dess namn för instance_type egenskapen i distributionens YAML. Ett exempel:

$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

I föregående exempel ersätter <instance type name> du med namnet på den instanstyp som du vill välja. Om du inte anger en instance_type egenskap använder defaultinstancetype systemet för att distribuera modellen.

Important

För MLflow-modelldistribution kräver resursbegäran minst 2 CPU-kärnor och 4 GB minne. Annars misslyckas distributionen.

Verifiering av resursavsnitt

Använd avsnittet resources för att definiera resursbegäran och gräns för dina modelldistributioner. Ett exempel:

$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>

När du använder resources avsnittet måste en giltig resursdefinition uppfylla följande regler. En ogiltig resursdefinition gör att modelldistributionen misslyckas.

Parameter Obligatorisk eller valfri Description
requests:
cpu:
Required Strängvärden som inte får vara noll eller tomma.
Du kan ange processorn i millicores. till exempel 100m. Du kan också ange den i fullständiga tal. "1" motsvarar till exempel 1000m.
requests:
memory:
Required Strängvärden som inte får vara noll eller tomma.
Du kan ange minnet som ett fullständigt tal + suffix. till exempel 1024Mi för 1024 MiB.
Minnet får inte vara mindre än 1 MB.
limits:
cpu:
Optional
(krävs endast när du behöver GPU)
Strängvärden som inte får vara noll eller tomma.
Du kan ange processorn i millicores. till exempel 100m. Du kan också ange den i fullständiga tal. "1" motsvarar till exempel 1000m.
limits:
memory:
Optional
(krävs endast när du behöver GPU)
Strängvärden som inte får vara noll eller tomma.
Du kan ange minnet som ett fullständigt tal + suffix. till exempel 1024Mi för 1 024 MiB.
limits:
nvidia.com/gpu:
Optional
(krävs endast när du behöver GPU)
Heltalsvärden som inte kan vara tomma och som endast kan anges i avsnittet limits .
Mer information finns i Kubernetes-dokumentationen.
Om du bara behöver CPU kan du utelämna hela limits avsnittet.

En instanstyp krävs för modelldistribution. Om du definierar avsnittet resources verifieras det mot instanstypen enligt följande regler:

  • Med en giltig resource avsnittsdefinition måste resursgränserna vara mindre än instanstypens gränser. Annars misslyckas distributionen.
  • Om du inte definierar en instanstyp använder defaultinstancetype systemet för validering med avsnittet resources .
  • Om du inte definierar resources avsnittet använder systemet instanstypen för att skapa distributionen.

Nästa steg