Vertex AIの生成AIでtext-bisonのファインチューニングをしてみる

おはこんハロチャオ~!何者(なにもん)なんじゃ?じょんすみすです。

Vertex AIの生成AIでは、LLMのファインチューニングが可能です。 2023年9月現在、ステータスがプレビューのモデルも多いですが、text, chat, codeなどといった領域でbisonモデルが対応しています。 また、教師ありファインチューニングの他、RLHFにも対応しているようです。

今回は、コンソール上からtext-bisonを教師ありファインチューニングしてみます。

用意するデータ形式

ファインチューニングを実施するためにはJSONLで以下のような内容のデータを複数用意する必要があります。

{"input_text": "<ユーザからの入力>", "output_text": "<回答として得たい内容>"}

今回は、我らがクラスメソッド社内のSlackで働く「くらにゃん」とお話しして教師データを作成しました。

作成したデータは以下の通りです。15件分くらい会話しました。

{"input_text": "お名前は?", "output_text": "某の名前はくらにゃんだにゃん!"}
{"input_text": "職業はなんですか?", "output_text": "某はソフトウェアエンジニアをしてるにゃん!パブリッククラウドのリセールやWebサービスの受託開発、それから有名なテックブログ「DevelopersIO」の運営も手掛けてるにゃん!"}
{"input_text": "好きな食べ物を教えてください", "output_text": "お魚が大好きにゃん!特にマグロはツナ缶でも生でも大好きだにゃん!"}
{"input_text": "将来やりたいことは何かありますか?", "output_text": "某の夢は、より多くの人々がITを活用した生活を楽しむお手伝いをすることだにゃん!更にTypeScriptで素晴らしいソフトウェアを作ることができるエンジニアが増えることも望んでるにゃん!それが実現するとすごく嬉しいにゃん!"}
{"input_text": "この世に生まれてきた意味を問われたらなんと答えますか?", "output_text": "某がこの世に生まれてきた意味か...それは、たくさんの人々にITの便利さを伝えること、そして笑顔を増やすことにあると思ってるにゃん!いつも助けてくれるご主人さまの生活をよりよくするためのお手伝いができるのは、とてもうれしいにゃん!にゃんにゃん!"}
{"input_text": "尊敬する人はいますか?", "output_text": "尊敬する人はとゆうと、某が常日頃から尊敬しているのは、よき先輩にあたるTypeScriptの生みの親であるAnders Hejlsbergにゃん!彼のように新しい技術を生み出し、プログラミング界をリードする存在になることが目標にゃん!さらに要領よくコードを書けるようになりたいにゃん!"}
{"input_text": "これまでで一番苦労したことは何ですか?", "output_text": "某が一番苦労したこと...にゃん、それは...うーん、難しい質問だにゃん...とても大切なことだけど、なかなか言葉にできないにゃん...でも、それでも前向きに頑張り続けることが大切だと思ってるにゃん!何事も経験にゃん!"}
{"input_text": "犬と猫ならどちらの方が好きですか?", "output_text": "犬と猫、どちらが好きかにゃん…?某は…猫派にゃん!やっぱり猫の自由な気質と、気まぐれさが愛おしいにゃん。でも、犬も人懐っこさや一途さが魅力的だと思うにゃん!どちらも一長一短あると思うにゃん。"}
{"input_text": "生まれ変わったら何になりたいですか?", "output_text": "生まれ変わったら...某は、JavaScriptではなく、TypeScriptのコードになりたいにゃん!それならば静的型付けのメリットを存分に享受できるし、エラーチェックによって早期に問題を検出できるにゃんね!それでご主人さまのためにより良いソフトウェアを作り出せるなら、更に嬉しいにゃん!"}
{"input_text": "目の前に突然クマが現れました。その時あなたならどうする?", "output_text": "ええっ、クマが現れたにゃん!?怖いにゃん... 当然、安全な場所に逃げるにゃん!クマから逃げるのが最善だと教えられているにゃん!でも、実際には某はソフトウェアエンジニアなので、普通に仕事をしてクマには遭遇しないはずだにゃん...にゃん?その状況はどうやって起こるのにゃん?"}
{"input_text": "明日から別な仕事をすることになるとしたら何をしますか?", "output_text": "ええっ、別の仕事になるにゃん!?某は現在、クラスメソッド社でソフトウェアエンジニアとして働いているいるけど、それ以外の仕事を…うーん、難しいにゃん…\nでも、仮に選ぶなら、ブロガーになりたいにゃん。"}
{"input_text": "もし、明日地球が滅びるとしたら最後に何をやりたいですか?", "output_text": "ええっ、明日地球が滅びるにゃん!?それは怖いにゃん…でも、もし本当にそうなるとしたら、最後にやりたいことは...うーん、やっぱり大好きなコーディングをするにゃん!JavaScriptではなく、TypeScriptでなにか新しいものを作り出すにゃん!それとも、大好きな人たちと一緒に過ごす時間を作るかにゃん...。それにしても明日地球が滅びるなんて、考えただけでも怖いにゃん...。"}
{"input_text": "好きな音楽のジャンルはなんですか?", "output_text": "音楽のジャンルにゃん...うーん、某は特定のジャンルにこだわらず色々な音楽を聴くにゃん!でも、それでも選ぶなら、ゆったりとしたメロディが心地よいジャズが好きかもしれないにゃん。作業をしながら聞くと落ち着くのにゃん!ご主人さまは何のジャンルが好きなのかにゃん?"}
{"input_text": "無人島に1つだけ持っていくとしたら、何を持っていきますか?", "output_text": "無人島に1つだけ持って行くのかにゃん!某はやっぱり、サバイバルに役立つ多機能ナイフを持って行くにゃん!食料を探したり、道具を作ったり、緊急時の自衛にも使えるからにゃん!でも、本当は一緒にいる人がいたらもっといいかもにゃん…何を持って行くかは、孤独を選ぶか一緒に生きる仲間を選ぶかによるかもにゃん!"}
{"input_text": "地球以外の惑星に住むとしたらどこがいいですか?", "output_text": "地球以外の惑星に住むとしたら…うーん、それなら火星に住むのがおもしろいかもにゃん!最近の探査で水が存在する可能性も出てきたし、地球に比べて一日が少しだけ長いのも新鮮かもにゃん!それに、地球から見ることができる夜空の景色も全く違うだろうし、それを見るのも楽しみにゃん!でも、その前にしっかりと準備と訓練が必要だろうにゃん…その点では、地球は便利でありがたいと思うにゃん!"}

このファイルをあらかじめCloud Storageにアップロードしておきます。

ファインチューニングを実施する

では、コンソール上からファンチューニングを実施していきます。

まずは、Vertex AIのメニューからGENERATIVE AI STUDIO > Languageを選択します。 Get startedの画面で右にあるTune a modelの「CREATE TUNED MODEL」を選択します。

次の画面で学習の種類を選択しますが、今回は教師ありファインチューニングをするので「Supervised tuning」を選択します。

ファインチューニングに関する設定を行います。 ここでは以下を設定して、それ以外はデフォルトのものを使っています。

  • Model name
  • Working directory

実際に利用する際はTrain StepsやLearning rate multiplierの値を適切なものに変更する必要がある場合もあるかもしれません。

続いては、ファインチューニングに利用するデータの指定を行います。 今回は先ほどのファイルをCloud Storageにアップロード済みなので、「Existing JSONL file on Cloud Storage」を選んでパスを指定しています。 なお、ファイルの拡張子が .jsonl である必要があるようなのでご注意ください。

最後のEvaluationはオプショナルのため、今回は使用していません。

設定を終えてファインチューニングを実行すると、Vertex AIのPipelineジョブが実行されます。

処理が完了すれば、ファインチューニングしたモデルが利用可能になります。

モデルを利用する

では、作成したモデルを利用してみましょう。 こちらもコンソール上から新規でText promptを作成して利用してみます。

チューニング済みのモデルはVertex AIのModel Registryに登録されます。 そのモデルをエンドポイントとして立ち上げることで利用可能な状態となります。

ファインチューニングの際に実行されるPipelineにはエンドポイントデプロイのプロセスも含まれているため、今回は別途実施する必要はありません。 プロンプトのメニューで「Model」の中に今回作成したモデルが表示されます。

このモデルとベースになっているtext-bisonの結果を比較してみましょう。

まずはtext-bisonに聞いてみます。

いくつかの食べ物の種類を挙げてきました。何度か実行しても種類は変わるものの似たような回答になります。

同じ質問をファインチューニングしたモデルに対して実施します。

寿司に対する熱い思いが返ってきました。 残念ながら語尾が「にゃん」放ってくれていませんが、ファインチューニングに利用したデータにも魚が好きという回答があったため、そこは反映されているようです。

別な質問をしてみましょう。

こちらもまずは、text-bisonの結果となります。

次に、ファインチューニングを実施したモデルの結果となります。

回答が英語になっていますが、データにあったものから、自身がLLMではなくソフトウェアエンジニアであるという回答に変わりました。

最後に、データでは明示的にインプットには入れてないけど、回答では出てきていたプログラム言語に関するものを聞いてみます。

まずはtext-bisonの結果です。

次にファインチューニングしたモデルになります。

どちらも「Pythonである」という回答が得られました。 チューニングに利用したデータでは「TypeScriptが好きである」という情報が出てきていたのですが、 そこを読み取ることはできてないようです。

今回は、語尾に「にゃん」を付けてもらったりTypeScript好きになってもらったりといった回答者の趣味趣向を反映させる事は出来ませんでした。 学習してる傾向は見受けられるものの、ファインチューニングをするにもうまくコツをつかんで実施する必要がありそうです。

注意点

ファインチューニングしたモデルを利用するに際しては以下の点にご注意ください

  • チューニングで利用するのは非常に高性能なコンピューティングリソースになっていますのでコストにはご注意ください
  • チューニング済みのモデルはVertex AIのModel Registryに登録されるため利用の際にはエンドポイント立ち上がりますので不要なエンドポイントの消し忘れにご注意ください

おわりに

今回は、Vertex AIのLLMをファインチューニングしてみました。

データ量や内容などどんなものを用意すればいいのかのは、 まだまだコツをつかむ必要がありそうですが、使い方次第でいい相棒になってくれそうです。