どこよりも優しく丁寧に、GPT-2日本語(rinna)モデルを自宅のPCでファインチューニングする方法を解説していきます。
学習データの用意方法や、ファインチューニング済みモデルの使用方法まで画像付きで詳しく説明しました。
GPT-2をとりあえず日本語で動かすには以下のページを参照してください。
1,環境構築を行う
Python(3.10.7で動作確認済)とGitがインストール済みであることが前提です。
ファインチューニングにつかうスクリプトをダウンロード
ファインチューニング関連用のフォルダを適当な場所に作成します。
そのフォルダ内で右クリックしてターミナルを起動。

以下のコマンドを実行し、ファインチューニング用スクリプトを取得します。
git clone https://github.com/huggingface/transformers -b v4.23.1

Pythonの仮想環境を作成し、諸々インストール
仮想環境を作成
仮想環境を使用してPythonを実行するために、まず仮想環境を作る準備をしていきます。
まずコマンドプロンプトで以下のコマンド実行。
pip install virtualenv
そして先程作成したフォルダ内でターミナルを開き、以下のコマンドで仮想環境を構築します。

virtualenv -p C:\Users\loveanime\AppData\Local\Programs\Python\Python310\python.exe myvenv
赤文字部分のユーザー名は各々置き換えて下さい。
構築終了後、以下のコマンドで仮想環境を有効化します。
myvenv\Scripts\Activate.ps1
モジュールをインストール
以下のモジュールを1つずつインストールします。
pip install transformers==4.23.1
pip install evaluate==0.3.0
pip install sentencepiece==0.1.97
pip install protobuf==3.20.0
pip install scikit-learn
最後にPytorchをインストールしますが、PyTorchについてはCUDAバージョンなどに左右されるため、公式を確認してインストールしてください。

ここでは一例として当方の環境(上記画像の通り)のコマンドを載せておきます。
pip3 install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117
全てインストールし終えたらファインチューニングの開始です。
なお、エラーが起きる場合、以下も追加でインストールします。
(最初インストールせずに上手く行ったので謎、理由は分からなくても以下のインストールで上手く行ったからヨシ!)
pip install accuracy
2,ファインチューニングを実行
学習元テキストファイルの準備
よくファインチューニングの例でデータセットになっているakane-talkをダウンロードします。
上記リンク先で、「Raw」ボタンを右クリックし、「名前をつけてリンクを保存」を選択します。

ダウンロードしたファイルから「<|endoftext|>」という文字列を取り除き、分かりやすくするため名前をtrain.txtに変更したら準備完了です。

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

学習元のテキストファイルを上記写真のように配置してから以下のコマンドを実行します。
python ./transformers/examples/pytorch/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/
学習が始まります。

[INFO|trainer.py:2907] 2023-02-21 10:48:21,739 >> ***** Running Evaluation *****
[INFO|trainer.py:2909] 2023-02-21 10:48:21,739 >> Num examples = 14
[INFO|trainer.py:2912] 2023-02-21 10:48:21,739 >> Batch size = 1
100%|██████████████████████████████████████████████████████████████████████████████████| 14/14 [00:01<00:00, 12.70it/s]
1分ちょいで終わりました。
学習中のシステム負荷
学習中のシステム負荷はこんな感じです。

VRAMが足りなくて出来ない方は、小さいモデルを使用してみるといいかもしれません、
--model_name_or_path=rinna/japanese-gpt2-medium
↑ここを「japanese-gpt2-small
」とかに変更すればOKです。
3,ファインチューニング済みモデルを使用する
推論(文章生成)を行うコード コピペ用
from transformers import T5Tokenizer, AutoModelForCausalLM
import torch
tokenizer = T5Tokenizer.from_pretrained("rinna/japanese-gpt2-medium")
model = AutoModelForCausalLM.from_pretrained("C:/Users/loveanime/Desktop/gpt-train/output")
if torch.cuda.is_available():
model = model.to("cuda")
while True:
text = input("プロンプト: ")
# text = "おはよう、お兄ちゃん。"
token_ids = tokenizer.encode(text, add_special_tokens=False, return_tensors="pt")
with torch.no_grad():
output_ids = model.generate(
token_ids.to(model.device),
max_length=100,
min_length=100,
do_sample=True,
top_k=500,
top_p=0.95,
pad_token_id=tokenizer.pad_token_id,
bos_token_id=tokenizer.bos_token_id,
eos_token_id=tokenizer.eos_token_id,
)
output = tokenizer.decode(output_ids.tolist()[0])
print(output)
これをコピペして保存し、ダブルクリックで起動します。
黒い画面が立ち上がり、プロンプトを入力できるようになるので、好きに書いてエンターキーを押してみましょう。


ファインチューニング結果 元のモデルと見比べる
プロンプト「ねえ、お兄ちゃん」の場合 3つずつ返答させてみる
元のモデルの返答
- ねえ、お兄ちゃん。 」に出演している。 2015年より活動拠点を東京都千代田区岩本町から福岡に移し、「神谷ゆみ」へ改名している。 2018年5月6日、都内ホテルでの第1子となる女児を出産。
- ねえ、お兄ちゃん! 私、一人暮らしだから買い物行かないのよ、お母さん。いいのよ、そうすれば、今日はちょっとだけ優しくしてあげる。でも、それだけじゃないんだって、あなたは
- ねえ、お兄ちゃん、あなたは、あなたの宝物だから大切にしてくれる? どうせ、いいって、思っているのなら、きっと、いいんだよ。 それは……、そうですねえ、それは……、いいわ
ファインチューニング済みモデルの返答
- ねえ、お兄ちゃん。 よく兄ちゃんに話を聞こうとするでしょ? いつもちゃんと聞いてあげてたつもりなんだけど……。 それってねえ、本当にそう? いいえ、だからって話聞きたいわけじゃないよ。 ずっと外にいたから分からないよ。 え、そんなことないよ! お兄ちゃんにはいつも相談に乗ってもらってるんだから。 ふふっ。 じゃあ、ではお兄
- ねえ、お兄ちゃん! 今、やっちゃんが何か言ってると思うんだけど……。まぁ、そんなことお兄ちゃんは知ってるけどね! あはは 、そうだね! ほら、○○ちゃん。今日はね、ねぇ、お兄ちゃんがプール教室に行ってるから、代わりにバイバイッ! うん、うん! ほら 、あれよあれよという間に終わるのが面白いね!
- ねえ、お兄ちゃん。テレビに熱中していると、今ごろになって叱られちゃうかも? 「お兄ちゃんはテレビばかり見ないで、勉強しようね。そして、スポーツをね!」 お兄ちゃんのテストの点、最高だね。私はこれから君たちと一緒に、お勉強しよう。………………お、もうこんな時間になったか?まぁ、よしとしよ、お兄ちゃん! そうだね。……お兄ちゃんが
生成された文章を見比べてみて
ファインチューニング済みモデルの返答は、学習データの通り、比較的会話のような体裁になっています。
また、学習データによく出るセリフ末尾の「!」も反映されています。
より学習ステップを増やしていけば、キャラの返答をファインチューニングできるかもしれませんね☆
とりあえず学習データが豊富な一般的雑談を行えるようにファインチューニングしてみました。
GPT-2をとりあえず日本語で動かすには以下のページを参照してください。
他にも色々とAI関連の記事を書いています。合わせてご覧ください。
画像生成AI「Stable Diffusion」を動かす方法
コード生成AI「santacoder」をWindowsローカル環境で動かす方法
文章生成AI「GPT-2/rinna」をWindowsローカルで動かすには