

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Amazon SageMaker HyperPod에서 GPU 파티션 설정
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup"></a>

**Topics**
+ [사전 조건](#sagemaker-hyperpod-eks-gpu-partitioning-setup-prerequisites)
+ [MIG 구성을 사용하여 클러스터 생성](#sagemaker-hyperpod-eks-gpu-partitioning-setup-create-cluster)
+ [기존 클러스터에 GPU 연산자 추가](#sagemaker-hyperpod-eks-gpu-partitioning-setup-add-operator)
+ [MIG 구성 업데이트](#sagemaker-hyperpod-eks-gpu-partitioning-setup-update)
+ [MIG 구성 확인](#sagemaker-hyperpod-eks-gpu-partitioning-setup-verify)
+ [MIG 구성 디버깅을 위한 공통 명령](#sagemaker-hyperpod-eks-gpu-partitioning-setup-debug-commands)
+ [SageMaker AI 콘솔 사용](#sagemaker-hyperpod-eks-gpu-partitioning-setup-console)

## 사전 조건
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup-prerequisites"></a>
+ 지원되는 GPU 인스턴스가 있는 HyperPod Amazon EKS 클러스터
+ NVIDIA GPU Operator 설치됨
+ 클러스터 관리를 위한 적절한 IAM 권한

## MIG 구성을 사용하여 클러스터 생성
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup-create-cluster"></a>

### 사용 AWS CLI
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup-create-cluster-cli"></a>

```
aws sagemaker create-cluster \
  --cluster-name my-mig-cluster \
  --orchestrator 'Eks={ClusterArn=arn:aws:eks:region:account:cluster/cluster-name}' \
  --instance-groups '{
    "InstanceGroupName": "gpu-group",
    "InstanceType": "ml.p4d.24xlarge",
    "InstanceCount": 1,
    "LifeCycleConfig": {
       "SourceS3Uri": "s3://my-bucket",
       "OnCreate": "on_create_script.sh"
    },
    "KubernetesConfig": {
       "Labels": {
          "nvidia.com/mig.config": "all-1g.5gb"
       }
    },
    "ExecutionRole": "arn:aws:iam::account:role/execution-role",
    "ThreadsPerCore": 1
  }' \
  --vpc-config '{
     "SecurityGroupIds": ["sg-12345"],
     "Subnets": ["subnet-12345"]
  }' \
  --node-provisioning-mode Continuous
```

### 사용 CloudFormation
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup-create-cluster-cfn"></a>

```
{
  "ClusterName": "my-mig-cluster",
  "InstanceGroups": [
    {
      "InstanceGroupName": "gpu-group",
      "InstanceType": "ml.p4d.24xlarge",
      "InstanceCount": 1,
      "KubernetesConfig": {
        "Labels": {
          "nvidia.com/mig.config": "all-2g.10gb"
        }
      },
      "ExecutionRole": "arn:aws:iam::account:role/execution-role"
    }
  ],
  "Orchestrator": {
    "Eks": {
      "ClusterArn": "arn:aws:eks:region:account:cluster/cluster-name"
    }
  },
  "NodeProvisioningMode": "Continuous"
}
```

## 기존 클러스터에 GPU 연산자 추가
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup-add-operator"></a>

### GPU 연산자 설치
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup-add-operator-install"></a>

를 클러스터 리전(예: us-east-1, us-west-2)`{$AWS_REGION}`으로 바꿉니다.

```
helm install gpuo helm_chart/HyperPodHelmChart/charts/gpu-operator \
-f helm_chart/HyperPodHelmChart/charts/gpu-operator/regional-values/values-{$AWS_REGION}.yaml \
-n kube-system
```

### 설치 확인(2\$13분 대기)
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup-add-operator-verify"></a>

모든 GPU 운영자 포드가 실행 중인지 확인합니다.

```
kubectl get pods -n kube-system | grep -E "(gpu-operator|nvidia-)"
```

**예상 포드:**
+ gpu-operator-\$1 - 인스턴스 1개(클러스터 컨트롤러)
+ nvidia-device-plugin-daemonset-\$1 - GPU 노드당 1개(모든 GPU 인스턴스)
+ nvidia-mig-manager-\$1 - MIG 지원 노드당 1개(A100/H100)

### 이전 디바이스 플러그인 제거
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup-add-operator-remove"></a>

기존 nvidia-device-plugin을 비활성화합니다.

```
helm upgrade dependencies helm_chart/HyperPodHelmChart \
--set nvidia-device-plugin.devicePlugin.enabled=false \
-n kube-system
```

### GPU 리소스 확인
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup-add-operator-verify-gpu"></a>

노드에 GPU 용량이 표시되는지 확인합니다. nvidia.com/gpu: 8(또는 실제 GPU 수)이 표시되어야 합니다.

```
kubectl describe nodes | grep "nvidia.com/gpu"
```

## MIG 구성 업데이트
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup-update"></a>

**MIG 업데이트 전에 노드 준비**  
인스턴스 그룹에서 MIG 구성을 업데이트하기 전에 워크로드 중단을 방지하기 위해 노드를 준비해야 합니다. 다음 단계에 따라 재구성할 노드에서 워크로드를 안전하게 드레이닝합니다.

### 1단계: 인스턴스 그룹의 노드 식별
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup-update-identify"></a>

먼저 업데이트하려는 인스턴스 그룹에 속하는 모든 노드를 식별합니다.

```
# List all nodes in the instance group
kubectl get nodes -l sagemaker.amazonaws.com/instance-group-name=INSTANCE_GROUP_NAME

# Example:
kubectl get nodes -l sagemaker.amazonaws.com/instance-group-name=p4d-group
```

이 명령은 지정된 인스턴스 그룹의 모든 노드 목록을 반환합니다. 다음 단계의 각 노드 이름을 기록해 둡니다.

### 2단계: 각 노드의 코드 및 드레이닝
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup-update-drain"></a>

1단계에서 식별된 각 노드에 대해 다음 작업을 수행합니다.

#### 노드 코드
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup-update-drain-cordon"></a>

코딩은 노드에서 새 포드가 예약되지 않도록 합니다.

```
# Cordon a single node
kubectl cordon NODE_NAME

# Example:
kubectl cordon hyperpod-i-014a41a7001adca60
```

#### 노드에서 워크로드 포드 드레이닝
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup-update-drain-evict"></a>

시스템 포드를 유지하면서 노드를 드레이닝하여 모든 워크로드 포드를 제거합니다.

```
# Drain the node (ignore DaemonSets and evict pods)
kubectl drain NODE_NAME \
  --ignore-daemonsets \
  --delete-emptydir-data \
  --force \
  --grace-period=300

# Example:
kubectl drain hyperpod-i-014a41a7001adca60 \
  --ignore-daemonsets \
  --delete-emptydir-data \
  --force \
  --grace-period=300
```

**명령 옵션 설명:**
+ `--ignore-daemonsets` - DaemonSet 포드가 있더라도 드레이닝 작업을 진행할 수 있습니다.
+ `--delete-emptydir-data` - emptyDir 볼륨을 사용하여 포드를 삭제합니다(드레이닝이 성공하는 데 필요).
+ `--force` - 컨트롤러에서 관리하지 않는 포드를 강제로 삭제합니다(주의하여 사용).
+ `--grace-period=300` - 포드가 정상적으로 종료될 수 있도록 5분을 부여합니다.

**중요**  
드레이닝 작업은 포드 수와 종료 유예 기간에 따라 몇 분 정도 걸릴 수 있습니다.
`kube-system`, , , , , , , , `cert-manager``kubeflow``hyperpod-inference-system``kube-public``mpi-operator``gpu-operator`, `aws-hyperpod`, `jupyter-k8s-system`, `kueue-system`및 네임스페이스의 시스템 포드는 계속 실행됩니다`hyperpod-observability`. `keda` 
DaemonSet 포드는 노드에 남아 있습니다(설계상 무시됨).

### 3단계: 실행 중인 워크로드 포드가 없는지 확인
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup-update-verify"></a>

드레이닝 후 노드에 워크로드 포드가 남아 있지 않은지 확인합니다(시스템 네임스페이스 제외).

```
# Check for any remaining pods outside system namespaces
kubectl get pods --all-namespaces --field-selector spec.nodeName=NODE_NAME \
  | grep -v "kube-system" \
  | grep -v "cert-manager" \
  | grep -v "kubeflow" \
  | grep -v "hyperpod-inference-system" \
  | grep -v "kube-public" \
  | grep -v "mpi-operator" \
  | grep -v "gpu-operator" \
  | grep -v "aws-hyperpod" \
  | grep -v "jupyter-k8s-system" \
  | grep -v "hyperpod-observability" \
  | grep -v "kueue-system" \
  | grep -v "keda"

# Example:
kubectl get pods --all-namespaces --field-selector spec.nodeName=hyperpod-i-014a41a7001adca60 \
  | grep -v "kube-system" \
  | grep -v "cert-manager" \
  | grep -v "kubeflow" \
  | grep -v "hyperpod-inference-system" \
  | grep -v "kube-public" \
  | grep -v "mpi-operator" \
  | grep -v "gpu-operator" \
  | grep -v "aws-hyperpod" \
  | grep -v "jupyter-k8s-system" \
  | grep -v "hyperpod-observability" \
  | grep -v "kueue-system" \
  | grep -v "keda"
```

**예상 출력:** 노드가 제대로 드레이닝된 경우이 명령은 결과를 반환하지 않아야 합니다(또는 헤더 행만 표시). 아직 실행 중인 포드가 있는 경우 제거되지 않은 이유를 조사하고 필요한 경우 수동으로 삭제합니다.

### 4단계: 노드 준비 상태 확인
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup-update-readiness"></a>

MIG 업데이트를 진행하기 전에 모든 노드가 연결되었는지 확인합니다.

```
# Check node status - should show "SchedulingDisabled"
kubectl get nodes -l sagemaker.amazonaws.com/instance-group-name=INSTANCE_GROUP_NAME
```

노드는 STATUS 열`SchedulingDisabled`에 표시되어야 하며, 이는 노드가 연결되고 MIG 업데이트 준비가 되었음을 나타냅니다.

### 기존 클러스터에서 MIG 프로파일 업데이트
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup-update-change"></a>

기존 클러스터에서 MIG 프로파일을 변경할 수 있습니다.

```
aws sagemaker update-cluster \
  --cluster-name my-mig-cluster \
  --instance-groups '{
    "InstanceGroupName": "gpu-group",
    "InstanceType": "ml.p4d.24xlarge",
    "InstanceCount": 1,
    "KubernetesConfig": {
       "Labels": {
          "nvidia.com/mig.config": "all-3g.20gb"
       }
    },
    "ExecutionRole": "arn:aws:iam::account:role/execution-role"
  }'
```

**참고**  
노드에서 작업이 이미 실행 중인 경우 MIG 파티셔닝이 실패합니다. MIG 파티셔닝을 다시 시도하기 전에 노드를 비우는 오류 메시지가 표시됩니다.

## MIG 구성 확인
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup-verify"></a>

클러스터 생성 또는 업데이트 후 MIG 구성을 확인합니다.

```
# Update kubeconfig
aws eks update-kubeconfig --name your-eks-cluster --region us-east-2

# Check MIG labels
kubectl get node NODE_NAME -o=jsonpath='{.metadata.labels}' | grep mig

# Check available MIG resources
kubectl describe node NODE_NAME | grep -A 10 "Allocatable:"
```

## MIG 구성 디버깅을 위한 공통 명령
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup-debug-commands"></a>

다음 명령을 사용하여 클러스터의 MIG 구성 문제를 해결하고 검증합니다.

```
# Check GPU Operator status
kubectl get pods -n gpu-operator-resources

# View MIG configuration
kubectl exec -n gpu-operator-resources nvidia-driver-XXXXX -- nvidia-smi mig -lgi

# Check device plugin configuration
kubectl logs -n gpu-operator-resources nvidia-device-plugin-XXXXX

# Monitor node events
kubectl get events --field-selector involvedObject.name=NODE_NAME
```

**참고**  
`nvidia-driver-XXXXX` 및 `nvidia-device-plugin-XXXXX`를 클러스터의 실제 포드 이름으로 바꾸고 `NODE_NAME`를 노드 이름으로 바꿉니다.

## SageMaker AI 콘솔 사용
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup-console"></a>

### MIG를 사용하여 새 클러스터 생성
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup-console-create"></a>

1. **Amazon SageMaker AI** > **HyperPod 클러스터** > **클러스터 관리** > ** HyperPod 클러스터 생성**으로 이동합니다.

1. **EKS에서 오케스트레이션 선택**

1. **사용자 지정 설정을** 선택하고 **GPU 연산자가** 기본적으로 활성화되어 있는지 확인합니다.

1. **인스턴스 그룹** 섹션에서 **그룹 추가**를 클릭합니다.

1. 인스턴스 그룹을 구성하고 **고급 구성**으로 이동하여 **GPU 파티션 사용** 토글을 활성화하고 드롭다운에서 원하는 **MIG 구성을** 선택합니다.

1. **인스턴스 그룹 추가**를 클릭하고 나머지 클러스터 구성을 완료합니다.

1. **제출**을 클릭하여 클러스터를 생성합니다.

### 기존 클러스터에서 MIG 구성 업데이트
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup-console-update"></a>

1. **Amazon SageMaker AI** > **HyperPod 클러스터** > **클러스터 관리**로 이동합니다.

1. 기존 클러스터를 선택하고 수정하려는 인스턴스 그룹에서 **편집**을 클릭합니다.

1. **고급 구성**에서 아직 활성화되지 않은 경우 **GPU 파티션 사용을** 전환하고 드롭다운에서 다른 **MIG 구성을** 선택합니다.

1. **변경 사항 저장**을 클릭합니다.