LLM 모듈 파인튜닝, DeepSpeed를 활용한 경험기
최근에 Hugging Face에서 제공하는 Solar 모델을 활용해 LLM(대규모 언어 모델) 파인튜닝 프로젝트를 진행했습니다.
데이터는 약 4,000개 정도였고, 전처리 과정까지 포함하면 모델 학습에 상당한 시간이 소요될 수 있는 환경이었어요.
실제로 처음에는 일반적인 GPU 환경에서 파인튜닝을 시도했는데,
한 번 학습을 돌리는데 약 7시간 30분이라는 시간이 걸리더라고요.
처음에는 이 시간이 크게 느껴지지 않을 수도 있지만, 모델 성능을 조금씩 조정하고 실험을 반복하려면 매번 7시간 이상을 기다려야 하는 상황이었습니다. 이는 곧 생산성 저하로 직결되었고, 모델 개선을 빠르게 반복하며 최적화하기에는 현실적인 한계가 있었죠.
그래서 고민 끝에 선택한 방법이 DeepSpeed를 활용하는 것이었습니다.
DeepSpeed는 마이크로소프트에서 개발한 딥러닝 최적화 라이브러리로, 특히 대규모 모델 학습에서 속도 개선과 메모리 효율 측면에서 큰 장점을 제공합니다. 제가 직접 경험해보니, 단순히 GPU를 여러 개 쓰는 것뿐만 아니라, 메모리 관리와 연산 최적화를 통해 학습 시간을 확실히 단축할 수 있었습니다.
이 프로젝트에서 DeepSpeed를 도입한 목적은 명확했습니다.
- 학습 시간 단축
모델이 크고 데이터가 꽤 있는 상황에서, 일반적인 학습 환경으로는 매 실험마다 반나절 이상 기다려야 했습니다. DeepSpeed는 이 시간을 줄여주어, 하루 안에 여러 번 실험을 반복할 수 있게 만들어 주었어요. - GPU 자원 효율화
모델을 그대로 학습하면 GPU 메모리 부담이 커서 배치 사이즈를 늘리거나 속도를 올리는 것이 제한적이었습니다. DeepSpeed는 메모리 최적화 기법을 사용해 더 큰 배치 사이즈와 더 빠른 연산이 가능하게 해주었습니다. - 반복 실험 용이성
빠른 학습 덕분에 하이퍼파라미터 조정이나 데이터 전처리 방식 테스트를 훨씬 효율적으로 진행할 수 있었습니다. 결과적으로 모델 성능을 개선하는 사이클이 매우 짧아졌고, 실험 과정에서 얻는 인사이트도 훨씬 풍부해졌습니다.
참고로 저는 데이터 병렬화만 진행하였고 모델 병렬화는 진행하지 않았습니다
아래는 제가 직접 deepspeed를 사용한 코드입니다
우선 deepspeed를 사용하기 위한 config.json 입니다.
{
"bf16": {
"enabled": true
},
"zero_optimization": {
"stage": 1,
"offload_optimizer": {
"device": "none"
},
"offload_param": {
"device": "none"
},
"contiguous_gradients": true,
"overlap_comm": true,
"allgather_bucket_size": 2e8,
"reduce_bucket_size": 2e8
},
"train_batch_size": "auto",
"gradient_accumulation_steps": 16,
"gradient_clipping": 1.0,
"steps_per_print": 200,
"wall_clock_breakdown": false,
"aio": {
"block_size": 1048576,
"queue_depth": 8,
"single_submit": false,
"overlap_events": true
}
}
핵심 설정과 효과
- BF16 연산 활성화 (A100 GPU 사용시 효과가 높아짐)
- 모델 학습을 bfloat16 반정밀도로 수행
- 메모리 사용량 절반, 연산 속도 빠름 → 더 큰 배치 사용 가능
- ZeRO 최적화(Stage 1)
- 옵티마이저 상태를 분산 관리하여 GPU 메모리 부담 감소
- gradient와 통신을 병렬 처리 → 학습 속도 향상
- contiguous_gradients: true ➡️ gradient를 연속된 메모리 블록으로 관리, GPU 연산 효율 향상
- overlap_comm 덕분에 연산 효율 극대화
- 자동 배치 사이즈 (train_batch_size: auto)
- GPU 메모리에 맞춰 DeepSpeed가 최적 배치 사이즈 선택
- 메모리 부족 걱정 없이 최대 배치 사용 → 속도 ↑
- Gradient Accumulation (gradient_accumulation_steps: 16)
- 작은 배치를 여러 번 합산 → 효과적인 큰 배치 학습
- 안정적인 학습 + GPU 효율 극대화
- Asynchronous I/O (aio)
- 데이터 로딩과 연산을 동시에 수행
- GPU가 기다리지 않고 계속 학습 → 전체 학습 시간 단축
training_args = TrainingArguments(
output_dir="./solar10_7B",
per_device_train_batch_size=1,
gradient_accumulation_steps=16,
num_train_epochs=1,
learning_rate=3e-4,
bf16=True,
logging_steps=50,
save_steps=500,
save_total_limit=3,
report_to="wandb" if is_master() else [],
run_name="solar10_7B" if is_master() else None,
logging_dir="./logs",
remove_unused_columns=False,
deepspeed="ds_config.json", # deepspeed 사용
do_eval=True
)
deepspeed 사용은 traing_args 쪽에 deepspeed = "내가 저장한 deepspeed.json" 파일을 넣어주면 됩니다.
이후에 deepspeed를 사용하기 위한 환경설정과 라이브러리를 import해주면 됩니다.
아래사이트에 자세하게 제가 실제로 deepspeed를 사용하면서 겪은 오류 및 해결과정이 들어있습니다.
https://tjdwl000801.tistory.com/7
deepSpeed 모델 사용 방법 및 오류
DeepSpeed란?Microsoft에서 개발한 딥러닝 최적화 라이브러리GPU 메모리와 연산 자원을 효율적으로 활용초대형 모델 훈련 및 추론을 용이하게 함핵심 기능:ZeRO (Zero Redundancy Optimizer): 옵티마이저/그래
tjdwl000801.tistory.com
deepspeed 파인튜닝 결과
Contribute to genbotlabs/models development by creating an account on GitHub.
github.com
DeepSpeed를 적용한 덕분에, 원래 한 번 파인튜닝하는 데 걸리던 7시간 30분이 최종적으로 1시간 30분으로 크게 단축되었습니다.
GPU도 기존 1개에서 4개로 확장하면서 학습 속도가 눈에 띄게 빨라졌고, RunPod에서 실행한 덕분에 비용 또한 약 1달러 정도 절감되는 효과를 확인할 수 있었습니다.
이번 프로젝트를 통해 DeepSpeed를 활용한 LLM 파인튜닝의 속도 향상과 메모리 효율을 직접 체감할 수 있었습니다.
작은 설정 하나가 학습 시간과 반복 실험 효율에 큰 영향을 주는 것을 경험하며, 초대형 모델을 다루는 환경에서는 적절한 최적화 라이브러리 선택과 설정이 얼마나 중요한지도 깨닫게 되었죠.
앞으로 Solar 모델뿐만 아니라 다른 대규모 언어 모델을 다룰 때도, 이번 경험을 바탕으로 효율적이고 안정적인 학습 환경을 구축할 수 있을 것 같습니다.
DeepSpeed를 처음 접하는 분들께는 제가 정리한 설정과 경험이 도움이 되길 바랍니다.
이상으로 글 마치겠습니다 긴 글 읽어주셔서 감사합니다.
'LLM 개인 공부 > 파인튜닝 - DeepSpeed' 카테고리의 다른 글
| deepSpeed 모델 사용 방법 및 오류 (4) | 2025.07.12 |
|---|---|
| deepSpeed GitHub 공부(Readme) (1) | 2025.07.03 |