L4 vs A100 vs H100, 그리고 DataParallel의 함정
온라인 커뮤니티에서 악플이랑 욕설은 진짜 끊이질 않는다. 이걸 자동으로 감지하려고 한국어에 특화된 KcELECTRA 모델을 파인튜닝하기로 했다.
파인튜닝 하면서 자연스럽게 드는 의문이 있었다.
어떤 GPU를 써야 할까?
비싼 GPU가 정말 그만큼 값어치를 할까?
Multi-GPU 쓰면 무조건 빨라질까?
이번 글에서는 GCP의 L4, A100, H100 GPU로 똑같은 모델을 학습시키면서 실제 소요 시간이랑 비용을 비교해봤다.
총 79만개 데이터를 수집해서 직접 라벨링했다.
데이터 출처:
AI Hub 한국어 혐오 표현 데이터셋
Curse Detection Data (2runo)
K-MHaS (ADL NLP)
NSMC (Naver Sentiment Movie Corpus)
kor_unsmile (Smilegate AI)
라벨 카테고리 (10개):
여성/가족
남성
성소수자
인종/국적
연령
지역
종교
기타/혐오
악플/욕설
clean
데이터 분할:
학습 설정
GCP GPU 스펙
A100 1GPU로 학습 돌렸는데 예상보다 너무 느렸다.
확인해보니까 4개 GPU 중에 1개만 돌아가고 있었음.
"그럼 DataParallel로 4개 다 쓰면 4배 빨라지겠지?"
왜 이런 일이?
nn.DataParallel은 가장 간단한 멀티GPU 방식인데, 심각한 비효율이 있다.
모델을 모든 GPU에 복제
각 GPU에서 forward pass
모든 gradient를 GPU 0으로 모음
GPU 0에서 파라미터 업데이트
업데이트된 파라미터를 다시 복제
GPU 0이 모든 gradient를 처리해야 하니까 병목이 생긴다.
DataParallel은 멀티스레딩 기반이다. Python GIL(Global Interpreter Lock) 때문에 실제로는 병렬 처리가 제한된다.
매 step마다 모델 전체를 복제하고 gradient를 수집하는 과정에서 GPU 간 통신 오버헤드가 발생한다.
KcELECTRA는 약 1.28억 파라미터로 상대적으로 작은 모델이다. 모델이 작을수록 통신 비용 대비 연산 이득이 적어서 멀티GPU 효과가 떨어진다.
각 GPU가 독립 프로세스로 동작 → GIL 회피
효율적인 Ring-AllReduce 알고리즘으로 gradient 동기화
GPU 0 병목 없음
아니면 Hugging Face Accelerate나 DeepSpeed 쓰면 더 쉽게 멀티GPU 학습 가능하다.
GCP 가격 기준으로 총 학습 비용을 계산해봤다. (2024년 12월 기준, On-demand, us-central1)
시간이 중요하면 H100이 압도적이다
비용도 L4랑 비슷한 수준
시간 넉넉하면 가장 경제적
밤새 돌려놓고 다음날 확인하는 용도로 적합
1GPU 기준으로 시간도 비용도 애매한 포지션
LLM 같은 대형 모델에서 VRAM 필요할 때 고려
GPU는 비싼 게 답일 수 있다: H100이 L4보다 15배 비싸지만 13배 빠르고, 총 비용은 비슷함
DataParallel 믿지 마라: 간단하지만 비효율적이고, 오히려 느려질 수 있음
멀티GPU 필요하면 DDP 써라: DistributedDataParallel 또는 Accelerate/DeepSpeed 활용
작은 모델은 싱글GPU가 효율적: 통신 오버헤드 > 연산 이득이면 멀티GPU 의미 없음
실험에 사용된 환경
참고 링크
beomi/KcELECTRA-base-v2022
PyTorch DistributedDataParallel
Hugging Face Accelerate