見出し画像

rinna社が日本語特化の対話GPT言語モデルを公開! VRAM6GBあれば動くかも。

rinna社から、日本語に特化した強化学習済みの「対話GPT言語モデル:rinna/japanese-gpt-neox-3.6b-instruction-ppo」をオープンソースで公開したとの大ニュースがありましたので、早速ためしてみます!😀

無料のGoogle Colabで動くお試し用の簡易プログラムも作ってみましたので、ぜひお試しください。

1.モデル特徴(プレス文から)

  • 36億パラメータ(3.6B)を持つ汎用GPT言語モデルをベースに、対話GPT言語モデルへのfine-tuningと強化学習を行っています。

  • 強化学習には、HH-RLHFの一部を日本語に翻訳したデータを用いています。

  • 強化学習済みのモデルは、Hugging Faceに商用利用可能なMIT Licenseで公開されています。

  • 特定の利用目的に対して性能を最適化させたい場合には、fine-tuningやin-context learningにより精度向上を目指すことができます。

  • 強化学習済みと強化学習前の対話GPT言語モデルの性能を、人間による評価とChatGPTによる自動評価で比較しました。両評価手法で、人間の評価を利用した強化学習による性能向上が確認されました。

    • 人間による評価

      • 良い 47%

      • 差がない 31%

      • 悪い 22%

    • ChatGPTによる自動評価

      • 良い 63%

      • 差がない 3%

      • 悪い 34%

2.ローカルPCでの動作確認

早速、HFの実行サンプルのままプロンプトを少し変えてローカルPCで試してみます。試していませんが、サイズが手ごろなのでgoogle colabでも十分動くと思います。

動作環境

  • OS:  Windows11 wsl2上 の ubuntu22.04

  • GPU: RTX3090 - VRAM 24GB

2.1 プロンプトの準備

prompt = [
    {
        "speaker": "ユーザー",
        "text": "最近、眠りが浅くい気がして改善できないかなぁと思っています。"
    },
    {
        "speaker": "システム",
        "text": "もう少し具体的に説明していただけますか?"
    },
    {
        "speaker": "ユーザー",
        "text": "すっきり起きられない気がします。日中も眠たくなります。"
    },
    {
        "speaker": "システム",
        "text": "分かりました、十分な睡眠を実感できていないということですね。睡眠時間はどれくらいですか?"
    },
    {
        "speaker": "ユーザー",
        "text": "6時間ぐらいなのですが...。どうすれば改善できるでしょうか。"
    }
]
prompt = [
    f"{uttr['speaker']}: {uttr['text']}"
    for uttr in prompt
]
prompt = "<NL>".join(prompt)
prompt = (
    prompt
    + "<NL>"
    + "システム: "
)

2.2 オプションなしで実行

import torch
from transformers import AutoTokenizer, AutoModelForCausalLM

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

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

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,
        repetition_penalty=1.1,
        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")
print(output)

一般的に、健康的な睡眠習慣を身につけるには、毎日規則正しい睡眠をとることが大切です。また、定期的な運動や瞑想などのリラクゼーション技術を使用することで、より良い睡眠を促進することもできます。さらに、寝つきを良くするために、温かいお風呂に入ることや、ストレッチやマッサージを行うことも効果的です。</s>

  • 実行時間: 19.8sec

  • モデルのVRAM消費は約15GB程度

2.3 float16で読み込み

model = AutoModelForCausalLM.from_pretrained(
    "rinna/japanese-gpt-neox-3.6b-instruction-ppo",
    device_map='auto',
    torch_dtype=torch.float16
    )

一般的には、健康的な睡眠習慣を身につけることが重要であり、規則正しい生活や運動、そして良質な睡眠をとることが大切です。また、寝具や照明などの環境を整える必要があります。さらに、定期的な運動は、慢性的な睡眠障害を治療するために非常に効果的であることが研究によって明らかになっています。</s

  • モデルのVRAM消費は約8GB強

  • 上と同じプロンプトで、実行時間:12.6sec

  • わたしには出力品質の差は特になく、両方とも自然な回答だと感じます。

2.4 【6/1訂正】8bit、4bitでも読み込めました!!

model = AutoModelForCausalLM.from_pretrained(
    "rinna/japanese-gpt-neox-3.6b-instruction-ppo",
    device_map={"": 0},
    # torch_dtype=torch.float16,
    load_in_4bit=True
    )

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

良質な睡眠をとるためには、運動や健康的な食生活などのライフスタイルの改善が必要です。また、リラクゼーション技術を学ぶことで、不安やうつ病を軽減することができます。さらに、瞑想やマインドフルネスの練習など、自分の考えや感情に気付き、それらをコントロールする練習をすることで、睡眠の質を向上させることができます。</s>

  • 量子化4bitオプション付きでは動かないと思い込んでしまいましたが、model.to("cuda")の部分をコメントアウトしたら、load_in_4bit=True、load_in_8bit=Trueのいずれのオプションでも読み込めました。明示的にmodel.to()しなくてもGPUで動いてます。お詫びして訂正いたします。😔 

  • 4bit量子化で読み込んだ場合、モデルのGPUメモリ消費は4GB程度、OSの消費分と合わせても6GBいかないので、ゲーミングノートとかの小さめのGPUにも載っちゃいますね。これ。

  • 実行時間:16.8sec。I/Oのオーバーヘッドも影響すると思うので、ほぼ差がない結果だと思います。

  • 品質低下も感じません。この日本語の品質でこの低燃費。すごくないですか。😆

2.5 おためし用の簡易プログラム

  • モデルの雰囲気をつかんでいただけるように、ローカルPCやGoogle Colabなどでチャットを試せる簡易プログラムを作りました。

  • 機能豊富なチャットアプリとか、ファインチューニングに関する話題は、ほかのツヨツヨのエンジニアさん達お任せします。よろしくお願いします!😉

3.感想

  • さすがrinna社が訓練しただけあって、とても自然な対話ができる印象を受けました。3.6b程度のサイズでも日本語でこんなに自然な出力が返ってくるのかと、正直おどろきです。

  • 家庭用のGPUで動くサイズなのもありがたい。かなり多くのゲーミングPC、ゲーミングノートで動かすことができるのでは?

  • おそらくrinna社の実力はこんなものではなく、並行してもっとすごいモデルも開発されているのではないかと想像します。そのような、ローカルPCで動かないような日本語特化の高性能モデルの有料APIサービスとかも、あれば面白そうだなぁと思いました。

  • 国の後押しもありそうですし、日本語に特化したLLMの開発が今後さらに加速しそうでとても楽しみです。

大ニュースが毎日のようにあって楽しいですね。明日も楽しみです。

現場からは以上です。


この記事が気に入ったらサポートをしてみませんか?