Go to file
selee f62425843b Update integration config for InfiniBand GPU environment
- Add IB CNI annotation (hostdevice-net), /dev/shm, /dev/infiniband mounts
- Add nvidia.com/hostdev: 2 resource for IB NICs
- Add privileged securityContext with IPC_LOCK for NCCL
- Add NCCL env vars (NCCL_DEBUG, NCCL_IB_DISABLE=0, NCCL_SOCKET_IFNAME)
- Set image to nvcr.io/nvidia/pytorch:24.10-py3
- Set numNodes: 2 for multi-node distributed training

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 15:57:03 +09:00
charts Initial setup: Volcano + Kubeflow Trainer installation environment 2026-02-09 15:21:10 +09:00
configs Update integration config for InfiniBand GPU environment 2026-02-10 15:57:03 +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 resource descriptions to README, set GPU to 8 per node 2026-02-10 15:44:49 +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대
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 가능)

TrainJob — 학습 작업 제출

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

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

설치 테스트는 numNodes: 1로 단일노드에서 진행합니다. 검증 완료 후 numNodes를 늘리면 멀티노드 분산학습이 됩니다.

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