딥러닝 학습을 돌릴 때 데이터나 모델이 크고 리소스는 한계가 있을 때 이를 해결하도록 도와주는 Huggingface의 라이브러리가 있다.
바로 accelerate 이다.
단 4줄의 코드만 추가하면 Multi GPU 분산 구성을 똑같이 100%로 활용할 수 있다.
기본 pytorch 코드를 통해 multi gpu를 사용하면(DDP) 0번 gpu만 100퍼센트 사용되고 나머지 GPU는 예를 들어 60% 정도씩 덜 활용된다.
각 GPU에서 loss를 계산하고 각 결과를 합해서 최종 loss를 구해야 하는데 합하는 연산을 0번 device에서 하기 때문에 0번의 소모만 커지기 때문이다.
accelerate을 사용하면 이러한 문제를 해결할 수 있다. nvidia-smi를 찍어보면 모든 GPU가 100% 활용되고 있는 것을 확인할 수 있다.
또한 accelerate를 통해 DeepSpeed를 활용할 수 있다.
DeepSpeed는 스케일링 등을 통해 학습 속도를 가속화하는 라이브러리이다. floating point를 32에서 16으로 줄이는 등의 스케일을 적용하여 학습 속도를 줄이지만 당연히 성능이 저하된다.
따라서 예를 들어 하루종일 걸리는 학습 속도를 30분 정도(stage 3)로 단축하지만 성능도 그만큼 감수해야 한다.
때문에 분류 문제처럼 acc가 중요한 문제에는 DeepSpeed를 덜 사용하거나 사용하지 않는게 좋고, 텍스트 생성모델처럼 정량적 평가가 크게 중요하지 않은 문제(정성적 평가에 비중이 큰 문제)에는 DeepSpeed를 써도 감수할 만하다.
기존의 딥러닝 모델의 분산 학습(DDP)에서는 모든 GPU가 모델을 가지고 있어야 했기 때문에 모델을 학습시키기 위한 값(Optimizer State, Gradient, Parameter)을 GPU마다 복제해서 가지고 있어야 했다.
GPT-2 모델은 3GB 정도의 메모리를 차지하지만 32GB GPU에서 학습이 안되는 것이 이러한 낭비 문제 때문이었다.
ZeRO는 이러한 모델(파라미터) 복제로 인한 낭비를 해결한다.
DeepSpeed의 ZeRO는 stage를 통해 최적화 정도를 조절할 수 있다.
+) Stage 3부터는 OOM가 발생하면 에러를 올리지 않고 나머지를 하드디스크에 보내고 cpu로 연산한다.
+) Stage infinity도 있음