ELYZAの曾根岡さんが「ELYZAでも商用利用可能な大規模言語モデルを作ったので使ってみてください」というので、使ってみた。
最大の特徴は、他の言語モデルと違い、Llama2をベースとしながらも、Llama2のトークナイザーに日本語がほとんど含まれていないという欠点を解消するために独自にトークナイザーを拡張したこと。これによりトークン数を節約できるようになり、2倍近くスピードが上がったとのこと。これはファインプレー。このトークナイザーだけでも使える。
そして日本語能力テストでぶっちぎりの性能
というわけでワクワクしながら試してみた。
マシンはもちろんドスパラ製Memeplexマシン(A6000x2)を使用。だが7Bなので普通のご家庭の12GBくらいのGPUでも動くかも?
こんな感じで下準備した。
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
B_INST, E_INST = "[INST]", "[/INST]"
B_SYS, E_SYS = "<<SYS>>\n", "\n<</SYS>>\n\n"
DEFAULT_SYSTEM_PROMPT = "あなたは誠実で優秀な日本人のアシスタントです。"
model_name = "elyza/ELYZA-japanese-Llama-2-7b-instruct"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype="auto")
if torch.cuda.is_available():
model = model.to("cuda")
def q(text):
prompt = "{bos_token}{b_inst} {system}{prompt} {e_inst} ".format(
bos_token=tokenizer.bos_token,
b_inst=B_INST,
system=f"{B_SYS}{DEFAULT_SYSTEM_PROMPT}{E_SYS}",
prompt=text,
e_inst=E_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)
さて、デフォルトがけっこうトリッキーな文章生成なのでどストレートな質問をぶつけてみた。
おおお。
これはGPT4くらいいい感じじゃないの?
数を決めて考えさせるというのもやってみた。
すごい。どこのPOPEYEを読んだんだ。
(いまどきそれは読まないか)
契約書を書かせてみる
処方箋はどうか
物語もいけるか?
なかなか良い感じ。
プログラムを改造してもっと長い文章を出せるようにしてみる。
うほ。こりゃすごい。ちゃんと綺麗にオチがついてる。
何食ったらこうなるんだ
ちなみにELYZAがトークンの増やし方についてソース付きで解説してくれてます。神としか