sugiii8's tech blog.
post: 2023-07-06
update: 2023-07-06
INDEX

とにかくファインチューニングを正常に完了させるとこまでやったので記録

thumbnail

ちょっと業務で機械学習周りに手を付けることになりまして、今まであまりやってこなかったジャンルなので
まずはとにかくなんらかファインチューニングを行い正常に動作するコードを得るところまでやったので一旦記録しようと思った。

環境について

ローカル/ローカル仮想環境

とにかく「ファインチューニングとやらが正常に動けばいい」を目標にしていた。
なのでローカルで動かすのが手っ取り早いと考えた。
がMacローカル、Dockerともに環境構築するのに詰まり過ぎたので断念。正直何が悪いのかわからんというレベルで詰まりすぎた。

クラウド

環境構築をしたいわけではなかったのでクラウド上で行うことにした。
AWS(SageMaker)かGoogle(Colab)が有名らしいがとりまColabにした。


参考

りんな GPT-2 の fine tuningをGoogle Colabの無料枠で試す方法
こちらを参考にした。
2023/07時点で2年前の動画なのでこの界隈だとかなり古いものを参考にしている気がしているが、以下を理由にチョイス。

  • やってることはなんとなくわかった
  • 登場する技術が比較的シンプルっぽい
  • データセットも単純にリストを食わせてるだけっぽい


実際Colabで動作させたコード

基本は参考動画の概要欄に貼ってある手順に従ったが、バージョンが古かったりバージョン変更にともなう互換性みたいなところでの修正が必要だった

準備

# google driveをcolab上で使えるようにする
from google.colab import drive

# カレントディレクトリに移動
%cd '/content/drive/My Drive/{ワークディレクトリ}/'


データセットをdriveに入れておく

  • つくよみちゃんというキャラクターが会話テキストデータセットを配布していたので使用させてもらった

つくよみちゃん

  • 簡易的にファインチューニングしたかったので、応答部分のみを残したリストに加工してdriveに配置
  • ファイル名: list.csv とした


transformers取得

# transformersをclone あとでこの中のファイルを修正して使う
# 動画内ではブランチ指定していたが動かなかったのでとりあえず最新を取得した
!git clone https://github.com/huggingface/transformers


必要なものを環境に追加

# こちらも同様に最新バージョン前提とした
!pip install transformers
!pip install tqdm


ランタイム再起動

  • colacメニュー > ランタイム > ランタイムを再起動
  • TODO: ランタイムについて調べる、どういうときに再起動が必要か?等


再度準備

# カレントディレクトリに移動
%cd '/content/drive/My Drive/{ワークディレクトリ}/'


必要なものを環境に追加

!pip install datasets
!pip install sentencepiece


cloneしたtransformersリポジトリのファイル修正

  • ワークディレクトリに指定したgoogle driveにcloneしたリポジトリがある
  • ./transformers/examples/tensorflow/language-modeling/run_clm.py ※ファイルの場所が動画の説明と違っていた
  • 動画の説明通り「AutoTokenizer」を検索して「T5Tokenizer」に置換


ファインチューニング実行

!python ./transformers/examples/tensorflow/language-modeling/run_clm.py \
    --model_name_or_path=rinna/japanese-gpt2-medium \
    --train_file=list.csv \
    --validation_file=list.csv \
    --do_train \
    --do_eval \
    --num_train_epochs=3 \
    --save_steps=5000 \
    --save_total_limit=3 \
    --per_device_train_batch_size=1 \
    --per_device_eval_batch_size=1 \
    --output_dir=output/ \
    --use_fast_tokenizer=False


ファインチューニングしたモデルを使用する

from transformers import T5Tokenizer, AutoModelForCausalLM
tokenizer = T5Tokenizer.from_pretrained("rinna/japanese-gpt2-medium")
model = AutoModelForCausalLM.from_pretrained("output/", from_tf=True)
input = tokenizer.encode("こんにちは、つくよみちゃん", return_tensors="pt")
output = model.generate(input, do_sample=True, max_length=100, num_return_sequences=8)

print(tokenizer.batch_decode(output))


結果

一応それっぽい結果が返ってきた

['こんにちは、つくよみちゃん</s><unk> いつも、たくさん遊びに来てくださり、ありがとうございます♥<unk> 今日は私のオススメメニュー<unk> をお話ししたいと思います♪  ...


振り返り

Keep

  • 一応動いたので、これを記録しておき色々と試せる下地ができた

Problem

  • サンプルコードで動かなかった部分を試行錯誤して修正したがあまり分かってない
  • そもそも機会学習についての知識が足りなすぎる
  • データセットの量が少なすぎる気がするのでちゃんとファインチューニングできたのか怪しい

Try

  • 参考書籍を読む
  • データセット量を増やして再度試してみる