본문 바로가기
[GPUaaS]/TensorFlow

[GPU] Node Affinity + GPU 타입 분리 (A100 / H100)

by METAVERSE STORY 2026. 1. 26.
반응형

 

 

 

GPU 클러스터 운영의 핵심 중 핵심

👉 라벨링 → Affinity → TFJob 적용 → 운영 팁 순서


1️⃣ 왜 GPU 타입 분리가 필수냐?

문제 상황 (안 하면 생기는 일)

  • A100 / H100 혼재 노드
  • Worker 일부는 A100, 일부는 H100
  • ❌ NCCL 성능 저하
  • ❌ 학습 속도 불균형
  • ❌ 결과 재현성 깨짐

👉 분산 학습은 GPU “동질성”이 생명

 

 


2️⃣ GPU 노드 라벨링 (관리자의 1회 작업)

🔹 권장 라벨 설계

 
gpu.vendor=nvidia
gpu.model=A100
gpu.model=H100
gpu.mem=80gb
gpu.interconnect=nvlink
 
 
 

예시 (A100 노드) (임시용)

 
kubectl label node gpu-node-1 gpu.vendor=nvidia gpu.model=A100 gpu.mem=80gb

예시 (H100 노드) (임시용)

 
kubectl label node gpu-node-9 gpu.vendor=nvidia gpu.model=H100 gpu.mem=80gb
 
 
 

📌 이 라벨은 오토스케일링돼도 자동 상속되게 구성 (영구용)
(NCP / Managed K8s에서는 노드풀 라벨로 설정)

 

 

 


3️⃣ Node Affinity 기본 패턴 (GPU 타입 고정)

🎯 목표

“이 TFJob은 A100에서만 실행”


Affinity 필수 옵션

 
affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: gpu.model
          operator: In
          values:
          - A100
 
 
 
 

의미 해석

  • required → 다른 노드면 절대 스케줄 ❌
  • IgnoredDuringExecution → 실행 중 이동은 안 함

 

 

 


4️⃣ TFJob에 실제 적용 (A100 전용)

✅ Worker / Chief 동일하게 적용해야 함

 
template:
  spec:
    affinity:
      nodeAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
          - matchExpressions:
            - key: gpu.model
              operator: In
              values:
              - A100
 
 
 

 

 


5️⃣ H100 전용 TFJob 패턴

 
values:
- H100

👉 TFJob 단위로 GPU 타입 완전 분리

 

 

 


6️⃣ Soft Affinity (차선책 허용 전략)

“A100 우선, 없으면 H100”

 
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
  preference:
    matchExpressions:
    - key: gpu.model
      operator: In
      values:
      - A100
 
 
 

📌 연구용 / 테스트용에만 추천
운영 학습에는 ❌

 

 

 


7️⃣ GPU 타입 + 용도까지 분리하는 실전 설계

라벨 예시

 
gpu.model=A100
gpu.pool=train
gpu.pool=inference
 
 
 

Affinity

 
matchExpressions:
- key: gpu.model
  operator: In
  values: [A100]
- key: gpu.pool
  operator: In
  values: [train]
 
 
 

👉 학습/추론 완전 분리

 

 

 


8️⃣ (중요) GPU 타입 섞이면 왜 안 되냐 – 실무 이유

항목 문제
성능 AllReduce 지연
NCCL topology mismatch
TF_CONFIG worker sync 지연
재현성 step time 변동
비용 H100 낭비

 

 

 


9️⃣ TFJob 최종 예시 (A100 고정 + 안정성)

 

Worker:
  replicas: 4
  restartPolicy: OnFailure
  template:
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: gpu.model
                operator: In
                values:
                - A100
      containers:
      - name: trainer
        image: tensorflow/tensorflow:2.14.0-gpu
        command: ["python", "train.py"]
        resources:
          requests:
            nvidia.com/gpu: 1
          limits:
            nvidia.com/gpu: 1

 

 

 


10️⃣ 운영 체크 명령어

 
# 노드 라벨 확인
kubectl get nodes --show-labels | grep gpu.model

# 실제 배치 확인
kubectl get pod -n ml -o wide

# GPU 모델 확인
kubectl exec tf-mnist-train-worker-0 -- nvidia-smi -L
 
 
 
 

🔥 한 줄 결론

GPU 타입 분리는 선택이 아니라 필수이며,
Node Affinity는 분산 학습 안정성을 보장하는 “안전벨트”다.

 

 

 

반응형

댓글