Databricksでrinnaの日本語GPT-2モデルのファインチューニングを試す

こちらを参考にさせていただきながら。

https://note.com/npaka/n/n9f2f6aa0eb0b

他にもこちらの記事を参考にさせていただきました。

https://data-analytics.fun/2022/02/23/gpt-1b/

https://qiita.com/m__k/items/36875fedf8ad1842b729

# ライブラリのインストール

```
%pip install sentencepiece==0.1.97 datasets evaluate accelerate
```

スクリプトをクローンしておきます。

```
%sh
git clone https://github.com/huggingface/transformers
```

ソースからtransformersをインストールしろと言われたのでインストールします。

```
%pip install git+https://github.com/huggingface/transformers
```

# MLflowトラッキングサーバーの設定

DatabricksにはMLflowがインテグレーションされているので、適切な設定を行えばシェルによるトレーニングもトラッキングできます。

[Hugging FaceとDeepSpeedによる大規模言語モデルのファインチューニング](https://qiita.com/taka_yayoi/items/fadf3ce5b3d4e954ef83)

`MLFLOW_EXPERIMENT_NAME`はMLflowエクスペリメントのパスなので適宜変更してください。

```py:Python
import os

os.environ['DATABRICKS_TOKEN'] = dbutils.notebook.entry_point.\
getDbutils().notebook().getContext().apiToken().get()
os.environ['DATABRICKS_HOST'] = "https://" + spark.conf.get("spark.databricks.workspaceUrl")
os.environ['MLFLOW_EXPERIMENT_NAME'] = "/Users/takaaki.yayoi@databricks.com/20230422_rinna/japanese-gpt2-medium"
os.environ['MLFLOW_FLATTEN_PARAMS'] = "true"
```

# ファインチューニング

データは`/dbfs/FileStore/shared_uploads/takaaki.yayoi@databricks.com/dolly/taka_qiita.csv`にあるものを使用しています。モデルは`rinna/japanese-gpt2-medium`を使用しています。`output_dir`にはモデルの保存先を指定します。

```sh
%sh
python ./transformers/examples/pytorch/language-modeling/run_clm.py \
  --model_name_or_path=rinna/japanese-gpt2-medium \
  --train_file=/dbfs/FileStore/shared_uploads/takaaki.yayoi@databricks.com/dolly/taka_qiita.csv \
  --do_train \
  --num_train_epochs=3 \
  --save_steps=10000 \
  --block_size 512 \
  --save_total_limit=3 \
  --per_device_train_batch_size=1 \
  --output_dir=/dbfs/tmp/takaaki.yayoi@databricks.com/rinna/output/ \
  --overwrite_output_dir \
  --use_fast_tokenizer=False
```

今回使用したGPUクラスターでは2.5時間程度かかりました。DeepSpeedをも使いこなせるようにならなくてはです。

なお、エクスペリメントでトラッキングされるので、lossをリアルタイムで確認できます。便利ですね。
![Screenshot 2023-04-23 at 13.07.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/0ad7ce29-ea66-fe56-7dc0-e0b1d70b43fd.png)

```
%fs 
ls /tmp/takaaki.yayoi@databricks.com/rinna/output/
```
![Screenshot 2023-04-23 at 13.13.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/31b2ad32-cc51-d720-08ff-8e720d1aae83.png)

DBFSに永続化しているので、クラスターを停止してもモデルが消えることはありません。

# 推論

保存したモデルをロードします。

```py:Python
from transformers import T5Tokenizer, AutoModelForCausalLM

tokenizer = T5Tokenizer.from_pretrained("/dbfs/tmp/takaaki.yayoi@databricks.com/rinna/output/")
model = AutoModelForCausalLM.from_pretrained("/dbfs/tmp/takaaki.yayoi@databricks.com/rinna/output/")
```

```py:Python
input = tokenizer.encode("機械学習とは", return_tensors="pt")
output = model.generate(input, do_sample=True, max_length=100, num_return_sequences=1)
print(tokenizer.batch_decode(output))
```

```
['機械学習とは
 機械学習(<unk> )は、コンピュータービジョン技術と人工知能を用いた様々な種類の機械学習、コンピュータービジョンアプリケーションです。機械学習のユースケースには、予測や不正検知のようなセンシティブなタスク、画像分類、テキスト分類、不正検知のようなエンドツーエンドのユースケース、<unk> のインフラストラクチャの管理、モデルとモデルのバージョンの管理が含まれます。 この記事の後半では、モデル開発、<unk> の自動化を支援する様々なツールを探索し、<unk>ata']
```

`<unk>`が含まれていますが、トレーニングデータが反映されています。面白い。

この辺りの挙動を理解しつつ、データも整理して、さらには[MLflowの新機能](https://qiita.com/taka_yayoi/items/ad370a7f57c4eae58800)も活用していこうと思います。いやー、LLM面白いです。

### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)