19-bo‘lim
Ishlab chiqarishga tayyorlash
Bashorat funksiyasi, no_grad va eval, paketlash bilan tezlik, torch.export va modelni xizmat sifatida ishlatish.
Ushbu bo‘lim mundarijasi
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:
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)]
| Qism | Nima uchun |
|---|---|
@torch.no_grad() | Hosila kerak emas - tezroq va kam xotira |
model.eval() | Dropout va BatchNorm ni bashorat rejimiga o'tkazadi |
softmax | Logitni ehtimolga aylantiradi (model ichida emas!) |
ishonch qaytarish | Past ishonchli javobni odamga uzatish imkoni |
@torch.no_grad() dekorator sifatidawith 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 #
model.eval()
x1 = torch.randn(1, 1, 28, 28)
=== 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:
=== 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.
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:
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))
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 eskirganKo'p eski qo'llanmalarda torch.jit.trace va torch.jit.script
ko'rsatiladi. PyTorch 2.14 da ular ishlaydi, lekin ogohlantirish beradi:
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.
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 #
| Usul | Fayl | Model sinfi kerakmi | Qachon |
|---|---|---|---|
state_dict | 83 KB | Ha | O'qitishni davom ettirish, odatiy ish |
torch.export | 105 KB | Yo'q | Boshqa muhitga ko'chirish |
| ONNX | ~ | Yo'q | PyTorch dan tashqari tizimlar |
Xotira #
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 #
| Tekshiruv | Nega |
|---|---|
model.eval() chaqirildimi | Aks holda natija tasodifiy bo'ladi |
torch.no_grad() bormi | Tezlik va xotira |
| Kirish o'zgarishi o'qitishdagidek-mi | Normalize qiymatlari bir xil bo'lishi shart |
| Qurilma to'g'rimi | Model va ma'lumot bir joyda |
| Past ishonch bilan nima qilinadi | Odamga uzatish yoki rad etish |
| Model versiyasi yozilyaptimi | Qaysi model qanday javob berganini bilish uchun |
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:
nazorat = {
"model": model.state_dict(),
"ortacha": 0.2860,
"ogish": 0.3530,
"sinflar": sinflar,
}
@torch.no_grad()dekoratori bilan bashorat funksiyasi yozing.- U sinf nomi va ishonch darajasini qaytarsin.
no_gradbilan va usiz tezlikni o'lchab solishtiring.- Paket hajmini 1, 8, 32 va 128 qilib, bir rasmga ketgan vaqtni yozing.
- Qaysi paket hajmidan keyin foyda to'xtaganini aniqlang.
- Paketlash kechikish qo'shishini o'z so'zingiz bilan tushuntiring.
- Modelni
torch.exportbilan saqlab, qaytadan yuklang. - Ikki modelning natijasini
allclosebilan solishtiring. torch.jit.traceni ishlatib, ogohlantirish xabarini o'qing.- Model bilan birga
Normalizeqiymatlarini saqlaydigan nazorat lug'ati tuzing.
Xulosa #
- Bashorat funksiyasida
model.eval()vatorch.no_grad()har doim bo'lishi kerak. @torch.no_grad()dekorator sifatida yozilsa, uni unutib bo'lmaydi.softmaxmodel ichida emas, bashorat funksiyasida qo'llanadi.no_gradbizning 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.exportmodelni Python sinfisiz ko'chirish imkonini beradi.torch.jit.tracePyTorch 2.14 da eskirgan - yangi kodda ishlatmang.- Kirish o'zgarishlarini (
Normalizeqiymatlarini) model bilan birga saqlang.
Keyingi, yakuniy bo'limda bilganlarimizni bitta loyihada birlashtiramiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
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.