見出し画像

Paperspace Gradient で japanese-gpt-neox-3.6b を動かす

mah_lab / 西見 公宏

世はオープンソース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>

皇居とスカイツリーが重複しているところは気になりますが、それっぽい応答は返してくれるよう。

所感

今日はなんて日だ。

現場からは以上です。

この記事が気に入ったら、サポートをしてみませんか?
気軽にクリエイターの支援と、記事のオススメができます!