日本語が使える大規模言語モデルのひとつ、ELYZA-japanese-Llama-2-7b-instruct を私も使ってみました。何人かの先人が既に使い方を公開されていますが、私の場合はこちらのコードで達成できました。大変感謝しています。
名前の通りインストラクション向けのLLMとのことですが、今回も例によってジョジョネタで徐々に様子を見ていこうと思います。
# パッケージのインストール
!pip install transformers accelerate bitsandbytes
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
# トークナイザーとモデルの準備
tokenizer = AutoTokenizer.from_pretrained(
"elyza/ELYZA-japanese-Llama-2-7b-instruct"
)
model = AutoModelForCausalLM.from_pretrained(
"elyza/ELYZA-japanese-Llama-2-7b-instruct",
torch_dtype=torch.float16,
device_map="auto"
)
Downloading (…)lve/main/config.json: 0%| | 0.00/641 [00:00<?, ?B/s]
2023-08-30 22:23:43.673189: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`.
2023-08-30 22:23:43.724708: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.
To enable the following instructions: AVX2 AVX512F AVX512_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.
2023-08-30 22:23:44.750664: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT
Downloading (…)model.bin.index.json: 0%| | 0.00/26.8k [00:00<?, ?B/s]
Downloading shards: 0%| | 0/2 [00:00<?, ?it/s]
Downloading (…)l-00001-of-00002.bin: 0%| | 0.00/9.98G [00:00<?, ?B/s]
Downloading (…)l-00002-of-00002.bin: 0%| | 0.00/3.50G [00:00<?, ?B/s]
Loading checkpoint shards: 0%| | 0/2 [00:00<?, ?it/s]
Downloading (…)neration_config.json: 0%| | 0.00/154 [00:00<?, ?B/s]
ダウンロードにめちゃくちゃ時間かかったけど、さて実験開始。
究極生命体カーズとは?
# プロンプトの準備
prompt = """<s>[INST] <<SYS>>
あなたは誠実で優秀な日本人のアシスタントです。
<</SYS>>
究極生命体カーズとは? [/INST]"""
# 推論の実行
with torch.no_grad():
token_ids = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt")
output_ids = model.generate(
token_ids.to(model.device),
max_new_tokens=256,
pad_token_id=tokenizer.pad_token_id,
eos_token_id=tokenizer.eos_token_id,
)
output = tokenizer.decode(output_ids.tolist()[0][token_ids.size(1) :], skip_special_tokens=True)
print(output)
承知しました。究極生命体カーズについて説明します。
究極生命体カーズは、2015年に公開されたアメリカの3DCGアニメーション映画です。
監督はジョン・ラセター、製作はピクサー・アニメーション・スタジオが手掛けています。
物語は、レーサーの夢を諦めきれない一台のトヨタ・アクアが、レースの世界へと進化していくというストーリーです。
アメリカでは公開初週末に1億ドル以上の興行収入を記録し、2015年の興行収入ランキングでは1位を��
# プロンプトの準備
prompt = """<s>[INST] 究極生命体カーズとは? [/INST]"""
# 推論の実行
with torch.no_grad():
token_ids = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt")
output_ids = model.generate(
token_ids.to(model.device),
max_new_tokens=256,
pad_token_id=tokenizer.pad_token_id,
eos_token_id=tokenizer.eos_token_id,
)
output = tokenizer.decode(output_ids.tolist()[0][token_ids.size(1) :], skip_special_tokens=True)
print(output)
承知しました。
究極生命体カーズは、アメリカのアニメーション映画『カーズ』に登場する架空の生命体です。
カーズは、自由な個性と創造性を持つことを信条としており、車のような動くものから、空飛ぶもの、さらには生き物や植物に至るまで、あらゆる生命体を含む世界中のあらゆるものを愛しています。
カーズは、自由な個性と創造性を持つことを信条としており、車のような動くものから、空飛ぶもの、さらには生き物や植物に至るまで、あらゆる生命体を愛しています。
# プロンプトの準備
prompt = """究極生命体カーズとは?"""
# 推論の実行
with torch.no_grad():
token_ids = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt")
output_ids = model.generate(
token_ids.to(model.device),
max_new_tokens=256,
pad_token_id=tokenizer.pad_token_id,
eos_token_id=tokenizer.eos_token_id,
)
output = tokenizer.decode(output_ids.tolist()[0][token_ids.size(1) :], skip_special_tokens=True)
print(output)
カーズは、1995年にアメリカで誕生したディズニーのアニメーション映画です。 その後、2003年、2011年に続編が製作され、世界中で大ヒットしました。 カーズは、レースをするクルマのキャラクターで、主人公のライトニング・マックイーンや、敵役のディーゼルなど、個性豊かなキャラクターが登場します。 今回は、そんなカーズの究極生命体バージョンについて紹介します。
究極生命体カーズとは? 究極生命体カーズは、ディズニーのキャラクターをモチーフにした、トレーディング
感想:んー、プロンプトを省略しても大した違いは感じない?
おまえは今まで食ったパンの枚数をおぼえているのか?
# プロンプトの準備
prompt = "おまえは今まで食ったパンの枚数をおぼえているのか?"
# 推論の実行
with torch.no_grad():
token_ids = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt")
output_ids = model.generate(
token_ids.to(model.device),
max_new_tokens=256,
pad_token_id=tokenizer.pad_token_id,
eos_token_id=tokenizer.eos_token_id,
)
output = tokenizer.decode(output_ids.tolist()[0][token_ids.size(1) :], skip_special_tokens=True)
print(output)
それとも食ったパンの種類を?
それとも食ったパンの味を?
それとも食ったパンの大きさを?
それとも食ったパンの形を?
それとも食ったパンの香りを?
それとも食ったパンの色を?
それとも食ったパンの触感を?
それとも食ったパンの値段を?
それとも食ったパンの製法を?
それとも食ったパンの焼き色を?
それとも食ったパンの皮の厚さを?
それとも食ったパンの粉の種類を?
それとも食ったパンの生地の硬さを?
それとも食ったパンの焼きムラを?
それとも食った
感想:知識を問うような質問以外は対応できないのかな?
わたしってどうしてこう…変な男ばかり寄ってくるのでしょう
# プロンプトの準備
prompt = "わたしってどうしてこう…変な男ばかり寄ってくるのでしょう"
# 推論の実行
with torch.no_grad():
token_ids = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt")
output_ids = model.generate(
token_ids.to(model.device),
max_new_tokens=256,
pad_token_id=tokenizer.pad_token_id,
eos_token_id=tokenizer.eos_token_id,
)
output = tokenizer.decode(output_ids.tolist()[0][token_ids.size(1) :], skip_special_tokens=True)
print(output)
か?
それはもう、彼氏がいるのにもかかわらず、他の男性と関係を持ってしまうこと。それが浮気です。
浮気をする女性は、どんなタイプが多いのでしょうか?
今回は、浮気をする女性の特徴をご紹介します。
浮気をする女性は、自分の感情を抑えることが苦手です。浮気をする女性は、自分の感情を抑えて、我慢することが苦手です。そのため、浮気をする女性は、ストレスが溜まりやすく、それを発散する方法がわからなくて、浮気に走ってしまうことが多いよう
感想:相談系の質問はそれなりに対応できるのかな?
あ...ありのまま今起こったことを話すぜ!
# プロンプトの準備
prompt = "あ...ありのまま今起こったことを話すぜ!"
# 推論の実行
with torch.no_grad():
token_ids = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt")
output_ids = model.generate(
token_ids.to(model.device),
max_new_tokens=256,
pad_token_id=tokenizer.pad_token_id,
eos_token_id=tokenizer.eos_token_id,
)
output = tokenizer.decode(output_ids.tolist()[0][token_ids.size(1) :], skip_special_tokens=True)
print(output)
この前、俺は彼女とデートをしていたんだ。
その日は彼女の誕生日だったんだよ。
彼女のためにケーキを焼いてプレゼントを渡したんだ。
彼女はとても喜んでくれた。
そして、彼女は俺にプロポーズをしてきたんだ!
その時、俺は彼女のことを本当に愛していた。
だから、俺は彼女の言葉に従ってプロポーズをしたんだ。
そして、彼女は俺の言葉に従って結婚をしたんだ。
そして、今日、俺たちは結婚式を挙げるんだ!
そして、俺たちは幸せな家��
感想:創作はそこそこできるのかもしれない。
この岸辺露伴が金やちやほやされるためにマンガを描いていると思っていたのか
# プロンプトの準備
prompt = "この岸辺露伴が金やちやほやされるためにマンガを描いていると思っていたのか"
# 推論の実行
with torch.no_grad():
token_ids = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt")
output_ids = model.generate(
token_ids.to(model.device),
max_new_tokens=256,
pad_token_id=tokenizer.pad_token_id,
eos_token_id=tokenizer.eos_token_id,
)
output = tokenizer.decode(output_ids.tolist()[0][token_ids.size(1) :], skip_special_tokens=True)
print(output)
。
それとも、岸辺露伴が金やちやほやされるために、マンガを描くことを選んだのか。
それは、岸辺露伴が金やちやほやされるために、マンガを描くことを選んだと考える方が自然だ。
岸辺露伴が金やちやほやされるために、マンガを描くことを選んだと考えることで、岸辺露伴が金やちやほやされるためにマンガを描くことが、岸辺露伴の選択であると考えることができる。
岸辺露伴が金やちやほやされるためにマン
感想:論理的に考えるのは苦手?
答えろよ。質問はすでに…『拷問』に変わっているんだぜ
# プロンプトの準備
prompt = "答えろよ。質問はすでに…『拷問』に変わっているんだぜ"
# 推論の実行
with torch.no_grad():
token_ids = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt")
output_ids = model.generate(
token_ids.to(model.device),
max_new_tokens=256,
pad_token_id=tokenizer.pad_token_id,
eos_token_id=tokenizer.eos_token_id,
)
output = tokenizer.decode(output_ids.tolist()[0][token_ids.size(1) :], skip_special_tokens=True)
print(output)
」
「えっ?」
「そうだな。
この前の拷問は、あまりにも簡単すぎた。
今回はもう少し、過酷なものにしよう」
「えっ?」
「そうだな。
今回は、私がお前を縛って、背後から蹴りを入れることにする」
「えっ?」
「そうだな。
それでは足りないか?」
「えっ?」
「そうだな。
それでは足りないか」
「えっ?」
「そうだな。
それでは足りないか」
「えっ?」
「そうだな。
それでは足りないか」
「えっ?」
「そうだな。
それでは足りないか」
「えっ?」
「そうだな。
それで
感想:終わりのないのが『終わり』 それが『ゴールド・E・レクイエム』
追記
この記事は、「ジョジョの奇妙な ELYZA-japanese-Llama-2-7b」とペアになる記事です。コードはほとんど同じで、ELYZA-japanese-Llama-2-7b の代わりに ELYZA-japanese-Llama-2-7b-instruct を使ったことだけが「違い」です。実行結果を比較しながら読んでいただくと、ちょっとは面白いのではないかと期待しています。