에러 노트
[Deepspeed]assert len(set(t.dtype for t in tensors)) == 1에러 해결
DopeorNope
2024. 1. 15. 11:58
이놈의 Multi-GPU 훈련은 진짜 사람을 돌게 만든다.
도대체 어디서 문제가 나는지 감도 안오는 경우가 많기 때문이다.
하지만 결국 사람은 그렇게 찾아낸다.
이 에러가 나는 근본적인 이유를 알아보자.
깃허브 이슈에 나와있던 글이다.
내용인 즉슨, 보통 llm full-finetuning시 레이어 얼리는데 있어서, 옵티마이저 최적화 할만한 레이어가 없다는 것이라는것과 같다는 것이다.
근데 솔직히 이것보다 더 근본적인 문제가 있는게, 지금 내가 fine_tuning하려는 하이퍼 파라미터들(트레이닝 옵션 혹은 모델 dtype)과 deepspeed의 config가 호환이 되지 않아서 그런거다.
그러면 어떻게 해결할 것인가?
방법은 은근히 간단하다.
우선 불러오는 모델 type이 bfloat16이라면, deepspeed config를 다음과 같이 설정해주면 된다.
우선 나는 zero3를 사용하기에
{
"zero_optimization": {
"stage": 3,
"overlap_comm": true,
"contiguous_gradients": true,
"sub_group_size": 0,
"reduce_bucket_size": "auto",
"stage3_prefetch_bucket_size": "auto",
"stage3_param_persistence_threshold": "auto",
"stage3_max_live_parameters": 0,
"stage3_max_reuse_distance": 0,
"stage3_gather_16bit_weights_on_model_save": true
},
"bf16": {
"enabled": true
},
"fp16": {
"enabled": false,
"auto_cast": false,
"loss_scale": 0,
"initial_scale_power": 32,
"loss_scale_window": 1000,
"hysteresis": 2,
"min_loss_scale": 1
},
"optimizer": {
"type": "AdamW",
"params": {
"lr": "auto",
"betas": [
0.9,
0.999
],
"eps": 1e-08,
"weight_decay": "auto"
}
},
"gradient_accumulation_steps": "auto",
"train_batch_size": "auto",
"train_micro_batch_size_per_gpu": "auto",
"wall_clock_breakdown": false
}
위와 같이 config를 수정해주었다.
여기서 핵심은, fp16옵션을 꺼주는것이다.
안꺼주면 계속 질질 끌린다.
만약에 float32이면 bf16은 꺼주고, fp16 enable을 auto로 세팅해주면 된다.
하 deepspeed는 정말 간편하고 좋으면서도 재앙과도 같다...