👑

QLoRA で 4bit 量子化で LLM 33B 規模ファインチューン頑張りたいメモ

2023/05/24に公開

QLORA: Efficient Finetuning of Quantized LLMs
https://github.com/artidoro/qlora/tree/main

ありがとうございます.

まとめ

  • NF4(NormalFloat)
    • Neural network の重みは概ね正規分布に従うので, 正規分布ベースで量子化するよ. int4, FP4 よりいい性能でるよ
  • DQ(Double Quantization)
    • 量子化しても量子化のための定数値がまだやぱっり場所食うからこれも量子化するよ
  • Paged Optimizer
    • CPU memory と GPU VRAM で mmap で on-demand paging で optimizer state をページングして GPU out-of-memory を回避するよ.

これにより LLama 33B が 3090 x 1(24 GB) GPU で LoRA finetuning できます!

Paged Optimizer

CPU memory と GPU VRAM で mmap で, optimizer state を on-depand paging して GPU out-of-memory 回避します.

GPU との mmap 機能自体は RTX 3000 くらいからある(AMD の場合は SSD 内蔵 GPU(RDNA?) くらいからカナ)のですが, LLM のトレーニングに適したやりかたを提案しているのかな?

論文では 33B では finetuning に必要なメモリは 24.7 GB くらいと微妙に 24 GB GPU にフィットしないけど, optimizer state 800 MB くらいを paged optimizer でページングすることで 24 GB にフィットさせることが出来たと述べています.

model weight 自体も paging や double-buffering させたらいいんじゃないかとも思いますが, PCI-ex 帯域ネックになるんじゃろか?

PCI-ex Gen5 ならいい感じになりそうだけど, 現状の RTX 4000, RDNA3 など Gen4 なので, 最大片道 16 GB/s だからちょい厳しいのかしらん. それでも一部だけでも paging する手もありそうですけどネ.

もしくは pytorch だと paging とか double buffering が面倒なのかも.

llama.cpp(ggml) でも finetuning(backward pass) 対応 + GPU 対応始まっています. llama.cpp の方がハックしやすいので paging なりで GPU VRAM 賢く使って LLM ファインチューン(フルの学習も!)は llama.cpp の方で発展していきそうカモ?

Discussion