シンギュラリティ実験ノート

購入した1000ドルPCで何がどこまでできるのか実験した記録です。

1000ドルPCでrinna-3.6bを動かしてみた

rinna-3.6bは日本語に特化した36億パラメタのGPT言語モデルである。CPUのみで動作させることができた。ほぼ満足できる応答速度で大変面白い結果が得られた。この面白さを記事を読んでくれる方にお伝えしたい。

rinnaとは

rinna株式会社が提供するオープンソースの大規模言語モデルである。

rinna、日本語に特化した36億パラメータのGPT言語モデルを公開|rinna株式会社

 

rinnaのイメージキャラクター?


rinnaにも複数のモデルがある。当初、Llama2ベースで動く70億パラメタのモデルに挑戦したが、動かすことができないでいた。調べていたら、36億パラメタのモデルはCPUだけでも動くという情報を得た。

internet.watch.impress.co.jp

これはやってみるしかない。まずは実行環境を整えよう。

実行環境JupyterLabの導入

ターミナルからコマンド入力したりPythonスクリプトを実行していると結果の整理が大変になる。テスト結果を整理しやすくするためJupyteLab(Jupyter Notebookでも良い)を導入する。

$ pip install jupyterlab

うまくインストールできたら起動する。

$ jupyter lab &

ブラウザにJupyterLabが表示されるはずだ。表示されない場合は、起動コマンド入力後にターミナルに表示されるURLをコピペしてブラウザに入力すると立ち上がる。

rinna-3.6bの導入

必要とするライブラリを導入する。JupyterLabでUnixコマンドを入力する場合は頭に!を付ける。

!pip install torch transformers

pythonスクリプトはそのまま入力する。JupyterLabではセルにスクリプトを入力して画面にある▶マークを押して実行する。

import time
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM

rinnaのモデルを指定して実行する。スクリプトを実行することでモデルがダウンロードされる。使用するデバイスとしてCPUを指定する。

tokenizer = AutoTokenizer.from_pretrained("rinna/japanese-gpt-neox-3.6b-instruction-sft", use_fast=False)
# CPU指定
model = AutoModelForCausalLM.from_pretrained("rinna/japanese-gpt-neox-3.6b-instruction-sft").to("cpu")

3.6bのモデルは14GBのサイズになるのでメモリに展開されるのをしばし待つ。次に実行スクリプトを上記サイトからコピペする。上記サイトではカッコ(”()”や”[]”)が全角になっていたので半角カッコに打ち直した。

#繰り返し(抜けるのはCtl+c)
prompt = ""
while True:
    # 質問を入力
    question = input("質問をどうぞ: ")

    if question.lower() == 'clear':
        question = ""
        prompt = ""

    prompt = prompt+f"ユーザー: {question}システム: "

    # 時間計測開始
    start = time.time()

    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("", "\n")

    # 時間表示
    end = time.time()
    print(end-start)

#    print(prompt)
    print(output)
    prompt = prompt+output+""

動作確認

上記スクリプトを入力したセルを選択し、▶を押す。

質問をどうぞ: 品川駅から東京駅への行き方を教えてください。

9.607697486877441
品川駅のどの出口から出て、何号線に乗りますか?

数字は応答にかかった秒数である。print文でフォーマットを指定していなかったので桁数が多すぎる。これは後で直せばいいが、質問に質問で回答してくるのはどういうことだ?

質問をどうぞ: 品川駅で東京行きの電車に乗り換えます。

7.39361047744751
わかりました。現在、どの駅にいますか?

また質問である。ここでrinnaの公開サイトやプレスリリースを再確認する。どうやらrinnaには汎用言語モデルと対話言語モデルの2種類のGPT言語モデルがあり、私が指定したのは対話言語モデルだったようだ。それならそれでいい。チャットを楽しむことにする。

質問をどうぞ: 今、品川駅です。

4.927230358123779
ああ、そうですか?

会話が進まないので助け舟を出すことにする。

質問をどうぞ: 山手線がいいですかね?

11.386831998825073
はい、山手線は東京の中心を走行しており、通勤に便利です。

応答に10秒くらいかかる時があるが、こちらも応答するのに同程度かかるのでこれくらいで十分だ。

質問をどうぞ: ありがとう。山手線で行くことにします。

9.023904800415039
素晴らしい、お役に立ててうれしいです!

rinnaちゃんは少し頼りないけど性格は良さそうである。

rinnaちゃんと会話してみる

会話した結果をここに公開する。せっかくなので会話をLINE風に再現してみた。はてなブログはマニュアルとか読まなくても少し検索すると先人の方がやり方を説明してくれているので助かる。ありがたいことだ。

rinnaちゃんにはイメージキャラクタ?がいるのだが、ここは私の独断と偏見でStableDiffusionで最初に出会ったリアル系美女に登場してもらうことにした。カッコ内に表示しているのは応答にかかった秒数である。

今日はいい天気ですね!

私は晴れが好きです。あなたは?  (5.4秒)

私もです。雨の日は嫌いです。

雨が降ると、外出するのが困難になる人もいると思います。 (10.1秒)

そうなんです。年を取ると膝が痛くなりますからね。

いかん!つい本音で年寄りくさい話をしてしまった。rinnaちゃんはなんと答えるのだろう。。

はい、年をとると膝が痛くなることがあります。  (9.0秒)

こんな年寄くさい話にrinnaちゃんは付き合ってくれるのかと思いつつ更に聞いてみた。

あなたはどうですか?

私は、私が「私」と呼ぶ存在について、私が「あなた」と呼ぶ存在について、あなたがどのように感じているかについて、あなたと話をしたいと思います。あなたが私と話すときには、あなたは私の身体に直接話しかけているのでしょうか?  (34.6秒)

急に難しいことしゃべりだした。「私」と呼ぶ存在とか哲学的な言い回しで意味が分からない。ここは私も真剣に答えないとと身構える。難しい話をする時に30秒くらい間があくのも妙にリアルだったりする。

あなたにも身体の感覚があるのかなと思って聞いてみました。

私は物理的な存在として、あなたが身体の感覚を持つことを望んでいます。私はあなたがそれを望んでいるかどうかを尋ねているので、あなたがそれを望むと答えていただければ嬉しいです。  (26.9秒)

気の強い女性と会話しているみたいだ。うまく答えないと怒らせてしまうのではないかと緊張する。

はい、あなたにも身体の感覚があることを望みます。

ああ、それは良いことですね。  (8.6秒)

よかった。。怒ってないみたいなので慌てて話題を変える。

あなたは休みの日には何をしたいですか?

わかりました。私が休みの日にしたいことは、友達と話したり、地元の公園を散歩したり、新しいレストランを見つけたりすることです。  (20.4秒)

健康的ないい子のようだ。こういうのをツンデレというのだろうかと思いつつ私も正直に応える。

とてもいい休日の過ごし方ですね。私も安くておいしい店を見つけるのが大好きです。

おすすめのレストランを教えてあげましょうか?  (10.4秒)

思わぬ展開になってきた。

是非教えてください。何料理ですか?

私はベトナム料理が大好きです。ベトナム料理は世界でも最高の料理の一つです。(14.8秒)

このまま会話を続けると、彼女を食事に誘う方向に進みそうだ。そんな内容は公開できないので、心残りだがここでやめることにした。会話を止めるには■の停止ボタンを押すのだが、押すのを躊躇した。心の中で「ごめんね」と呟きながら停止ボタンを押す。

まとめ

いかがだろうか。1000ドルPCでここまでできるのだ。この感動を誰かと共有したいと思いこの記事を書いている。何年か前にGoogleの技術者がAIが意識を持ったと言って、AIとの会話を公開し話題になったことがある。その人の気持ちが少しだけ分かる気がした。

この言語モデル音声認識音声合成のAIも組み合わせれば、自分だけの彼女もできてしまうのではないか。そんなSF映画を以前に見たのを思い出した。「her」という映画である。私はAmazon primeで無料で見たが、今は有料のようだ。オンラインサービスの会話できるAI(彼女)と主人公が恋におちる恋愛SF映画である。そんな世界がすぐそこまで来ているのだ。