컴퓨팅 리소스의 효율적인 활용을 위한 인스턴스 형식 만들기 및 관리

인스턴스 유형은 학습 및 추론 워크로드에 대해 특정 유형의 컴퓨팅 노드를 대상으로 지정할 수 있는 Azure Machine Learning 개념입니다. 예를 들어 Azure 가상 머신에서 인스턴스 유형은 .입니다 STANDARD_D2_V3. 이 문서에서는 계산 요구 사항에 대한 인스턴스 유형을 만들고 관리하는 방법을 설명합니다.

Kubernetes 클러스터에서 인스턴스 형식은 Azure Machine Learning 확장과 함께 설치된 CRD(사용자 지정 리소스 정의)에 표시됩니다. Azure Machine Learning 확장의 두 요소는 인스턴스 형식을 나타냅니다.

  • Pod가 실행되어야 하는 노드를 지정하려면 nodeSelector를 사용합니다. 노드에는 해당 레이블이 있어야 합니다.
  • resources 섹션에서 Pod의 컴퓨팅 리소스(CPU, 메모리 및 NVIDIA GPU)를 설정할 수 있습니다.

Azure Machine Learning 확장을 배포할 때 nodeSelector 필드를 지정하면 nodeSelector 필드가 모든 인스턴스 형식에 적용됩니다. 이는 다음을 의미합니다.

  • 만드는 각 인스턴스 형식에 대해 지정된 nodeSelector 필드는 확장에 지정된 nodeSelector 필드의 하위 집합이어야 합니다.
  • nodeSelector와 함께 인스턴스 형식을 사용하는 경우 워크로드는 확장 지정 nodeSelector 필드 및 인스턴스 형식 지정 nodeSelector 필드와 모두 일치하는 모든 노드에서 실행됩니다.
  • nodeSelector 필드 없이 인스턴스 형식을 사용하는 경우 워크로드는 확장에 지정된 nodeSelector 필드와 일치하는 모든 노드에서 실행됩니다.

기본 인스턴스 형식 만들기

기본적으로 Kubernetes 클러스터를 Azure Machine Learning 작업 영역에 연결하면 defaultinstancetype이라는 인스턴스 형식이 만들어집니다. 정의는 다음과 같습니다.

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

nodeSelector 필드를 적용하지 않으면 모든 노드에서 Pod를 예약할 수 있습니다. 워크로드의 Pod에는 요청에 대해 CPU 코어 0.1개, 메모리 2GB, GPU 0개가 포함된 기본 리소스가 할당됩니다. 워크로드의 Pod가 사용하는 리소스는 CPU 코어 2개와 메모리 8GB로 제한됩니다.

기본 인스턴스 형식은 의도적으로 리소스를 거의 사용하지 않습니다. 모든 기계 학습 워크로드가 적절한 리소스(예: GPU 리소스)로 실행되도록 하려면 사용자 지정 인스턴스 형식을 만드는 것이 좋습니다.

기본 인스턴스 형식에 관해 다음 사항에 유의합니다.

  • defaultinstancetypekubectl get instancetype 명령을 실행할 때 클러스터에서 InstanceType 사용자 지정 리소스로 표시되지 않지만 모든 클라이언트(UI, Azure CLI, SDK)에는 표시됩니다.
  • defaultinstancetype은 이름이 같은 사용자 지정 인스턴스 형식의 정의로 재정의될 수 있습니다.

사용자 지정 인스턴스 형식 만들기

새 인스턴스 유형을 만들려면 인스턴스 유형 CRD에 대한 새 사용자 지정 리소스를 만듭니다. 예시:

kubectl apply -f my_instance_type.yaml

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"

앞의 코드는 레이블이 지정된 동작으로 인스턴스 형식을 만듭니다.

  • Pod는 mylabel: mylabelvalue 레이블이 있는 노드에만 예약됩니다.
  • Pod에는 CPU의 경우 700m, 메모리의 경우 1500Mi의 리소스 요청이 할당됩니다.
  • Pod에는 CPU의 경우 1, 메모리의 경우 2Gi, NVIDIA GPU의 경우 1의 리소스 제한이 할당됩니다.

사용자 지정 인스턴스 형식을 만들려면 다음 매개 변수 및 정의 규칙을 충족해야 합니다. 그렇지 않으면 실패합니다.

매개 변수 필수 또는 선택 사항 설명
name 필수 클러스터에서 고유해야 하는 문자열 값입니다.
CPU request Required 0이거나 비어 있을 수 없는 문자열 값입니다.
CPU를 밀리코어로 지정할 수 있습니다. 예를 들면 다음과 같습니다 100m. 전체 숫자로 지정할 수도 있습니다. 예를 들어 "1"1000m와 같습니다.
Memory request Required 0이거나 비어 있을 수 없는 문자열 값입니다.
전체 숫자 + 접미사로 메모리를 지정할 수 있습니다. 예를 들어, 1,024MiB(mebibyte)의 경우 1024Mi입니다.
CPU limit Required 0이거나 비어 있을 수 없는 문자열 값입니다.
CPU를 밀리코어로 지정할 수 있습니다. 예를 들면 다음과 같습니다 100m. 전체 숫자로 지정할 수도 있습니다. 예를 들어 "1"1000m와 같습니다.
Memory limit Required 0이거나 비어 있을 수 없는 문자열 값입니다.
메모리를 전체 숫자 + 접미사로 지정할 수 있습니다. 예를 들어 1024Mi 1024MiB의 경우입니다.
GPU 선택 사항 limits 섹션에서만 지정할 수 있는 정수 값입니다.
자세한 내용은 Kubernetes 설명서를 참조하세요.
nodeSelector 선택 사항 문자열 키 및 값의 맵입니다.

한 번에 여러 인스턴스 형식을 만들 수도 있습니다.

kubectl apply -f my_instance_type_list.yaml

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"

앞의 예에서는 cpusmalldefaultinstancetype이라는 두 가지 인스턴스 형식을 만듭니다. 이 defaultinstancetype 정의는 Kubernetes 클러스터를 Azure Machine Learning 작업 영역에 연결할 때 만들어진 defaultinstancetype 정의를 재정의합니다.

인스턴스 형식 없이 학습 또는 유추 워크로드를 제출하는 경우 defaultinstancetype을 사용합니다. Kubernetes 클러스터의 기본 인스턴스 형식을 지정하려면 이름이 defaultinstancetype인 인스턴스 형식을 만듭니다. 자동으로 기본값으로 인식됩니다.

학습 작업을 제출하려면 인스턴스 형식을 선택합니다.

Azure CLI(v2)를 사용하여 학습 작업에 대한 인스턴스 형식을 선택하려면 작업 YAML의 resources 속성 섹션의 일부로 해당 이름을 지정합니다. 예시:

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

앞의 예에서 <Kubernetes-compute_target_name>을 Kubernetes 컴퓨팅 대상의 이름으로 바꿉니다. <instance type name>을 선택하려는 인스턴스 형식의 이름으로 바꿉니다. instance_type 속성을 지정하지 않으면 시스템은 defaultinstancetype을 사용하여 작업을 제출합니다.

모델을 배포할 인스턴스 형식을 선택합니다.

Azure CLI(v2)를 사용하여 모델 배포에 대한 인스턴스 형식을 선택하려면 배포 YAML의 instance_type 속성에 해당 이름을 지정합니다. 예시:

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

앞의 예에서 <instance type name>을 선택하려는 인스턴스 형식의 이름으로 바꿉니다. instance_type 속성을 지정하지 않으면 시스템은 defaultinstancetype을 사용하여 모델을 배포합니다.

Important

MLflow 모델 배포의 경우 리소스 요청에는 최소 2개의 CPU 코어와 4GB의 메모리가 필요합니다. 그렇지 않으면 배포에 실패합니다.

리소스 섹션 유효성 검사

resources 섹션을 사용하여 모델 배포의 리소스 요청 및 제한을 정의할 수 있습니다. 예시:

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>

resources 섹션을 사용하는 경우 유효한 리소스 정의는 다음 규칙을 충족해야 합니다. 잘못된 리소스 정의로 인해 모델 배포가 실패합니다.

매개 변수 필수 또는 선택 사항 설명
requests:
cpu:
필수 0이거나 비어 있을 수 없는 문자열 값입니다.
CPU를 밀리코어로 지정할 수 있습니다. 예를 들면 다음과 같습니다 100m. 전체 숫자로 지정할 수도 있습니다. 예를 들어 "1"1000m와 같습니다.
requests:
memory:
Required 0이거나 비어 있을 수 없는 문자열 값입니다.
메모리를 전체 숫자 + 접미사로 지정할 수 있습니다. 예를 들어 1024Mi 1024MiB의 경우입니다.
메모리는 1MB보다 작을 수 없습니다.
limits:
cpu:
선택적
(GPU가 필요한 경우에만 필요)
0이거나 비어 있을 수 없는 문자열 값입니다.
CPU를 밀리코어로 지정할 수 있습니다. 예를 들면 다음과 같습니다 100m. 전체 숫자로 지정할 수도 있습니다. 예를 들어 "1"1000m와 같습니다.
limits:
memory:
선택적
(GPU가 필요한 경우에만 필요)
0이거나 비어 있을 수 없는 문자열 값입니다.
전체 숫자 + 접미사로 메모리를 지정할 수 있습니다. 예를 들어, 1024MiB의 경우 1024Mi입니다.
limits:
nvidia.com/gpu:
선택적
(GPU가 필요한 경우에만 필요)
비워둘 수 없고 limits 섹션에서만 지정할 수 있는 정수 값입니다.
자세한 내용은 Kubernetes 설명서를 참조하세요.
CPU만 필요한 경우 전체 limits 섹션을 생략할 수 있습니다.

모델 배포에는 인스턴스 형식이 필수입니다. resources 섹션을 정의하고 인스턴스 형식에 대해 유효성을 검사하는 경우 규칙은 다음과 같습니다.

  • 유효한 resource 섹션 정의를 사용하면 리소스 제한이 인스턴스 형식 제한보다 작아야 합니다. 그렇지 않으면 배포가 실패합니다.
  • 인스턴스 형식을 정의하지 않으면 시스템은 resources 섹션의 유효성 검사를 위해 defaultinstancetype을 사용합니다.
  • resources 섹션을 정의하지 않으면 시스템은 인스턴스 형식을 사용하여 배포를 만듭니다.

다음 단계