RWKV14Bを日本語AlpacaデータセットでLoRAして公開しました(ご家庭で動く!?)
布留川npaka大先生がRWKVのファインチューニングする方法を公開していたのだが、Google Colabでは7Bが限界で14Bは失敗したらしい。
人はいつでも、誰かのお役に立つチャンスを伺っている。
今こそ千載一遇のチャンス!ドスパラ様から我らがMemeplexのために開発していただいた、怒涛のA6000x2マシンが火を吹く時が来た!みんな!パソコン買うならドスパラ!AIやるならドスパラだぜ!忘れないでくれよな!(※ドスパラはMemeplexにスポンサーしています)
大先生がGoogle Colabで14Bの学習に失敗したのは、学習時のメインメモリの消費が80GBを超えてしまったからだそうだ。
ならば大丈夫。我らがドスパラ謹製Memeplexマシンは、A6000(VRAM48GB)を二枚搭載した上に、メインメモリは怒涛の256GB。もともとRAMディスクとして使うことを想定していたものの能力を解放すれば良いのだ。ベースとしたのはPileベースの14Bモデル。Ravenをファインチューニングすることも考えたが、RavenはもともとAlpacaでファインチューニングされているので差が出にくいと想定。
というわけで、丸一日学習させてみた。
LoRA適用前のRWKV14Bモデルとの日本語の会話
LoRAで日本語Alpaca_cleanredで学習したモデルとの会話
RWKV14Bが28.3GBと巨大なのに対して、ファインチューニングした差分であるLoRAデータのサイズは25MB程度と驚異的に少なく、うまく組み合わせれば推論だけならもっとVRAMが少ない環境で動作させることができるはずだ。実際、学習が安定しているときの消費メモリは32GBくらいで、Colabで83GBに達してメモリエラーとなったのは一時的なものだと思われる。
HuggingFace
今回学習したLoRAデータはHuggingFaceに公開したのでぜひ遊んでいただきたい。また、現在も継続的に学習を行なっていて、随時更新していく予定。
https://huggingface.co/shi3z/RWKV-LM-LoRA-Alpaca-Cleaned-Japan
蛇足・というか考察
やはり機械学習ものは自分の手を動かして学習してみないことには何もわからない、と思った。
ファインチューニング版が最初の「こんにちは」に対して「こんちには。こんにちは」を連続して返してくるのは大規模言語モデル特有の「あるある」である。以前LSTMで試した時も、ある瞬間から同じ文字列をひたすら繰り返すという反応がよくあった。RNNでよく見られた現象なのでRWKVがRNNであることに関係するのかとも思ったが、Transformerモデルでも普通によくある現象なのであまり比較しても意味がないだろう。ひょっとするとGPTは内部的にこういう反復を見つけたら生成をやりなおさせているのかもしれない(それだけで相当賢そうに見えるはずである)。
これはひょっとするとGPT3.5以降の特徴かもしれず、Transformerの原理から言えば本来は出力が一定速度で得られるはずなのに、ときどき止まったり考えたりしているように見えるのは、「へんなことを言い出したかどうか」を途中で検知して途中から修正させている可能性がある。
RWKVの場合、そもそもストリームモデルなので躊躇なく出てきてしまうが、もっと原始的な方法で「繰り返しパターンがでてきたら最初の一個でやめさせる」ようなガードレールを作ることはできるだろう。
そして、具体的な知識は全くダメだが、それはGPT3.5、GPT4にも共通する欠点で、そもそも具体的な知識を知らない/持ってないから当然とも言える。しかし、抽象的な質問や科学的な質問に答えられるのは、Alpacaデータセットにそもそもそういう質問と回答のセットが多く含まれていることから自明だ。
ということは、闇雲にたくさんのデータを食わせるというよりも、やはり目的に応じたデータを作って食わせた方が遥かに良い結果を生むのではないか。僕はそんな気がしている。
HuggingGPTと呼ばれているLLaMAベースのOpenAssistantデータセットのモデルは確かに凄そうなのだが、ライセンス的にLLaMAに汚染されているため学術利用に限定されている。
RedPajamaの事前訓練済みモデルの登場が待たれる。
僕ももっと精神的に余裕があったらRedPajamaで手元のRWKV14Bを訓練したいんだけど。RedPajamaって、データセットの塊がどこかにデン、とあるわけじゃなくて、RedPajamaのデータセットをプログラムを走らせて整形したりしなきゃなんないのでけっこう面倒なのである(まあそれでもないよりずっといいのだが)。
もしくは、Databricks社のDolly-v2を使って設問を作らせ、クリーンなAlpaca風データセットを作るという手もある。
いずれにせよ、ついにスーパーコンピュータでなくても、理論上は軽自動車一台くらいの投資でご家庭に置ける程度のコンピュータで、インハウスの大規模自然言語モデルが構築できるようになったことは素直に喜ばしいことだ。
これからもっともっと大規模言語モデルに「なにを学習させるべきか」という本質的な議論が進むだろう。プロンプト芸に時間を浪費している場合ではないのである。人間、中身だ。AIだってそうだろう。
そのためには、「どんなプロンプトがいいか」を極めることもまあ面白いのだろうが、それよりも、「どんなデータでファインチューニングするか」「実際にどのような実用的な目的にAIを使いたいと考えるか」を考えた方がいいのではないか。少なくとも僕はそう思う。
たとえば要約タスクなら(LLaMA/RedPajamaもやっているように)arxivの本文とabstructの対応を学習させるのが最も効率的だろうし(だって人間が過去につくった膨大な要約タスクのデータセットだから)、英語を日本語に翻訳させるなら、ニュースサイトの同一ニュースについての訳(対訳ではなく)を学習させるほうが効率的かもしれない。
人間のように話をさせたいなら、人間の、しかも固定された特定の人間のツイートを学習させるほうが効果的だと思うし、ダンジョンマスターをやらせたいなら、ソードワールドのリプレイ集でも読ませた方が手っ取り早いはずだ(誰か著作権的にクリアな電子化されたTRPGのリプレイ集をもっていたらぜひLoRAで試すか僕に貸して欲しい)。
とにかく今日は、僕が初めて最近の大規模言語モデルを「ちゃんと手触りをもって」使えたという記念すべき日である。やっぱり手元で学習させられないものは、どうしてもどこかよそよそしく感じるし、面白みも薄れてしまうのである。
要は、ここまできてようやく「よし、あとはデータだ」というところに来たのだ。
そのためにはGPT4のようなマルチモーダルでの学習なんかも有効になるだろう。GPT4がどのような意味で「マルチモーダル」学習を行っているのかは不可解なほど不透明ではあるが、想像することは誰でもできる。