Go to file
selee 146baa41e8 Add ConfigMap training script, update IB/NCCL config in README
- Add ConfigMap with train_nccl.py (VGG11 + CIFAR10 + NCCL)
- Runtime: mount training-scripts ConfigMap to /workspace/scripts
- Runtime: set command to python /workspace/scripts/train_nccl.py
- Runtime: remove /dev/infiniband hostPath (hostdevice-net CNI handles it)
- Runtime: add NCCL_DEBUG_SUBSYS=INIT,NET,IB
- Runtime: add cifar-10 dataset hostPath mount
- README: add NCCL_DEBUG_SUBSYS, cifar-data, MASTER_ADDR auto-config note

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 16:10:10 +09:00
charts Initial setup: Volcano + Kubeflow Trainer installation environment 2026-02-09 15:21:10 +09:00
configs Add ConfigMap training script, update IB/NCCL config in README 2026-02-10 16:10:10 +09:00
manifests/kubeflow-trainer/runtimes Initial setup: Volcano + Kubeflow Trainer installation environment 2026-02-09 15:21:10 +09:00
.gitignore Initial setup: Volcano + Kubeflow Trainer installation environment 2026-02-09 15:21:10 +09:00
README.md Add ConfigMap training script, update IB/NCCL config in README 2026-02-10 16:10:10 +09:00

README.md

Volcano + Kubeflow Trainer 설치 매뉴얼

멀티노드 GPU 분산 학습을 위한 Volcano Scheduler와 Kubeflow Trainer v2 설치 가이드.

환경 정보

항목
Kubernetes v1.34.3
Helm v4.0.4
GPU 노드 InfiniBand 연결 GPU 노드 3대 (노드당 GPU 8장, IB NIC 2개)
GPU 이미지 nvcr.io/nvidia/pytorch:24.10-py3
Volcano v1.14.0
Kubeflow Trainer sha-48e7a93
JobSet (의존성) v0.10.1

디렉토리 구조

kubeflow_trainer_with_volcano/
├── .env                                          # 환경변수 (git 제외)
├── .gitignore
├── README.md                                     # 이 문서
├── charts/
│   ├── volcano/
│   │   └── volcano-1.14.0.tgz                    # Volcano Helm chart
│   └── kubeflow-trainer-0.0.0-sha-48e7a93.tgz    # Kubeflow Trainer Helm chart
├── manifests/
│   └── kubeflow-trainer/
│       └── runtimes/
│           └── runtimes.yaml                     # ClusterTrainingRuntime manifests
└── configs/
    ├── volcano-values.yaml                       # Volcano 커스텀 values
    ├── kubeflow-trainer-values.yaml              # Kubeflow Trainer 커스텀 values
    └── volcano-trainjob-integration.yaml         # Volcano-Trainer 연동 설정 샘플

사전 요구사항

  • Kubernetes 클러스터 (v1.26+)
  • Helm v3 이상
  • kubectl 클러스터 접근 설정 완료
  • GPU 노드에 NVIDIA device plugin 설치 완료
  • InfiniBand 네트워크 구성 완료
  • 클러스터에 기존 Volcano/Kubeflow CRD가 없는 상태
  • 컨트롤 플레인 컴포넌트 배치용 노드에 nodegroup: nd 라벨 설정 완료
# 사전 확인
kubectl version
helm version
kubectl get nodes
kubectl get nodes -l nodegroup=nd   # 컨트롤 컴포넌트 배치 노드 확인
nvidia-smi                          # GPU 노드에서 확인
ibstat                              # InfiniBand 상태 확인

Task 2: Volcano 설치

Volcano는 Kubernetes를 위한 배치 스케줄링 시스템으로, gang scheduling을 통해 분산 학습 Pod들이 동시에 스케줄링되도록 보장합니다.

2.1 네임스페이스 생성

kubectl create namespace volcano-system

2.2 Helm으로 Volcano 설치 (로컬 chart 사용)

helm install volcano charts/volcano/volcano-1.14.0.tgz \
  -n volcano-system \
  -f configs/volcano-values.yaml \
  --wait --timeout 5m

주요 커스텀 설정 (configs/volcano-values.yaml):

  • scheduler_config_override: gang scheduling + binpack (GPU 노드 집약 배치) 활성화
  • default_ns: nodegroup: nd — Volcano 컴포넌트를 non-GPU 노드에 배치
  • API rate limits: 대규모 클러스터용 QPS/Burst 설정

2.3 설치 확인

# Pod 상태 확인 (모두 nodegroup=nd 노드에 배치되어야 함)
kubectl get pods -n volcano-system -o wide

# CRD 확인
kubectl get crd | grep volcano

2.4 Volcano 삭제 (필요시)

helm uninstall volcano -n volcano-system
kubectl delete namespace volcano-system

Task 3: Kubeflow Trainer 설치

Kubeflow Trainer v2는 TrainJob CRD를 통해 분산 학습 워크로드를 관리합니다.

3.1 네임스페이스 생성

kubectl create namespace kubeflow-trainer

3.2 Helm으로 Kubeflow Trainer 설치 (로컬 chart 사용)

helm install kubeflow-trainer charts/kubeflow-trainer-0.0.0-sha-48e7a93.tgz \
  -n kubeflow-trainer \
  -f configs/kubeflow-trainer-values.yaml \
  --wait --timeout 5m

주요 커스텀 설정 (configs/kubeflow-trainer-values.yaml):

  • manager.nodeSelector: nodegroup: nd — Trainer controller를 non-GPU 노드에 배치
  • jobset.controller.nodeSelector: nodegroup: nd — JobSet controller를 non-GPU 노드에 배치
  • jobset.install: true — JobSet을 함께 설치 (이미 설치되어 있으면 false로 변경)

3.3 ClusterTrainingRuntime 설치

kubectl apply -f manifests/kubeflow-trainer/runtimes/runtimes.yaml

3.4 설치 확인

# Trainer, JobSet controller 확인 (nodegroup=nd 노드에 배치되어야 함)
kubectl get pods -n kubeflow-trainer -o wide

# CRD 확인
kubectl get crd | grep trainer

# ClusterTrainingRuntime 확인
kubectl get clustertrainingruntimes

3.5 Kubeflow Trainer 삭제 (필요시)

kubectl delete -f manifests/kubeflow-trainer/runtimes/runtimes.yaml
helm uninstall kubeflow-trainer -n kubeflow-trainer
kubectl delete namespace kubeflow-trainer

Task 4: Volcano ↔ Kubeflow Trainer 연동 설정

Volcano 스케줄러를 Kubeflow TrainJob과 연동하여 gang scheduling, queue 기반 리소스 관리, topology-aware scheduling을 활성화합니다.

Reference: https://www.kubeflow.org/docs/components/trainer/gang-scheduling/volcano/

4.1 연동 리소스 개요

configs/volcano-trainjob-integration.yaml에 아래 3개 리소스가 정의되어 있습니다.

Queue — 리소스 풀

학습 워크로드가 사용할 수 있는 총 리소스 상한을 정의합니다. 한 번 생성하면 모든 TrainJob이 공유합니다.

옵션 설명
weight 여러 Queue 간 리소스 배분 비율 (Queue 1개면 무의미)
reclaimable 유휴 리소스를 다른 Queue에 빌려줄 수 있는지
capability 이 Queue의 최대 리소스 (클러스터 실제 용량에 맞게 조정)

ClusterTrainingRuntime — 학습 환경 템플릿

학습 Pod의 기본 설정을 정의합니다. 한 번 생성하면 여러 TrainJob이 재사용합니다.

옵션 설명
mlPolicy.torch.numProcPerNode 노드당 프로세스 수 (기본값, TrainJob에서 override 가능)
mlPolicy.numNodes 노드 수 (기본값, TrainJob에서 override 가능)
podGroupPolicy.volcano Volcano gang scheduling 활성화. PodGroup 자동 생성
podGroupPolicy.volcano.networkTopology topology-aware scheduling (InfiniBand 통신 최적화)
template.metadata.annotations Queue 지정 등. TrainJob level에서 override 가능
resources.requests/limits 노드당 GPU 기본 할당량 (TrainJob에서 override 가능)

현재 Runtime에 포함된 InfiniBand/NCCL 설정:

설정 설명
k8s.v1.cni.cncf.io/networks hostdevice-net InfiniBand CNI 네트워크 연결
nvidia.com/gpu 8 노드당 GPU 8장
nvidia.com/hostdev 2 노드당 IB NIC 2개
privileged + IPC_LOCK - NCCL IB 통신에 필요한 권한
NCCL_IB_DISABLE 0 InfiniBand 사용
NCCL_DEBUG_SUBSYS INIT,NET,IB NCCL 디버그 서브시스템
NCCL_SOCKET_IFNAME net NCCL 소켓 인터페이스
/dev/shm 128Gi NCCL 공유 메모리 (GPU 8장 기준)
cifar-data hostPath /home/ubuntu/cifar-10-batches-py 데이터셋 마운트

MASTER_ADDR / MASTER_PORT는 Kubeflow Trainer torch runtime이 torchrun rdzv로 자동 설정하므로 별도 지정 불필요.

TrainJob — 학습 작업 제출

실제 학습을 실행할 때마다 생성합니다. Runtime의 기본값을 상속받고, 필요한 부분만 override합니다.

옵션 설명
runtimeRef.name 사용할 ClusterTrainingRuntime 이름
trainer.image 학습 컨테이너 이미지
trainer.numNodes 학습에 사용할 노드 수 (Runtime 기본값 override)
trainer.numProcPerNode 노드당 프로세스 수 ("auto"면 GPU 수만큼 자동)
trainer.resourcesPerNode 노드당 리소스 (Runtime 기본값 override)

현재 기본 설정은 numNodes: 2 (2노드 멀티노드 분산학습). 단일노드 테스트 시 TrainJob에서 numNodes: 1로 override 가능.

4.2 연동 설정 적용

kubectl apply -f configs/volcano-trainjob-integration.yaml

4.3 연동 확인

# Queue 확인
kubectl get queue training-queue

# ClusterTrainingRuntime 확인
kubectl get clustertrainingruntimes torch-distributed-volcano

# 테스트 TrainJob 상태 확인
kubectl get trainjob

# PodGroup 자동 생성 확인
kubectl get podgroup

# Pod 스케줄러 확인 (schedulerName이 volcano인지)
kubectl get pods -l trainer.kubeflow.org/trainjob-name=<trainjob-name> \
  -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.schedulerName}{"\n"}{end}'

컴포넌트 배치 요약

모든 컨트롤 플레인 컴포넌트는 nodegroup: nd 노드에 배치됩니다. GPU 노드에는 학습 Pod만 배치됩니다.

컴포넌트 네임스페이스 배치 노드 GPU 필요
Volcano admission volcano-system nodegroup: nd X
Volcano controller volcano-system nodegroup: nd X
Volcano scheduler volcano-system nodegroup: nd X
Trainer controller kubeflow-trainer nodegroup: nd X
JobSet controller kubeflow-trainer nodegroup: nd X
TrainJob 학습 Pod default (사용자 지정) GPU 노드 (InfiniBand) O

검증 체크리스트

  • Volcano Pod 3개 Running (nodegroup=nd 노드에 배치 확인)
  • Volcano CRD 생성됨 (jobs, podgroups, queues 등)
  • Kubeflow Trainer controller Running (nodegroup=nd 노드에 배치 확인)
  • JobSet controller Running (nodegroup=nd 노드에 배치 확인)
  • Kubeflow Trainer CRD 생성됨 (trainjobs, trainingruntimes 등)
  • ClusterTrainingRuntime 목록 확인 (deepspeed-distributed, torch-distributed 등)
  • Training Queue 생성됨
  • 테스트 TrainJob 제출 시 PodGroup 자동 생성 확인
  • 테스트 TrainJob Pod가 Volcano 스케줄러로 스케줄링됨

트러블슈팅

Volcano 관련

Volcano admission webhook 타임아웃

kubectl get secret volcano-admission-secret -n volcano-system
kubectl logs -n volcano-system -l app=volcano-admission

Pod가 Pending 상태로 유지

# PodGroup 상태 확인 - minMember 충족 여부
kubectl describe podgroup <podgroup-name>
# Queue 리소스 capacity 확인
kubectl get queue training-queue -o yaml
# Volcano scheduler 로그 확인
kubectl logs -n volcano-system -l app=volcano-scheduler

Kubeflow Trainer 관련

TrainJob이 생성되지 않음

kubectl logs -n kubeflow-trainer -l app.kubernetes.io/name=kubeflow-trainer
kubectl describe trainjob <trainjob-name>

ClusterTrainingRuntime을 찾을 수 없음

kubectl get clustertrainingruntimes
kubectl apply -f manifests/kubeflow-trainer/runtimes/runtimes.yaml  # 재설치

연동 관련

PodGroup이 자동 생성되지 않음

  • ClusterTrainingRuntime에 podGroupPolicy.volcano: {} 가 설정되어 있는지 확인
  • TrainJob이 올바른 runtimeRef(torch-distributed-volcano)를 참조하는지 확인

TrainJob Pod가 default-scheduler로 스케줄링됨

  • podGroupPolicy.volcano가 runtime에 설정되어 있는지 확인
  • Volcano가 정상 동작 중인지 확인: kubectl get pods -n volcano-system

로그 수집

kubectl logs -n volcano-system -l app=volcano-scheduler --tail=100
kubectl logs -n volcano-system -l app=volcano-controller --tail=100
kubectl logs -n volcano-system -l app=volcano-admission --tail=100
kubectl logs -n kubeflow-trainer -l app.kubernetes.io/name=kubeflow-trainer --tail=100