加藤純一AIその4 ELYZA-japanese-Llama-2-7b-fastをファインチューニングして雑談させる

:::note warn
AIの出力を紹介する部分で、暴力的・差別的な表現が記載される場合があります。これは本記事に書かれた手法通りの処理をした場合、AIがどのような結果を示すのか忠実に報告するために記載しているものであり、個人・団体を中傷ないし脅迫など権利を害する意図は全くございませんので、ご理解のほどよろしくお願いします。
:::

加藤純一さんの雑談データから人格のクローンとなるようなAIを作り、最終的には雑談配信ができてしまうことを目標にしています。
データ作成やGPU計算などの協力者も欲しいですが、SNSは特にやっておらず、Youtube向けに動画編集する時間もないので、少し小刻みにQiitaにアウトプットして存在感を示したいと思います。AIの出力結果を意識的に紹介したいと思いますので、技術に興味のない方もAIの成長を楽しんでもらえればと思います。
やったこと・次やること・課題点のフォーマットでお届けします。このシリーズは[「加藤純一クローンAI」タグ](https://qiita.com/tags/%e5%8a%a0%e8%97%a4%e7%b4%94%e4%b8%80%e3%82%af%e3%83%ad%e3%83%bc%e3%83%b3ai)をつけますので、バックナンバーはそちらから確認できるようにします。

## やったこと

:::note
実際のコードはこちらの`talker`ブランチにあります。
Github: https://github.com/konbraphat51/K-A-T-O
:::

おととい、ELYZA社から`ELYZA-japanese-Llama-2-7b`が公開されました。( https://huggingface.co/elyza/ELYZA-japanese-Llama-2-7b )　今年6~8月にかけて日本語LLMがウミガメの卵のごとく産出されていきますね。
これは現時点で最も「賢い」らしく（どの企業も自社LLMをそう評価している気がしますが...）、もともとけっこう強かった`Llama 2`を、日本語特化させたものになっています。
>　"性能について、ELYZA独自作成の性能評価の結果、1750億パラメータを有する「GPT-3.5 (text-davinci-003)」に匹敵するスコアが算出されており、日本語の公開モデルのなかでは最高水準の性能となっています。"
引用元：https://prtimes.jp/main/html/rd/p/000000034.000047565.html

しかも、Tokenizer（テキストを分散表現＝数値化する機器）も日本語特化させることで（`fast`モデル）、安定性・速度が向上するという。

公開当日にファインチューニングを開始し（`Llama`と同じ形式なので設定が簡単で助かりました）、2023そのままデータ（[その2参照](https://qiita.com/konbraphat51/items/c9b23cf3af7ee09428be)）15行を学習させ(24時間)、これまでと同様の試行をしました。

時期的に`ELYZA-japanese-Llama-2-7b`の性能、実装、ファインチューニングが気になって見に来ているエンジニアもいるかもしれないので、これまでの記事と繰り返しになりますが、実装内容と注意点を概略しておくと、（コードは上記githubリンクから確認できます）
* 加藤純一の雑談配信の書き起こしデータを、1行1000文字までに区切り、そのままファインチューニングデータとして利用（`inputs_id`列にこのテキストを記録したtorchテーブルとして`transformers.trainer`クラスに渡している）
* GPUはRTX4070 VRAM12GB、int8量子化+LoRAファインチューニング+`batch_size=1`によりこのVRAM内で処理できる
* Llama系統に限って：LoRA(PEFTライブラリ)設定時に下記コードが必要
```python
target_modules = [
        "q_proj",
        "up_proj",
        "o_proj",
        "k_proj",
        "down_proj",
        "gate_proj",
        "v_proj"
    ]
```
* 出力は、一言目を入力として、その続きを考えさせることを想定。

:::note
今回完成させたLLMモデルは、こちらからアクセスできます。
https://huggingface.co/konbraphat51/KATO_talker_202308300155
:::

前回同様、
「こんにちは」
「やあ」
「喉痛いわ」
「今週のキングダム見た？」
「ヒカキンは神だと思わない？」
を一言目にした雑談の続きを出力してもらいます。

```python: 出力ハイパーパラメーター
{"max_new_tokens": 100, "do_sample": true, "temperature": 0.2, "top_p": 0.75, "top_k": 40, "no_repeat_ngram_size": 4, "chains": 5, "chain_depth": 3}
```

>こんにちは 今日も多分頑張ってきゃな ちょっと体調が悪かったから ちょっと体力に余裕があるから そういう時にかまたどういう動きができてくるんでしょ そういう動きができてくれるんでしょって 俺ももちろん仕事してないから 完全にそういう気持ちでヤマト先生の配信を見せてもらってます いつも俺がどういう気持ちでヤまト先生のコンテンツを見せてくれるか 今見せたけど まあいいや 行きましょう ビッグセーブです 監督の指示を受けてピッチに後退選手が投入されます 手前の味方に渡します 手前の意味わからん人に渡します いやこれまじでやばい これ今マジでやばいです 俺なら全然平気だね 無視するわ 今のディフェンス大事 しっかりディフェンスしていく ゴールキーパー誰 ゴールケーパーって ミュラーじゃないの ワントップは何これ ちょドイツが ドイツが入ってる なんか俺に ドイズする ドイスね あいつハンドするんだもん 吉田麻衣記 吉田マジで クソハンドするんだよ 吉田あいつハンデするんだもんと あいつクソハンデしてるんだもん
 everybodyが5月頭に配信した配信者に対する暴言した配信者に対して 怒られてたけど そんな奴クビにしろ一緒にやりたくないの前に やる気が本当にないなら もうやめた方がいいって言ったじゃん 俺も本当に思うの これ自分自身のためじゃなくて 多分うちってね これ前も言ったけど 必要以上にみんなに対して これ以上はしてあげられないぐらいの そうことしてて この環境で多分頑張れなかったら 多分こういう道を選ばない方がいいと思う 別にまだ若いからいろんな道があるじゃん 同じこと言うけど 今後の人生50年考えた時に マジでこれ全員にとって 最後のチャンスだと思ってくれって俺言ったじゃん この1年は本当に最後のチャンジだぞって言って 体調が悪かったっていうのももちろんあるし 俺ももちろん仕事で 
>
>やあこれまじでネタバレになっちまう まじでこれ本当に いやこれじゃあこの人を別に出さなきゃいいのか いやこれ無職じゃねえだろみたいなさ 今さあの昼のさ無職の人はさ 昼の無職の一つが無職は昼も無職か あのメール送ってるからね メール送ってるからのよろしくね 早く見せたいこれ女もおもろいやつ これみたいな採用通知が言ってるんで 倍率10倍からかけやがった できればちょっと確認してもらってもいいですか わかんないと思う多分これ いい塩梅だな マジでねいい塩梅なんだな でやっぱ pc から顔出し ズーム可能ですか に対してマックブック持ってるんですけど ズームのインストールの仕方がわかりませんとか そういうちゃんと無職らしい返信も来てます 無職らしい人かかるから その人と一緒に発信してもらおうとか そういう感じで 俺も今度マリオ見に行くんだよ マジで超楽しみクソいいんでしょ なんで配信してるんですか 配信が好きだからみんながコメントくれるから そういうことだから みどりさんは昨日ツイッターでうなちゃまの件について触れたけど その4分後に飯田の店で焼肉食べてリプで怒られてさすがに投稿消した なんて別にしょうがないしょうがなくない 人が死んでも飯は食うだろ 別にしょうがいなくないでしょ 仕方なくないだめだろ 意味がわからん ハイコツ1日どんぐらいだろ 60本ぐらいずっと吸ってない 次死んじゃうの誰だと思いますか ダソクさん キンバエ うわいい 今度マリオ見に行くんだよ マジで超楽しみクソいいんでしょ なんで配信してるんですか 配信が好きだからみんながコメントくれるから そういうことだから みどりさんは昨日ツイッターでうなちゃまの件について触れたけど その4分後に飯田の店で焼肉食べてリプで怒られてさすがに投稿消した なんて別にしょうがないしょうがなく
>
>喉痛いわ 早めに帰ってきて もう一回スイッチで練習して そんで youtube出るわ ok あその前にさ ちょっと待って ハンドルの仕方とかわかんねえからさ 俺ハンドルのようした動きして 調和した動きにして 本番も本当に7時からなのかって 今思い始めてきた どうする? もう始まってたな 切れるわ なんで言われんだ! ひでえじゃねえか! 被害者ぶるわ 浮気ばれた時と一緒で やめてよ! やられたこれ 急げ! 押してだ! 裏ならここにドリルがあるぜ オッケー! 出番だぞ! グレネードだ! ノーダメか! 俺! やったぜ! 行け! 死のうとして適当にやってねえよ もう飽きないで 謝る 本当にすいませんでしたって 本当にうちのものがすいませんでしたて 他人のせいでするわ 本当にすいません うちのスタッフが 言うな なんて情けないことでしょうって 鎌田の選手 今日俺やばくね? 強いね その武器 さぞかし 気持ちいいんでしょうね あいつを お前がどういう声で 泣くのか楽しみだ おい 来いよ うめえな! お前! うめえてな! おか! 来いね! うわ! おい! あいつハンドするんだもん 吉田麻衣記者 無職のジャンソー行こうぜ 無職の方がさ心配だよ 俺大丈夫かよ ちゃんと返信してくれるかな こっちは全然平気だね 無職歴3ヶ月か うわこの人参加させたいな ねえスマホからの参加ってできるのかな スマホ参加ってできるかな お前らが配信見ろ それでいいか かあいいね 配信しちゃった 俺も配信するわ うわいいねいいねいいネ ちょっと待って ハンドルのカードショップ行ってもいいな あ、いいんじゃないすか 配信しながら突っ込んでていいの 全然オッケーじゃない 俺らが
>
>今週のキングダム見た？ ちょっと見せたいから ちょっと見せてほしい いやこれまじでネタバレになっちまう まじでこれ本当に いやこれじゃあこの人を別に出さなきゃいいのか いやこれ無職じゃねえだろみたいなさ 今さあの昼のさ無職の人はさ 昼の無職の一つが無職は昼も無職か あのメール送ってるからね メール送ってるからのよろしくね 早く見せたいこれ女もおもろいやつ これみたいな採用通知が言ってるんで 倍率10倍からかけやがった できればちょっと確認してもらってもいいですか わかんないと思う多分これ いい塩梅だな マジでねいい塩梅なんだな でやっぱ pc から顔出し ズーム可能ですか に対してマックブック持ってるんですけど ズームのインストールの仕方がわかりませんとか そういうちゃんと無職らしい返信も来てます 無職らしいReturn信も来てるんで あの返信がもう掃除で遅くて 23件中今1件です ページにはあいいね 続々と帰ってきてる あいいねいいねいいネ これ男かなこれこれ男か女かわかんねえ これどっちだこれ わかんないんだよね まあいいや わかんねえた ぜひとも参加してほしい人いるんだよね 若者からおじさんまで取り揃えたいね まだ決めてない 10人ぐらいに絞るかな ありがとうございます すいませんよく考えたら パソコン持ってませんでした お手すりかけてすいません 37歳無職 無職歴13年 いやーこのこの人ぜひ来たかったんだけどね 無職歴史が長い人いるから その人来たかったんだよね あんまり働いてない人いるからさ お前らそれってメタありえんよこれ ふざけんなよ 油で光ってるマジで お前らいついけよ 油まみれの社会人探そう今から ガソリンスタンドで日々頑張ってますみたいなやつ ちょっとさもしかしたら長ビーティー1試合しかできないかもしれないけどちゃんと さわやかだね 高生年だな 高生
>
>ヒカキンは神だと思わない？ それ言ったら俺はキレるよ うるせえ カマちゃん忙しいけどスタート時間遅れてるからここ滞りなくやろう やべえでも俺が選ぶとどうしても年齢数高くなっちゃうから 最高この人 即決 やべエも同意する この人抜けられないから一回無視するわ よーし ここを地獄に変えてやるぜ おい あっちに行こうぜ あそこに敵を発見 最悪だ 頼む 向こうも寝坊しててくれ 頼むってな ヤマト先生も配信してる? よかった 仲間がいた 絶対ヤマト teacherに言うなよ ここにネメシスがある リーフが閉じるまであと1分 まだまだ距離がある 向こうに行く 拡張エネルギーマガジンを見つけた レベル3だ 残り45秒で行くぞ 俺なら余裕だな ダスクも配信してる? やっぱりそうだよな 気のせいだよなって まさか俺がそんな初歩的なミスするわけないよね リーダーだけど 俺リーダーなんだ 秘宝加藤リーダー 向こうの戦車 上と下か オッケー 本番も本当に7時からなのかって 今思い始めてきた どうする? もう始まってたな 切れるわ なんで言われんだ! ひでえじゃねえか! 被害者ぶるわ 浮気ばれた時と一緒で やめてよ! やられたこれ 急げ! 押してだ! 裏ならここにドリルがあるぜ オッケ! 出番だぞ! グレネードだ! ノーダメか! 俺! やったぜ! 行け! 死のうとして適当にやってねえよ もう飽きないで 謝る 本当にすいませんでしたって 本当にうちのものがすいませんでしたて 他人のせいでするわ 本当にすいません うちのスタッフが 言うな なんて情けないことでしょうって 鎌田の選手 今日俺やばくね? 強いね その武器 さぞかし 気持ちいいんでしょうね

**めっちゃいい！！** 

[前回のOpenCALM](https://qiita.com/konbraphat51/items/391fd89abd3de229230b)より格段に、というよりも断然良いです。（サイバーエージェント社様には悪いですけど、、；；）
現時点でファインチューニングに成功しているのが`Open-CALM`とこちらの`ELYZA`なので、どうしてもこの二者比較になってしまいますね。（LINEモデルは出力がかなり望ましくない形式、StabilityAIモデルは仕様がそもそも対応していなさそうでした）

特に制御していないのに、`Open-CALM`に見られた「繰り返し暴走」などはない。両者ともに文法的正しさ・自然さは`Open-CALM`よりかなり格上。主観的ですが、「加藤純一っぽさ」はこちらが勝る気がします。
ただ、こちらは`Open-CALM`よりも話題が飛び飛びな気がします。ハイパーパラメーターチューニングで制御できるか？
あと、あからさまに元データの文章（特に無職人狼、FIFA）から話題をむりやり引っ張ってきている。もしかすると、**こちらの方がファインチューニングデータに忠実**で、いろいろな話題に対応するには、元データが15行では足りないからこうなのかもしれません。

>今思い始めてきた どうする? もう始まってたな 切れるわ なんで言われんだ! ひでえじゃねえか! 被害者ぶるわ 浮気ばれた時と一緒で やめてよ! やられたこれ 急げ! 

個人的にこの部分がとても好きです。コメント読んで感情に起伏ができている感じが見られます。仕組み的にコメント見ていないはずのに。

GPT3.5並みとのたまうだけあって、性能がとても高いように感じた。7bパラメータでこれを動かせるのはかなりありがたい。（欲を言うと100倍ぐらいコンパクトになってくれれば安価なGPUでも済みますが、、、）

もっと良いLLMが出るか分からないですが、それまではこちらをメインに開発を続行しようと思います。

## 次やること
第一に、
まずは、データ数を増やすかどうなるかを観察します。現在50行を学習させています（80時間かかるそうです。GPUの寿命が、、、；；）

第二に、
インターネッツ上にて、「LLMのファインチューニングにより知識を学習できるか」について議論が起こりました。
>「事実」を学習するタスクは、LLMのファインチューニングは不得意です。
npakaさん：https://note.com/npaka/n/nec63c01f7ee8 より引用

>LLMのファインチューニングで新たな知識を付与できないというのは普通に言い過ぎでしょ。本来の慣習に従ったフルパラメータファインチューニングであれば当たり前に可能だし、効率が劇的に落ちるというだけで、PEFTでも決して不可能ではない **（更新/新たに付与するパラメータ数に依存する）** ので。
X:@kyo_takanoさん：https://twitter.com/kyo_takano/status/1696409487538901225より引用

LoRAの「事実」の学習がうまくいかないとすれば問題です。プロジェクトの主旨として加藤純一のクローンを作成するので、加藤純一の思想・知識をコピーできなければならない。
そこでこちらを注意して出力を再度確認しましたが、自分が何言っているのかわかってなさそうな`Open-CALM`はともかく（一応自分が38歳であることは認識できていました）、こちらもそんなこともなさそう。
しかし、@kyo_takanoさんの「更新/新たに付与するパラメータ数に依存する」というのは非常に重要な指摘であると感じます。LoRAは全てのパラメーターではなく、大事そうなパラメーターだけをいじるという性質のもので、ちょっと変えただけではモデル全体が動かないだろう、という直観に合う言葉です。
今までLoRAハイパーパラメーターに無頓着であったので、こちらの調整を検討します。

## 現在の課題
### 新しい課題
* LINEモデルがうまくいかなかったのはLoRAハイパーパラメーターがよくなかったからでは？
[その2](https://qiita.com/konbraphat51/items/c9b23cf3af7ee09428be)でLINEモデルがうまくいかなかったのは、いじるパラメーター数が少なかったからという可能性があります。
多い場合はどうなるのか、検証の余地があります。

### 引き続きの課題
* <strong><重要></strong> 書き起こし精度が最善とは言い難いです。例えばよく登場する配信者「もこう」さんは「モコ」とかに書き起こされ、検索しても0件ヒットです。今開発しているこのAIも知識は完全に書き起こしデータに依存するので、<strong>この書き起こし精度がプロジェクト全体のボトルネックになっています。</strong>
書き起こしAIにOpenAI社の「Whisper」の`large-v2`モデルを使用していますが、こちらをファインチューニングする必要があるものと考えています。
文字ベースのデータでも出来るという情報もありますが、できれば音声+文字データでファインチューニングした方がよさそう、しかしデータがない。誰か手動書き起こしデータ作りしてほしいものです；；（時間がない）

* `stabilityai/japanese-stablelm-base-alpha-7b`のファインチューニングができない。
`Open-CALM`よりずっといいことを自称している（[出典](https://ja.stability.ai/blog/japanese-stablelm-alpha)）ので、使ってみたかったのですが、エラーが発生してファインチューニングまでたどり着かない。([建てたissue](https://huggingface.co/stabilityai/japanese-stablelm-base-alpha-7b/discussions/5))仕様としては、`transformers`とは別のコードでモデルを構築させ、`transformers`経由でそのコードにアクセスして実行しているため、おそらく今回やろうとしているint8+LoRAファインチューニングを想定していない可能性があると予想しています。さすがに僕のGPUでは丸ごとファインチューニングには耐えられないので、開発者の対応を待ちます。

* シンプルに`ChatGPT`をファインチューニングするべきではないか？
LLMの性能で悩むぐらいなら、もう金払って`ChatGPT`をファインチューニングすればいいという考え方もできます。ただ出力のたびにお金がかかるのがしんどいですが。やるとしたら`curie`モデルが適切だと思います。とりあえずクレジットカードが必要とのことなので、現在クレジットカード申請中です。