実は量子化は詳しくないのですが、VRAMがきついのでFP8を使ってみました。ada世代のGPUもFP8に対応しているというので測定してみました。日本語をやってみましたがそんなに精度は気にならなかったので、限られたリソースで秒ごとのトークン生成数を増やしたいというモチベーションです。
そんなに難しい手法は使いたくなかったので、こちらを参考にしました。
【インターンレポート】量子化による大規模言語モデル軽量化の効果測定
https://engineering.linecorp.com/ja/blog/quantization-lightweighting-llms
量子化する際にはおそらくスムーズには行かなくて、ライブラリのインストールで多少突っかかりましたが、最終的には実行ができました。
Mistral instruct v0.2 の7Bモデルを使いました。例えば、adaのRTX4060tiでは16GBモデルのGPUではVRAMが足りなくて、FP16はVRAM不足で動きません。そこで、FP8にしたらギリギリ足りました。
各種設定は下記の通りです。
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
import time
device="cuda"
model_name="mistralai/Mistral-7B-Instruct-v0.2"
model = AutoModelForCausalLM.from_pretrained(model_name, device_map="auto", torch_dtype=torch.float16)
tokenizer = AutoTokenizer.from_pretrained(model_name)
#accelerator = Accelerator(mixed_precision="fp8")
#model = accelerator.prepare_model(model)
messages = [
{"role": "user", "content": "What is your favourite condiment?"},
{"role": "assistant", "content": "Well, I'm quite partial to a good squeeze of fresh lemon juice. It adds just the right amount of zesty flavour to whatever I'm cooking up in the kitchen!"},
{"role": "user", "content": "Do you have mayonnaise recipes?"}
]
model_inputs = tokenizer.apply_chat_template(messages, return_tensors="pt").to(device)
model.to(device)
#のコメントアウトをとって混合精度で実行していけました。
電気は165W中110W利用し、
VRAMは15533MiB / 16380MiB
となりました。かなりギリギリなので、RAGなどでベクトル検索などでGPUを利用するプロセスを両方使おうとするとVRAM容量オーバーでエラーが出ます。
4060tiのような低価格?のGPUでもLLMが高精度のFP8で動くのでリーズナブルと感じましたが、トークン生成速度は遅いと感じました。
以上です。