Re:ゼロから始めるML生活

どちらかといえばエミリア派です

Unslothの覚書き

これまでLLMはChatGPTとかを使うくらいの関わり方をしていたんですが、最近重い腰上げてLLMについてキャッチアップしようと勉強したりしていたりします。

LLMをfine tuneしようとしたときにどうやらUnslothというライブラリが便利らしいという話を小耳に挟みました。 このあたり、本当かどうかよく分からなかったので今回はUnslothを使ってみたメモです。

Unsloth?

UnslothはLLMのfine tuningを低メモリ・高速に実行する便利ライブラリです。

リポジトリはこの辺です。

github.com

READMEを読んでみるとこんなふうに書いてあります。

Finetune Llama 3.2, Mistral, Phi-3.5, Qwen 2.5 & Gemma 2-5x faster with 80% less memory! GitHub - unslothai/unsloth: Finetune Llama 3.3, Mistral, Phi, Qwen 2.5 & Gemma LLMs 2-5x faster with 70% less memory

Fine tuningの高速化、省メモリ化を謳っていますね。 ドキュメントはこの辺です。

docs.unsloth.ai

Tutorialを一巡り

Llama3.2をColabでfine tuningするnotebookが公開されているので、それを動かしながら感じを見てみたいと思います。

colab.research.google.com

baseにしているモデルは、4bitにquantizeしたunslothのモデルを使用し、それをmlabonne/FineTome-100kデータセットでfine tuningするというコードになっています。 (その他にfine tuneしたモデルのread/writeなどのコードがあるのでそのへんで一通り使い方を確認することができます)

日本語データセットを使ってやってみる

おおよそ使い方がわかったところで、試しに日本語のデータセットを使用してfine tuiningをやってみようと思います。

データセット

今回は簡単のため、東工大のtokyotech-llm/Swallow-Instruct-v0.1データセットを使用してやってみたいと思います。

huggingface.co

最初にもともとのモデルで質問の回答を確認します。

['<|begin_of_text|><|start_header_id|>system<|end_header_id|>\n\nCutting Knowledge Date: December 2023\nToday Date: 26 July 2024\n\n<|eot_id|><|start_header_id|>user<|end_header_id|>\n\n答えが42の質問で一番面白いのは?<|eot_id|><|start_header_id|>assistant<|end_header_id|>\n\n答えが42の質問は、SF小説『指令42』(原題:「ディレクションズ・フォー・ア・シュルード」とも)の題材であり、作家リース・ラプリンがSF界で話題となるような意味の深い無解の数として登場するものです。\n\nこの質問で一番面白いのは、リース・ラプリンがSF界の有名な作家ジョン・グリーンをもてなす会のときに、どれも答えが42である質問を5つ並べたものです。 \n\n1. 42は数字なのに何を意味するでしょうか?\n2. 42は数か文字なのに何を意味するでしょうか?\n3. 数字や文字のどちらなりにしても意味のある答えがあるかどうか?\n4. 答えが42であることを知るために研究や計算に費やす費用と時間がどのくらいかかるでしょうか?\n5. 答えが42であることを知るために研究や計算に費やした費用と時間を考慮した場合、答えが42であることを知ることの意味は何でしょうか?\n\nこの5つの質問は答えが42なので、各質問に答える人には、それ自体が答えになるとともに、質問そのものはその質問に答える人が考えるのと同じであるとみなすことです。したがって、この質問の中でも最も面白いのは、第2の質問か、第5の質問です。<|eot_id|>']

これをfine tuningしたときはこんな感じになっていました。

['<|begin_of_text|><|start_header_id|>system<|end_header_id|>\n\nCutting Knowledge Date: December 2023\nToday Date: 26 July 2024\n\n<|eot_id|><|start_header_id|>user<|end_header_id|>\n\n答えが42の質問で一番面白いのは?<|eot_id|><|start_header_id|>assistant<|end_header_id|>\n\n答えが42である質問で一番面白いというのは、様々な面白さがあるのにおおよそのものにあります。\n\n1)アドバルター・プリンスの「42」を読んだ人にとっては、エリーが42と言及したエピソードに思わず大笑いができました。おかしさと感動と、読み手に一つの感情を与える一言の台詞です。\n\n2)答えは42なので、意味を考え続けながら解決方法がわかる、難解な数学や科学の問題やミステリーもあります。なぜ42が解答とあるのか、さらに深い理由を考える面白いことにもなります。\n\n3)実際には答えが42であることで、人間の理解は限界があり、答えは無限に存在することにも面白いです。この一言で、無限と有限、可能性と限界についての複雑で多面的な考慮を強調しています。\n\n4)答えが42であることで、無意識の深みにあまりもってくる意外なエピソードやシナリオに思わず興味を持ちます。意図的か無意識かはよくわからないことでもあります。\n\n5)答えは42であることによって、人生の中で目指す答えは見つけてもうまくいっていることにも感慨を表します。なぜ、42で十分であるか、また何で42なのかの考察に導き、多面的な思考を引き起こします。\n\n一言で言うと、42を意識して書いたものとしても、それを無視するものとしても、読み手に面白いように感じられるような表現やエピソードがあるのです。<|eot_id|>']

あんまり違いがわからないのと、fine tuningによって獲得できた知識が影響しているのかはよくわかりませんね…

ただ学習自体はちゃんとできているのと、出力が変化しているので多分fine tuningできてるんだろうということにしておくことにします。

参考文献

下記の文献を参考にさせていただきました。

感想

以上、Unslothの使い方について勉強してみた次第です。 モデルをquantizeしているので精度劣化の懸念はあるものの、高速かつ軽量に学習できるようなのでGPU環境をあまり持っていない庶民はまずはこのあたりを試してみるのがいいんじゃないかな、と個人的には思ったりしました。

まだまだLLM全くわからない民なので、ちょいちょい勉強していこうと思います。