
Paperspace Gradient で japanese-gpt-neox-3.6b を動かす
世はオープンソースLLMの戦国時代なのか、本日5月17日サイバーエージェント社と立て続けにrinna社からもオープンソースで36億パラメータを持つ言語モデル「japanese-gpt-neox-3.6b」が公開されました。こちらは対話形式のプロンプトにファインチューニングした「japanese-gpt-neox-3.6b-instruction-sft」も同時に公開されています。
早速Paperspace Gradientで動かしてみる
こちらの記事と同環境で実行しています。
実行環境
A100(80GB)
python 3.9.16
torch v2.0.1
transformers v4.29.2
リポジトリは以下の通り。
japanese-gpt-neox-3.6b
まずは汎用モデルの方を試してみようと思います。
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
tokenizer = AutoTokenizer.from_pretrained("rinna/japanese-gpt-neox-3.6b", use_fast=False)
model = AutoModelForCausalLM.from_pretrained("rinna/japanese-gpt-neox-3.6b")
if torch.cuda.is_available():
model = model.to("cuda")
def rinna(prompt: str, max_token: int = 128, temperatur: float = 0.7) -> str:
token_ids = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt")
with torch.no_grad():
output_ids = model.generate(
token_ids.to(model.device),
max_new_tokens=max_token,
min_new_tokens=max_token,
do_sample=True,
temperature=temperature,
pad_token_id=tokenizer.pad_token_id,
bos_token_id=tokenizer.bos_token_id,
eos_token_id=tokenizer.eos_token_id
)
output = tokenizer.decode(output_ids.tolist()[0])
return output
output = rinna('生成AI全盛のこの世の中でプログラマーは', 64, 0.5)
print(output)
生成AI全盛のこの世の中でプログラマーは不要になるのか? AIは人間を超えられるのか? そもそもAIとは何なのか? AIと人間の違いは何か? AIは人間を幸せにできるのか? AIの進化はどこまでいくのか? AIの進化は人類を滅ぼすのか? AIは人類を
output = rinna('生成AI全盛のこの世の中でプログラマーはこの先生きのこれるか?', 64, 0.5)
print(output)
生成AI全盛のこの世の中でプログラマーはこの先生きのこれるか? というか、もうプログラマーは不要なのか? という疑問が頭をよぎります。 でも、プログラマーが不要になる時代が来るのは、まだまだ先の話です。 プログラマーが不要になるのは、プログラマーが不要な仕事が、世の中にあふれるから
パラメータ数はOpenCALMよりも少ないが、体感ではrinna社のモデルの方が自然な応答を返しているような気がします。
japanese-gpt-neox-3.6b-instruction-sft
次は対話モデル。
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
tokenizer = AutoTokenizer.from_pretrained("rinna/japanese-gpt-neox-3.6b-instruction-sft", use_fast=False)
model = AutoModelForCausalLM.from_pretrained("rinna/japanese-gpt-neox-3.6b-instruction-sft")
if torch.cuda.is_available():
model = model.to("cuda")
def rinna(prompt: str, max_token: int = 128, temperature: float = 0.7) -> str:
token_ids = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt")
with torch.no_grad():
output_ids = model.generate(
token_ids.to(model.device),
do_sample=True,
max_new_tokens=128,
temperature=0.7,
pad_token_id=tokenizer.pad_token_id,
bos_token_id=tokenizer.bos_token_id,
eos_token_id=tokenizer.eos_token_id
)
output = tokenizer.decode(output_ids.tolist()[0][token_ids.size(1):])
output = output.replace("<NL>", "\n")
return output
こちらのモデルへの入力時には、「<NL>」という特殊文字で区切ったプロンプトを作成する必要があります。
prompt = [
{
"speaker": "ユーザー",
"text": "生成AI全盛のこの世の中でプログラマーはこの先生きのこれるのでしょうか。"
},
]
prompt = [
f"{uttr['speaker']}: {uttr['text']}"
for uttr in prompt
]
prompt = "<NL>".join(prompt)
prompt = (
prompt
+ "<NL>"
+ "システム: "
)
print(prompt)
ユーザー: 生成AI全盛のこの世の中でプログラマーはこの先生きのこれるのでしょうか。<NL>システム:
output = rinna(prompt)
print(output)
私はプログラミングが得意ではありません。しかし、私にとっては、AIは人間がより効率的に仕事をするためのツールです。</s>
ファインチューニングされているだけあって、かなり自然な応答を返してくれます。プレスリリースに掲載されている例ではどうでしょうか。
prompt = [
{
"speaker": "ユーザー",
"text": "日本のおすすめの観光地を教えてください。"
},
{
"speaker": "システム",
"text": "どの地域の観光地が知りたいですか?"
},
{
"speaker": "ユーザー",
"text": "渋谷の観光地を教えてください。"
}
]
prompt = [
f"{uttr['speaker']}: {uttr['text']}"
for uttr in prompt
]
prompt = "<NL>".join(prompt)
prompt = (
prompt
+ "<NL>"
+ "システム: "
)
print(prompt)
ユーザー: 日本のおすすめの観光地を教えてください。<NL>システム: どの地域の観光地が知りたいですか?<NL>ユーザー: 渋谷の観光地を教えてください。<NL>システム:
output = rinna(prompt)
print(output)
私は東京を訪れる観光客についてあまり知りませんが、いくつかのアイデアを挙げてみます。
- 原宿
- 浅草
- 国会議事堂
- 皇居
- スカイツリー
- 谷中
- 浅草寺
- スカイツリー
- 皇居</s>
皇居とスカイツリーが重複しているところは気になりますが、それっぽい応答は返してくれるよう。
所感
今日はなんて日だ。
現場からは以上です。
気軽にクリエイターの支援と、記事のオススメができます!