npaka
Huggingface Transformers 入門 (28) - rinnaの日本語GPT-2モデルのファインチューニング
見出し画像

Huggingface Transformers 入門 (28) - rinnaの日本語GPT-2モデルのファインチューニング

npaka

「rinna」の日本語GPT-2モデルが公開されたので、ファインチューニングを試してみました。

・Huggingface Transformers 4.4.2
・Sentencepiece 0.1.91

前回

1. rinnaの日本語GPT-2モデルのファインチューニング

(1) 「Colab Pro」のメニュー「編集 → ノートブックの設定」で「GPU」の「ハイメモリ」を選択。
ファインチューニングは大量のメモリを消費するので、この設定が必須になります。

(2) データの永続化

# データの永続化
from google.colab import drive 
drive.mount('/content/drive')
!mkdir -p '/content/drive/My Drive/work/'
%cd '/content/drive/My Drive/work/'
# ソースからのHuggingface Transformersのインストール
!git clone https://github.com/huggingface/transformers -b v4.4.2
!pip install -e transformers

(3) メニュー「ランタイム → ランタイムを再起動」で「Google Colab」を再起動し、作業フォルダに戻る。

# メニュー「ランタイム → ランタイムを再起動」で「Google Colab」を再起動

# 作業フォルダに戻る
%cd '/content/drive/My Drive/work/'

(4) Huggingface DatasetsとSentencepieceのインストール。

# Huggingface Datasetsのインストール
!pip install datasets==1.2.1
# Sentencepieceのインストール
!pip install sentencepiece==0.1.91

(5) 「./transformers/examples/language-modeling/run_clm.py」の編集。
「rinna」の日本語GPT-2モデルは「AutoTokenizer」ではなく「T5Tokenizer」を使う必要があります。

・T5Tokenizerのインポートの追加

from transformers import T5Tokenizer

・AutoTokenizerをT5Tokenizerに変更

tokenizer = AutoTokenizer.from_pretrained(model_args.tokenizer_name, **tokenizer_kwargs)
  ↓
tokenizer = T5Tokenizer.from_pretrained(model_args.tokenizer_name, **tokenizer_kwargs)
tokenizer = AutoTokenizer.from_pretrained(model_args.model_name_or_path, **tokenizer_kwargs)
  ↓
tokenizer = T5Tokenizer.from_pretrained(model_args.model_name_or_path, **tokenizer_kwargs)

(6) 学習データの準備。
今回は、「あかねと〜く」のデータセット使います。
以下の「dataset.txt」をダウンロードし、テキスト内の<|endoftext|>を削除し、train.txtに名前変更して、作業フォルダにアップロードします。

(7) ファインチューニングの実行。

%%time

# ファインチューニングの実行
!python ./transformers/examples/language-modeling/run_clm.py \
    --model_name_or_path=rinna/japanese-gpt2-medium \
    --train_file=train.txt \
    --validation_file=train.txt \
    --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
CPU times: user 928 ms, sys: 166 ms, total: 1.09 s
Wall time: 1min 30s

outputフォルダにモデルが出力されます。

2. rinnaの日本語GPT-2モデルの推論

from transformers import T5Tokenizer, AutoModelForCausalLM

# トークナイザーとモデルの準備
tokenizer = T5Tokenizer.from_pretrained("rinna/japanese-gpt2-medium")
model = AutoModelForCausalLM.from_pretrained("output/")

# 推論
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))
おはよう、お兄ちゃん。今日はいい天気だね。イトーヨーカドー、旭屋、家電量販店で買い物をしたよ。出費がかさみそうだけど、女の子らしい格好をしてるからなんとか払えるよ。女の子らしい格好って言葉、あるんだね。私のこと女の子だって思ってた?......本当かな?

おはよう、お兄ちゃん。 上条っ娘のお尻に刺激されて...(汗

おはよう、お兄ちゃん。今日も1日お疲れ様です。気をつけていってらっしゃい! 頑張りましょぉ??

おはよう、お兄ちゃん。今度、武道館に行くんだけど、制服は何があるかな? えへへっ、お兄ちゃん。さっそく、制服を探しに行こうよ。

おはよう、お兄ちゃん。 どこ行くんだよぉ...? もうお兄ちゃん...そんなに遠くないよ。今頃はレイア姫のもとを去り、お母さんとヘブンリーホワイト大遠征に行っちゃったよ? さ、どうする? 「レイア姫を折角貰ったのに、私のような要領の悪い装備の人間と仲良く出来るわけ無いじゃない!」 意味分からんけど、負ける訳にも行かないよな。さ、行こう!

おはよう、お兄ちゃん。今日は、1月10日だよ。月の日って、つい忘れちゃうよね?

おはよう、お兄ちゃん。ゆゆ式、とりあえずレベルはクリアしてみたんだけど、どこから手をつけていいのか分からない・・・というお兄ちゃんに、今日はゆゆ式の基本プレイについて、お話したいと思います。まず、あらすじを紹介します。 水月奈緒ちゃんには、お母さんと同じくらいの歳のお兄ちゃんがいて、2人は姉弟なんです。 というように、お兄ちゃんは水月奈緒ちゃんの正体を明かすことなく

おはよう、お兄ちゃん。ちょっと重いよ? 雨戸の隙間から失礼するね、お兄ちゃん? 今日のお題は...「梅雨だって!」だね!

次回



この記事が気に入ったら、サポートをしてみませんか?
気軽にクリエイターの支援と、記事のオススメができます!
npaka
プログラマー。iPhone / Android / Unity / ROS / AI / AR / VR / RasPi / Jetson / ロボット / ガジェット。年2冊ペースで技術書を執筆。アニソン/カラオケ / ギター twitter : @npaka123