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)
実行時間: 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
)
モデルの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")
量子化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の開発が今後さらに加速しそうでとても楽しみです。
大ニュースが毎日のようにあって楽しいですね。明日も楽しみです。
現場からは以上です。