bfloat16でなくfloat16による量子化

#1
by alfredplpl - opened

こんにちは

質問があります。
もとのモデルはbfloat16なんですが、
float16で正常に動作できるのでしょうか?

いろいろ試行錯誤してエラーをなくしました。
まず、このモデルはtritonが必要らしいのでが必要なので、

pip install auto-gptq[triton]==0.4.2

をしました。最新の0.5.0ではバグるようです。
次にプロンプトが対話用になってなかったので修正しました。

# Check transformers version
assert transformers.__version__ >= "4.34.1"

# Tokenizer
tokenizer = AutoTokenizer.from_pretrained(model_name_or_path)

# Model
model = AutoGPTQForCausalLM.from_quantized(model_name_or_path,
        use_safetensors=True,
        inject_fused_attention=True,
        inject_fused_mlp=True,
        device="cuda:0",
        use_triton=True,
        quantize_config=None,
        use_cuda_fp16=True,
        torch_dtype=torch.float16)

# Your test prompt
prompt = """
USER: 今日の夕食のレシピを紹介してください。
ASSISTANT: 
"""
input_ids = tokenizer.encode(prompt, return_tensors="pt")
output_ids=model.generate(
        input_ids=input_ids.to(model.device),
        max_new_tokens=128
)
print(tokenizer.decode(output_ids[0]))
"""

としたところ、エラーなく次のように出力しました。

USER: 今日の夕食のレシピを紹介してください。
ASSISTANT: 
<|endoftext|>

しかし、明らかにおかしいので、model.generate(...,do_sample=True)を入れると、

RuntimeError: probability tensor contains either `inf`, `nan` or element < 0

となり、計算不能になりました。
この原因はおそらくbfloat16の値域がfloat16よりも広いために起こっています。

そこで質問なのですが、もとのモデルはbfloat16なんですが、float16で正常に動作できるのでしょうか?

よろしくお願いします。

alfredplpl changed discussion title from bfloat16でなくfloat16による量子化への質問 to bfloat16でなくfloat16による量子化

ご質問ありがとうございます。
ご指摘のとおり、元モデルはbfloat16でfloat16になっていることにより正常に動作しておりませんでしたので、
bfloat16で作り直して再度アップロードいたしました。
また、README.mdの記載コードも修正しました。

use_triton=TrueはcolabのT4で再起動がかかってしまう謎の挙動となってしまうため、
warningは出ますがひとまず外してあります。

お手数おかけして申し訳ないです。
助かりました、ありがとうございます!

ご対応ありがとうございました。お陰様で4bit量子化したモデルが使えるようになりました。
なお、動作確認として使った正常動作するサンプルコードと正常動作したした結果を貼ります。

from auto_gptq import AutoGPTQForCausalLM
from transformers import AutoTokenizer

model_name_or_path = "mmnga/cyberagent-calm2-7b-chat-GPTQ-calib-ja-1k"

# Tokenizer
tokenizer = AutoTokenizer.from_pretrained(model_name_or_path)

# Model
model = AutoGPTQForCausalLM.from_quantized(model_name_or_path,
        use_safetensors=True,
        device="cuda:0",
        use_triton=True,
        quantize_config=None)

# Your test prompt
prompt = """
USER: 今日の夕食のレシピを紹介してください。
ASSISTANT: 
"""
input_ids = tokenizer.encode(prompt, return_tensors="pt")
output_ids=model.generate(
    input_ids=input_ids.to(model.device),
    max_new_tokens=300,
    do_sample=True,
    temperature=0.7,
)
print(tokenizer.decode(output_ids[0], skip_special_tokens=True))
USER: 今日の夕食のレシピを紹介してください。
ASSISTANT: 

今日の夕食のレシピは「鶏肉と野菜の炒め物」です。

【材料】
・鶏もも肉 150g
・キャベツ 4分の1玉
・玉ねぎ 1個
・にんじん 1本
・ピーマン 2個
・サラダ油 大さじ1
・酒 大さじ1
・醤油 大さじ1
・砂糖 大さじ1
・塩 小さじ1/4
・コショウ 少々

【作り方】

1. 野菜を食べやすい大きさに切ります。
2. フライパンにサラダ油を熱し、鶏肉を炒めます。
3. 鶏肉に火が通ったら、野菜を加えて炒めます。
4. 野菜がしんなりしてきたら、酒と醤油を加え、砂糖と塩を加え、さらに炒めます。
5. 最後にコショウで味を整えたら完成です。

【ポイント】
鶏肉は皮目から焼くことで、カリカリに焼き上がります。野菜は火が通りやすいように小さめに切ることがポイントです。甘辛い味付けでご飯が進む一品です。
alfredplpl changed discussion status to closed

Sign up or log in to comment