반응형
☸️ Kubernetes + TensorFlow
“이 코드가 대체 어디서 어떻게 도는 건데?” 완전 정리
0️⃣ 전체 그림 먼저 (제일 중요)
[로컬 PC] (코드 작성)
↓ docker build
[컨테이너 이미지]
↓
[컨테이너 레지스트리]
↓
kubectl apply -f tfjob.yaml
↓
[Kubernetes]
├─ Chief Pod ──▶ python train.py ← 이 코드 실행됨
└─ Worker Pod ─▶ python train.py ← 똑같이 실행됨
↓ docker build
[컨테이너 이미지]
↓
[컨테이너 레지스트리]
↓
kubectl apply -f tfjob.yaml
↓
[Kubernetes]
├─ Chief Pod ──▶ python train.py ← 이 코드 실행됨
└─ Worker Pod ─▶ python train.py ← 똑같이 실행됨
👉 당신이 직접 실행하는 게 아님
👉 Kubernetes가 Pod 안에서 실행시킴
1️⃣ 이 코드는 “파일 하나”다
📄 파일명
보통 이렇게 씀:
train.py
📌 train.py 안에 들어가는 전체 코드 예시
# train.py
import tensorflow as tf
# 1️⃣ 분산 학습 전략 선언
strategy = tf.distribute.MultiWorkerMirroredStrategy()
# 2️⃣ 모델 정의는 반드시 scope 안에서
with strategy.scope():
model = tf.keras.Sequential([
tf.keras.layers.Dense(128, activation="relu"),
tf.keras.layers.Dense(10, activation="softmax")
])
model.compile(
optimizer="adam",
loss="sparse_categorical_crossentropy",
metrics=["accuracy"]
)
# 3️⃣ 데이터셋 (예제용)
dataset = tf.data.Dataset.from_tensor_slices(
(
tf.random.normal([1000, 32]),
tf.random.uniform([1000], maxval=10, dtype=tf.int32)
)
).batch(32)
# 4️⃣ 학습 시작
model.fit(dataset, epochs=10)
import tensorflow as tf
# 1️⃣ 분산 학습 전략 선언
strategy = tf.distribute.MultiWorkerMirroredStrategy()
# 2️⃣ 모델 정의는 반드시 scope 안에서
with strategy.scope():
model = tf.keras.Sequential([
tf.keras.layers.Dense(128, activation="relu"),
tf.keras.layers.Dense(10, activation="softmax")
])
model.compile(
optimizer="adam",
loss="sparse_categorical_crossentropy",
metrics=["accuracy"]
)
# 3️⃣ 데이터셋 (예제용)
dataset = tf.data.Dataset.from_tensor_slices(
(
tf.random.normal([1000, 32]),
tf.random.uniform([1000], maxval=10, dtype=tf.int32)
)
).batch(32)
# 4️⃣ 학습 시작
model.fit(dataset, epochs=10)
📌 중요 포인트
- 이 파일 하나만 실행됨
- Chief / Worker 전부 동일한 코드 실행
2️⃣ MultiWorkerMirroredStrategy 이게 뭐냐면
한 줄 설명
“지금 이 파이썬이 혼자 도는지, 여러 Pod가 같이 도는지 자동 판단해서 분산 학습 해주는 스위치”
Kubernetes + TFJob 환경에서는
- TFJob이 TF_CONFIG 환경변수를 자동으로 넣어줌
- TensorFlow가 이걸 보고:
- “아 지금 Worker 4개네”
- “그럼 GPU들끼리 통신하자”
📌 그래서 코드에 IP / Pod 이름 / 개수 전혀 없음
3️⃣ 이 파일은 어디서 실행되나?
❌ 아님
python train.py # 당신 PC ❌
⭕ 정답
Kubernetes Pod 내부
TFJob YAML에서 이렇게 실행됨
containers:
- name: tensorflow
image: tensorflow/tensorflow:2.14.0-gpu
command:
- python
- train.py
- name: tensorflow
image: tensorflow/tensorflow:2.14.0-gpu
command:
- python
- train.py
👉 이 순간:
- Pod 생성
- 컨테이너 시작
- python train.py 자동 실행
4️⃣ 그럼 누가 몇 번 실행하냐?
TFJob 설정에 따라:
Chief:
replicas: 1
Worker:
replicas: 4
replicas: 1
Worker:
replicas: 4
결과:
| Pod | 실행 |
| Chief 1개 | python train.py |
| Worker 4개 | python train.py |
👉 총 5번 실행
👉 하지만 TensorFlow가 서로 통신하면서 “한 번의 학습”처럼 동작
5️⃣ 로컬에서는 어떻게 실행돼?
로컬 테스트 (분산 ❌)
python train.py
- 이때도 MultiWorkerMirroredStrategy()는 문제 없음
- 자동으로 단일 워커 모드로 동작
👉 그래서 로컬 → 쿠버네티스 코드 변경 없음
6️⃣ 실행 순서 요약 (사람 기준)
👨💻 당신이 하는 일
- train.py 작성
- Dockerfile 작성
- 이미지 빌드 & 푸시
- tfjob.yaml 작성
- kubectl apply -f tfjob.yaml
🤖 Kubernetes가 하는 일
- Pod 생성
- TF_CONFIG 설정
- python train.py 실행
- GPU 할당
- 실패 시 재시작
7️⃣ “그럼 이 코드는 왜 이렇게 생겼냐?”
핵심 이유 3가지
- 단일 GPU / 멀티 GPU / 멀티 노드 코드 통합
- Kubernetes 환경 자동 대응
- 연구 → 운영 코드 동일
👉 실무에서 이게 미친 장점임
8️⃣ 한 문장으로 완전 정리
이 코드는 train.py이고, 당신이 직접 실행하는 게 아니라 TFJob이 Pod 안에서 여러 번 실행해서 하나의 분산 학습을 만든다
반응형
'[GPUaaS] > TensorFlow' 카테고리의 다른 글
| [중요3] 운영 표준 - [최종] KServer & NAS & S3 & TFJob.yaml (라벨/MIG/RWO/RWM 적용) (0) | 2026.01.30 |
|---|---|
| [중요2] 운영 표준 - [최종] Train.py & TFJob.yaml (라벨/MIG/RWO 적용) (0) | 2026.01.30 |
| [중요2] 운영 표준 - TFJob.yaml (라벨/MIG/RWO/S3 적용) (0) | 2026.01.28 |
| [중요2] 운영 표준 - GPU 노드 라벨 세트 (0) | 2026.01.28 |
| [GPU 타입] 운영 무중단 - 라벨 NodePool 등록 (1) | 2026.01.27 |
| [GPU 타입] 신규 라벨 NodePool 등록 (라벨 + Taint + Affinity 세트) (0) | 2026.01.26 |
| [GPU] Node Affinity + GPU 타입 분리 (A100 / H100) (0) | 2026.01.26 |
| [GPU] requests = limits가 좋은 이유 (0) | 2026.01.26 |
댓글