
Notebook에서는 GPU를 최대 8개까지만 한 번에 붙일 수 있고,
그보다 크게 여러 GPU 노드(서버 여러 대)를 써서 학습하려면 PyTorchJob 방식으로 분산학습을 해야 한다는 뜻입니다.
아래처럼 이해하시면 가장 쉽습니다.
1. 먼저 개념부터 이해하기
1) Notebook 방식
- 한 대의 머신 안에서 작업하는 방식입니다.
- GPU를 여러 장 붙일 수는 있지만, 기본적으로 한 노드 안에서만 쓰는 개념에 가깝습니다.
- 질문에서처럼 Notebook에 할당 가능한 GPU는 총 8개입니다.
2) PyTorchJob 방식
- 여러 대의 GPU 서버를 묶어서 학습하는 방식입니다.
- 예를 들어:
- 서버 1대에 GPU 8개
- 서버 2대에 GPU 8개
이렇게 총 16개 GPU를 써서 분산학습할 수 있습니다.
- Ncloud 가이드에서도 단일 노드 학습은 Job, 분산 노드 학습은 PyTorchJob 사용을 권장합니다.
즉,
- GPU 1~8개 / 한 서버 안에서 학습 → Notebook 또는 Job
- 서버 2대 이상 / 여러 노드 분산학습 → PyTorchJob
이렇게 보시면 됩니다.
2. PyTorchJob이 왜 필요한가
PyTorchJob은 분산학습할 때 귀찮은 걸 자동으로 해줍니다.
가이드 기준으로 PyTorchJob은 다음을 자동 처리합니다.
- Worker Pod 생성
- 분산학습에 필요한 환경변수 자동 설정
- WORLD_SIZE
- RANK
- MASTER_ADDR
- Pod끼리 통신하도록 Kubernetes Service 자동 생성
- torchrun에 필요한 값들도 elasticPolicy로 넣을 수 있음
초보자 입장에서는 이렇게 이해하면 됩니다.
“내가 서버 여러 대에 직접 접속해서 rank, master 주소, worker 수를 하나하나 맞출 필요 없이
PyTorchJob이 분산학습용 틀을 자동으로 만들어준다.”
3. 분산학습에서 자주 나오는 말 쉽게 설명
1) 노드(node)
GPU 서버 1대를 말합니다.
예:
- node 1 = GPU 서버 1대
- node 2 = GPU 서버 1대
2) GPU 개수
서버 한 대 안에 들어있는 GPU 수입니다.
예:
- 1노드당 GPU 8개
3) Worker
실제로 학습을 수행하는 작업 단위입니다.
4) torchrun
PyTorch 분산학습을 실행하는 표준 실행기입니다.
Ncloud 가이드도 PyTorch 분산학습에는 torchrun 사용을 권장합니다.
4. 초보자 기준 전체 흐름
순서대로 보면 어렵지 않습니다.
1단계. 학습 코드 준비
먼저 PyTorch 학습 코드가 있어야 합니다.
예:
- train.py
- 데이터 읽기
- 모델 생성
- 학습 루프 실행
중요한 점은 이 코드가 분산학습을 지원하도록 작성되어 있어야 한다는 점입니다.
2단계. Docker 이미지 준비
학습 코드를 컨테이너 이미지로 만들어야 합니다.
쉽게 말하면:
- Python
- PyTorch
- CUDA
- 내 학습 코드
를 한 덩어리 이미지로 묶는 겁니다.
가이드 예시도 image: examples.com/pytorch-mnist-dist:23.03-py3처럼 컨테이너 이미지를 사용합니다.
3단계. PyTorchJob YAML 작성
이게 핵심입니다.
YAML 파일에 다음을 적습니다.
- 작업 이름
- 몇 개 노드를 쓸지
- 노드당 GPU 몇 개 쓸지
- 어떤 이미지로 실행할지
- 실행 명령어가 무엇인지
가이드에서 예시로 kind: PyTorchJob 리소스를 작성해서 kubectl apply -f pytorchjob.yaml로 실행합니다.
4단계. torchrun으로 실행
PyTorchJob 안에서 실제 학습은 보통 torchrun으로 시작합니다.
가이드 예시도 이런 형태입니다.
- --nnodes : 전체 노드 수
- --nproc_per_node : 노드당 GPU 수
- --rdzv_id, --rdzv_backend, --rdzv_endpoint : 워커들끼리 만나는 정보
초보자용으로 바꾸면:
- 서버 몇 대 쓸지
- 서버당 GPU 몇 장 쓸지
- 서로 어디로 통신할지
를 torchrun이 받아서 분산학습을 시작하는 구조입니다.
5단계. kubectl로 제출
작성한 YAML을 아래처럼 실행합니다.
그러면 Kubernetes가 Worker Pod들을 띄우고 학습을 시작합니다.
6단계. 상태 확인
실행 후에는 상태를 봐야 합니다.
가이드에서도 아래 명령으로 상태 확인하라고 안내합니다.
kubectl describe pytorchjob <job-name>
이걸로 확인 가능한 것:
- Running 인지
- Succeeded 인지
- 실패했는지
- 어떤 에러로 Pod 생성이 안 됐는지
5. 초보자가 가장 쉽게 기억해야 할 구조
예를 들어 이렇게 생각하시면 됩니다.
예시 목표
- GPU 서버 2대 사용
- 각 서버에 GPU 8개 사용
- 총 16개 GPU 분산학습
그럼 개념상 이렇게 됩니다.
- replicas: 2
- Worker 2개 = 서버 2대
- nProcPerNode: 8
- 서버 1대당 GPU 8개 사용
- torchrun --nnodes 2 --nproc_per_node 8
- 총 2노드 × 8GPU
이 구조입니다.
가이드의 elasticPolicy가 이런 값을 환경변수로 넣어주는 역할을 합니다.
6. 꼭 지켜야 하는 중요한 설정 2개
이건 초보자도 꼭 알아야 합니다.
1) 컨테이너 이름은 반드시 pytorch
가이드에 따르면 학습용 컨테이너 이름은 반드시 pytorch여야 합니다.
다른 이름이면 PyTorchJob 동작이 꼬일 수 있습니다.
2) Istio sidecar 주입 비활성화
가이드에 따르면 아래 annotation이 필요합니다.
이걸 안 넣으면 노드 간 통신 오류, 예를 들어
RuntimeError: Connection reset by peer 같은 문제가 날 수 있다고 안내합니다.
초보자용으로 말하면:
분산학습 Pod끼리 통신해야 하는데,
옆에서 Istio 사이드카가 끼어들면 통신이 꼬일 수 있으니 꺼두라는 뜻입니다.
7. 가장 쉬운 PyTorchJob 예시 구조
아래는 이해용 초간단 예시입니다.
kind: PyTorchJob
metadata:
name: my-train
namespace: p-프로젝트명
spec:
runPolicy:
cleanPodPolicy: None
ttlSecondsAfterFinished: 86400
elasticPolicy:
rdzvId: my-train
rdzvBackend: c10d
minReplicas: 2
maxReplicas: 2
nProcPerNode: 8
pytorchReplicaSpecs:
Worker:
replicas: 2
restartPolicy: OnFailure
template:
metadata:
annotations:
sidecar.istio.io/inject: "false"
spec:
containers:
- name: pytorch
image: 내학습이미지:latest
command: ["bash", "-c"]
args:
- >
torchrun
--nnodes ${PET_NNODES}
--nproc_per_node ${PET_NPROC_PER_NODE}
--rdzv_id ${PET_RDZV_ID}
--rdzv_backend ${PET_RDZV_BACKEND}
--rdzv_endpoint ${PET_RDZV_ENDPOINT}
/workspace/train.py
이 예시는 Ncloud 가이드 구조를 초보자용으로 단순화한 것입니다.
가이드에서도 elasticPolicy의 값들이 PET_NNODES, PET_NPROC_PER_NODE, PET_RDZV_ID, PET_RDZV_BACKEND, PET_RDZV_ENDPOINT 같은 환경변수로 연결된다고 설명합니다.
8. 각 항목을 초보자용으로 해석하면
replicas: 2
Worker를 2개 띄운다는 뜻입니다.
보통 노드 2대를 쓴다고 생각하시면 됩니다.
nProcPerNode: 8
한 Worker(한 노드)에서 GPU 프로세스 8개를 돌린다는 뜻입니다.
즉 노드당 GPU 8개 사용입니다.
rdzvBackend: c10d
분산학습에서 서로 만나는 방식입니다.
가이드 예시도 c10d를 사용합니다.
restartPolicy: OnFailure
실패하면 다시 시도하는 정책입니다.
ttlSecondsAfterFinished
학습 종료 후 얼마 뒤에 Job을 자동 삭제할지 정합니다.
가이드도 TTL을 직접 설정할 수 있다고 설명합니다.
9. 실제 실행 순서
아주 실무적으로 적으면 이 순서입니다.
1) 학습 코드 준비
train.py
2) Docker 이미지 빌드
예:
- PyTorch
- CUDA
- 학습 코드 포함
3) 이미지 레지스트리에 업로드
사설 레지스트리나 외부 Container Registry 사용 가능
필요하면 imagePullSecrets를 사용합니다. 가이드에도 외부 레지스트리 Secret 사용법이 있습니다.
4) YAML 작성
pytorchjob.yaml
5) Job 제출
6) 상태 확인
kubectl describe pytorchjob my-train
7) Pod 로그 확인
보통 Pod 이름 확인 후 kubectl logs로 봅니다.
10. 데이터와 체크포인트는 어디 저장하나
가이드에서는 기존 볼륨(PVC) 을 연결해서 사용할 수 있다고 안내합니다.
즉 데이터셋, 체크포인트, 로그를 볼륨에 붙여서 보관할 수 있습니다.
쉽게 말하면:
- 코드만 컨테이너 안에 넣고
- 데이터/결과물은 외부 볼륨에 저장
이 방식이 안전합니다.
11. 초보자가 자주 만나는 에러
1) GPU 할당 실패
예:
- quota 부족
- GPU 수 부족
- 요청한 리소스가 너무 큼
가이드에서도 kubectl describe pytorchjob의 Events에서
exceeded quota 같은 메시지로 원인을 볼 수 있다고 안내합니다.
2) 노드 간 통신 실패
원인 예:
- sidecar.istio.io/inject: "false" 누락
- NCCL 통신 문제
- 네트워크 문제
3) 이미지 pull 실패
원인 예:
- 이미지 경로 오타
- 레지스트리 인증 누락
4) 컨테이너 이름 오류
가이드 기준 컨테이너 이름이 pytorch가 아니면 안 됩니다.
12. 디버깅은 어떻게 하나
가이드에서는 디버깅용 환경변수도 안내합니다.
- NCCL_DEBUG=INFO
- TORCH_DISTRIBUTED_DEBUG=DETAIL
- TORCH_CPP_LOG_LEVEL=INFO
초보자용으로 해석하면:
- NCCL_DEBUG: GPU끼리 통신 로그
- TORCH_DISTRIBUTED_DEBUG: 분산학습 내부 동작 로그
- TORCH_CPP_LOG_LEVEL: PyTorch C++ 레벨 로그
분산학습이 안 붙을 때 아주 유용합니다.
13. InfiniBand 쓰는 경우
가이드에 따르면 InfiniBand 환경에서는 추가 설정이 필요합니다.
- InfiniBand zone 지정
- IPC_LOCK capability 추가
- rdma/hca_shared_devices_a 리소스 요청
- /dev/shm shared memory 설정
이건 초보자라면 처음부터 무리해서 넣기보다,
일단 일반 PyTorchJob으로 성공 → 이후 InfiniBand 최적화 순서가 좋습니다.
14. 진짜 초보자용 한 줄 요약
Notebook 학습
- 한 서버 안에서 GPU 최대 8개까지
- 간단한 실험용으로 좋음
PyTorchJob 학습
- 서버 여러 대 사용 가능
- 대규모 분산학습용
- torchrun + PyTorchJob YAML이 핵심
15. 초보자가 바로 따라할 추천 순서
- 먼저 단일 노드 Job으로 학습이 되는지 확인
- 그다음 PyTorchJob으로 2노드, 각 1GPU부터 테스트
- 성공하면 2노드, 각 8GPU처럼 늘리기
- 이후 볼륨 연결, 체크포인트 저장, 디버그 로그 추가
- 마지막에 InfiniBand 최적화 적용
이 순서가 가장 안전합니다.
가이드도 단일 노드 Job과 분산 노드 PyTorchJob을 구분해서 설명하고 있습니다.
16. 정말 쉽게 비유하면
- Notebook = 내 PC 한 대에서 작업
- PyTorchJob = 여러 작업자에게 같은 일을 나눠서 동시에 시키는 현장 반장 시스템
PyTorchJob이 하는 일은:
- 작업자 몇 명 쓸지 정하고
- 누가 0번인지 정하고
- 서로 연락할 주소를 만들어주고
- 실패 시 다시 띄워주는 것
이렇게 이해하시면 됩니다.
'[GPUaaS] > PyTorch' 카테고리의 다른 글
| PyTorch란 무엇인가? (0) | 2026.03.05 |
|---|
댓글