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
논문 46s에서 35s로 개선되었습니다. 또한 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
사용한다는 점만 다릅니다. 전자는 일회성 컴파일 비용을 상각하기 위해 많은 네트워크를 한 번에 훈련시키는 실험을 위한 것입니다.
CIFAR-10은 기계 학습에서 가장 널리 사용되는 데이터 세트 중 하나로 매년 수천 건의 연구 프로젝트를 촉진합니다. 이 저장소는 이 연구를 가속화하는 데 도움이 되도록 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/(26 V100초에서 94%, >=8 A100초)를 기반으로 합니다.