Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

Ubuntu 22 LTSでOpenCALM をためす その2:チャット的な挙動

実際のところ

スクリプト

argから質問文をとって回答するようにします。

import sys
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

def generate_answer(question):
    loadmodel = "cyberagent/open-calm-7b"
    model = AutoModelForCausalLM.from_pretrained(loadmodel, device_map="auto", torch_dtype=torch.float16)
    tokenizer = AutoTokenizer.from_pretrained(loadmodel)

    inputs = tokenizer(question, return_tensors="pt").to(model.device)
    with torch.no_grad():
        tokens = model.generate(
            **inputs,
            max_new_tokens=64,  # 生成するトークンの最大数
            do_sample=True,  # サンプリングに基づく生成を有効化
            temperature=0.7,  # サンプリングの温度を設定
            top_p=0.9,  # トップpサンプリングを有効化
            repetition_penalty=1.05,  # 繰り返しペナルティを設定
            pad_token_id=tokenizer.pad_token_id,  # パディングトークンのIDを設定
        )

    answer = tokenizer.decode(tokens[0], skip_special_tokens=True)
    return answer

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("Usage: python llmquestion.py 'Your question here'")
        sys.exit(1)
    
    question = sys.argv[1]
    answer = generate_answer(question)
    print(f"Question: {question}")
    print(f"Answer: {answer}")

実行結果

実行はまぁ、例のごとく……遅いです。
とはいえ、全うな結果は返してくれるようですね。

$ python llmquestion.py 銀杏の木はどこで 見ることができますか?
Loading checkpoint shards: 100%|██████████████████| 2/2 [00:02<00:00,  1.10s/it]
WARNING:root:Some parameters are on the meta device device because they were offloaded to the cpu.
Question: 銀杏の木はどこで見ることができますか?
Answer: 銀杏の木はどこで見ることができますか?
西東京市には、武蔵野の雑木林や竹林が多く存在し、自然豊かな環境が広がっています。中でも、関町南4丁目・緑町にあるイチョウ並木は有名で、毎年秋になると黄金色のトンネルを作り出します。また、ひばりが丘団地の近くにも街路樹として植えられています。ほかにも、

モデルを最小のものに変更してみる

あまりに遅いので、loadmodel変数に格納するのを最小モデルにしてみました。
で、何回か叩いた結果が、こちら。

$ python llmquestion.py 銀杏の木はどこで 見ることができますか?
config.json: 100%|█████████████████████████████| 612/612 [00:00<00:00, 7.64MB/s]
pytorch_model.bin: 100%|█████████████████████| 381M/381M [00:06<00:00, 62.9MB/s]
generation_config.json: 100%|██████████████████| 116/116 [00:00<00:00, 1.33MB/s]
tokenizer_config.json: 100%|███████████████████| 326/326 [00:00<00:00, 2.46MB/s]
tokenizer.json: 100%|██████████████████████| 3.23M/3.23M [00:01<00:00, 3.19MB/s]
special_tokens_map.json: 100%|██████████████████| 129/129 [00:00<00:00, 991kB/s]
Question: 銀杏の木はどこで見ることができますか?
Answer: 銀杏の木はどこで見ることができますか?
私は、この木を私の娘が育てていることを知っています。しかし、この木は私たちが見つけることはできませんでした。
あなたはあなたがそのような場所を見つけるためにここにいるかもしれません。
それは私が知っているすべての場所です。
それは素晴らしい場所です!
私の妻は私に「なぜ、あなたはそれを見てくれないのですか?」と言いました
$ python llmquestion.py 今日はいい天気な んです。あなたは、どう思いますか?
Question: 今日はいい天気なんです。あなたは、どう思いますか?
Answer: 今日はいい天気なんです。あなたは、どう思いますか?
2019年2月21日
2019年3月5日
2018年11月29日
2018年11月8日
2018年10月24日
$ python llmquestion.py 豆腐を買ってきて ほしいです。
Question: 豆腐を買ってきてほしいです。
Answer: 豆腐を買ってきてほしいです。
また、1日のうちで1回だけしか食べない日があってもいいと思います。
1日に2回食べる場合は、そのときはお腹がすくので空腹時にお腹を満たすように食べればいいと思います。
また、1週間のうち3食を規則正しく食べることができれば、健康的な生活ができるでしょう。
また
$ python llmquestion.py こんばんわ。
Question: こんばんわ。
Answer: こんばんわ。
今日は、先週に引き続き、
2月7日(水)の診療時間のお知らせです。
9:00~13:00 / 14:30~19:00
14:30~20:00
(土曜日は17時まで、日曜は17時まで)
休診日:木曜・日曜・祝日

……ホラーかな?
まともな会話が成立しません。
まぁ、コイツを訓練して自分だけの素敵なモデルを作れという話なのでしょうが……。