노트북 닫아도 학습은 계속된다: CLI 한 줄로 시작하는 Batch Job


GPU 학습, 아직도 노트북에서 돌리고 계세요?
Jupyter 노트북에서 학습을 돌리면 편하긴 해요. 셀 하나 실행하면 바로 결과가 보이니까요.
그런데 이런 경험, 한 번쯤 있지 않나요?
- 노트북 탭을 닫았더니 학습이 멈춰 있었어요
- 밤새 돌리려고 했는데 커널이 죽어서 처음부터 다시 시작했어요
- 하이퍼파라미터 조합을 바꿔가며 하나씩 수동으로 돌렸어요
- GPU를 잡아놓고 전처리 코드만 3시간째 돌리고 있었어요
배치 잡은 이런 문제를 해결해요. 스크립트를 제출하면 VESSL Cloud가 알아서 GPU를 할당하고, 학습을 실행하고, 끝나면 자원을 반납해요. 노트북을 열어둘 필요 없이요.
Workspace vs Job — 언제 뭘 쓰면 될까요?
| Workspace | Job | |
|---|---|---|
| 목적 | 인터랙티브 개발 & 디버깅 | 자동화된 학습 & 배치 처리 |
| 접근 방식 | SSH, Jupyter, VS Code 접속 | 스크립트 제출 → 로그 확인 |
| 라이프사이클 | 직접 시작/중지/삭제 | 실행 완료 시 자동 종료 |
| 과금 | 실행 중인 시간 전체 | 실제 사용 시간만 |
요약하면: 코드를 짜고 디버깅할 때는 Workspace, 검증된 코드를 반복 실행할 때는 Job을 쓰면 돼요.
30초 설치
아래 시나리오를 돌려보기 전에 vesslctl을 설치하고 로그인해요.
1. vesslctl 설치
curl -fsSL https://api.cloud.vessl.ai/cli/install.sh | bash2. 로그인
vesslctl auth login브라우저 OAuth로 로그인만 하면, 아래 시나리오 어떤 거든 바로 제출할 수 있어요.
크레딧 확인하기
로그인이 끝나면vesslctl billing show로 조직의 크레딧 잔액을 확인해 주세요. 잔액이 0이면workspace create와job create가 실행 직전에 차단돼요. 부족하면 VESSL Cloud에서 먼저 충전할 수 있어요.
리소스 스펙·볼륨 slug 찾기
아래 시나리오의<your-resource-spec-slug>는vesslctl resource-spec list로,<your-volume-id>는vesslctl volume ls로 본인 조직에서 확인할 수 있어요.
이런 상황에서 배치 잡을 써보세요
1. 간단한 GPU 스크립트 실행
학습 코드가 준비되었고, GPU 한 장에서 돌리기만 하면 되는 경우예요.
vesslctl job create \
--resource-spec <your-resource-spec-slug> \
--image "pytorch/pytorch:2.3.0-cuda12.1-cudnn8-runtime" \
--cmd "python train.py --epochs 50 --batch-size 128"A100 SXM 기준 시간당 $1.55, 학습이 끝나면 자동으로 자원이 반납돼요.
2. 하이퍼파라미터 스윕 (9가지 조합)
learning rate 3개 x batch size 3개 = 9가지 조합을 한 번에 돌려보고 싶을 때요.
for lr in 1e-3 3e-4 1e-4; do
for bs in 32 64 128; do
vesslctl job create \
--resource-spec <your-resource-spec-slug> \
--image "pytorch/pytorch:2.3.0-cuda12.1-cudnn8-runtime" \
--cmd "python train.py --lr $lr --batch-size $bs" \
--name "sweep-lr${lr}-bs${bs}"
done
done9개 Job이 동시에 실행돼요. 각각 독립적으로 자원을 할당받고, 끝난 순서대로 반납해요.
9개는 이 예시의 숫자일 뿐이에요. 반복문 범위만 넓히면 25개도, 125개도 같은 패턴으로 돌아가요. Job 자체에는 동시 실행 개수 제한이 없고, 조직 GPU 쿼터와 클러스터 가용 자원이 실질적인 상한이에요.
3. 야간 학습 + 체크포인트 저장
큰 모델을 오래 학습할 때가 상위 티어 GPU가 값을 하는 구간이에요. H100은 A100보다 시간당 단가가 높지만, FP8 지원과 넓은 메모리 대역폭 덕분에 학습 시간을 많이 줄여서 총 비용이 오히려 낮아지는 경우가 많아요. 야간 학습처럼 긴 작업일수록 차이가 커져요.
학습이 길어질수록 안전장치도 필요해요. 중간 결과를 Object Storage에 저장해두면, 뭔가 잘못돼도 이어서 시작할 수 있어요.
vesslctl job create \
--resource-spec <your-resource-spec-slug> \
--image "pytorch/pytorch:2.3.0-cuda12.1-cudnn8-runtime" \
--object-volume "my-checkpoints:/mnt/checkpoints" \
--cmd "python train.py \
--epochs 200 \
--checkpoint-dir /mnt/checkpoints \
--save-every 10"H100 SXM 기준 시간당 $2.39예요. 학습이 중간에 실패하더라도 마지막 체크포인트부터 이어서 할 수 있어요.
4. CPU 전처리 → GPU 학습 파이프라인
데이터 전처리는 GPU가 필요 없어요. 저렴한 CPU 인스턴스에서 전처리하고, 결과물을 GPU 학습($1.55/hr)에 넘기면 비용을 크게 줄일 수 있어요.
# Step 1: CPU 전처리
vesslctl job create \
--resource-spec <your-resource-spec-slug> \
--image "python:3.11" \
--object-volume "my-data:/mnt/data" \
--cmd "python preprocess.py --input /mnt/data/raw --output /mnt/data/processed" \
--name "preprocess"
# Step 2: GPU 학습 (전처리 완료 후 실행)
vesslctl job create \
--resource-spec <your-resource-spec-slug> \
--image "pytorch/pytorch:2.3.0-cuda12.1-cudnn8-runtime" \
--object-volume "my-data:/mnt/data" \
--cmd "python train.py --data /mnt/data/processed" \
--name "train"전처리까지 GPU에서 돌리면 5시간 x $1.55 = $7.75지만, 저렴한 CPU 인스턴스에 전처리를 맡기면 GPU는 학습 2시간분($3.10)만 필요해서 총 비용이 절반 이하로 떨어져요.
5. 실전 워크스루 — Gemma 4 파인튜닝 처음부터 끝까지

위 네 가지는 형태예요. 실제로 돌려본 워크플로우를 하나 풀어드릴게요 — Gemma 4 E4B를 잡 다섯 개로 파인튜닝하고, 같은 인프라에서 베이스 모델, 일반 데이터 학습 모델, VESSL 도메인 학습 모델을 비교했어요.
Object storage 볼륨 하나에 스크립트와 데이터셋을 올려두고, 모든 잡이 /shared에 마운트해요. 데이터셋은 환경변수 하나로 분기해요. 스크립트 전문(finetune_gemma4.py)과 submit.sh 래퍼는 Gemma 4 파인튜닝 cookbook에서 그대로 받을 수 있어요.
# 한 번만 업로드 — 스크립트 + 데이터셋
vesslctl volume upload <your-volume-id> finetune_gemma4.py --remote-prefix scripts/
vesslctl volume upload <your-volume-id> vessl-cloud-qa-dataset.json --remote-prefix datasets/
# 일반 데이터 잡
vesslctl job create \
--name gemma4-generic \
--resource-spec <your-resource-spec-slug> \
--image pytorch/pytorch:2.5.1-cuda12.4-cudnn9-devel \
--object-volume <your-volume-id>:/shared \
--env DATASET_MODE=generic \
--cmd "pip install unsloth trl transformers datasets && python -u /shared/scripts/finetune_gemma4.py"
# VESSL 도메인 잡 (DATASET_MODE만 바꿔서 제출)
vesslctl job create \
--name gemma4-vessl \
--resource-spec <your-resource-spec-slug> \
--image pytorch/pytorch:2.5.1-cuda12.4-cudnn9-devel \
--object-volume <your-volume-id>:/shared \
--env DATASET_MODE=vessl \
--cmd "pip install unsloth trl transformers datasets && python -u /shared/scripts/finetune_gemma4.py"
# 로스 커브 실시간 확인, 최종 상태와 비용 조회
vesslctl job logs <slug> --follow
vesslctl job show <slug>
vesslctl billing show다섯 번 돌려서 강한 결과 두 개를 비교해보면:
| 잡 | 데이터셋 | 학습 시간 | Final loss | 비용 |
|---|---|---|---|---|
| Generic | FineTome-100k (3,000개) | 15분 44초 | 4.06 | $0.41 |
| VESSL-domain | VESSL QA (36개, 20 에폭, r=32) | 22분 12초 | 0.61 | $0.57 |
"VESSL Cloud 워크스페이스를 일시 중지해서 비용을 아끼려면 어떻게 해야 하나요?" 라고 물었을 때, 베이스 모델과 일반 데이터 학습 모델은 둘 다 "해당 문서를 찾을 수 없어요…" 라고 거절했어요. VESSL 도메인으로 학습한 모델은 "VESSL Cloud의 Pause 기능을 사용하세요. CPU와 메모리 사용이 즉시 중단돼요…" 라고 답했어요. 올바른 도메인 데이터 36개가, 일반 대화 데이터 3,000개로는 바꾸지 못한 응답 패턴을 바꿨어요.
잡이 완료되거나 실패하면 자동으로 종료되니까 중간에 멈춰도 비용이 크게 쌓이지 않아요. 다섯 번 전체, 총 $1.72예요. 참고로 AWS의 8-GPU 번들($21.96/hr)에서 같은 실험 다섯 번을 돌렸다면 3분만 idle이어도 약 $10가 날아가요.

FAQ
Job이 실패하면 어떻게 되나요?
Job이 비정상 종료되면 상태가 failed로 표시돼요. vesslctl job logs 로 에러 로그를 확인하고, 수정 후 다시 제출하면 돼요. Object Storage에 체크포인트를 저장해 두었다면, 마지막 체크포인트부터 이어서 학습할 수 있어요.
Workspace에서 Job을 제출할 수 있나요?
네, Workspace 터미널에서 vesslctl job create 명령어를 실행하면 돼요. 코드를 Workspace에서 개발하고 디버깅한 다음, 검증이 끝나면 바로 Job으로 제출하는 워크플로우를 추천해요.
Job 간에 데이터를 어떻게 전달하나요?
Object Storage를 사용하면 돼요. 여러 Job에 같은 Object Storage 볼륨을 마운트하면, 한 Job의 출력을 다음 Job의 입력으로 사용할 수 있어요. 위의 CPU→GPU 파이프라인 예시처럼요.
참고 자료
- VESSL Cloud Job 문서
- vesslctl CLI 설치 가이드
- GPU 가격표 — A100 SXM $1.55/hr, H100 SXM $2.39/hr, L40S $1.80/hr
이어 읽기


VESSL AI