【ローカルLLM】GPTQ-for-LLaMAによるモデルの量子化を試す
Llama系モデルのGPTQ量子化&推論に使用できるパッケージには、AutoGPTQの他に、GPTQ-for-LLaMaがある。
最近はAutoGPTQへの機能集約が進み、高速推論に関してもExllamaが登場したので、GPTQ-for-LLaMAはあまり利用されなくなっている。
ただ、量子化に関してはAutoGPTQよりGPTQ-for-LLaMAの方が手軽という噂を聞いたので、ちょっと試してみた。
ELYZA-japanese-Llama-2-7bで試す
ちょうど下記モデルがリリースされたので、試しにこちらをGPTQ化してみることにした(ELYZA-japanese-Llama-2-7b-instruct)。
量子化パラメータ
量子化パラメータについては、HuggingFaceのGPTQConfigやTheBloke氏のGPTQのモデルカードに分かりやすい解説がある。
GPTQ-for-LLaMAのサンプルでは、以下のようになっている。
python llama.py ${MODEL_DIR} c4 --wbits 4 --true-sequential --act-order --groupsize 128 --save_safetensors llama7b-4bit-128g.safetensors
当初、このサンプルのパラメータを使って量子化したが、出力の劣化がやや気になったので、グループサイズ64でやり直した。
GPTQデータセットにはそのままc4を利用した。日本語モデルなら日本語データセットを使った方が量子化精度が上がるのかも(?)。
量子化の実行
GPTQ-for-LLaMAのインストールと実行はReadmeに記載のとおり。
わりとメモリを食うらしく、LLaMA-13BをGPTQ化するのに64GBのRAMを要するとの情報あり。GPUも必要。
今回は7Bモデルなのでスペック弱めで大丈夫そうだが、ちょうどいいクラウドGPUが無く、82GB RAM+RTX 3090 x2という無駄な環境で実施。
モデルのダウンロードを含め30分強で量子化が完了した。4bitのgroupsize 64でちょうど4GBに圧縮。llama.cppのQ4_K_Mと同じくらいのサイズ。
生成テキストの確認
こちらの記事を参考に、元のモデルとGPTQ量子化モデルで簡単に比べてみた。プロンプトはELYZAの公式から借用し、あらためて自分で出力。
まずはオリジナルの「ELYZA-japanese-Llama-2-7b-instruct」の回答:
※ ELYZA-japanese-Llama-2-7b-instruct(オリジナル)の回答
<s><s> [INST] <<SYS>>
あなたは誠実で優秀な日本人のアシスタントです。
<</SYS>>
仕事の熱意を取り戻すためのアイディアを5つ挙げてください。 [/INST]
仕事の熱意を取り戻すためのアイディアをご紹介します。
1. 仕事のやりがいを見つける: 仕事のやりがいを見つけることで、仕事に対する意欲が高まり、熱意が湧き上がってきます。
2. 仕事の進め方を見直す: 自分の仕事の進め方を見直し、効率の良い方法を見つけることで、仕事への取り組みやすさが変わり、熱意が高まる可能性があります。
3. 仕事のやる気を出す音楽を聞く: 仕事のやる気を出すための音楽を聞くことで、気分を切り替え、熱意を取り戻すことができるかもしれません。
4. 仕事の合間に休憩する: 仕事の合間に休憩することで、仕事への集中力を高め、熱意を取り戻すことができるかもしれません。
5. 仕事のやりがいを伝える: 仕事のやりがいを伝えることで、仕事へのモチベーションが高まり、熱意が取り戻される可能性があります。</s>
4bit量子化(gr64)したモデルの回答:
※ 4bit量子化(gr64)したELYZA-japanese-Llama-2-7b-instructの回答
<s><s> [INST] <<SYS>>
あなたは誠実で優秀な日本人のアシスタントです。
<</SYS>>
仕事の熱意を取り戻すためのアイディアを5つ挙げてください。 [/INST]
以下は、仕事の熱意を取り戻すためのアイデアです。
1. 新しいことに挑戦する
- 新しい業務を任される
- 資格の勉強をする
- 自分のスキルをアップデートする
2. 責任を持って仕事をする
- 仕事を細かく区切り、段階的に達成感を感じられるようにする
- ミスが少なくなるように注意をする
3. 仕事のやりがいを感じられるようにする
- 報酬や評価のシステムを見直す
- 仕事の内容を変更する
4. 仕事の効率を上げる
- タスクを細かく区切り、優先順位をつける
- 仕事の合間に休憩をする
5. 仕事の説明を理解しやすくする
- 仕事の目的を明確にする
- 報連相をする
以上は、仕事の熱意を取り戻すためのアイデアです。状況によっては、効果がない場合もありますが、参考になれば幸いです。</s>
内容は特に代わり映えしない。他のプロンプトでも試してみたが、とりあえず量子化モデルが大きく劣化していることはなさそう。
モデルの出力は温度などのサンプリング次第なので、上記の出力例はあくまで参考。
備考
GPTQ-for-LLaMAでは、グループサイズ128がデフォルトになっているが、今回試したところGS 128の4-bit GPTQだと出力テキストにrepetitionが見られた。
グループサイズが大きいほうが多少速いというが、Exllamaを使えば4bitのGPTQは高速で動かせるので、グループサイズを大きめに設定するメリットはあまりない気もする。
参考
量子化パラメータについての詳細は下記にまとまっている。AutoGPTQを前提にした解説だが、基本的にGPTQ-for-LLaMAと共通。
オリジナルの「ELYZA-japanese-Llama-2-7b-instruct」の利用はこちらの記事を参照した。7Bモデルは量子化しなくてもColabで実行できるサイズ。llama.cppもあるし、7BモデルではGPTQの必要性は乏しそう。
GPTQ-for-LLaMAによる量子化については、コンパクトで分かりやすい記事が転がっていた。「馬鹿でも分かるLLaMA量子化ガイド」。