オープンソース大規模言語モデルDollyをトレーニングしてみる

こちらの記事で触れた、オープンソース大規模言語モデルDollyを動かしてみます。モデルをダウンロードしてトレーニングを行うところまでカバーします。

https://qiita.com/taka_yayoi/items/e9c895c169da652c6efb

# 前提

- Databricksワークスペース
- GPUインスタンスのクォータ([こちら](https://github.com/databrickslabs/dolly)に記載されている`p4d.24xlarge`などは大規模GPUクラスターなので、多くの場合クォータ解除の申請が必要になりますが、そもそも希少なので利用自体が難しいかもしれません)

# 手順

## クラスターの作成

私が使用している環境でも上のインスタンスタイプは利用できなかったので、`g5.48xlarge`を使用しています。これでもメモリ768GB、8GPUです。
![Screenshot 2023-03-26 at 8.42.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/2a985acc-e9af-b307-3a60-598e23b43375.png)

:::note
**注意**
CPUクラスターに比べて、GPUクラスターは高価なので使用する際にはコストに注意してください。AWSのコストに加えて、[こちら](https://www.databricks.com/product/pricing/product-pricing/instance-types)で試算できるように`g5.48xlarge`の場合、Databricksのコストも一時間あたり14ドル程度かかります。
:::

## ノートブックのクローン

もとのソースは[GitHubで公開](https://github.com/databrickslabs/dolly)されているので、[Databricks Repos](https://qiita.com/taka_yayoi/items/b89f199ff0d3a4c16140)のリポジトリにクローンします。
![Screenshot 2023-03-26 at 8.52.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/2bf5b498-1895-3f15-1c08-79fbd38d9dc8.png)
![Screenshot 2023-03-26 at 8.52.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b7f51a7d-0744-0b25-cbce-06cb392216dd.png)

## 設定の変更

ノートブック`train_dolly`を開き、[上で作成](#クラスターの作成)したクラスターにアタッチします。

実際、`g5.48xlarge`でトレーニングを完了させるにはいくつか設定の変更を行いました。さらなるチューニングは必要だと思いますが、まずはトレーニング完遂を目指します。こちらではトレーニングに成功した設定を共有しています。

リポジトリからクローンした`dolly/config/ds_z3_bf16_config.json`を変更します。`"zero_optimization"`の下に`"offload_optimizer"`のブロックを追加しています。

```json:ds_z3_bf16_config.json
{
    "bf16": {
      "enabled": "auto"
    },
    "optimizer": {
      "type": "AdamW",
      "params": {
        "lr": "auto",
        "betas": "auto",
        "eps": "auto",
        "weight_decay": "auto"
      }
    },
    "scheduler": {
      "type": "WarmupLR",
      "params": {
        "warmup_min_lr": "auto",
        "warmup_max_lr": "auto",
        "warmup_num_steps": "auto"
      }
    },
    "zero_optimization": {
      "stage": 3,
      "offload_optimizer": {
        "device": "cpu",
        "pin_memory": true
      },
      "overlap_comm": true,
      "contiguous_gradients": true,
      "sub_group_size": 1e9,
      "reduce_bucket_size": "auto",
      "stage3_prefetch_bucket_size": "auto",
      "stage3_param_persistence_threshold": "auto",
      "stage3_max_live_parameters": 1e9,
      "stage3_max_reuse_distance": 1e9,
      "stage3_gather_16bit_weights_on_model_save": true
    },
    "gradient_accumulation_steps": "auto",
    "gradient_clipping": "auto",
    "steps_per_print": 2000,
    "train_batch_size": "auto",
    "train_micro_batch_size_per_gpu": "auto",
    "wall_clock_breakdown": false
  }
```

ノートブックの最後のセルは以下の様になっています。

```sh
!deepspeed {num_gpus_flag} \
     --module training.trainer \
     --deepspeed {deepspeed_config} \
     --epochs 1 \
     --local-output-dir {local_output_dir} \
     --dbfs-output-dir {dbfs_output_dir} \
     --per-device-train-batch-size 8 \
     --per-device-eval-batch-size 8 \
     --lr 1e-5
```

今回はバッチサイズと学習率を大きくしています。

```sh
!deepspeed {num_gpus_flag} \
    --module training.trainer \
    --deepspeed {deepspeed_config} \
    --epochs 1 \
    --local-output-dir {local_output_dir} \
    --dbfs-output-dir {dbfs_output_dir} \
    --per-device-train-batch-size 16 \
    --per-device-eval-batch-size 16 \
    --lr 1e-2
```

## ノートブックの実行

Cmd4を実行すると、画面左上にある`num_gpus`はDatabricksのウィジェットであり、ノートブックにパラメーターを引き渡すことができます。ここではクラスターのGPU数である`8`を入力しておきます。
![Screenshot 2023-03-26 at 8.53.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/cd7960a2-3f9c-bd0a-c5dc-a0193bd8eeed.png)

Cmd9を実行すると、tensorboardが表示されるのでトレーニングの進捗を確認することができます。
![Screenshot 2023-03-26 at 8.55.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/fdf0fcb5-7a74-9276-fe9f-f31007da8960.png)
![Screenshot 2023-03-26 at 8.57.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ff4f0e7d-2d32-ab7c-a313-7aea0d3e79dd.png)

# トレーニングの完了

上のスペックのインスタンスでは約4時間かかりました。
![Screenshot 2023-03-29 at 15.42.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/0d867f6b-3fdd-29db-407c-89ecb319f085.png)

Tensorboardの結果。
![Screenshot 2023-03-29 at 15.42.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/9e9ea4f6-10cc-d214-26b7-eedd91df9c29.png)

出力ディレクトリにモデルが永続化されています。
![Screenshot 2023-03-29 at 15.42.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/06e3dd2f-e67d-20d0-5907-7bf64ce4e32d.png)

次はこのモデルをどう使うかを調査します。

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

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


### Databricks無料トライアル

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