ColossalAIのChatGPTトレーニングプロセスをGoogle Colabで動かしてみた

# はじめに
2022-2023年は、GenerativeAIが目覚ましい進化を遂げています。その中でも、GPT-3と呼ばれるモデルは、非常に高い性能を発揮することで知られています。しかし、GPT-3は商用利用に制限がある点やOpenAIのChatGPTがコードをリリースしていない点を考えると、一般の開発者や研究者が利用することが難しい状況にあります。

そこで注目されているのが、ColossalAIという機械学習フレームワークです。ColossalAIは、ChatGPTのトレーニングプロセスをオープンソース版を提供しており、低コストでChatGPTと同等の実装プロセスを誰でも自由に利用することができます。本記事では、ColossalAIが開発したレプリカ版ChatGPTをGoogle Colabで動かしてみようと思います。

参考文献: https://www.hpc-ai.tech/blog/colossal-ai-chatgpt
リポジトリ: https://github.com/hpcaitech/ColossalAI/tree/main/applications/ChatGPT

## ColossalAIのトレーニングプロセスの概要
1. pytorchベースの完全なオープンソースで、ChatGPTと同等の実装プロセスを提供。
2. デモトレーニングプロセスでは、1.62GBのGPUメモリしか必要としない軽量モデル
3. 元のpytorchと比較して、単一マシンのトレーニングプロセスは7.73倍高速、１GPUでの推論が1.42倍高速になった、
4. 単一GPUスケール、単一ノードでの複数 GPUスケール、オリジナルの1,750億パラメータスケールの複数のバージョンを提供。また、OPT、GPT-3、BLOOM、および Hugging Faceからトレーニングプロセスへの他の多くの事前学習済み大規模モデルのインポートもサポート。

# GoogleColabの設定
1. ノートブックを新規作成
下記のURLをクリックしてGoogle Colabにアクセスします．
https://colab.research.google.com/?hl=ja
![スクリーンショット 2023-02-25 10.35.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1917122/241bfb1d-7ad7-b09e-5fc1-752323dcd3b3.png)

2. GPUの選択
タブから，ランタイム＞ランタイムのタイプを変更＞ハードウェアアクセラレータでGPUを選択します．無料版なので、デフォルトで保存しました。
![スクリーンショット 2023-02-25 10.35.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1917122/5b8f8e7f-2a58-ae12-16e5-59466295d911.png)

3. 作業フォルダの作成
自分のアカウントのGoogle Driveとマウントし、「マイドライブ」の中に「work」という作業フォルダを作成します。その後、以下のコードを実行します。

```py
# Googleドライブのマウント
from google.colab import drive
drive.mount("/content/drive")

# 作業フォルダの作成と移動
import os
os.makedirs("/content/drive/My Drive/work", exist_ok=True)
%cd "/content/drive/My Drive/work"

# ColossalAIのリポジトリをworkディレクトリの中にクローン
!git clone https://github.com/hpcaitech/ColossalAI.git

# ColossalAIというディレクトリに移動し、インストール
%cd ColossalAI
!pip install .
```

![スクリーンショット 2023-02-25 10.34.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1917122/ac3a5c45-5e71-43c6-46de-77a29007c39e.png)

# Chatgpt/examplesでトレーニング
ColossalAIのgitリポジトリには、examplesというディレクトリが格納されており、実際にモデルのトレーニングやその結果を確認することができます。まずは用意されているrequirements.txtを使って、必要なライブラリをインストールしましょう。

```py
%cd applications/ChatGPT/examples/
!pip install -r requirements.txt
```

## 1. ダミーデータを使ったモデルのトレーニング
ColossalAIの中には、３つのstrategiesがサポートされています。
・naive
・ddp
・colossalai

これらは、ランダムに生成されたprompt dataを使用し、naiveの場合は1GPU、ddpとcolossalaiの場合には、2GPUを使ってトレーニングを行います。GPU数が多いほど並列演算が速くなるため、トレーニングが早まると考えてください。それぞれを実行するコードは次の通りですので、好きなものを選んでください。

```py
# run naive on 1 GPU
!python train_dummy.py --strategy naive
# run DDP on 2 GPUs
!torchrun --standalone --nproc_per_node=2 train_dummy.py --strategy ddp
# run ColossalAI on 2 GPUs
!torchrun --standalone --nproc_per_node=2 train_dummy.py --strategy colossalai
```

### 結果
今回はnaiveを使用し、1時間ほどで学習が終了しました。
[最終] 1.84it/s, actor_loss=0.374, critic_loss=0.0465
![スクリーンショット 2023-02-25 11.40.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1917122/5c7d8c2e-a7c1-7a0e-b9e1-cad7874cb997.png)

## 2. リアルデータを使ったモデルのトレーニング
ColossalAIでは,トレーニングデータとしてHugging Faceの[awesome-chatgpt-prompts](https://huggingface.co/datasets/fka/awesome-chatgpt-prompts)を使用しているため、こちらの[prompts.csv](https://github.com/f/awesome-chatgpt-prompts)をworkフォルダにダウンロードします。テストで使用するのは、100promptsほどの小さいデータセットです。

```py
%cd "/content/drive/My Drive/work"
!git clone https://github.com/f/awesome-chatgpt-prompts.git
%cp /content/drive/MyDrive/work/awesome-chatgpt-prompts/prompts.csv /content/drive/MyDrive/work/ColossalAI/applications/ChatGPT/examples
```

↓promptsの例
![スクリーンショット 2023-02-25 10.59.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1917122/d98b63b1-8786-7d6c-75ad-b41582dd1aca.png)

こちらも、３種類のstrategiesから選択することができます。
```py
# run naive on 1 GPU
!python train_prompts.py prompts.csv --strategy naive
# run DDP on 2 GPUs
!torchrun --standalone --nproc_per_node=2 train_prompts.py prompts.csv --strategy ddp
# run ColossalAI on 2 GPUs
!torchrun --standalone --nproc_per_node=2 train_prompts.py prompts.csv --strategy colossalai
```
### 結果
今回はnaiveを使用し、10分ほどで学習が終了しました。
[最終] 1.83it/s, actor_loss=-.102, critic_loss=0.00737
![スクリーンショット 2023-02-25 11.48.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1917122/52bc80ee-cd25-cd2a-4635-0fc44ac31318.png)

## 3.報酬モデルをトレーニング
公式によると、以下のモデルがサポートされています。
GPT
 - GPT2-S (s)
 - GPT2-M (m)
 - GPT2-L (l)
 - GPT2-XL (xl)
 - GPT2-4B (4b)
 - GPT2-6B (6b)
 - GPT2-8B (8b)
 - GPT2-10B (10b)
 - GPT2-12B (12b)
 - GPT2-15B (15b)
 - GPT2-18B (18b)
 - GPT2-20B (20b)
 - GPT2-24B (24b)
 - GPT2-28B (28b)
 - GPT2-32B (32b)
 - GPT2-36B (36b)
 - GPT2-40B (40b)
 - GPT3 (175b)

BLOOM
 - BLOOM-560m
 - BLOOM-1b1
 - BLOOM-3b
 - BLOOM-7b
 - BLOOM-175b

OPT
 - OPT-125M
 - OPT-350M
 - OPT-1.3B
 - OPT-2.7B
 - OPT-6.7B
 - OPT-13B
 - OPT-30B

今回は、[bloom-560m](https://huggingface.co/docs/transformers/model_doc/bloom#transformers.BloomTokenizerFast)を使っていきましょう！

```py
!python train_reward_model.py --pretrain bigscience/bloom-560m
```

### 結果
OutOfMemoryErrorになってしまいました😭もう少し調べる必要ありますね
```py
torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 64.00 MiB (GPU 0; 14.75 GiB total capacity; 13.62 GiB already allocated; 2.81 MiB free; 13.74 GiB reserved in total by PyTorch) If reserved memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation.  See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF
```

# まとめ
本記事では、ColossalAIのChatGPTをGoogle Colabで動かしてみた結果を紹介しました。オープンソースでChatGPTが動かせるようになるのは夢が広がりますね。今後、さらなるLLMの登場や、より高度な自然言語処理が可能になることを期待してます！

# おすすめの記事
https://qiita.com/walnut-pro/items/0124a5a0c83c9b4e2669

# Twitter
[https://twitter.com/walnut_pro](https://twitter.com/walnut_pro)