Vytváření a správa typů instancí pro efektivní využití výpočetních prostředků

Typy instancí jsou koncept Učení Azure Machine, který umožňuje cílení na určité typy výpočetních uzlů pro trénovací a odvozovací úlohy. Například ve virtuálním počítači Azure je STANDARD_D2_V3typ instance . V tomto článku se dozvíte, jak vytvářet a spravovat typy instancí pro vaše požadavky na výpočty.

V clusterech Kubernetes jsou typy instancí reprezentovány ve vlastní definici prostředků (CRD), která je nainstalovaná s rozšířením Azure Machine Učení. Dva prvky rozšíření Azure Machine Učení představují typy instancí:

  • Pomocí nodeSelectoru určete, na kterém uzlu se má pod spouštět. Uzel musí mít odpovídající popisek.
  • V části prostředky můžete pro pod nastavit výpočetní prostředky (procesor, paměť a NVIDIA GPU).

Pokud při nasazování rozšíření Azure Machine Učení zadáte pole nodeSelector, nodeSelector použije se pole pro všechny typy instancí. To znamená, že:

  • Pro každý typ instance, který vytvoříte, by zadané nodeSelector pole mělo být podmnožinou pole zadaného nodeSelector rozšířením.
  • Pokud použijete typ instance s nodeSelector, úloha se spustí na libovolném uzlu, který odpovídá poli zadanému nodeSelector rozšířením i poli zadanému nodeSelector typem instance.
  • Pokud použijete typ instance bez nodeSelector pole, úloha se spustí na libovolném uzlu, který odpovídá poli zadanému nodeSelector rozšířením.

Vytvoření výchozího typu instance

Ve výchozím nastavení se při připojení clusteru Kubernetes k pracovnímu prostoru Učení Azure vytvoří typ defaultinstancetype instance. Tady je definice:

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

Pokud pole nepoužijete nodeSelector , můžete ho naplánovat na libovolném uzlu. Podům úloh se přiřadí výchozí prostředky s 0,1 jádry procesoru, 2 GB paměti a 0 GPU pro požadavek. Prostředky, které pody úlohy používají, jsou omezené na 2 jádra procesoru a 8 GB paměti.

Výchozí typ instance účelně používá několik prostředků. Pokud chcete zajistit, aby všechny úlohy strojového učení běžely s příslušnými prostředky (například s prostředkem GPU), důrazně doporučujeme vytvořit vlastní typy instancí.

Mějte na paměti následující body týkající se výchozího typu instance:

  • defaultinstancetypepři spuštění příkazu kubectl get instancetypese v clusteru nezobrazuje jako InstanceType vlastní prostředek, ale zobrazuje se ve všech klientech (uživatelské rozhraní, Azure CLI, SDK).
  • defaultinstancetype lze přepsat definicí vlastního typu instance, který má stejný název.

Vytvoření vlastního typu instance

Pokud chcete vytvořit nový typ instance, vytvořte nový vlastní prostředek pro typ instance CRD. Příklad:

kubectl apply -f my_instance_type.yaml

Tady je obsah souboru 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"

Předchozí kód vytvoří typ instance s popiskem chování:

  • Pody jsou naplánovány pouze na uzlech, které mají popisek mylabel: mylabelvalue.
  • Podům se přiřazují požadavky 700m na prostředky procesoru a 1500Mi paměti.
  • Pody jsou přiřazené limity prostředků procesoru 1 , 2Gi paměti a 1 NVIDIA GPU.

Vytvoření vlastních typů instancí musí splňovat následující parametry a pravidla definice, jinak selže:

Parametr Požadované nebo volitelné Popis
name Povinní účastníci Řetězcové hodnoty, které musí být v clusteru jedinečné.
CPU request Požaduje se Řetězcové hodnoty, které nesmí být nulové nebo prázdné.
Můžete zadat procesor v milicores; například 100m. Můžete ho také zadat jako úplná čísla. Například "1" je ekvivalentní s 1000m.
Memory request Požaduje se Řetězcové hodnoty, které nesmí být nulové nebo prázdné.
Paměť můžete zadat jako celé číslo + příponu; Například 1024Mi pro 1 024 mebibajtů (MiB).
CPU limit Požaduje se Řetězcové hodnoty, které nesmí být nulové nebo prázdné.
Můžete zadat procesor v milicores; například 100m. Můžete ho také zadat jako úplná čísla. Například "1" je ekvivalentní s 1000m.
Memory limit Požaduje se Řetězcové hodnoty, které nesmí být nulové nebo prázdné.
Paměť můžete zadat jako celé číslo + příponu; Například 1024Mi pro 1024 MiB.
GPU Volitelné Celočíselné hodnoty, které lze zadat pouze v oddílu limits .
Další informace najdete v dokumentaci k Kubernetes.
nodeSelector Volitelné Mapa řetězcových klíčů a hodnot

Je také možné vytvořit více typů instancí najednou:

kubectl apply -f my_instance_type_list.yaml

Tady je obsah souboru 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"

Předchozí příklad vytvoří dva typy instancí: cpusmall a defaultinstancetype. Tato defaultinstancetype definice přepíše definici vytvořenou defaultinstancetype při připojení clusteru Kubernetes k pracovnímu prostoru azure machine Učení.

Pokud odešlete trénovací nebo odvozenou úlohu bez typu instance, použije defaultinstancetypese . Pokud chcete zadat výchozí typ instance pro cluster Kubernetes, vytvořte typ instance s názvem defaultinstancetype. Automaticky se rozpozná jako výchozí.

Vyberte typ instance pro odeslání trénovací úlohy.

Pokud chcete vybrat typ instance pro trénovací úlohu pomocí Azure CLI (v2), zadejte jeho název jako součást oddílu resources vlastností v YAML úlohy. Příklad:

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

V předchozím příkladu nahraďte <Kubernetes-compute_target_name> názvem cílového výpočetního objektu Kubernetes. Nahraďte <instance type name> názvem typu instance, který chcete vybrat. Pokud nezadáte instance_type vlastnost, systém ji odešle defaultinstancetype .

Výběr typu instance pro nasazení modelu

Pokud chcete vybrat typ instance pro nasazení modelu pomocí Azure CLI (v2), zadejte jeho název vlastnosti instance_type v YAML nasazení. Příklad:

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

V předchozím příkladu nahraďte <instance type name> názvem typu instance, který chcete vybrat. Pokud nezadáte instance_type vlastnost, systém použije defaultinstancetype k nasazení modelu.

Důležité

V případě nasazení modelu MLflow požadavek na prostředky vyžaduje alespoň 2 jádra procesoru a 4 GB paměti. Jinak nasazení selže.

Ověření oddílu prostředku

V resources této části můžete definovat požadavek na prostředky a omezení nasazení modelu. Příklad:

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>

Pokud použijete resources oddíl, musí platná definice prostředku splňovat následující pravidla. Neplatná definice prostředku způsobí selhání nasazení modelu.

Parametr Požadované nebo volitelné Popis
requests:
cpu:
Povinní účastníci Řetězcové hodnoty, které nesmí být nulové nebo prázdné.
Můžete zadat procesor v milicores; například 100m. Můžete ho také zadat v úplných číslech. Například "1" je ekvivalentní s 1000m.
requests:
memory:
Požaduje se Řetězcové hodnoty, které nesmí být nulové nebo prázdné.
Paměť můžete zadat jako celé číslo + příponu; Například 1024Mi pro 1024 MiB.
Paměť nemůže být menší než 1 MB.
limits:
cpu:
Volitelné
(vyžaduje se pouze v případě, že potřebujete GPU)
Řetězcové hodnoty, které nesmí být nulové nebo prázdné.
Můžete zadat procesor v milicores; například 100m. Můžete ho také zadat v úplných číslech. Například "1" je ekvivalentní s 1000m.
limits:
memory:
Volitelné
(vyžaduje se pouze v případě, že potřebujete GPU)
Řetězcové hodnoty, které nesmí být nulové nebo prázdné.
Paměť můžete zadat jako celé číslo + příponu; Například 1024Mi pro 1 024 MiB.
limits:
nvidia.com/gpu:
Volitelné
(vyžaduje se pouze v případě, že potřebujete GPU)
Celočíselné hodnoty, které nemohou být prázdné a dají se zadat jenom v oddílu limits .
Další informace najdete v dokumentaci k Kubernetes.
Pokud vyžadujete pouze procesor, můžete vynechat celý limits oddíl.

Pro nasazení modelu se vyžaduje typ instance. Pokud jste definovali resources oddíl a ověří se proti typu instance, pravidla jsou následující:

  • V platné resource definici oddílu musí být limity prostředků menší než limity typu instance. Jinak nasazení selže.
  • Pokud nedefinujete typ instance, systém použije defaultinstancetype k ověření oddílu resources .
  • Pokud oddíl nedefinujete resources , systém k vytvoření nasazení použije typ instance.

Další kroky