Eine Sammlung schneller und eigenständiger Trainingsskripte für CIFAR-10.
Skript | Mittlere Genauigkeit | Zeit | PFLOPs |
---|---|---|---|
airbench94_compiled.py | 94,01 % | 3,09s | 0,36 |
airbench94.py | 94,01 % | 3,83 Sekunden | 0,36 |
airbench95.py | 95,01 % | 10,4s | 1.4 |
airbench96.py | 96,03 % | 34,7s | 4.9 |
airbench94_muon.py | 94,01 % | 2,59s | 0,29 |
airbench96_faster.py | 96,00 % | 27,3s | 3.1 |
Zum Vergleich: Das in den meisten Studien zu CIFAR-10 verwendete Standardtraining ist viel langsamer:
Grundlinie | Mittlere Genauigkeit | Zeit | PFLOPs |
---|---|---|---|
Standard-ResNet-18-Schulung | 96 % | 7min | 32.3 |
Alle Timings erfolgen auf einer einzigen NVIDIA A100-GPU.
Hinweis: airbench96
wurde seit dem Papier von 46 auf 35 verbessert. Darüber hinaus ist airbench96_faster
eine verbesserte (aber kompliziertere) Methode, die die Datenfilterung durch ein kleines Proxy-Modell nutzt. Und airbench94_muon
ist eine verbesserte Methode, die eine Variante des Muon-Optimierers verwendet.
Die Methoden, mit denen diese Trainingsgeschwindigkeiten ermittelt werden, werden im Artikel beschrieben.
Um ein neuronales Netzwerk mit einer Genauigkeit von 94 % zu trainieren, führen Sie Folgendes aus:
git clone https://github.com/KellerJordan/cifar10-airbench.git
cd airbench && python airbench94.py
oder
pip install airbench
python -c "import airbench; airbench.warmup94(); airbench.train94()"
Hinweis: airbench94_compiled.py
und airbench94.py
sind gleichwertig (d. h. ergeben die gleiche Verteilung trainierter Netzwerke) und unterscheiden sich nur darin, dass ersteres torch.compile
verwendet, um die GPU-Auslastung zu verbessern. Ersteres ist für Experimente gedacht, bei denen viele Netzwerke gleichzeitig trainiert werden, um die einmaligen Kompilierungskosten zu amortisieren.
CIFAR-10 ist einer der am häufigsten verwendeten Datensätze im maschinellen Lernen und ermöglicht Tausende von Forschungsprojekten pro Jahr. Dieses Repo bietet schnelle und stabile Trainingsgrundlagen für CIFAR-10, um diese Forschung zu beschleunigen. Die Schulungen werden als einfach ausführbare, abhängigkeitsfreie PyTorch-Skripte bereitgestellt und können klassische Baselines wie das Training von ResNet-20 oder ResNet-18 ersetzen.
Zum Schreiben benutzerdefinierter CIFAR-10-Experimente oder -Schulungen kann es hilfreich sein, den GPU-beschleunigten Datenlader unabhängig zu verwenden.
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)
...
Wenn Sie die Daten im Loader ändern möchten, können Sie dies wie folgt tun:
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 kann als Plattform für Experimente zur Datenauswahl und zum aktiven Lernen genutzt werden. Das Folgende ist ein Beispielexperiment, das das klassische Ergebnis demonstriert, dass Beispiele mit geringer Konfidenz mehr Trainingssignale liefern als zufällige Beispiele. Auf einem A100 läuft es in <20 Sekunden.
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.
Dieses Projekt baut auf dem hervorragenden bisherigen Rekord https://github.com/tysam-code/hlb-CIFAR10 (6,3 A100-Sekunden bis 94 %) auf.
Was wiederum auf der erstaunlichen Serie https://myrtle.ai/learn/how-to-train-your-resnet/ aufbaut (26 V100-Sekunden zu 94 %, das sind >=8 A100-Sekunden)