CIFAR-10 用の高速かつ自己完結型のトレーニング スクリプトのコレクション。
スクリプト | 平均精度 | 時間 | PFLOP |
---|---|---|---|
airbench94_compiled.py | 94.01% | 3.09秒 | 0.36 |
airbench94.py | 94.01% | 3.83秒 | 0.36 |
airbench95.py | 95.01% | 10.4秒 | 1.4 |
airbench96.py | 96.03% | 34.7秒 | 4.9 |
airbench94_muon.py | 94.01% | 2.59秒 | 0.29 |
airbench96_faster.py | 96.00% | 27.3秒 | 3.1 |
比較として、CIFAR-10 に関するほとんどの研究で使用される標準トレーニングははるかに時間がかかります。
ベースライン | 平均精度 | 時間 | PFLOP |
---|---|---|---|
標準 ResNet-18 トレーニング | 96% | 7分 | 32.3 |
すべてのタイミングは単一の NVIDIA A100 GPU 上で行われます。
注: airbench96
論文以降、46 秒から 35 秒に改良されました。さらに、 airbench96_faster
、小規模なプロキシ モデルによるデータ フィルタリングを使用する、改良された (ただしより複雑な) メソッドです。 airbench94_muon
は、Muon オプティマイザーのバリアントを使用して改良された方法です。
これらのトレーニング速度を取得するために使用される一連の方法については、論文で説明されています。
ニューラル ネットワークを 94% の精度でトレーニングするには、次のいずれかを実行します。
git clone https://github.com/KellerJordan/cifar10-airbench.git
cd airbench && python airbench94.py
または
pip install airbench
python -c "import airbench; airbench.warmup94(); airbench.train94()"
注: airbench94_compiled.py
とairbench94.py
は同等であり (つまり、トレーニングされたネットワークの同じ分布が得られます)、最初のものが GPU 使用率を向上させるためにtorch.compile
を使用するという点のみが異なります。前者は、1 回限りのコンパイル コストを償却するために、多くのネットワークを一度にトレーニングする実験を目的としています。
CIFAR-10 は、機械学習で最も広く使用されているデータセットの 1 つであり、年間数千件の研究プロジェクトを促進しています。このリポジトリは、この研究を加速するために、CIFAR-10 の高速で安定したトレーニング ベースラインを提供します。トレーニングは、簡単に実行できる依存関係のない PyTorch スクリプトとして提供され、ResNet-20 や ResNet-18 のトレーニングなどの従来のベースラインを置き換えることができます。
カスタム CIFAR-10 の実験やトレーニングを作成する場合は、GPU アクセラレーション データローダーを単独で使用すると便利な場合があります。
import airbench
train_loader = airbench.CifarLoader('/tmp/cifar10', train=True, aug=dict(flip=True, translate=4, cutout=16), batch_size=500)
test_loader = airbench.CifarLoader('/tmp/cifar10', train=False, batch_size=1000)
for epoch in range(200):
for inputs, labels in train_loader:
# outputs = model(inputs)
# loss = F.cross_entropy(outputs, labels)
...
ローダー内のデータを変更したい場合は、次のように行うことができます。
import airbench
train_loader = airbench.CifarLoader('/tmp/cifar10', train=True, aug=dict(flip=True, translate=4, cutout=16), batch_size=500)
mask = (train_loader.labels < 6) # (this is just an example, the mask can be anything)
train_loader.images = train_loader.images[mask]
train_loader.labels = train_loader.labels[mask]
print(len(train_loader)) # The loader now contains 30,000 images and has batch size 500, so this prints 60.
Airbench は、データ選択やアクティブ ラーニングの実験用のプラットフォームとして使用できます。以下は、信頼性の低い例の方がランダムな例よりも多くのトレーニング信号を提供するという古典的な結果を示す実験例です。 A100 では 20 秒未満で実行されます。
import torch
from airbench import train94, infer, evaluate, CifarLoader
net = train94(label_smoothing=0) # train this network without label smoothing to get a better confidence signal
loader = CifarLoader('cifar10', train=True, batch_size=1000)
logits = infer(net, loader)
conf = logits.log_softmax(1).amax(1) # confidence
train_loader = CifarLoader('cifar10', train=True, batch_size=1024, aug=dict(flip=True, translate=2))
mask = (torch.rand(len(train_loader.labels)) < 0.6)
print('Training on %d images selected randomly' % mask.sum())
train_loader.images = train_loader.images[mask]
train_loader.labels = train_loader.labels[mask]
train94(train_loader, epochs=16) # yields around 93% accuracy
train_loader = CifarLoader('cifar10', train=True, batch_size=1024, aug=dict(flip=True, translate=2))
mask = (conf < conf.float().quantile(0.6))
print('Training on %d images selected based on minimum confidence' % mask.sum())
train_loader.images = train_loader.images[mask]
train_loader.labels = train_loader.labels[mask]
train94(train_loader, epochs=16) # yields around 94% accuracy => low-confidence sampling is better than random.
このプロジェクトは、以前の優れた記録 https://github.com/tysam-code/hlb-CIFAR10 (6.3 A100 秒で 94%) に基づいて構築されています。
これ自体は、驚くべきシリーズ https://myrtle.ai/learn/how-to-train-your-resnet/ に基づいて構築されています (94% までの 26 V100 秒、つまり 8 A100 秒以上)