Okullar için Robotik ve Mühendislik · anaokulundan liseye

10. ünite / 10

Aktarım öğrenmesi ve dağıtım

Önceden eğitilmiş modeller, dondurma ve ince ayar; state_dict, TorchScript, ONNX; int8 nicemleme; uçta ve tarayıcıda çıkarım.

Bu ünitenin sonunda

  • Önceden eğitilmiş bir modelin omurgasını dondurup yeni bir baş eğitmek
  • Dondurmanın eğitilen parametre ve bellek üstündeki etkisini hesaplamak
  • Modeli TorchScript ya da ONNX olarak dışa aktarmak
  • Nicemlemenin boyut, hız ve doğruluk üstündeki etkisini ölçmek

Ders notları

Bir görüntü sınıflandırıcıyı sıfırdan eğitmek milyonlarca etiketli görüntü ister. Aktarım öğrenmesi, ImageNet gibi büyük bir veride eğitilmiş bir modelin genel özniteliklerini (kenar, doku, parça) kendi küçük verine taşır.

Dondur ya da ince ayarla

  • Öznitelik çıkarıcı: tüm katmanları dondur (requires_grad = False), yalnız yeni sınıflandırma başını eğit. Az veri için hızlı ve güvenli.
  • İnce ayar: son blokları da çöz, küçük bir öğrenme oranıyla eğit. Daha çok veri varsa daha iyi sonuç.

Dondurulan parametrelerin gradyanı ve optimize edici durumu tutulmaz: Adam'da parametre başına 12 bayt (gradyan + iki moment) kazanılır.

Dağıtım

Eğitim Python'da, çıkarım her yerde olabilir. state_dict ağırlıkları saklar ama sınıf kodunu ister. TorchScript (torch.jit.script) ve ONNX (torch.onnx.export) modeli koddan bağımsız bir grafiğe çevirir: C++, mobil, ONNX Runtime ya da tarayıcı (onnxruntime-web) çalıştırabilir. model.eval() ve örnek girdiyle dışa aktarılır.

Nicemleme

q = round(w / ölçek), ölçek = max|w| / 127   (int8)

32 bitlik ağırlıklar 8 bite inince dosya yaklaşık 4 kat küçülür ve uygun donanımda çıkarım hızlanır; doğruluk genellikle çok az düşer. Bu ünitenin aracı, bitirme projesindeki CNN'i tarayıcıda gerçekten nicemler ve 200 test örneğinde ölçer.

Görselleştirici

Aktarım öğrenmesi ve dağıtım: dondur, nicemle, ölç

ResNet-18'in bloklarını dondur ya da çöz: eğitilecek parametre sayısı ve iyileştirici belleği değişir. Sonra küçük MNIST CNN'ini int8'e nicemle: dosya boyu, 200 test örneğindeki doğruluk ve tarayıcıdaki çıkarım süresi önce ve sonra.

Kendin dene

Aktarım aracında ResNet-18'in tüm bloklarını dondur ve 5 sınıflı baş için eğitilen parametre sayısını oku. Sonra yalnız layer4'ü çöz: eğitim belleği kaç kat arttı? Nicemleme bölümünde "Ölç"e bas: fp32 ve int8 dosya boyunu, 200 örnekteki doğruluğu ve çıkarım süresini yaz. Doğruluk kaç puan değişti?

Kod

Python: ResNet-18 ile aktarım öğrenmesi, ONNX ve nicemleme
import torch
from torch import nn
from torchvision import models

model = models.resnet18(weights=models.ResNet18_Weights.DEFAULT)   # ImageNet ile önceden eğitilmiş
for p in model.parameters():
    p.requires_grad = False                              # omurgayı dondur
model.fc = nn.Linear(model.fc.in_features, 5)            # yeni baş: 5 sınıf (eğitilebilir)
egitilen = sum(p.numel() for p in model.parameters() if p.requires_grad)
print(egitilen)                                          # 512·5 + 5 = 2565
opt = torch.optim.Adam(filter(lambda p: p.requires_grad, model.parameters()), lr=1e-3)

model.eval()
ornek = torch.randn(1, 3, 224, 224)
torch.onnx.export(model, ornek, 'model.onnx', input_names=['goruntu'], output_names=['skor'],
                  dynamic_axes={'goruntu': {0: 'N'}})    # tarayıcı, mobil, C++ için
q = torch.ao.quantization.quantize_dynamic(model, {nn.Linear}, dtype=torch.qint8)   # Linear katmanları int8
torch.save(model.state_dict(), 'model.pt')               # ağırlıklar; tüm nesneyi değil

Colab defteri

PyTorch tarayıcıda çalışmaz; gerçek kodu Google Colab'da (ücretsiz GPU ile) çalıştır. Defteri indir, colab.research.google.com adresinde "Dosya → Not defteri yükle" ile aç, "Çalışma zamanı → Çalışma zamanı türünü değiştir → T4 GPU" seç ve hücreleri sırayla çalıştır.

Defteri indir (.ipynb)

Sık yapılan hatalar

  • Önceden eğitilmiş modelin beklediği normalleştirmeyi (ImageNet ortalama ve std, 224×224) uygulamamak: öznitelikler bozulur.
  • Dondurduktan sonra optimize ediciye tüm parametreleri vermek: zararsız ama gereksiz; yalnız requires_grad olanları ver.
  • Dışa aktarmadan önce model.eval() demeyi unutmak: dropout ve batchnorm eğitim kipinde dışa aktarılır.
  • Nicemlenmiş modelin doğruluğunu ölçmeden yayına almak: her zaman aynı test kümesinde önce/sonra karşılaştır.

Yazılım mühendisliği bağlantısı

Model bir yazılım ürünüdür: sürümü, bağımlılıkları, testleri ve geri alma planı olmalıdır.

  • Model dosyasını sürümle (model kartı: veri, metrik, tarih, kod sürümü), dosya özetini (SHA-256) kaydet.
  • Dağıtımdan önce otomatik "kabul testi": sabit bir test kümesinde doğruluk eşiğin altındaysa yayını durdur; çıkarım süresini de ölç.

Kendini sına

  1. ResNet-18'in tüm omurgası dondurulup 5 sınıflı yeni bir baş (Linear(512, 5)) eklenirse kaç parametre eğitilir?

  2. Az etiketli veriyle (sınıf başına birkaç yüz görüntü) başlarken en güvenli yaklaşım hangisidir?

  3. int8 nicemleme ağırlık dosyasının boyunu yaklaşık ne kadar değiştirir?

  4. ONNX'e dışa aktarmanın temel yararı nedir?

Bu üniteden sonra bitirme projesinde

  • Dağıtım ve demo: JSON ve ONNX dışa aktarma, tarayıcıda tutarlılık testi (G5), nicemleme ölçümü, kendi çizim kümen (G6), 5 dakikalık demo ve kısa rapor.
Esc
  • PanelAna sayfaSayfa
  • ModüllerTüm modüllerSayfa
  • ParçalarParça ansiklopedisiSayfa
  • Mühendislik yoluBüyükler için robotik: 128 parça, 7 seviyeSayfa
  • Robotik dersi (ESOF 323)Üniversite robotik dersi, 14 haftaSayfa
  • Drone dersiBüyükler için: parça, simülasyon, yazılım; 10 üniteSayfa
  • Blok atölyesiSerbest blok programlamaAraç
  • Devre laboratuvarıSanal Arduino ve devreAraç
  • Robot arenasıSanal robot sürüşüAraç
  • OyunlarBloklarla 8 öğretici oyunAraç
  • Mikro Kart atölyesiSanal LED kartı bloklarla programlaAraç
  • Robot atölyesiMikro Kart'ı robota tak, bloklarla görev yapAraç