見出し画像

WSL2でcalm2-7b-chatを試してみる

CALM2は、サイバーエージェントが公開した日本語LLMです。
今回は calm2-7b-chatを試します。

準備

では、いつも通り始めましょう。

python3 -m venv calm2
cd $_
source bin/activate

続いて、パッケージのインストールです。

pip install torch transformers
pip install accelerate

pip listで何がインストールされているか確認しましょう。
そしてpythonを実行します。

$ pip list
Package                   Version
------------------------- -------------
ansiwrap                  0.8.4
attrs                     23.1.0
blinker                   1.4
certifi                   2023.7.22
charset-normalizer        3.2.0
click                     8.1.7
command-not-found         0.3
cryptography              3.4.8
dbus-python               1.2.18
distro                    1.7.0
distro-info               1.1+ubuntu0.1
entrypoints               0.4
fastjsonschema            2.18.0
find-libpython            0.3.0
httplib2                  0.20.2
idna                      3.4
importlib-metadata        4.6.4
jeepney                   0.7.1
jsonschema                4.19.0
jsonschema-specifications 2023.7.1
jupyter_client            8.3.1
jupyter_core              5.3.1
keyring                   23.5.0
launchpadlib              1.10.16
lazr.restfulclient        0.14.4
lazr.uri                  1.0.6
more-itertools            8.10.0
nbclient                  0.8.0
nbformat                  5.9.2
netifaces                 0.11.0
oauthlib                  3.2.0
papermill                 2.4.0
pip                       22.0.2
platformdirs              3.10.0
PyGObject                 3.42.1
PyJWT                     2.3.0
pyparsing                 2.4.7
python-apt                2.4.0+ubuntu2
python-dateutil           2.8.2
PyYAML                    5.4.1
pyzmq                     25.1.1
referencing               0.30.2
requests                  2.31.0
rpds-py                   0.10.2
SecretStorage             3.3.1
setuptools                59.6.0
six                       1.16.0
ssh-import-id             5.11
systemd-python            234
tenacity                  8.2.3
textwrap3                 0.9.2
tornado                   6.3.3
tqdm                      4.66.1
traitlets                 5.9.0
ubuntu-advantage-tools    8001
ufw                       0.36.1
unattended-upgrades       0.1
urllib3                   2.0.4
wadllib                   1.3.6
wheel                     0.37.1
zipp                      1.0.0
$ python
>>>

流し込み

tokenizerとmodelの準備です。

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, TextStreamer
import time

llm = "cyberagent/calm2-7b-chat"

# トークナイザーとモデルの準備
tokenizer = AutoTokenizer.from_pretrained(llm)
model = AutoModelForCausalLM.from_pretrained(
    llm,
    device_map="auto",
    torch_dtype="auto"
)

if torch.cuda.is_available():
    model = model.to("cuda")

TextStreamerを使うことで、応答結果がストリームで出力されるようになります。

streamer = TextStreamer(
    tokenizer,
    skip_prompt=True,
    skip_special_tokens=True
)

続いて、queryの関数定義。
せっかくchatを使うのですから、応答結果を踏まえて続きを回答してくれるようにしましょう。

def build_prompt(user_query, chat_history):
    prompt = "USER: " + user_query + "\n" 
    prompt += "ASSISTANT: "
    if chat_history:
        prompt = chat_history  + "<|endoftext|>\n" + prompt
    return prompt

def q(user_query, chat_history):
    start = time.process_time()
    # 推論の実行
    prompt = build_prompt(user_query, chat_history)
    input_ids = tokenizer.encode(
        prompt,
        return_tensors="pt"
    )
    output_ids = model.generate(
        input_ids.to(device=model.device),
        max_new_tokens=300,
        do_sample=True,
        temperature=0.8,
        streamer=streamer,
    )
    output = tokenizer.decode(
        output_ids[0][input_ids.size(1) :],
        skip_special_tokens=True
    )
    # print(output)
    chat_history = prompt + output
    end = time.process_time()
    print(end - start)
    return chat_history

試してみる

chat_history = ""
chat_history = q("小学生にでもわかる言葉で教えてください。ドラえもんとはなにか", chat_history)
# for debug
# print(chat_history)

ドラえもんと聞いて最初に思い浮かべるものは、漫画「ドラえもん」シリーズの主人公であるジャイアンとスネ夫にいじめられる、小学4年生の「野比のび太」が、未来からやって来たロ ボット「ドラえもん」と織りなす日常を描いたSF作品でしょう。

作品中には、「どこでもドア」や「タイムマシン」、「スモールライト」などの未来のアイテムが登場します。

また、「ドラえもん」というキャラクターは、未来から来たロボットで、猫型ロボットで、身長129.3cm、体重129.3kgということも特徴です。

「ドラえもん」は、日本だけでなく世界中で愛され、愛読されています。未来への夢と希望を私たちに届けてくれています。
21.337786600000015

cyberagent/calm2-7b-chatより

とても良い感じ。レスポンスも21秒と体感的にも違和感ないです。
続きを聞いてみましょう。

chat_history = q("続きを教えてください", chat_history)

野比のび太が困っていると、「ドラえもん」が「四次元ポケット」からさまざまなアイテムを出して解決しようとするのが、漫画「ドラえもん」の主なストーリー展開です。

「四次元ポケット」から出す道具は、未来の道具で不思議なものがたくさん登場します。

例えば、宇宙旅行をするための「宇宙探検セット」や、手から光を出す「光線銃」、空を飛ぶ「タケコプター」などがあります。

このように、「ドラえもん」は、未来の道具を使って野比のび太を助け、また、のび太自身も失敗から学び、最後には成功するというストーリーを通して、読者に勇気と希望を与えてくれます。

また、「ドラえもん」は、友情の大切さや、他人を思いやる気持ちなども教えてくれます。

このように、漫画「ドラえもん」は、未来の道具や不思議なアイテムという現実離れした要素と、友情や努力といった現実的な要素をバランスよく織り交ぜることで、子供たちの読者に夢や希望を与えるとともに、多くのことを教えてくれます。
29.335427900000013

cyberagent/calm2-7b-chatより

これは、いいかも。

FYI.

ちなみに、変数chat_historyの値はこんな感じになってます。

>>> print(chat_history)
USER: 小学生にでもわかる言葉で教えてください。ドラえもんとはなにか
ASSISTANT: ドラえもんと聞いて最初に思い浮かべるものは、漫画「ドラえもん」シリーズの主人公であるジャイアンとスネ夫にいじめられる、小学4年生の「野比のび太」が、未来からやって来たロボット「ドラえもん」と織りなす日常を描いたSF作品でしょう。

作品中には、「どこでもドア」や「タイムマシン」、「スモールライト」などの未来のアイテムが登場します。

また、「ドラえもん」というキャラクターは、未来から来たロボットで、猫型ロボットで、身長129.3cm、体重129.3kgということも特徴です。

「ドラえもん」は、日本だけでなく世界中で愛され、愛読されています。未来への夢と希望を私たちに届けてくれています。<|endoftext|>
USER: 続きを教えてください
ASSISTANT: 野比のび太が困っていると、「ドラえもん」が「四次元ポケット」からさまざまなアイテムを出して解決しようとするのが、漫画「ドラえもん」の主なストーリー展開です。

「四次元ポケット」から出す道具は、未来の道具で不思議なものがたくさん登場します。

例えば、宇宙旅行をするための「宇宙探検セット」や、手から光を出す「光線銃」、空を飛ぶ「タケコプター」などがあります。

このように、「ドラえもん」は、未来の道具を使って野比のび太を助け、また、のび太自身も失敗から学び、最後には成功するというストーリーを通して、読者に勇気と希望を与えてくれます。

また、「ドラえもん」は、友情の大切さや、他人を思いやる気持ちなども教えてくれます。

このように、漫画「ドラえもん」は、未来の道具や不思議なアイテムという現実離れした要素と、友情や努力といった現実的な要素をバランスよく織り交ぜることで、子供たちの読者に夢や希望を与えるとともに、多くのことを教えてくれます。
>>>


この記事が気に入ったらサポートをしてみませんか?