【この記事の目的】
この記事では、Part3で実装したGPT型モデルを、実際にNVIDIA A100 80GB上で学習させる過程をまとめる。
モデルを実装するだけではなく、GPUメモリ、学習速度、バッチサイズ、学習率、checkpoint管理、validation設計など、実際に学習を回すうえで必要になった調整を紹介する。
【機材協力について】
本記事(および本連載プロジェクト)は、株式会社ハイレゾ様よりGPUクラウドサービス「GPUSOROBAN」の計算資源(NVIDIA A100 80GB)をご提供いただき、開発・検証を行っています。
0. はじめに
こんにちは!東京大学文科3類2年で、東大AI研究会 代表の青木です。
私たち東大AI研究会は東大で活動するサークルで、1年かけて0からGPT型モデルを開発するために、毎週水曜日に勉強会を開催しています。勉強会では初心者でも理解しやすいスライドと、充実したカリキュラムを用いて開発を進めています。
株式会社ハイレゾ様は自社でGPUデータセンターを運営しGPUSOROBAN というGPUのクラウドサービスを提供する会社です。高性能GPUは非常に高価で、私たちのような学生サークルが簡単に手を出せるような代物ではありません。GPUSOROBANではクラウド上で必要な期間・量だけGPUを借りることができるため、初期投資を抑えてGPUを活用し開発を行うことができます。
現在株式会社ハイレゾ様の協力のもと、25億パラメーターのGPT型モデルの実装と訓練を行っています。その名もSGT(Scratch Generative Transformer)プロジェクト!前回に引き続き、SGTプロジェクトの様子をお伝えします。
前回モデルの実装を行いましたが、実際に学習を回すには、VRAM、学習速度、バッチサイズ、学習率、checkpoint、validation lossなど、多くの現実的な調整が必要になります。
この記事は、Part4【学習・チューニング編】として、そんな学習・チューニングの過程をまとめます。
(Part3【モデル実装編】はこちらから:https://qiita.com/uaokit0905/private/8e849efa7e6142dffaf3)
今回の学習サマリは以下のようになっています。
学習サマリ
基本情報
- 実験名SGTプロジェクト
- モデル規模: 約2.5B parameters
- GPU: A100 80GB など
- 初期状態: ランダム初期化
- 最新checkpoint: checkpoint_25500steps
学習設定
- batch size: 4
- gradient accumulation steps: 128
- 実質batch size: 512 sequences/update
- sequence length: 2048
- 1 stepあたりの処理token数: 約1.05M tokens/update
- 学習予定token数: 約50B tokens
- learning rate: max 3e-4 / min 3e-5
- warmup steps: 1000
実行結果
-checkpoint_001000時点で約2.80。その後、checkpoint_25000付近までおおむね低下し、約1.5前後まで改善。20,000stepsで急激な減少が見られるが、原因は不明。
-
step 0のvalidation lossは未測定のため、グラフには含めていない。
-
学習速度: 11400 tokens/sec
-
VRAM使用量: 70.9 GB / 81.9 GB
-
GPU-Util 99%
-
学習時間: 約30日
簡易判断
- validation loss: 改善
- 所感: train lossを保存しておくのを完全に忘れていました。この致命的なミスを繰り返さないように、ログ情報の記録は大切にしましょう。
推論試験
1. 学習環境
GPU:NVIDIA A100 80GB ×1
Compute Platform:GPUSOROBAN
OS:Ubuntu 22.04
CUDA / Driver:12.8 / 570.86
Python:3.11
PyTorch:2.7.0
利用期間:2026年6月1日から7月29日
2. 学習設定
2.1 主なハイパーパラメーター
表にする項目:
| 項目 | 設定値 | 意味 |
|---|---|---|
| batch_size | 4 | 1回のforward/backwardで処理するサンプル数 |
| gradient_accumulation_steps | 128 | 何回分の勾配を貯めてから更新するか |
| sequence length | 2048 | 1サンプルあたりのトークン数 |
| 1 stepあたりのtokens | 4 × 128 × 2048 = 1,048,576 | 1回の重み更新で処理するtoken数 |
| max learning rate | 3e-4 | 最大学習率 |
| min learning rate | 3e-5 | 最小学習率 |
| warmup steps | 1000 | 学習率を徐々に上げる期間 |
| total steps | 54000 | 学習予定step数 |
| checkpoint保存間隔 | 500 steps | モデルを保存する頻度 |
| validation間隔 | 100 steps | lossを評価する頻度 |
2.2 学習効率の向上の工夫:勾配蓄積
複数の学習データをまとめてモデルに入力し学習を行うbatch学習という手法があります。一度にまとめてモデルへ入力するデータの数をbatch sizeといい、batch sizeを大きくすることで、安定して学習を行うことができます。しかし、その分GPUメモリ(VRAM)を多く使用するため、25億パラメータのモデルをそのまま大きなbatch sizeで学習させるとメモリが足りません。
そこで、何回かに分けて計算した勾配をためておき、あとでまとめて重みを更新する勾配蓄積という手法を使用します。メモリ使用量を抑えながら、疑似的にbatch sizeを大きくすることができます。
今回はbatch size=4で計算した勾配を128回分ためてから勾配を更新するので、実質的なbatch sizeは 4 × 128 で 512になります。
3. 学習開始!
3.1 学習ループの流れ
学習がどのように進んでいくかは前回記事【Part.3 モデル実装編】をご覧ください。
3.2 学習ログの例
執筆時の学習ログの様子です。
step 21300 | lr 2.135042e-04 | train loss 1.6942 | val loss 1.6763 | tok/s 11340 | tokens 22,334,668,800 | time 866340.79s
- steps : 学習が何step目まで進んだのかを表示します。
- lr : 現在の学習率が表示されます。学習の進行状況によって学習率を変動させる学習率スケジューリングを用いています。
- train loss : 学習時にどれくらいの誤差が出ているのかを表示します。
- val loss : 学習に使っていないテキストを用いてモデルの精度を調査します。100stepごとに計算され、表示されます。
- tok/s : tokens per second を意味し、一秒間に何トークンを処理したかを示しています。大体 11300tok / s くらいで安定しています。
- tokens : 現在学習済みのtoken数を示しています。
- time : 学習の進行時間を示しています。
train lossについて
train lossは学習データに対して、モデルの予測がどれくらい外れているかを表す値です。GPT型モデルは過去のトークンから未来のトークンを予測していくわけですが、この予測が上手くいけばいくほど、この値は下がります。ただし、あくまで学習データにおける予測と正解の誤差であることが重要です。
val lossについて
val loss とはvalidation lossの略で、学習に使っていないデータに対して、モデルの予測がどれくらい外れているかを表す値です。計測方法自体はtrain lossと変わらないのですが、重要なのは、学習に使っていないトークンを用いて評価するということです。
val lossには過学習を防ぐという重要な役割があります。train lossだけ下がってval lossが下がっていないならそのモデルは過学習を起こしており、train lossとval lossがともに下がっているなら、そのモデルは順調に汎化性能を高めている、と分かります。
4. GPU使用率・VRAM使用量
4.1 VRAMは何に使われるのか
GPUのメモリのことをVRAMと言います。VRAMにはモデルの重み、勾配の計算結果、optimizerの状態、forward/backward中の中間計算結果が保存されます。batch sizeやsequence lengthが大きいほどVRAMの使用量が増えます。
4.2 実際のVRAM使用量
VRAM使用量:70.9 GB / 81.9 GB
勾配蓄積の実質batch sizeを調整し、メモリをなるべく使用しています。ここで欲張ると学習中にメモリ不足になってしまうので、慎重に。
4.3 GPU使用率
GPU使用率:GPU-Util 99% Power 294W / 300W
この値が高いほど、GPUの計算性能が発揮されていることになります。
訓練開始前にこの値はあまり意識していませんでしたが、batch sizeの調整が上手くいっていたようです。
5. 学習速度と学習時間
5.1 11300tokens/secで60日間学習を回す。
tokens/secは、1秒あたりに処理できるtoken数を示しています。この値から、何日間でどれくらいのトークン量を学習できるかが分かります。
その間1秒当たり約11300token処理できるので、GPUの使用期間である60日間(5,184,000秒)で 11300 * 5,184,000 = 58,579,200,000 tokens 約600億トークンを処理できます。このSGTプロジェクトでは500億トークンの学習を目標にしているため、計算速度は問題ありません。
5.2 1 stepあたりの処理token数
今回の設定では、batch sizeを4、勾配蓄積の回数を128、sequence lengthを2048にしています。batch sizeが4なので、1回の計算では2048トークンのデータを4個まとめて処理します。つまり、1回の計算で処理するトークン数は 4 × 2048 = 8192 tokens です。
さらに、勾配蓄積によってこの計算を128回繰り返してから、1回モデルの重みを更新します。そのため、1 stepあたりに処理するトークン数は、4 × 128 × 2048 = 1,048,576 tokens になります。
今回は学習総ステップを54,000stepsに設定しているため、56,623,104,000tokens、つまり約566億トークンを学習します。11300 tok/s だと大体58日間かかります。
この辺はあまり細かい調整をしていません。。。
6. おわりに
GPUの使用期間は60日と期限が決まっています。この中でGPUを最大限利用するために、VRAMの使用量を安全な範囲で増やし、GPUの計算効率を高めました。
VRAMの使用量については勾配蓄積を使用しましたが、4から1024までの様々な実質batch sizeを試して512に決めました。
勾配蓄積のことは先輩に教わりました。batch sizeの目安はだいたい256とか512とのことなので、その値ありきで実質batch sizeをいじりながら、tok / sの値を計測しました。
実質batch size32
実質batch size64
実質batch size128
実質batch size256
実質batch size512
実質batch size1024
ご覧の通り、ログの一番右のtimeが2倍2倍に増えています。tokensも一緒に2倍2倍になっているので、tok/sは変わりませんでした。
batch sizeは大きい方が学習が安定しますし、モデルサイズが大きいほどbatch sizeも大きくする傾向にあります。しかし、実質batch size1024では1stepに時間がかかりすぎて、重みの更新回数が減ってしまいます。処理するtoken量が一緒でも、更新回数が下がると学習速度が下がり、lossが下がり切らないかもしれません。
tok / sが変わらないのならば、もともとの目標値にしようということで、実質batch sizeを512にしました。
結果的にVRAMを十分に使用できたので良かったです。
次回は学習状況の共有と、モデル性能の検証を行います!お楽しみに
関連リンク
株式会社ハイレゾ 公式サイト:https://highreso.jp/
クラウドサービス GPUSOROBAN:https://soroban.highreso.jp/










