19-bo‘lim

Ishlab chiqarishga tayyorlash

Bashorat funksiyasi, no_grad va eval, paketlash bilan tezlik, torch.export va modelni xizmat sifatida ishlatish.

🕑 8 daqiqa o‘qish 📄 701 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Bashorat funksiyasi
  2. no_grad qancha tejaydi
  3. Paketlash - eng katta yutuq
  4. torch.export bilan saqlash
  5. Saqlash usullarini solishtiramiz
  6. Xotira
  7. Tekshiruv ro'yxati
  8. Xulosa

Model o'qitildi va saqlandi. Endi uni haqiqiy dasturga ulash kerak - bu alohida mahorat talab qiladi.

Bashorat funksiyasi #

Ishlab chiqarish kodida to'rt narsa har doim bo'lishi kerak:

Python
import torch
import torch.nn as nn

sinflar = ['Futbolka', 'Shim', 'Sviter', 'Libos', 'Palto',
           'Sandal', "Ko'ylak", 'Krossovka', 'Sumka', 'Botinka']

@torch.no_grad()
def bashorat(model, rasmlar):
    model.eval()
    ehtimol = torch.softmax(model(rasmlar), dim=1)
    ishonch, indeks = ehtimol.max(dim=1)
    return [(sinflar[i], round(c.item(), 4)) for i, c in zip(indeks, ishonch)]
QismNima uchun
@torch.no_grad()Hosila kerak emas - tezroq va kam xotira
model.eval()Dropout va BatchNorm ni bashorat rejimiga o'tkazadi
softmaxLogitni ehtimolga aylantiradi (model ichida emas!)
ishonch qaytarishPast ishonchli javobni odamga uzatish imkoni
@torch.no_grad() dekorator sifatida

with torch.no_grad(): blokini har safar yozish o'rniga, funksiya ustiga dekorator qo'yish mumkin. Butun funksiya avtomatik ravishda gradientsiz ishlaydi - unutib qo'yish ehtimoli yo'qoladi.

no_grad qancha tejaydi #

Python
model.eval()
x1 = torch.randn(1, 1, 28, 28)
Natija
=== 1. no_grad ===
  oddiy     : 0.197 ms/rasm
  no_grad   : 0.152 ms/rasm

23% tezroq - va bu faqat vaqt. Xotira tejami undan ham kattaroq, chunki hisoblash grafi umuman qurilmaydi.

Paketlash - eng katta yutuq #

Rasmlarni bittalab emas, guruh bilan berish:

Natija
=== 2. paket hajmi ===
  paket=  1:    0.14 ms jami  ->   0.138 ms/rasm
  paket=  8:    0.67 ms jami  ->   0.083 ms/rasm
  paket= 32:    2.99 ms jami  ->   0.093 ms/rasm
  paket=128:   11.96 ms jami  ->   0.093 ms/rasm

Bitta rasm uchun 0.138 ms, 8 talik paketda esa 0.083 ms - 1.7 barobar tez. 8 dan keyin foyda to'xtadi.

Bir rasmga ketgan vaqt (kichikroq - yaxshiroq) 0.15 ms 0.08 ms 0 0.138 paket=1 0.083 paket=8 0.093 paket=32 0.093 paket=128 1 dan 8 ga o'tish 1.7 barobar tezlik beradi; keyin foyda to'xtaydi lekin paket to'lishini kutish kechikish qo'shadi - muvozanat kerak
Paketlash amalda eng arzon optimallashtirish usuli
Paketlashning narxi - kechikish

Veb-xizmatda so'rovlar birma-bir keladi. Paketni to'ldirish uchun kutish kerak bo'ladi.

Amalda vaqt chegarasi qo'yiladi: «10 ms kutamiz yoki 8 ta so'rov yig'ilguncha - qaysi biri avval bo'lsa». Foydalanuvchi uchun 10 ms sezilmaydi, server esa ancha ko'p so'rovga xizmat qiladi.

torch.export bilan saqlash #

Modelni Python kodisiz ishlatish uchun uni eksport qilish mumkin:

Python
eksport = torch.export.export(model, (x1,))
torch.export.save(eksport, "model.pt2")

qayta = torch.export.load("model.pt2").module()
print("natija bir xilmi:", torch.allclose(model(x1), qayta(x1), atol=1e-6))
Natija
  saqlandi: 107497 bayt
  natija bir xilmi: True
  tezlik: 0.236 ms/rasm

Farqi shundaki, state_dict faqat sonlarni saqlaydi va model sinfini talab qiladi (10-bo'lim). torch.export esa tuzilishni ham saqlaydi.

torch.jit.trace eskirgan

Ko'p eski qo'llanmalarda torch.jit.trace va torch.jit.script ko'rsatiladi. PyTorch 2.14 da ular ishlaydi, lekin ogohlantirish beradi:

Natija
FutureWarning: `torch.jit.trace` is deprecated. Please switch to
`torch.compile` or `torch.export`.

Yangi loyihada torch.export ishlating. Eski kodni ko'rsangiz, uning nima uchun yozilganini bilib turing.

Tezlik oshmadi - bu normal

Bizning o'lchovda eksport qilingan model 0.236 ms, oddiysi esa 0.152 ms berdi - ya'ni sekinroq.

torch.export ning maqsadi tezlik emas, ko'chuvchanlik: modelni Python sinfisiz, boshqa muhitda ishlatish. Tezlik uchun torch.compile ishlatiladi, lekin uning foydasi katta modellarda ko'rinadi - kichik modelda kompilyatsiya xarajati yutuqdan katta.

Saqlash usullarini solishtiramiz #

UsulFaylModel sinfi kerakmiQachon
state_dict83 KBHaO'qitishni davom ettirish, odatiy ish
torch.export105 KBYo'qBoshqa muhitga ko'chirish
ONNX~Yo'qPyTorch dan tashqari tizimlar

Xotira #

Natija
parametrlar xotirasi: 80.0 KB
fayl hajmi (state_dict): 83.2 KB

Bizning CNN juda kichik. Katta modellarda bu son gigabaytlarga yetadi va asosiy cheklov bo'lib qoladi.

Tekshiruv ro'yxati #

TekshiruvNega
model.eval() chaqirildimiAks holda natija tasodifiy bo'ladi
torch.no_grad() bormiTezlik va xotira
Kirish o'zgarishi o'qitishdagidek-miNormalize qiymatlari bir xil bo'lishi shart
Qurilma to'g'rimiModel va ma'lumot bir joyda
Past ishonch bilan nima qilinadiOdamga uzatish yoki rad etish
Model versiyasi yozilyaptimiQaysi model qanday javob berganini bilish uchun
Eng ko'p uchraydigan ishlab chiqarish xatosi

O'qitishda Normalize((0.2860,), (0.3530,)) ishlatib, bashoratda uni unutish.

Model butunlay boshqa taqsimotli kirish oladi va javoblari ma'nosiz bo'ladi - lekin hech qanday xato chiqmaydi. Shuning uchun o'zgarishlar ro'yxatini model bilan birga saqlang:

Python
nazorat = {
    "model": model.state_dict(),
    "ortacha": 0.2860,
    "ogish": 0.3530,
    "sinflar": sinflar,
}
Amaliy topshiriq
  1. @torch.no_grad() dekoratori bilan bashorat funksiyasi yozing.
  2. U sinf nomi va ishonch darajasini qaytarsin.
  3. no_grad bilan va usiz tezlikni o'lchab solishtiring.
  4. Paket hajmini 1, 8, 32 va 128 qilib, bir rasmga ketgan vaqtni yozing.
  5. Qaysi paket hajmidan keyin foyda to'xtaganini aniqlang.
  6. Paketlash kechikish qo'shishini o'z so'zingiz bilan tushuntiring.
  7. Modelni torch.export bilan saqlab, qaytadan yuklang.
  8. Ikki modelning natijasini allclose bilan solishtiring.
  9. torch.jit.trace ni ishlatib, ogohlantirish xabarini o'qing.
  10. Model bilan birga Normalize qiymatlarini saqlaydigan nazorat lug'ati tuzing.

Xulosa #

  • Bashorat funksiyasida model.eval() va torch.no_grad() har doim bo'lishi kerak.
  • @torch.no_grad() dekorator sifatida yozilsa, uni unutib bo'lmaydi.
  • softmax model ichida emas, bashorat funksiyasida qo'llanadi.
  • no_grad bizning o'lchovda 23% tezlik berdi.
  • Paketlash eng arzon optimallashtirish: 1 dan 8 ga o'tish 1.7 barobar tezlashtirdi.
  • 8 dan keyin foyda to'xtadi - katta paket har doim yaxshi emas.
  • Paketlash kechikish qo'shadi; amalda vaqt chegarasi bilan muvozanatlanadi.
  • torch.export modelni Python sinfisiz ko'chirish imkonini beradi.
  • torch.jit.trace PyTorch 2.14 da eskirgan - yangi kodda ishlatmang.
  • Kirish o'zgarishlarini (Normalize qiymatlarini) model bilan birga saqlang.

Keyingi, yakuniy bo'limda bilganlarimizni bitta loyihada birlashtiramiz.

Xatolik topdingizmi?

Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.