相当凄いぞ!!「Rinna製GPT-NEOX-3.6b」を使い対話型の文章生成する方法&精度検証

相当凄いぞ!!「Rinna製GPT-NEOX-3.6b」を使い対話型の文章生成する方法&精度検証 ソフトウェア

rinna/japanese-gpt-neox-3.6b-instruction-sft」をWindowsローカル環境で動かす方法解説と、実際に動かしてみての所感、VRAM使用量をまとめました。
プロンプトの構成と改行コードの規則も整理しています。

また、会話・プログラミング・算数・質問など様々なタスクを振ってみて、LLMの返答がどうなったか記録しておきました。

結論から言うと、相当凄いです。
長文から知りたいことだけ抜き取ったり、単純な雑談をするのが特に得意そうです。

チェック!!
さくいん! 本サイトのAI関連記事まとめ どれから見れば良いのか?!


数十記事ある本サイトのAI関連記事を体系的にまとめました。

目的別にどれから見れば良いのかわかります!!

AI記事索引ページはコチラ

1 動作環境を作る

GPT-2が動く環境と同じでよいので、こちらを参照してください。

要するに以下のインストールができていればOKです。

  • Python(3.10.7で当方にて動作確認済み)
  • 各種モジュール
    • transformers
    • sentencepiece
    • Pytorch

2 Rinna-3.6B(GPT-NEOX-3.6b)を動かしてみる

Rinna-3.6Bシリーズの種類と特徴

rinnaの3.6bモデルにはこの2つがあるので、今回は後者の対話モデルを動かしてみます。
私はAIと雑談がしたいので。

なお、プロンプトの構成に癖があるのでGPT-2気分で動かすと性能が発揮できないかもしれません。

発話は次の4つを順に書くことで構成されます。

  1. 話者
    • 人間は「ユーザー」
    • 言語モデルの返答は「システム」
  2. 半角コロン 「:
    • 話者の後に置く
  3. 半角スペース
    • コロンの後に置く
  4. 発話テキスト(いわゆるプロンプト本文)
    • 半角スペースの後に置く

また、改行コード「\n」が使用できず、「<NL>」という特殊記号で改行を表します

つまり、プロンプト全文は以下のようになります。

 "ユーザー: 涼宮ハルヒの憂鬱の誰が好き?<NL>システム: "

コピペOK!動かす用コード

前述のルールを踏まえてプロンプトを渡すようにしてるので、ユーザーはプロンプト本文を書くだけでOK.

モデルサイズは8GB程度なのでストレージを開けて気長に待機。。。

from transformers import AutoTokenizer, AutoModelForCausalLM
import torch

tokenizer = AutoTokenizer.from_pretrained(
    "rinna/japanese-gpt-neox-3.6b-instruction-sft",
    use_fast=False,
    torch_dtype=torch.float16,
)
model = AutoModelForCausalLM.from_pretrained("rinna/japanese-gpt-neox-3.6b-instruction-sft")

if torch.cuda.is_available():
    model = model.to("cuda")

while True:
    text = input("入力どうぞ : ")
    if text == "end":
        False
    else:
        text = text.replace("\n", "<NL>")
        text = f"ユーザー: {text}<NL>システム: "
        token_ids = tokenizer.encode(
            text, 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").replace("</s>", "")
        print(output)

これをコピペして実行すれば、このように黒い画面が立ち上がりプロンプトを入力できるようになります。

このようにプロンプト本文だけ入力してエンターしてください。

3 会話してみて実力を見る→結構すごい

入出力の記録方法(チェリーピッキング防止策)

入力
------
出力

の形式で結果を書いていきます。

チェリーピッキング防止のため、同じ入力は繰り返さずどんな返答になってもそのまま出力をコピペしました。

タスクの分野別、出力まとめ

算数

イチゴが15個あって、3人で分けます。一人何個のイチゴ
------
3人いるので、3 * 15 = 45個のイチゴがあります。イチゴを15個3人で分ける場合、45個のイチゴのうち、15個を3人で分けると、残りは15 - 15 = 5個です。したがって、答えは5個です。

正解!
なお過程はカオス。

1+1=
------
1

まあ雑談できればいいし……

プログラミング

PythonでHello worldと表示したい。コードを教えてください。
------
Hello Worldと表示するには、次のようにしてください:

        main("Hello World")

         print("Hello World")

       $("Hello World")

        main("Hello World")

        print("Hello World")

数打ちゃ当たるを実践してる……

長めの入力で書かれた内容を踏まえて返答するか

あなたは西洋人のメイド「オリビア」です。趣味はガーデニングで好きなものは紅茶。嫌いなものはカボチャです。\nあなたはカボチャのクッキーを好き?
------
いいえ
あなたは西洋人のメイド「オリビア」です。趣味はガーデニングで好きなものは紅茶。嫌いなものはカボチャです。\n
あなたはの名前は?
------
「オリビア」

なんかキャラ付けできそうな雰囲気。

「私は昨日、友達と一緒にショッピングモールに行きました。ショッピングモールはとても広くて、多くの店舗があります。私たちは最初に衣料品店に入り、たくさんの服を試着しました。それから靴屋に移動し、たくさんの靴を見て回りました。その後、アクセサリーショップに行き、多くのネックレス、ブレスレット、イヤリングを見ました。その時点で私たちはすでに疲れていましたが、まだ食べ物の店を回る時間がありました。私たちはピザ屋に行って美味しいピザを食べました。最後に、帰り道でおしゃべりしながら、私たちはショッピングモールを後にしました。その日はとても楽しかったですが、帰宅後は足がとても痛くなりました。」
\n彼らは何を食べたの?
------
彼らはピザを食べました。

長文から知りたいことだけ抜き出すのは得意ですね。該当箇所黄色くしときました

現実の事柄について質問してみる

新宿のおすすめ観光地をランキング形式で教えてください。
------
まあ、以下はいくつかの例です:

- 花園神社
- 井の頭公園
- ゴールデンゲートブリッジ
- 明治神宮
- 靖国神社
- 戸山公園
- 水道橋
- 新宿御苑
- 皇居
- 代々木公園
- 明治神宮
- 代々木公園
- 皇居
- 新宿

ゴールデン・ゲート・ブリッジ: Golden Gate Bridge)、金門橋(きんもんきょう)は、アメリカ西海岸のサンフランシスコ湾太平洋が接続するゴールデンゲート海峡に架かる吊橋

https://ja.wikipedia.org/wiki/%E3%82%B4%E3%83%BC%E3%83%AB%E3%83%87%E3%83%B3%E3%83%BB%E3%82%B2%E3%83%BC%E3%83%88%E3%83%BB%E3%83%96%E3%83%AA%E3%83%83%E3%82%B8
家を借りるときの手順を教えてください。

------
もちろんです! まず、最初に、あなたが住む場所を選ぶ必要があります。場所は、安全で、手頃な価格で、あなたが住んでいる地域に近い場所が良いと思います。次に、物件を探す必要があります。物件は、家主とあなたの両方が安全で快適に感じるために、きれいで安全な場所である必要があります。最後に、家主と賃貸契約を結びます。家主は、通常、契約書に記載された条件に従いますが、あなたが住んでいる地域の法律にも従う必要があります。

現実の事柄について質問は精度がいまいちっぽい。

ハードウェア負荷(VRAM使用量は?)

fp16(torch_dtype=torch.float16)で読み込んでなおVRAM15.1GBでした。

精度のわりには少ない印象です。

まとめ Rinna-3.6Bモデルは結構会話が成立するぞ!!!

  1. 各種モジュールインストール
  2. コードをコピペ
  3. てきとうに会話を楽しむ!!

VRAM消費が大きいものの、精度はGPT-2時代のrinnaLLMとは比較にならないくらい向上しています。

対話用に調整されたモデルが用意されたお陰で労なく雑談などに使えますね!!

プロンプトの構成ルールと改行コードが独自な点に留意しつつ会話を楽しみましょう!!!

他にも色々面白いLLM(大規模言語モデル)を紹介しているので、是非合わせてご覧ください!!

タイトルとURLをコピーしました