Amazon EKS에서 Neuron 장치 관리하기

Amazon EKS에서 Neuron 장치 관리하기

AWS Trainium과 AWS Inferentia는 AWS가 설계한 목적 특화 머신러닝 칩입니다. Amazon EKS는 EKS 클러스터에서 Neuron 장치를 관리하기 위한 두 가지 메커니즘을 지원합니다. Neuron DRA driver와 Neuron Kubernetes device plugin이에요.

Kubernetes 1.34 이상 버전에서 Karpenter의 정적 용량 프로비저닝, EKS 관리형 노드 그룹, 또는 자체 관리 노드를 사용하는 새 배포에는 DRA 드라이버를 사용할 것을 권장합니다. DRA는 현재 EKS Auto Mode에서 지원되지 않아요. Neuron DRA driver는 사용자 정의 스케줄러 확장 없이 토폴로지 인식 할당, 연결된 장치 부분 집합 스케줄링, Logical NeuronCore (LNC) 구성, UltraServer 다중 노드 할당을 제공합니다.

Neuron DRA driver vs Neuron device plugin

기능 Neuron DRA driver Neuron device plugin
최소 Kubernetes 버전 1.34 모든 EKS 지원 Kubernetes 버전
EKS 컴퓨팅 Karpenter (정적 용량만), 관리형 노드 그룹, 자체 관리 노드 EKS Auto Mode, Karpenter, 관리형 노드 그룹, 자체 관리 노드
EKS 최적화 AMI 지원 AL2023 (Neuron), Bottlerocket AL2023 (Neuron), Bottlerocket
장치 광고 장치 ID, 인스턴스 유형, 토폴로지, 드라이버 버전, EFA 근접성을 포함하는 ResourceSlice 객체를 통한 풍부한 속성 aws.amazon.com/neuron 및 aws.amazon.com/neuroncore 확장 리소스의 정수 개수
연결된 장치 부분 집합 토폴로지 제약으로 1, 4, 8, 16개의 연결된 Neuron 장치 부분 집합 할당 연속 장치 할당에 Neuron 스케줄러 확장 필요
LNC 구성 ResourceClaimTemplate 파라미터를 통한 워크로드별 Logical NeuronCore 구성 (LNC=1 또는 LNC=2) EC2 런치 템플릿에서 사전 구성 필요
속성 기반 선택 CEL 표현식으로 인스턴스 유형, 드라이버 버전 및 기타 속성으로 장치 필터링 미지원
토폴로지 인식 EFA 할당 DRA 네이티브 토폴로지 인식 자동 토폴로지 인식 (EKS 최적화 AL2023 AMI만)

Neuron DRA driver 설치

Neuron DRA driver는 Neuron 장치를 DeviceClass 이름 neuron.aws.com의 ResourceSlice 객체로 광고합니다. 드라이버는 DaemonSet으로 실행되며 Neuron 장치와 그 토폴로지 속성을 자동으로 발견합니다.

Neuron DRA driver에 대한 자세한 정보는 Neuron DRA 문서에서 확인할 수 있어요.

사전 조건

  • Karpenter, EKS 관리형 노드 그룹, 또는 자체 관리 노드 그룹으로 정적 용량이 프로비저닝된 Kubernetes 1.34 이상을 실행하는 Amazon EKS 클러스터.
  • AWS Trainium 또는 Inferentia2 인스턴스 유형의 노드.
  • 명령줄 환경에 Helm 설치. 자세한 내용은 Setup Helm 지침을 참고하세요.
  • 클러스터와 통신하도록 구성된 kubectl. 자세한 내용은 Install or update kubectl을 참고하세요.

절차

중요

Neuron device plugin이 실행 중인 노드에 Neuron DRA driver를 설치하지 마세요. 두 메커니즘은 같은 노드에 공존할 수 없습니다. 그렇게 하면 기본 장치가 같은 노드의 여러 Pod에 조용히 과다 예약될 수 있어요.

Helm을 사용해서 Neuron DRA driver를 설치합니다.

helm upgrade --install neuron-helm-chart oci://public.ecr.aws/neuron/neuron-helm-chart \
    --namespace neuron-dra-driver \
    --create-namespace \
    --set "devicePlugin.enabled=false" \
    --set "npd.enabled=false" \
    --set "draDriver.enabled=true"

드라이버는 기본적으로 neuron-dra-driver 네임스페이스에 DeviceClass neuron.aws.com과 함께 DaemonSet으로 배포됩니다.

DRA driver DaemonSet이 실행 중인지 확인합니다.

kubectl get ds -n neuron-dra-driver neuron-dra-driver-kubelet-plugin
NAME                              DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
neuron-dra-driver-kubelet-plugin  1         1         1       1            1                     60s

DeviceClass가 생성되었는지 확인합니다.

kubectl get deviceclass neuron.aws.com
NAME            AGE
neuron.aws.com  60s

노드에 ResourceSlice 객체가 광고되는지 확인합니다.

kubectl get resourceslice

사용 가능한 ResourceSlice 객체 속성에 대한 정보는 Neuron DRA 문서를 참고하세요.

Pod에서 Neuron 장치 요청

DRA driver를 사용해서 Neuron 장치를 요청하려면 neuron.aws.com DeviceClass를 참조하는 ResourceClaimTemplate을 만들고 Pod 사양에서 이를 참조합니다.

다음 예제는 trn2.48xlarge 인스턴스의 모든 Neuron 장치를 요청합니다.

apiVersion: resource.k8s.io/v1
kind: ResourceClaimTemplate
metadata:
  name: all-neurons
spec:
  spec:
    devices:
      requests:
      - name: neurons
        exactly:
          deviceClassName: neuron.aws.com
          selectors:
          - cel:
              expression: "device.attributes['neuron.aws.com'].instanceType == 'trn2.48xlarge'"
          allocationMode: All
---
apiVersion: v1
kind: Pod
metadata:
  name: neuron-workload
spec:
  containers:
  - name: app
    ...
    resources:
      claims:
      - name: neurons
  resourceClaims:
  - name: neurons
    resourceClaimTemplateName: all-neurons

연결된 장치 부분 집합 할당

Neuron DRA driver는 Neuron 스케줄러 확장 없이 연결된 Neuron 장치의 부분 집합을 할당할 수 있어요. 지원되는 부분 집합 크기는 1, 4, 8, 16개 장치입니다. 장치가 연결되도록 보장하려면 토폴로지 그룹 ID로 matchAttribute 제약을 사용하세요.

다음 예제는 4개의 연결된 Neuron 장치를 요청합니다.

apiVersion: resource.k8s.io/v1
kind: ResourceClaimTemplate
metadata:
  name: 1x4-connected-neurons
spec:
  spec:
    devices:
      requests:
      - name: neurons
        exactly:
          deviceClassName: neuron.aws.com
          allocationMode: ExactCount
          count: 4
          selectors:
          - cel:
              expression: "device.attributes['neuron.aws.com'].instanceType == 'trn2.48xlarge'"
      constraints:
      - requests: ["neurons"]
        matchAttribute: "resource.aws.com/devicegroup4_id"

연결된 부분 집합에 대해 지원되는 matchAttribute 값은 resource.aws.com/devicegroup1_id, resource.aws.com/devicegroup4_id, resource.aws.com/devicegroup8_id, resource.aws.com/devicegroup16_id입니다. devicegroup 속성 이름의 숫자는 연결된 토폴로지 그룹의 Neuron 장치 수에 해당합니다. 예를 들어 resource.aws.com/devicegroup1_id는 단일 Neuron 장치를, resource.aws.com/devicegroup4_id는 4개의 연결된 장치 그룹을, resource.aws.com/devicegroup8_id와 resource.aws.com/devicegroup16_id는 각각 8개와 16개의 연결된 장치 그룹을 식별해요. 할당된 장치가 같은 연결된 토폴로지 그룹에 속하도록 요청의 장치 count와 일치하는 matchAttribute를 선택하세요. 이 속성들에 대한 자세한 내용은 Neuron DRA driver 문서를 참고하세요.

Logical NeuronCores (LNC) 구성

Neuron DRA driver는 ResourceClaimTemplate 파라미터를 통해 워크로드별 Logical NeuronCore 구성을 허용합니다. 이는 EC2 Launch Templates에서 LNC를 사전 구성할 필요를 없애 줍니다.

다음 예제는 LNC를 1로 설정한 모든 Neuron 장치를 요청합니다.

apiVersion: resource.k8s.io/v1
kind: ResourceClaimTemplate
metadata:
  name: all-neurons-lnc-1
spec:
  spec:
    devices:
      requests:
      - name: neurons
        exactly:
          deviceClassName: neuron.aws.com
          selectors:
          - cel:
              expression: "device.attributes['neuron.aws.com'].instanceType == 'trn2.48xlarge'"
          allocationMode: All
      config:
      - requests: ["neurons"]
        opaque:
          driver: neuron.aws.com
          parameters:
            apiVersion: neuron.aws.com/v1
            kind: NeuronConfig
            logicalNeuronCore: 1

정렬된 EFA 인터페이스로 Neuron 장치 할당

Topology-aware EFA and GPU/Neuron device allocation을 참고하세요.

Neuron Kubernetes device plugin 설치

Neuron Kubernetes device plugin은 Neuron 장치를 aws.amazon.com/neuron 확장 리소스로, NeuronCore를 aws.amazon.com/neuroncore 확장 리소스로 광고합니다. 컨테이너 리소스 요청과 한도에서 Neuron 장치를 요청해요.

사전 조건

  • Amazon EKS 클러스터.
  • AWS Trainium 또는 AWS Inferentia 인스턴스용 호스트 수준 구성 요소가 설치된 노드. EKS AL2023 가속 AMI나 EKS Bottlerocket AMI를 사용하면 포함되어 있어요.
  • 명령줄 환경에 Helm 설치. 자세한 내용은 Setup Helm 지침을 참고하세요.
  • 클러스터와 통신하도록 구성된 kubectl. 자세한 내용은 Install or update kubectl을 참고하세요.

절차

Helm을 사용해서 Neuron Kubernetes device plugin을 설치합니다.

helm upgrade --install neuron-helm-chart oci://public.ecr.aws/neuron/neuron-helm-chart \
    --set "npd.enabled=false"

Neuron device plugin DaemonSet이 실행 중인지 확인합니다.

kubectl get ds -n kube-system neuron-device-plugin
NAME                   DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
neuron-device-plugin   1         1         1       1            1                     60s

노드에 할당 가능한 Neuron 장치가 있는지 확인합니다.

kubectl get nodes "-o=custom-columns=NAME:.metadata.name,NeuronDevice:.status.allocatable.aws\.amazon\.com/neuron,NeuronCore:.status.allocatable.aws\.amazon\.com/neuroncore"
NAME                                           NeuronDevice   NeuronCore
ip-192-168-47-173.us-west-2.compute.internal   1              2

테스트 Pod로 Neuron 장치 확인

테스트 Pod에서 neuron-ls 도구를 실행해서 Neuron 장치에 접근할 수 있는지 확인할 수 있어요.

다음 내용으로 neuron-ls.yaml 파일을 만듭니다. 이 매니페스트는 neuron-ls 도구가 설치된 Neuron Monitor 컨테이너를 시작합니다.

apiVersion: v1
kind: Pod
metadata:
  name: neuron-ls
spec:
  restartPolicy: Never
  containers:
  - name: neuron-container
    image: public.ecr.aws/g4h4h0b5/neuron-monitor:1.0.0
    command: ["/bin/sh"]
    args: ["-c", "neuron-ls"]
    resources:
      limits:
        aws.amazon.com/neuron: 1
      requests:
        aws.amazon.com/neuron: 1
  tolerations:
  - key: "aws.amazon.com/neuron"
    operator: "Exists"
    effect: "NoSchedule"

매니페스트를 적용합니다.

kubectl apply -f neuron-ls.yaml

Pod 실행이 끝나면 그 로그를 확인합니다.

kubectl logs neuron-ls

예제 출력은 다음과 같습니다.

instance-type: inf2.xlarge
instance-id: ...
+--------+--------+--------+---------+
| NEURON | NEURON | NEURON |   PCI   |
| DEVICE | CORES  | MEMORY |   BDF   |
+--------+--------+--------+---------+
| 0      | 2      | 32 GB  | 00:1f.0 |
+--------+--------+--------+---------+

참고

Neuron device plugin을 사용할 때 여러 Neuron 장치가 있는 인스턴스(trn2.48xlarge 같은)에서 연속 장치 할당은 Neuron Kubernetes 스케줄러 확장이 필요해요. Neuron DRA driver는 토폴로지 제약을 통해 이를 자동으로 처리합니다.

Amazon EKS에서 Neuron 장치를 사용하는 방법에 대한 자세한 내용은 EKS에서 실행하기 위한 Neuron 문서를 참고하세요.

더 알아보기 (Learn more)

출처: 문서