GPT4ALLを動かす

そしてGPT4ALL

GPT4ALLのレポジトリをクローン
https://github.com/nomic-ai/gpt4all

> git clone https://github.com/nomic-ai/gpt4all.git

ここからモデルをダウンロード
https://the-eye.eu/public/AI/models/nomic-ai/gpt4all/gpt4all-lora-quantized.bin

ダウンロードしたモデルはchatディレクトリに置いておきます。

そしてchatディレクトリでコマンドを動かす

> cd chat
> gpt4all-lora-quantized-win64

日本語は通らなさそう

GPUで試してみようと、gitに書いてある手順を試そうとしたけど、

D:\dev\nomic\gpt4all\chat>py -3.10 gpt4all-gpu.py
Traceback (most recent call last):
  File "D:\dev\nomic\gpt4all\chat\gpt4all-gpu.py", line 1, in <module>
    from nomic.gpt4all import GPT4AllGPU
ImportError: cannot import name 'GPT4AllGPU' from 'nomic.gpt4all'

というエラーが出たので断念。

日本語が通る大規模言語モデルCerebras-GPTを動かす

またなんか大規模言語モデルが公開されてましたね。
ということで、Cerebrasが公開したモデルを動かしてみます。日本語が通る感じ。
商用利用可能というライセンスなども含めて、一番使いやすい気がします。 https://huggingface.co/cerebras

ここでいろいろやってるようだけど、モデルを動かすスクリプトはありません。
https://github.com/Cerebras/modelzoo

なので、自分でモデルを動かすコードを書くということになるけど、VTS-Techさんがgistで公開しているスクリプトを使わせてもらいます。
https://gist.github.com/Veritas83/bb858a2039fe84cd35af4064c0aa44d8

-mでモデルサイズ、-cコマンドラインモード、-pでプロンプトを指定します。

>python VTSTech-GPT.py -m 590m -p "雨が降るときは" -c

ということだけど、-mが効いてないですが・・・。 日本語出てきますね。GPUは使わないので1.3Bや2.7Bでも動きましたが、6.7Bになると32GBメモリでは つらいようです。コードを直接いじってモデルサイズを指定しています。

pipelinedevice=0を追加するとGPUを使います。

pipe = pipeline("text-generation", model=model, tokenizer=tokenizer, device=0)

8GB VRAMで1.3Bは動きました。2.7Bは つらいかな。

やっぱりtransformersモジュールの使い方を知っておくほうがよさそう

FlexGenでおうちのパソコンとお話する

前のエントリでFlexGenも話題に出したので、メモを。
画像は、なんかStable DiffusionにFlexGenって入れていろいろやってたらかっこいいのが出たやつ。
おうちの8GB VRAM GPUでChatRWKVと会話する - きしだのHatena

FlexGenは、おうちでChat AIが動かせるぞって最初に話題になったやつですね。
https://github.com/FMInference/FlexGen

インストールは書いてあるとおりにやればいいと思うのだけど、いろいろハマりました。個人的に。
Python 3.10以前じゃないと動かないのだけど、インストールしてたのがPython 3.11で、以前いれてたPythonが散乱してたりしてハマり。普通の人はハマらない気がする。

なので、PyTorchも入れなおし。

> py -3.10 -m pip install -I torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

なんも考えなければpipでいけるぽい。

> pip install flexgen

でもまあgit cloneするやつにした。pyでバージョン指定している。

> git clone https://github.com/FMInference/FlexGen.git
> cd FlexGen
> py -3.10 -m pip install -e .

あとはflex_optで実行確認、ということなんだけど、このときhuggingfaceからモデルをダウンロードする。そしてこのモデルが~/.cache/huggingfaceになるのだけど、Cドライブに空きがないので別ドライブにしたい。

みんなcolabとかに入れてるから気にしないかもしれないんだけど、気にするのよ。
ということで、環境変数HF_HOMEにパスを設定すればいいという情報をChatGPTに教えてもらったので、設定する。

気をとりなおして、確認

> py -3.10 -m flexgen.flex_opt --model facebook/opt-1.3b

エラーがなければOK

VRAMが7GBちょい、GPUの共有メモリも使ってます。メインRAMも結構使ってますね。

それではチャットを。。。と動かそうすると、chatbot.pyを動かすという説明がいろいろ出てくるのだけど、いまはリポジトリから消えてます。
履歴をたどると2月の終わりのDelete Filesというコミットがあってそのときに消えてるので、発掘しておきます。
https://github.com/FMInference/FlexGen/blob/9d888e5e3e6d78d6d4e1fdda7c8af508b889aeae/flexgen/apps/chatbot.py

動かしてみます。

>py -3.10 -m flexgen.apps.chatbot --model facebook/opt-1.3b

ちゃんと動きますね。
日本語は通るように見えるんだけどわかってないっぽい。
英語にすると会話できるんだけど「世界をおみせしますよ。そこには浅い湖があります。」「虎がいます。泳げます」みたいな感じで、バカっぽくてよい。

モデルは1.3bの他に6.7bとか30bがあるので試してみます。
と思ったけど、メモリが足りなくてだめでしたね。
--compress-weightをつけます。

>py -3.10 -m flexgen.apps.chatbot --model facebook/opt-6.7b --compress-weight

動くけど、反応に30-40秒くらいかかりますね。そして、言葉すくなめな気がする。あまり会話ははずみませんね。なんか、バカな話をしたいのにマジメな質問をされて適当に答えている、という感じがw

VRAMは4.7GB使ってます。プロセッサもGPUもあまり使ってないので、何してるんだろう。

まあ、なんだか動いたので満足です。

だいたいtransformersライブラリを使っているので、このあたりを読んでおくのがいいのかなー

Alpaca.cppでおうちのパソコンとお話する

前回のエントリではChatRWVKを動かしたのだけど、Alpaca.cppもちょっと試してみてたのでメモを。
おうちの8GB VRAM GPUでChatRWKVと会話する - きしだのHatena

ほとんどの大規模言語モデルPythonで書かれてるけど、Alpaca.cppは名前のとおりC++で書かれてて、少ないリソースで動きます。
https://github.com/antimatter15/alpaca.cpp

インストールは、zipをダウンロードして解凍するだけ。
https://github.com/antimatter15/alpaca.cpp/releases/tag/81bd894

モデルはここからggml-alpaca-7b-q4.binをダウンロードして↑で展開したchat.exeと同じ場所に置くだけ。というか、上記は不要で、同じ場所にあるchat.exeを持ってくるだけで動いてくれますね。
https://huggingface.co/Sosaka/Alpaca-native-4bit-ggml

chatコマンドを実行すると、数分後にプロンプトを受け付けます。
日本語は受け付けてくれないけど、単純な問いには答えてくれます。そして普通に間違う。

検索の代わりという感じだとちゃんと答えてくれるのだけど、会話をしようとするとちょっと厳しいです。
しかし、CPUだけで動いてるにしてはかなり速いと思います。
まあ、気軽にChat AIを手元で試すというのにはいいですね。

おうちの8GB VRAM GPUでChatRWKVと会話する

ChatGPTが話題ですが、そういうのをおうちで動かしたいですよね。
ということで、おうちで動かしやすくて割と会話ができるChatRWKVを試してみます。

ChatGPTは実装は公開されておらず手元で動かすことはできません。けど、サービスがたまに落ちてたりするので手元で動かせるなにかがあると安心ですね。何より、こんな変な技術を手元で動かしたい。
そこで手元で動かせるLLMとしてFlexGenが話題になりましたが、それでも強力なGPUが必要です。
https://github.com/FMInference/FlexGen

そして低リソースで動かせる実装としてAlpaca.cppなんかも出ましたが、そこまで賢くない感じ。
https://github.com/antimatter15/alpaca.cpp

そこに現れたのがChatRWKVです。一般のご家庭の8GB VRAMのGPUで動かせつつ、結構ちゃんと会話ができます。
https://github.com/BlinkDL/ChatRWKV

TransformerじゃなくてRNNであることで計算量を押さえれてるらしいです。Transformerが出てきてRNNは用なしになってしまったかと思ったら、そんなことはなかったですね。

ChatRWKVのインストール

いろいろいじりたいのにで、ちゃんとローカルに入れます。
インストールといっても特別な手順は不要で、上記GitHubリポジトリをCloneするかダウンロードします。

動かすのはv2/chat.pyです。

tokenizesとprompt_toolkitあたりが必要なので、インストールしておきます。

> pip install tokenizers prompt_toolkit

あと、PyTorchがCUDA対応じゃなくてGPUで動かせなかったのでインストールします。
ここでpipコマンドを生成。
https://pytorch.org/get-started/locally/

強制インストールするために-Iを付けておきます。大文字のアイ。

pip3 install -I torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

モデルのダウンロード

言語モデルは別でダウンロードが必要です。大きさが数段階あって、動かし方も選べるのだけど、目安のメモリ量はこんな感じ。

https://pypi.org/project/rwkvstic/

モデルはここからダウンロードします。まあ3B、7B、14Bくらいになるんではないかと。
https://huggingface.co/BlinkDL

小さいモデルで動かしてみる

3Bを動かしてみます。 RWKV-4-Pile-3B-20221110-ctx4096.pthをダウンロードして適当な場所に置いておきます。
https://huggingface.co/BlinkDL/rwkv-4-pile-3b

v2/chat.pyをいじって、次のような設定をします。

args.strategy = 'cuda fp16'
args.MODEL_NAME = 'RWKV-4-Pile-3B-20221110-ctx4096.pth'

fp16i8にすれば、4GB VRAMでも動くかもしれません。動かなかったら後述の7Bで試しているよう、CPUと組み合わせればいけそう。

MODEL_NAMEにはダウンロードしたモデルを指定します。ウィンドウズでもバックスラッシュじゃなくスラッシュを使えって書いてある。

さて起動するとこんな出力になります。

これで6GBくらいVRAM使います。

コマンドはこんなのが用意されてます。

Commands:
say something --> chat with bot. use \n for new line.
+ --> alternate chat reply
+reset --> reset chat

+gen YOUR PROMPT --> free generation with any prompt. use \n for new line.
+qa YOUR QUESTION --> free generation - ask any question (just ask the question). use \n for new line.
+++ --> continue last free generation (only for +gen / +qa)
++ --> retry last free generation (only for +gen / +qa)

レスポンス、かなり速いです。

Javaコードもなんか生成してくれます。動かなそうだけど。

少し大きいモデルで動かす

それでは、少し大きい7Bモデルを動かしてみます。ここからダウンロード。
https://huggingface.co/BlinkDL/rwkv-4-pile-7b

RWKV-4-Pile-7B-20230109-ctx4096.pthがlikely bestらしいのでこれを。 8GB VRAMで7Bを動かすにはGPUを8bitで動かしつつ後段をCPUで動かすことが必要です。

args.strategy = 'cuda fp16i8 -> cpu fp32 *10'
args.MODEL_NAME = 'RWKV-4-Pile-7B-20230109-ctx4096.pth'

8K token用にはRWKV-4-Pile-7B-20230313-ctx8192-test380.pthがいいと書いてあります。長くない場合には4096より性能が劣るっぽい。

メモリは5.9GB使ってます。

動作速度としてはこんな感じ。

全体としてこんな感じのコードが生成されました。
最初に脈絡なく出てるint count;をクラスに含めるだけで、とりあえず実行できる。

なんか小さいモデルでちゃんと動くコードが生成されてすごい。

14Bを動かしたいけど8GB VRAMだと無理そう。なのでフルCPUでやる必要があるけど、3時間たっても読み込みが終わらずで試せてません。 7Bでかなり賢いので、結構期待しています。

(6時間まったら読み込み終わったけど、そのあと入力しても反応なし・・・おそらく4時間くらい待つと1単語くらい出力されると思う)

こうやって使えるモデルが手元で動くと、いろいろ試せて楽しそうです。

LLMを動かすのに一番コスパがいいのはRTX3060で、12GBメモリ載っていますね。入手しておくか。

ChatGPTは長期記憶と短期記憶を持っている

そういえば、ChatGPTには長期記憶と短期記憶がありますね。

ChatGPTはニューラルネットワークベースのAIです。そして、ニューラルネットワークではネットワークノードの接続の重みとしてデータが保持されます。この重みがパラメータと呼ばれています。
GPT4ではパラメータが100兆のようなうわさがあったり否定されていたりしますが、そういった量のデータを保持しています。
この重みがなんだかよくわからないけど法隆寺がどんなものかという情報になっていたり、プログラミング言語のルールや計算規則になっていたりします。そのかわり、はっきりとした形は残っていないはずです。

これは時間をかけて学習していて、簡単には消えないので、長期記憶に対応します。
また、新たな記憶を学習するにも時間がかかり負荷もかかるのでサービスの提供と同時に行うのは難しく、別系統のシステムで再学習を行うはずです。もしサービス用のシステムを直接学習させるのであれば、反応速度を落とした睡眠のようなことが必要になると思います。

一方でチャットを行うときに、前に何を言ったか覚えていてくれますね。
昨日も石取りゲームをやってみましたが、与えたルールや直前の石の状況をちゃんと覚えていてくれます。

このチャットの履歴はニューラルネットには記憶として投入されておらず、普通のWebアプリと同様にバックエンドシステムの変数だかキャッシュサーバーだかにそのままの形で残っているはずです。先日の情報漏洩の説明をみると、Redisっぽいですね。
ChatGPTで個人情報漏えい OpenAIが原因と対策を説明 - ITmedia NEWS

このチャット履歴は、他のユーザーだけではなく自分の他のチャットとも共有されません。
新たにチャットを始めると、なかったことになります。つまり、これは短期記憶になっています。

恐らくこれを長期記憶と短期記憶だとか意識して実装しては いないと思うのだけど、そんな感じの仕組みになっているのが面白いです。

ChatGPTでクオリアを説明するときの「メアリーの部屋」

前のエントリへのコメントで、メアリーの部屋という記述が出てるのだけど、むしろこのChatGPTでクオリアを説明する考え方を補強できる話ではないかと。

メアリーの部屋というのは、白黒しか見えない部屋に住んでいる色彩専門家メアリーが、色に関する知識は多くもっているけど実際の色を感じたことはなく、そしてそれが白黒の部屋を出て色を感じるようになったときにどういう認識が起きるかという話です。

これはChatGPTでとても説明しやすい話ではないかと思います。

GPT3.5までは言語処理だけを行うAIで、色に関する知識や表現、言葉遣いは深く理解していても、色の情報を感じることはできていませんでした。これがGPT4になるとマルチモーダルで画像情報も扱えるようになっているので、色の知識や表現と実際の色の情報を結び付けることができるようになっています。

これを、GPT3.5の拡張として追加学習の形で画像情報を扱えるようにするとどうなるかという話にすると面白いのですが、「メアリーの部屋」はGPT4を白黒画像だけで学習させたあとにカラー画像を見せるとどうなるかという話になります。
そうするとただの転移学習やファインチューニングの話になって、「なんかようわからんけどうまく学習するのでは」という感じになるように思います。
クオリアのように扱えるトークン候補が色彩を反映したものになるのではないかと。

想像ですが、GPT4内部で出力されるトークンは単語だけではなく画像などの情報も重ね合わせたものになっていて、ユーザーへの出力用に単語を取り出す感じになっているかもしれないなと思っています。