Qlora: Efficient finetuning of quantized llms 를 읽고 이해되는 선에서 최대한 정리를 해보았습니다.
Motivation
거대 모델에서 파라미터 수가 점점 커지고 있다. 이런 거대 모델을 릴리즈해도 일반 사람들이 파인튜닝해서 모델을 바꾸는 것은 쉽지가 않은데 큰 리소스가 필요하기에 쉽지가 않고, QLoRA를 이용하여 쉽게 파인튜닝을 할 수 있는 방법을 소개한다.
Contribution
- 4-bit Quantization
- 필요할 때만 사용한다.
양자화
block-wise k-bit quantization
- 동적 양자화의 일종
- 입력 텐서의 B개의 값을 하나의 블록으로 간주, 각 블록의 absmax를 양자화 상수로 취급하여 병렬처리가 가능하도록 함.
QLoRA
- 기존의 LoRA에 새로운 quantization을 더한 형태
- 베이스 모델인 PLM의 가중치를 얼리고, LoRA 어댑터의 가중치만 학습 가능하는 것은 같고, frozen PLM의 가중치가 4bit로 양자화 되었다는 것이 다르다.
- 사전 훈련된 모델을 4 bit로 양자화한다.
- 소량의 학습가능한 Low rank Adapter 가중치를 추가해서 튜닝한다.
- 이 가중치들이 양자화된 가중치를 통해서 Gradient를 역전파하여 조정한다.
- 데이터 품질이 데이터셋 크기보다 훨씬 중요하다.
- 데이터 적합성이 크기보다 중요하다.
방법론
4-bit NormalFloat(NF4)
- QLoRA의 핵심적인 방법론
- 정규 분포 가중치를 효율적으로 처리하도록 설계된 최적의 양자화 데이터 유형
- 표준 정규 분포의 분위수를 추정하여 정규 분포를 위한 4bit로 양자화된 채 저장됨.
- 표준 정규 분포의 분위수 추정과정에서 비용이 많이 들기 때문에 SRAM 분위수와 같은 빠른 분위수 근사 알고리즘을 사용한다.
Double Quantization
- 양자화 하는 과정에서 메모리 절약을 위한 양자화 상수를 양자화하여 평균 메모리 설치 공간을 줄인다. 정확한 4bit 양자화를 위해서는 작은 블록 크기가 요구되지만 이는 상당한 메모리 오버헤드가 있다.
- 양자화 상수의 memory footprint를 줄이도록 도와준다.
- memory footprint 프로그램이 실행되는 동안 사용하거나 참조하는 메모리의 양
- 첫 번째 양자화의 양자화 상수를 두 번째 양자화에 대한 입력으로 처리하여 양자와 상수와 두 번째 양자화 상수를 생성한다.
Paged Optimizers
NVIDIA 통합 메모리 기능을 사용하여 CPU와 GPU 간의 자동으로 페이지 간 전송을 수행한다.
gradient checkingpoing 도중에 메모리 spike가 발생하여 GPU 메모리 부족으로 인해 OOM을 야기하는 상황을 방지하는데 사용한다.
- 옵티마이저 상태에 페이징된 메모리를 할당한다.
- GPU가 메모리 부족으로 인해 OOM이 발생하였을 때, 자동으로 CPU RAM으로 옮긴다.
- 옵티마이저 업데이트 단계에서 메모리가 필요할 때, GPU 메모리로 다시 옮긴다.
참고
Dettmers, Tim, et al. "Qlora: Efficient finetuning of quantized llms." arXiv preprint arXiv:2305.14314 (2023).