そぬばこ

備忘録とか、多分そんな感じ。

LoRA チューニングを試して、ご家庭に1台 whywaita AI を手に入れよう

この記事は whywaita Advent Calendar 2024 16日目の記事です。

つまり、そう 遅刻 ですね。

前日 (15日目) は kyontan さんの jiro.md · GitHub でした。 風邪引いて日曜日に彼の登山の誘いを蹴ったんですが、そもそも色々と間に合いませんでした。 そして彼は WordPress どころかホストがお亡くなりになってそうな感じ。

前置き

全人類の夢、それは whywaita AI です。 ここまで数々の猛者が、短期間で whywaita AI 構築 RTA に挑んできました。

twismik0.hatenablog.com

nersonu.hatenablog.com

nersonu.hatenablog.com

なぜ Advent Calendar の月の短い期間でやろうとするのかはよくわかりません。

昨今は LLM がブームということで、ともかくデカいパラメータでぶん殴れば、お手軽に whywaita AI を構築できるのではないでしょうか (ひらめき) 。 と、いうことでご家庭にあるもので whywaita AI に再チャレンジしようと思います。

家にある GPU

今回はご家庭にあるものを使うので、こちらの GPU でローカルで学習していきたいと思います。

nvidia-smi --query-gpu=name --format=csv
name
NVIDIA GeForce RTX 4070 Ti SUPER

今年買いました。 余った GPU は、今後モンハンの新作とかに使おうと思います。

モデル

whywaita といえばなんでしょう。 そうですね。サイバーエージェントです。

ということで、サイバーエージェントが公開しているモデルを使いましょう。

huggingface.co

データ

whywaita のデータで最も手に入りやすいのは、過去の whywaita の Twitter の post がまとめられたこちらのリポジトリです。

github.com

今回 "も" こちらを使って時短していきましょう。

ところで、 Twitter のデータを使うんだから whywaita の Twitter の post を再現する bot みたいな感じにすればいいんじゃねと(15日(日)の21時過ぎくらいに)思い始めました。 雑に思いついてしまったので、 そんな感じの指示チューニングをすることにします。

input_format = """USER: whywaita さんが「{topic}」について Twitter で投稿しました。
何を投稿したか教えてください。
ASSISTANT: 
"""

前処理

とりあえず、メンションや URL などが入っている post は全部除きました。 問題はどうやって↑のチャットテンプレートを埋めるようなデータを作るかというところです。

まあ全部デカいモデルに任せるかと思い立ち、クラスタリングで無理やり分類し、50件ほどのトピックに手で名前を付けていくか、となりました。 今回は BERTopic で雑にやります。 ちょい古い情報ですが、前職で書いた記事でも貼っつけておきます。

buildersbox.corp-sansan.com

それでも、BERTopic に使う言語モデルは少しでも新しいものを使うか〜と思い立ち、以下の多言語モデルを採用しました。

huggingface.co

これでクラスタリングをし、(うまく分類できなかったものは除きましたが)トピックを約50件ほどに絞り込みました。

こんな感じでトピックごとの単語重要度の top-k が簡単に可視化できるので、こいつとにらめっこしながら緩く名前を付けていきます。

ほんまか?という感じです。

学習

LoRA でファインチューニングしていきます。 最近は peft ってやつで、 Transformers さえ知ってればほぼ脳の学習コスト 0 で出来ちゃいます。便利ですね。

github.com

もう Hugging Face 無しでは生きられないですよ。 量子化とかもして、とにかく使用メモリを抑えます。そうしないとご家庭の GPU ではすぐに OOM でございます。

そういえば私も去年サイバーエージェントに入ったんでした (唐突)

今回の学習のテクニックの一部は以下のカリキュラムを参考にしたりしなかったりしています。 受けましたがいい研修でした。

developers.cyberagent.co.jp

こんなふざけたことに得た技術を使っていることを含めて、会社から怒られたらこの辺は消します。

そして、もちろん、当然のごとく、学習には時間がかかります。

間に合うわけがありません。

結果を見よう!

結果をご覧になる前に、留意点が1つあります。 それは、元データの whywaita の Twitter の post が 2009年〜2019年 くらいというところです。 つまり、過去の whywaita を再現する AI ってことですね (?)

token 繰り返したりとかするので、 model.generate() の パラメータはちょこちょこ調整してます。 フォーマットはチャットテンプレートを流用して、好きなトピック名を入れてみています。 以下、再掲。

input_format = """USER: whywaita さんが「{topic}」について Twitter で投稿しました。
何を投稿したか教えてください。
ASSISTANT: 
"""

結果

さて、今回はどんなことを喋ってくれるのか! おいでませ! whywaita Twitter 大喜利 bot くん!

input: アニメ

10年前ぐらいに観てたアニメを今観返したりする事は少ないので、懐かしいという感じか。というか、今観返しててもあんまり覚えてないんだよな。当時の方が覚えてる事多い。そんなもんだ。 …いや、今のが好きなのかな。うーん?(曖昧) あと、あにこれって今どうなってるんだろうな(小声)  さて、寝ようか。おやすみなさい。  zzz… (寝ながらツイートしてる人)><><><<<<<<<<<<<<<<< || || || || || || || || || || ^o^

input: 調布

1年に数回京王線使うくらいで調布駅に行ける気がしないんだけど、これは流石にどうすべきか…って毎回思いながら歩いてると思う(特に何も考えてない) あそこ駅から離れると道すかすかだし無理じゃね?とか思うけどそうではないのだろうなあって感じするしなあんな遠いの行くもんか!ぐらい思ってた時期もあったんだけどそこまででもないしなぁ^p^とか言ってたらたまーにいく事もあるしねぇ^p^^;うん、俺も成長したよ!!!(ぉぃ)←とりあえず行った事が無い所を調査したらしいですよとwktkしてますよ!(超白目)はっ・・・もしやあのビルがあの噂の・・・・・!?うおおお!!いきてえぇえええええええ!!!!!!?(AA略)。+゚ヾ(*´Д`)ノ。+.。゚・★。・゚☆今日はここまでかなーてゆわけでまた明日!今日もお疲れ様です!(σ´∀`)σ Yoooo☆彡ではノシ

input: インターネットの人間

2chの某スレで話題の人見っけ!でも本人じゃないしなーとか考えてたら本人だった件について。マジカヨー マジカヨー( ^ω^ ) マジカヨー アイゴッドマスターオナガイデスカー? マジカヨー( ^ω^ ) マジカヨー ヒヨコチャンメアサンデスカー? マジカヨー( ^ω^ ) マジカヨー タマキチャンナニカルゲーワーカンデスカー? マジカヨー( ^ω^ ) マジカヨー オルノシャセットオッサンナイキ�

input: プライベートクラウド

1000円払って自宅サーバでも作るか…と思ったけど別にそんな必要も無かった事に気づいたのでやめてしまえと思っている時候ですおはようございます。自宅サーバってなんですか。なんでそんな事を?と聞かれると心底そう思います。何故そう思ったのかというと自宅鯖って語感的にかなり自宅からアクセス出来るように思いません?自宅サーバ、自宅サーバ。なんかよくわからないけど自宅からアクセス出来るらしいな?ん? ってなりませんか?僕もそうでした。今ではちゃんと自宅鯖を自宅サーバと言えるようになりました。やったね! 自宅鯖! 自宅鯖! 自宅鯖! 自宅鯖! 自宅鯖! 自宅鯖! 自宅鯖! 自宅鯖! 自宅鯖! 自宅鯖! 自宅鯖! 自宅鯖! 自宅鯖! 自宅鯖! 自宅鯖! 自宅鯖! 自宅鯖! 自宅鯖! 自宅鯖! 自宅鯖! 自宅鯖! 自宅鯖! 自宅鯖! 自宅鯖! 自宅鯖! 自宅鯖! 自宅鯖! 自宅鯖! 自宅鯖! 自宅鯖! 自宅鯖! 自宅鯖! 自宅鯖! 自宅鯖! 自宅鯖! 自宅鯖!

input: ISUCON

10秒ということは512kbpsですか?ISUCONでどうだろうな、100Mbpsあればなぁ。今の環境は768kbpsだし、まぁでも10Mbpsあれば十分か。もうISUCONもやってないしなぁ。。ISUCONは時間かかるか。でも最近10分ぐらいで結果出ちゃうしなぁ。まぁいいか。そうだよね、ISUCONも10分ぐらいで出来るはずだよなぁ。うんうん。え、僕何もしてない?あ、そうかそうか。そうかそうか。うんうん。そっか!そっか!そうだよなぁ!そっかぁ!そっかあ!!うん!うぇい!そっかぁ!そっかぁ!そっかぁ!え、何?もう時間?そっかそっか。そっかそっか!そっか!そっかぁ!そっかぁ!そっかぁ!そっかぁ!そっかぁ!え、あれ?もう終わってる?そっかそっか。そっかそっか!そっか!そっかぁ!そっかあ!そっかぁ!そっかあ!そっかぁ!そっかあ!そっかぁ!そっかあ!うん!うん!うぇい!うん

input: ポーカー

15Kぐらいで200回しか引けないのは無理あるなぁと思ってたけど、やっぱりそういうシステムだったんですね。 つまり1万円程度じゃ何もできないという事か…(^q^)ムッキー! まぁとりあえず8kまでならなんとか・・・wん?あれ・・・?なんかよく分からなくなってきたぞ???って感じです!ふぅうううん!!!どうでもいいや!!!!!!wwでも2万以上はさすがに欲しいですね()あ、そうだそうです、お気づきの方も居るかもしれませんが最近「ポーカーフェイス」というHNで活動しているのでよろしくお願いしますwwwwwwwwwwおおっ!?初めて自分で考えた名前に意味がある気がしてきたぁあああぁああっぁっぃぃいいいぃぇえええあうぜええええーーーっすわーーーーーわっしょいえげれすてぃぶぼぉう↑↑wwwwwwwww( ・`д・´)ノ<コノイダ!!!!!だの><こんなんで俺を笑わないで下さいorz orz orzw((;゚Д゚))w((;゜Д゜))y─┛~~~.・.。 シュバランスウ!!!!! つーかさっきも書いた

input: Advent Calendar

1日5分 AdventCalendarを24日公開しようとして寝坊した人みたいになってるな?どうでもいいです????????!なにそれ怖い!!!!!!!!!!!1!!!!!1っ!{はぁッス><>}(涙声)<^0^<うぇいうえ~~~~~~~いwwwwwww>www≡∠※このエントリはmasayuki.hatenadiary 氏が書いてくれました★}わーい☆"ヾ(。>ㅅ<)ノ”☆バンバン☆彡大喜びのけいちゃんであります(笑)。それでは、3日目の担当者をお呼びしますよ~! ○○○○○さん、どうぞー(ぱちぱちん)」
— お知らせbot (@naochi_jpu) November 28, 2017

 6月29日は…

 「#KyoaniProjectの日」とTwitterではささやかれましたが、「#kinmokuseinojikan」が本当のようです。

input: twismiko

6/3(土)にTwisMiko氏と何かする予定です 連絡取ってください、僕は未定です!!!!! (^ω^)ペロペロ みたいなのやめてください!!!

改めて twismiko さん、ご結婚おめでとうございます。

まとめ

懲りずに whywaita AI をまた作ろうとしました。 whywaita っぽいかどうかはわかりませんが、古のインターネットのオタク感は出せたのではないでしょうか。

今回、2度あることは3度あるやろということでの、3度目の挑戦だったわけですが、この領域は改めて進化のスピードが速いですね。 そんなこんなで4度目もありそうな気がしますよね (音声モデルのリベンジとか?) ではまた、次の whywaita AI でお会いしましょう。