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)
とても良い感じ。レスポンスも21秒と体感的にも違和感ないです。
続きを聞いてみましょう。
chat_history = q("続きを教えてください", chat_history)
これは、いいかも。
FYI.
ちなみに、変数chat_historyの値はこんな感じになってます。
>>> print(chat_history)
USER: 小学生にでもわかる言葉で教えてください。ドラえもんとはなにか
ASSISTANT: ドラえもんと聞いて最初に思い浮かべるものは、漫画「ドラえもん」シリーズの主人公であるジャイアンとスネ夫にいじめられる、小学4年生の「野比のび太」が、未来からやって来たロボット「ドラえもん」と織りなす日常を描いたSF作品でしょう。
作品中には、「どこでもドア」や「タイムマシン」、「スモールライト」などの未来のアイテムが登場します。
また、「ドラえもん」というキャラクターは、未来から来たロボットで、猫型ロボットで、身長129.3cm、体重129.3kgということも特徴です。
「ドラえもん」は、日本だけでなく世界中で愛され、愛読されています。未来への夢と希望を私たちに届けてくれています。<|endoftext|>
USER: 続きを教えてください
ASSISTANT: 野比のび太が困っていると、「ドラえもん」が「四次元ポケット」からさまざまなアイテムを出して解決しようとするのが、漫画「ドラえもん」の主なストーリー展開です。
「四次元ポケット」から出す道具は、未来の道具で不思議なものがたくさん登場します。
例えば、宇宙旅行をするための「宇宙探検セット」や、手から光を出す「光線銃」、空を飛ぶ「タケコプター」などがあります。
このように、「ドラえもん」は、未来の道具を使って野比のび太を助け、また、のび太自身も失敗から学び、最後には成功するというストーリーを通して、読者に勇気と希望を与えてくれます。
また、「ドラえもん」は、友情の大切さや、他人を思いやる気持ちなども教えてくれます。
このように、漫画「ドラえもん」は、未来の道具や不思議なアイテムという現実離れした要素と、友情や努力といった現実的な要素をバランスよく織り交ぜることで、子供たちの読者に夢や希望を与えるとともに、多くのことを教えてくれます。
>>>