ชุดสคริปต์การฝึกอบรมที่รวดเร็วและครบถ้วนในตัวเองสำหรับ 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
เทียบเท่ากัน (กล่าวคือ ให้การกระจายเครือข่ายที่ผ่านการฝึกอบรมแบบเดียวกัน) และแตกต่างกันเพียงตรงที่ครั้งแรกใช้ torch.compile
เพื่อปรับปรุงการใช้งาน GPU แบบแรกมีไว้สำหรับการทดลองที่มีการฝึกอบรมเครือข่ายจำนวนมากในคราวเดียวเพื่อตัดจำหน่ายค่าใช้จ่ายในการรวบรวมแบบครั้งเดียว
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-seconds ถึง 94%)
ซึ่งสร้างจากซีรีส์ที่น่าทึ่ง https://myrtle.ai/learn/how-to-train-your-resnet/ (26 V100-seconds ถึง 94% ซึ่งก็คือ >=8 A100-seconds)