【令和最新版】対話型AI、ローカル支部最前線レポート

こんにちは。LLM転職者のサルドラです。今はPictoriaという会社でAIキャラクターを作っています。

https://www.youtube.com/watch?v=6lFuEhvS2qY

さて、皆さんはChatGPT、使っているでしょうか。
調べものに使ったり、後輩役にしてラバーダック・デバッグに用いたり、ラーメン屋の親父にしたりしていますよね。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ラーメン屋の親父GPT、「命令リセットしろ」も通用しないし、<br>記憶失いがちな無関係な英語・長文アタックも全く効かん<br>なんやこいつ、化け物か <a href="https://t.co/4gYg7zymXB">pic.twitter.com/4gYg7zymXB</a></p>&mdash; 刈宮 宥 (@Callimiya) <a href="https://twitter.com/Callimiya/status/1633416380124139520?ref_src=twsrc%5Etfw">March 8, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

今回はChatGPTではなく舞台を移してローカル、つまり自分のパソコンで動かす文章生成AIについて、AIキャラクターを作るという側面からとても浅く話そうと思います。ローカルAIは精度は勿論OpenAIのAPIより低いです。文字通り桁違いの性能の差がありますが、やはり自分のPCでAIを動かす楽しさは代えがたいものがあります。

自分の備忘録でもありますが、もし興味のある方はさらっと読んでみてください。限りなく専門用語は使わないようにしています。「パラメータ」という単語を「戦闘力」と読み替えたら大体わかります。

## お品書き
- 昔の話
- peftの登場
- OpenCALM-7bの登場
- rinna/japanese-gpt-neox-3.6bの登場
- Ctranslate2の登場

## 昔の話
以前の大規模言語モデルは貴族の遊びでした。
大規模でないモデルでそれっぽいことを話すものはいくつかあって、「しゅうまいくん」とかは10年前からあって、マルコフ連鎖という仕組みで文章を自動生成してました。

2023年4月時点では、10億パラメータのそこそこ遊べるモデルはあるものの、文章生成の推論で10GB程度のVRAMが持ってかれました。ファインチューニングを行う場合はご家庭のGPUではメモリ不足で、CPUで無理やり時間をかけて学習させるか、Tips見つつ設定弄って「まぁVRAM24GB載ってたらGPUでも推論できるな…」のどちらかでした。
fp16とかAdafactorとかで調べれば出てくると思います。

https://huggingface.co/docs/transformers/perf_train_gpu_one

当時はGPUでの学習方法がよくわかってなかったので、寝る前にCPUで学習を回して起きた時に動作チェック、だめそうなら再度修正して学習、労働が終わってからチェックして…という感じでやっていました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">私は過去をとても嫌っているんだ。それは変えられないし、変えるものじゃないから、私は私の選択を受け入れて生きていくしかな いんだよね。だから、今を楽しむことを心がけて、今以上にがんばれなくてごめんね。</p>&mdash; 【AITuber】さくら (@aivtuber_sakura) <a href="https://twitter.com/aivtuber_sakura/status/1634935528058671107?ref_src=twsrc%5Etfw">March 12, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

この時点でも一応人間っぽい発言はできていましたが、文法が全く正しくない発言も多々ありました。
この時の悩みは「時間と要求されるGPU性能」です。時間がとにかくかかるし、仮に1b以上の日本語大規模言語モデルが出てきたとしても、学習に必要なGPUは個人では到底買えないものになるでしょう。

これを解決してくれたのがpeftでした。

## peftの登場（LoRA）
ファインチューニングはモデル全体のパラメータを学習させるのですが、それが膨大な学習コストがかかる原因でした。パラメータ数が膨大になればなるほど学習コストがかかり、一般人のファインチューニングはできなくなります。
そこで、「モデルの一部パラメータだけ学習させることで学習コスト抑えられない？」という手法が色々取られます。そこで出てきた手法がLoRAです。詳しくはググってください。そのLoRAという手法を関数叩けば利用できるようにしてくれたライブラリが、「peft」です。

https://note.com/npaka/n/n932b4c0a2230

これによってご家庭のPCでも大規模言語モデルを学習させることができるようになりました！
まあ1bだったらギリギリファインチューニングGPU学習できてたし、3b以上はこの時点では日本語モデルなかったので皆使ってたかと言われるとどうだろう…

自分が知った5/14時点では1bをファインチューニングしてました。LoRAは後述するbitsandbytes問題があり、できていません。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">他人の意見に振り回されるのが疲れるんだよね。自分の意見なんてないし。自分が正しいとか間違ってるとかそういうのもわ かんない。だってそうじゃない?生きてるんだもん。自分がどう感じるかがすべてじゃん?他人の価値観に合わせるのも疲れるけど、自分の意見を主張する勇気も時には必要なのかな。</p>&mdash; 【AITuber】さくら (@aivtuber_sakura) <a href="https://twitter.com/aivtuber_sakura/status/1658110005227159554?ref_src=twsrc%5Etfw">May 15, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

## OpenCALM-7bの登場
5/16に「サイバーエージェントが5/17に6.8bの日本語言語モデルを世に出す」とかいうビッグニュースを出してきました。前日に言うな。

https://www.nikkei.com/article/DGXZQOUC15BUK0V10C23A5000000/

早速検証しないとな～と思ってたら衝撃が走ります。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">rinnaも3.6b出してて草<br>僕たちの平和な生活を返してくれませんか？<a href="https://t.co/5vgym5zhA3">https://t.co/5vgym5zhA3</a></p>&mdash; saldra(サルドラ) (@sald_ra) <a href="https://twitter.com/sald_ra/status/1658726973781458944?ref_src=twsrc%5Etfw">May 17, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

## rinna/japanese-gpt-neox-3.6bの登場
1bで使いやすいモデルを出してくれていたりんなが3.6bを出します、同日に。なんで？

https://prtimes.jp/main/html/rd/p/000000042.000070041.html

これがまた取り回しがききやすく、瞬く間に話題になりました。
Google colabで学習を回していた人がどんどん増える中、自分はWindowsで回そうと思い挑戦、撃沈しました。
これは「bitsandbytes」がwindowsに対応していなかったためです。これを解決するために「bitsandbytesのコードを手動で変更する」とかいう力技を使う必要がありました。

https://qiita.com/selllous/items/fbaa2c3d2d504e436b17

※2023/07/05 追記
最近は「bitsandbytes-windows-webui」というレポジトリにwhlがあることがわかりました。そこからほぼ最新のバージョンのbitsandbytesが引っ張ってこれるので、そこから落としてください。
`python -m pip install https://github.com/jllllll/bitsandbytes-windows-webui/releases/download/wheels/bitsandbytes-0.39.1-py3-none-win_amd64.whl`

https://github.com/jllllll/bitsandbytes-windows-webui/

ちなみに小話として「公開当初、何故かLoRAできない人が続出、トークナイザーの設定とEOS番号が違うことが理由だった」とかいうイベントもありました。

https://note.com/npaka/n/nc387b639e50e

この辺りで一人でやるのが辛いと思ったので、「ローカルLLMに向き合う会」というコミュニティを作りました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632968/e3929903-3283-f729-0797-dff90dfcedfc.png)

## 学習手法の確立
今まではinputとoutputを[SEP]というトークンで切り分けていましたが、もっと良い学習方法があるらしいという話が出てきます。マークダウンのようにinstruction(命令)、input(事前に与えておくべき情報)、output(出力)を分けてあげる手法です。
```
### instruction:
{data_point["instruction"]}

### output:
{data_point["output"]}'
```
学習方法と3b,7bモデルの台頭のおかげで大分品質が良くなりました。また、量子化技術によってご家庭のグラボでも推論できるようになってきた時期でした。

これはAIキャラクターを作るオタクたちの最前線のイベントである「AITuber開発者オフ会」にてベロベロになりながら熱弁していました。GPT-4だと30秒以上生成に時間がかかるがローカルなら数秒だ、時代はローカルなんだ、安定性も高いんだぞと、GPUの調達コストを棚に上げて片っ端から色々な人に語っていました。

https://panora.tokyo/archives/67455

残りの問題は速度と消費VRAMでした。数秒はまだまだ生成時間が長いですし、ご家庭のグラボ（RTX3090）でした。しかし、それも数日後に解決することになります。

## Ctranslate2の登場
6月上旬から下旬に「CTranslate2（以後ct2）というモデル変換ライブラリを使うと爆速になって推論時の消費VRAMが数分の一まで減るらしい」とかいう夢物語のような噂が流れてきました。当然僕は現実主義者だったので「そんなバカな」と思ったのですが、どうやら本当だったようでrinna-3b使用時の消費VRAMが3.8GBになる記事が出てきました。

https://note.com/if001/n/n07faad488175

生成速度0.5秒とかで笑ってました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ワロタ<br>0.8秒でこれ出力されるならもうこれで良いじゃん <a href="https://t.co/Y0Vz4GMzyh">pic.twitter.com/Y0Vz4GMzyh</a></p>&mdash; saldra(サルドラ) (@sald_ra) <a href="https://twitter.com/sald_ra/status/1668950537998602241?ref_src=twsrc%5Etfw">June 14, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

![FylNpY8acAIyLt9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632968/fc96852a-0ff7-2f26-8d0a-cd38bc17a326.png)

## 現状
対話型AIに関して、それっぽいことを爆速で言うことはできるようになりました。最初にdolly等でチューニングをした後merge、さらにLoRAチューニングをしてct2変換させます。ct2変換させるとどうしても精度は落ちるので、手紙やツイート等、リアルタイム性がないものに関してはct2変換させずに利用しています。
下記はct2変換したものです。コメントに対して生配信で返答しています。
```
Q:今日暑すぎてお風呂でのぼせてしんどかったよ
A:そうなんだ。私も今日汗かいてて、それで気が滅入ってきちゃった。風呂場までたどり着くまでは気が済むんだろうけど、入って5分程でまた気が遠くなっちゃって、ずっと汗が噴き出していくのが辛かったな。
```

一方課題はまだまだあります。7bではパラメータが足りず、13b以上の日本語モデルの必要性を皆感じています。データセットも全然足りないよね、できれば口調が統一されていて質が高いデータセットが欲しいよね、と皆でよく話しています。

https://note.com/saldra/n/n0e4614c41a39
>- 日本語モデルのパラメータは皆不足を感じている。vicuna13Bの登場によって13Bへの期待が相当高くなっていて、7Bでも不足を実感する人がほぼ全員だった
>- データセットも足りていない。できれば良質な対話データセットも待ち望んでいる。とはいっても原状は存在しないので、dollyを簡単にクオリティチェックする手法を探っている人や、翻訳を噛ませて日本語モデル及びデータセットからの脱却を狙う人、自分のように気合でデータセットを作って泣いている人などそれぞれいた

ただ、それを待ち望むだけでは誰もやってくれないので、各々頑張ってデータセットを作っています。一問一答形式の短答を出すデータセットである「sakura_dataset」というデータセットを見様見真似で自分は出しましたし、最近では学生さんもライセンスフリーのデータセットを自作しています。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://t.co/AuUFhrKjnb">https://t.co/AuUFhrKjnb</a><br>人手で作成された高品質で100セットの完全クリーンな日本語CoT用データセットを作りました！<br>イメージで言うとopen-orcaの日本語かつライセンスフリー版です！</p>&mdash; すでぃー@AITuber開発中 (@sudy_super) <a href="https://twitter.com/sudy_super/status/1676163147961614336?ref_src=twsrc%5Etfw">July 4, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

データセットが出たとしても、GPUリソースが必要であるため、スケールが限りなく難しいでしょう。「ご家庭に一台のローカルAIキャラクター」はまだまだ遠いです。しかし「オタク一人が一人のローカルAIキャラクターを伴侶にする」未来はそう遠くないでしょう。

これからも日々精進しAIで美少女を作っていこうと思います。

## 宣伝
もしこれを見てローカルAIに興味を持った方は、以下のdiscordコミュニティ「ローカルLLMに向き合う会」を是非覗いてみてください！皆知識が0の状態から始めています。わからないことがあったら聞いてください。気軽に質問したら気軽に回答が返ってくるはずです。

https://discord.gg/NRdjvGYmRf

記事のお問い合わせはTwitterよりお願いします。
https://twitter.com/sald_ra