사전 학습된 모델 컴파일
AWS Inferentia를 활용하려는 모델은 AWS Neuron SDK를 사용하여 AWS Inferentia용으로 컴파일되어야 합니다.
다음은 Inferentia를 사용하도록 모델을 컴파일하는 코드입니다:
import torch
import numpy as np
import os
import torch_neuronx
from torchvision import models
image = torch.zeros([1, 3, 224, 224], dtype=torch.float32)
## Load a pretrained ResNet50 model
model = models.resnet50(pretrained=True)
## Tell the model we are using it for evaluation (not training)
model.eval()
model_neuron = torch_neuronx.trace(model, image)
## Export to saved model
model_neuron.save("resnet50_neuron.pt")
이 코드는 사전 학습된 ResNet-50 모델을 로드하고 평가 모드로 설정합니다. 모델에 추가 학습 데이터를 추가하지 않는다는 점에 유의하세요. 그런 다음 AWS Neuron SDK를 사용하여 모델을 저장합니다.
EKS 클러스터에 Pod를 배포하고 AWS Inferentia용 샘플 모델을 컴파일하겠습니다. AWS Inferentia용 모델을 컴파일하려면 AWS Neuron SDK가 필요합니다. 이 SDK는 AWS에서 제공하는 Deep Learning Containers (DLCs)에 포함되어 있습니다.
Device Plugin 설치
DLC가 Neuron 코어를 사용하려면 이를 노출해야 합니다. Neuron device plugin Kubernetes 매니페스트 파일은 Neuron 코어를 DLC에 노출합니다. 이러한 매니페스트 파일은 EKS 클러스터에 사전 설치되어 있습니다.
Pod가 노출된 Neuron 코어가 필요한 경우, Kubernetes 스케줄러는 Pod를 스케줄링할 Inferentia 또는 Trainium 노드를 프로비저닝할 수 있습니다.
실행할 이미지를 확인합니다:
트레이닝용 Pod 생성
EKS의 Pod에서 이 코드를 실행하겠습니다. 다음은 Pod를 실행하기 위한 매니페스트 파일입니다:
apiVersion: v1
kind: Pod
metadata:
labels:
role: compiler
name: compiler
namespace: aiml
spec:
nodeSelector:
node.kubernetes.io/instance-type: trn1.2xlarge
containers:
- command:
- sh
- -c
- sleep infinity
image: ${AIML_DL_TRN_IMAGE}
name: compiler
resources:
limits:
aws.amazon.com/neuron: 1
serviceAccountName: inference
nodeSelector 섹션에서 이 Pod를 실행할 인스턴스 타입을 지정합니다. 이 경우 trn1 인스턴스입니다.
resources limits 섹션에서 이 Pod를 실행하는 데 neuron 코어가 필요함을 지정합니다. 이는 Neuron Device Plugin에 neuron API를 Pod에 노출하도록 지시합니다.
다음 명령을 실행하여 Pod를 생성합니다:
Karpenter는 trn1 인스턴스와 Neuron 코어가 필요한 대기 중인 Pod를 감지하고 요구 사항을 충족하는 trn1 인스턴스를 시작합니다. 다음 명령으로 인스턴스 프로비저닝을 모니터링합니다:
{"level": "INFO",
"time": "2024-09-19T18:44:08.919Z",
"logger": "controller",
"message": "launched nodeclaim",
"commit": "6e9d95f",
"controller": "nodeclaim.lifecycle",
"controllerGroup": "karpenter.sh",
"controllerKind": "NodeClaim",
"NodeClaim": {"name": "aiml-hp9wm"
},
"namespace": "",
"name": "aiml-hp9wm",
"reconcileID": "b38f0b3c-f146-4544-8ddc-ca73574c97f0",
"provider-id": "aws:///us-west-2b/i-06bc9a7cb6f92887c",
"instance-type": "trn1.2xlarge",
"zone": "us-west-2b",
"capacity-type": "on-demand",
"allocatable": {"aws.amazon.com/neuron": "1",
"cpu": "7910m",
"ephemeral-storage": "89Gi",
"memory": "29317Mi",
"pods": "58",
"vpc.amazonaws.com/pod-eni": "17"
}
}
Pod는 Karpenter가 프로비저닝한 노드에 스케줄되어야 합니다. Pod가 준비 상태인지 확인합니다:
이 명령은 최대 10분이 소요될 수 있습니다.
다음으로, 모델을 컴파일하기 위한 코드를 Pod에 복사하고 실행합니다:
....
Downloading: "https://download.pytorch.org/models/resnet50-0676ba61.pth" to /root/.cache/torch/hub/checkpoints/resnet50-0676ba61.pth
100%|-------| 97.8M/97.8M [00:00<00:00, 165MB/s]
.
Compiler status PASS
마지막으로, 모델을 생성된 S3 버킷에 업로드합니다. 이렇게 하면 나중에 랩에서 모델을 사용할 수 있습니다.
upload: ./resnet50_neuron.pt to s3://eksworkshop-inference20230511204343601500000001/resnet50_neuron.pt