مجموعة من البرامج النصية التدريبية السريعة والمكتفية ذاتيًا لـ CIFAR-10.
البرنامج النصي | يعني الدقة | وقت | بفلوب |
---|---|---|---|
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 أبطأ بكثير:
خط الأساس | يعني الدقة | وقت | بفلوب |
---|---|---|---|
التدريب القياسي ResNet-18 | 96% | 7 دقائق | 32.3 |
جميع التوقيتات موجودة على وحدة معالجة الرسومات NVIDIA A100 واحدة.
ملحوظة: تم تحسين 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
متكافئان (أي ينتجان نفس التوزيع للشبكات المدربة)، ويختلفان فقط في أن الأول يستخدم 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 كمنصة للتجارب في اختيار البيانات والتعلم النشط. فيما يلي مثال لتجربة توضح النتيجة الكلاسيكية وهي أن الأمثلة منخفضة الثقة توفر إشارة تدريب أكثر من الأمثلة العشوائية. يتم تشغيله في أقل من 20 ثانية على A100.
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 ثانية)