DeepSpeed란?
- Microsoft에서 개발한 딥러닝 최적화 라이브러리
- GPU 메모리와 연산 자원을 효율적으로 활용
- 초대형 모델 훈련 및 추론을 용이하게 함
- 핵심 기능:
- ZeRO (Zero Redundancy Optimizer): 옵티마이저/그래디언트/파라미터를 분산시켜 메모리 사용 최소화
- Mixed Precision Training: FP16/FP8 등 정밀도 조절로 연산 속도 향상
- 모델 병렬화 및 offloading 기능
내가 DeepSpeed를 사용한 이유
프로젝트를 진행하며 대규모 언어모델의 파인튜닝이 필요해졌고, 초기 실험에서는 모델 한 번을 학습시키는 데 약 7시간이 소요되었습니다. 겉으로 보면 짧은 시간일 수 있지만, 다양한 실험을 반복하며 성능을 개선해야 하는 상황에서는 큰 제약이 되었습니다.
더 빠르고 효율적인 학습 환경이 필요했고, 이를 해결하기 위해 Microsoft의 DeepSpeed를 도입했습니다. DeepSpeed는 GPU 메모리를 효율적으로 관리하고, 분산 학습 최적화를 통해 학습 속도를 획기적으로 줄여주는 프레임워크로, 실제 적용 결과 학습 시간을 6시간30분에서 1시간 30분으로 단축시킬 수 있었습니다
DeepSpeed 설치 요구 사항(GitHub 참조)
- PyTorch must be installed before installing DeepSpeed.
- For full feature support we recommend a version of PyTorch that is >= 1.9 and ideally the latest PyTorch stable release.
- A CUDA or ROCm compiler such as nvcc or hipcc used to compile C++/CUDA/HIP extensions.
- Specific GPUs we develop and test against are listed below, this doesn't mean your GPU will not work if it doesn't fall into this category it's just DeepSpeed is most well tested on the following:
NVIDIA: Pascal, Volta, Ampere, and Hopper architectures
AMD: MI100 and MI200
DeepSpeed 설치 방법 및 사용 방법
설치 방법
pip install deepseed
DeepSpeed 사용을 위한 config.json 작성 방법
{
// bf16 연산(Brain Floating Point 16) 활성화: 메모리 절약 및 연산 속도 향상
"bf16": { # bf16 or fp16 , tf32 각 환경에 맞춰서 사용 할 수 있음
"enabled": true
},
// ZeRO 옵티마이제이션 설정: 단계 1로 optimizer 상태 분산
"zero_optimization": {
"stage": 1, # 단계는 1,2,3단계로 되어있고 단계가 높아질수록 성능이 높아짐
"offload_optimizer": {
"device": "none" // 옵티마이저 상태 오프로딩 없음
},
"offload_param": {
"device": "none" // 파라미터 오프로딩 없음
},
"contiguous_gradients": true, // 그라디언트 메모리 연속 저장으로 속도 최적화
"overlap_comm": true, // 통신과 계산 겹치기 활성화
"allgather_bucket_size": 2e8, // All-gather 버킷 크기 설정 (바이트 단위)
"reduce_bucket_size": 2e8 // Reduce 버킷 크기 설정 (바이트 단위)
},
// 자동으로 배치 사이즈 결정 (GPU 메모리에 맞춰 조정)
"train_batch_size": "auto",
// gradient accumulation 스텝 수: 16 스텝마다 역전파 수행
"gradient_accumulation_steps": 16,
// 그라디언트 클리핑 임계값: 1.0을 넘어갈 경우 클리핑하여 폭주 방지
"gradient_clipping": 1.0,
| 항목 | GPU 1개 | GPU 2개 | GPU 4개 |
| 학습 시간 | 6시간30분 | 3시간30분 | 1시간30분 |
| GPU 사용량 | 1개 | 2개 | 4개 |
| 모델 성능 (A100 SXM) | 동일 | 동일 | 동일 |

A100 GPU를 선택한 이유
초기에는 비교적 저렴한 비용으로 사용할 수 있는 A40 GPU를 활용하여 파인튜닝을 시도했습니다. 그러나 환경 설정 문제인지, 다른 시스템적인 충돌 때문인지 알 수 없는 이유로 학습이 정상적으로 진행되지 않았고, 여러 차례 시도에도 불구하고 문제를 해결할 수 없었습니다.
결국 다음 대안으로 A100 SXM GPU를 선택하게 되었고, 해당 환경에서는 모든 설정과 학습 과정이 안정적으로 작동하여 문제를 해결할 수 있었습니다.
A100은 단순히 고성능이기 때문이 아니라, 정상적인 학습을 보장받기 위한 실질적인 선택이었습니다.
| 항목 | A40 | A100 SXM |
|---|---|---|
| 메모리 용량 | 48GB GDDR6 | 80GB HBM2e |
| FP16 처리 성능 | 74.3 TFLOPS | 312 TFLOPS |
| GPU 아키텍처 | Ampere | Ampere |
| NVLink 지원 | 미지원 | 지원 (SXM 전용) |
| 적용 결과 | 환경 설정 오류로 학습 실패 | 안정적인 학습 환경 확보 |
| 선택 이유 | 비용 절감 목적 | 정상적인 파인튜닝 진행을 위해 선택 |
⚠️ 자주 발생하는 DeepSpeed 오류 및 해결 방법 모음
파인튜닝을 진행하면서 DeepSpeed, bitsandbytes, accelerate 등 다양한 라이브러리 조합으로 인해 예상치 못한 오류가 발생했습니다. 이 글에서는 제가 직접 경험한 자주 발생하는 오류와 해결 방법을 정리합니다.
1️⃣ DeepSpeed 비정상 종료 (exit code = 1)
[ERROR] ['/usr/bin/python', '-u', 'fine_tuning.py', '--local_rank=3'] exits with return code = 1
❗ 원인: 내부 파이썬 스크립트에서 예외가 발생하여 rank 3의 GPU 프로세스가 종료됨
에러를 확인하기위한 코드
CUDA_VISIBLE_DEVICES=3 python 파일명.py
위에 명령어를 통해 rank 3의 GPU 프로세스의 에러를 확인하고 해결하도록 하였습니다.
각자 명령어 에러가 다르기 때문에 각 에러에 맞춰서 해결하시면 될 것 같습니다
2️⃣ ImportError: clear_device_cache (제일 많은 오류가 나왔던 부분)
ImportError: cannot import name 'clear_device_cache' from 'accelerate.utils.memory'
❗ 원인: transformers와 accelerate 라이브러리 간 버전 불일치
pip install transformers==4.40.1 accelerate==0.27.2
처음 DeepSpeed를 적용할 때, transformers와 accelerate 라이브러리 간 버전 불일치로 인해 많은 에러를 경험했습니다. 두 라이브러리는 업데이트가 자주 이루어지고, DeepSpeed와의 호환성도 달라질 수 있기 때문에 무작정 최신 버전으로 업그레이드하는 것은 오히려 문제를 유발할 수 있습니다.
DeepSpeed를 안정적으로 사용하기 위해서는, 처음 환경을 구성할 때부터 버전 호환성을 고려하여 세팅하는 것이 가장 중요합니다. 사전에 호환 가능한 버전을 명확히 정한 후 설치하면, 이후의 디버깅 시간을 크게 줄일 수 있습니다.
3️⃣ bitsandbytes CUDA 오류
AttributeError: module 'bitsandbytes.nn' has no attribute 'Linear4bit'
❗ 원인: bitsandbytes 버전이 현재 CUDA 환경과 호환되지 않음
✅ 해결 방법: CUDA 11.8 환경에 맞는 버전 재설치
pip uninstall bitsandbytes -y
pip install bitsandbytes-cuda118
저는 bitsandbytes를 uninstall -> cuda118 버전으로 install 했더니 오류를 해결 했습니다
3️⃣ Torch.save
AttributeError: Can't pickle local object 'DeepSpeedEngine._create_module_forward_post_hook.<locals>._module_forward_post_hook'
torch.save(model, "solar-10.7b.pt") # ❌ DeepSpeed + PEFT 모델 저장 불가
DeepSpeed와 PEFT(예: LoRA) 모델을 함께 사용할 경우, 다음과 같은 오류가 발생할 수 있습니다:
이 오류는 DeepSpeed가 모델을 DeepSpeedEngine 객체로 래핑하기 때문에, torch.save(model, ...) 방식으로는 직렬화(Pickle) 불가능해서 발생합니다.
시도했던 코드
torch.save(model, "solar-10.7b.pt") # ❌ 실패
torch.save(model.module.state_dict(), "solar10_7b_fallback_state_dict.pth") # ❌ 여전히 에러
처음엔 첫줄에 torch.save만 시도했을 때 안되서
두번째 줄 state_dict()을 사용해보려 하였으나 여전히 불가능 하다는 결론을 냈습니다.
🚀 DeepSpeed 실행 방법
deepspeed <파일 이름.py>
'LLM 개인 공부 > 파인튜닝 - DeepSpeed' 카테고리의 다른 글
| [LLM,DeepSpeed] LLM 모듈 파인튜닝 (6) | 2025.08.14 |
|---|---|
| deepSpeed GitHub 공부(Readme) (1) | 2025.07.03 |