چیتشیت
پایپلاینهای بینایی ماشین و استقرار روی Edge
Vision Pipelines and Edge Deployment
سنجش، کوانتیزهسازی، خروجی گرفتن و سرو پایپلاین بینایی ماشین. تعیین اندازه رمزگشایی LLM روی اهداف Edge بر اساس پهنای باند حافظه.
فهرست مطالب
مراحل پایپلاین بینایی ماشین
معماریوظایف در کد
کار و کد| وظیفه | کد |
|---|---|
| صدکهای تاخیر | measure_latency(model, input_shape) |
| شمارش پارامترها | parameter_count(model) |
| تخمین FLOPs | flops_estimate(model, input_shape) |
| کوانتیزهسازی استاتیک INT8 | quantise_ptq(model, calibration_loader) |
| خروجی گرفتن به ONNX | export_onnx(model, sample_input) |
| مقایسهی 4 بکبون | compare_backbones(resolution=160) |
| اجرای پایپلاین | pipe.run(img, image_id="demo") |
| اندازهگیری زمان هر مرحله | benchmark(pipe, num_runs=10) |
اندازهگیری صحیح تاخیر
کدpython
model = model.to(device).eval()
with torch.no_grad():
for _ in range(warmup): # 5 در کد، 10 در مستندات
model(x)
torch.cuda.synchronize() # قبل و بعد، فقط روی cuda
t0 = time.perf_counter()
model(x)
times.append((time.perf_counter() - t0) * 1000) # میلیثانیه
times.sort()
p50 = times[len(times) // 2]
p95 = times[int(len(times) * 0.95)] # صدکها را گزارش کنید، نه میانگین را
کوانتیزهسازی و خروجی گرفتن
کدpython
import torch.ao.quantization as tq
model.qconfig = tq.get_default_qconfig(backend) # backend="x86"
tq.prepare(model, inplace=True) # ناظرها را درج میکند
for x, _ in calibration_loader:
model(x) # کالیبراسیون با دادههای واقعی
tq.convert(model, inplace=True) # ادغام و کوانتیزهسازی
torch.onnx.export(model, sample_input, path,
input_names=["input"], output_names=["output"],
dynamic_axes={"input": {0: "batch"}, "output": {0: "batch"}}, # هر اندازهی دستهای (batch)
opset_version=17) # پیشفرض امن در سال 2026
سرو و اجرا
دستورها| دستور | عملکرد |
|---|---|
uvicorn main:app --host 0.0.0.0 --port 8000 | سرویس FastAPI را راهاندازی میکند |
curl -F 'file=@dog.jpg' http://localhost:8000/detect | یک تصویر آپلود شده ارسال میکند |
rustc --edition 2021 -O code/main.rs | بنچمارک Rust برای Edge را بیلد میکند |
`code/main.py` (lesson 17.12) | سقف رمزگشایی به ازای هر هدف Edge را چاپ میکند |
trtexec | اعداد CLI مستقل TensorRT |
benchmark_app | اعداد CLI مستقل OpenVINO |
اصول اندازهگیری
گامبهگام- گرمکردن اولیهاجرای 5 تا 10 گذر رو به جلو تصنعی. آنها را نادیده بگیرید.
- همگامسازیفراخوانی
torch.cuda.synchronize()قبل و بعد از بلوک زمانگیریشده. - ثابت نگهداشتن ابعاد ورودیاز رزولوشن محیط عملیاتی استفاده کنید. 224x224 با 512x512 فرق دارد.
- زمانگیریاستفاده از
time.perf_counter()در اطراف هر گذر. - گزارشارائهی p50، p95 و p99. میانگین دم توزیع را پنهان میکند.
- تصمیمگیریاستفاده از FLOPs برای جستجوی معماری. استفاده از تاخیر روی دستگاه برای عرضهی نهایی.
پیشفرضها و ارقام
پیشفرضها| تنظیم | پیشفرض | نکته |
|---|---|---|
opset_version | 17 | خروجی ONNX |
Latency loop | warmup=10, iters=50 | مستندات. کد از 5 و 20 استفاده میکند |
min_crop | 32 | مستندات. کد از 16 استفاده میکند. باکسهای کوچکتر از دستهبندیکننده رد میشوند |
Crop resize | 224 | مستندات. کد از 64 استفاده میکند |
backend | x86 | qconfig مربوط به PTQ |
Micro-batch window | 20ms | جمعآوری درخواستها، سپس دستهبندی (batch) |
INT8 accuracy loss | 0.1-1 | درصد امتیاز با PTQ استاتیک |
CPU stage times | 300-500 ms | تشخیص. پیشپردازش حدود 3 میلیثانیه |
اهداف Edge و فرمتها
مفهومها- Apple ANE
- معادل 38 TOPS، حافظهی یکپارچه. وزنهای INT4 + اکتیویشنهای FP16 از طریق Core ML.
- Qualcomm Hexagon
- معادل 45 TOPS. کوانتیزهسازی QNN INT8 / INT4 از طریق مبدلهای AI Hub.
- WebGPU / WebLLM
- فرمت Q4 MLC (
q4f16_1) باmlc_llm convert_weight. فرمت GGUF پشتیبانی نمیشود. - Jetson Orin Nano
- فرمت Q4 GGUF یا TRT-LLM INT4. متکی به پهنای باند حافظه.
- Jetson AGX / Thor
- فرمت NVFP4 + حافظه موقت کلید-مقدار FP8 در مسیر Edge-LLM.
- محیطهای اجرای بینایی ماشین
- خروجی PyTorch به ONNX، سپس انتخاب ONNX Runtime، TensorRT، Core ML یا TFLite.
پهنای باند، سقف رمزگشایی را تعیین میکند
مفهومها- سقف
- $\text{tok/s} = \frac{\text{bandwidth (GB/s)}}{\text{model size (GB)}}$. رمزگشایی تمام وزنها را به ازای هر توکن میخواند.
- موبایل
- 3.5 گیگابایت در 50 گیگابایت بر ثانیه، 70 میلیثانیه طول میکشد. سقف ~14 توکن بر ثانیه است.
- دیتاسنتر
- حافظه HBM3 با 3 ترابایت بر ثانیه، 3.5 گیگابایت را در 1.2 میلیثانیه پاک میکند. سقف 830 توکن بر ثانیه است.
- شکاف
- پهنای باند دیتاسنتر نسبت به Edge بین 30 تا 50 برابر است.
- زمینهی گوشی
- مدل 4 گیگابایتی + 2 گیگابایت کش کلید-مقدار برای 32K توکن روی 8 گیگابایت RAM = خطای OOM. زمینه را روی 4K-8K نگه دارید.
- FLOPs کانوولوشن
- $2 \, c_{in} \, c_{out} \, k_h \, k_w \, h \, w$ برای یک لایهی کانوولوشن.
- INT8
- حجم مدل و پهنای باند حافظه 4 برابر کاهش مییابد. محاسبات 2 تا 4 برابر کاهش مییابد.
عیبیابی
عیبیابیزمانگیریهای اولیه کُند هستند
- علت
- سرد بودن کشها و کامپایل JIT
- راهحل
- گرمکردن اولیه با 5 تا 10 گذر
تاخیر GPU بسیار ناچیز به نظر میرسد
- علت
- ارسال کرنل را اندازهگیری میکنید
- راهحل
- همگامسازی در اطراف بلوک زمانگیریشده
برشها خالی برمیگردند
- علت
- باکسها در قالب (cx, cy, w, h)
- راهحل
- اعتبارسنجی (x1, y1, x2, y2) با Pydantic
برش در لبهها شکست میخورد
- علت
- باکسهای خارج از محدوده
- راهحل
- محدود کردن (Clamp) به ابعاد تصویر
آپلود خراب خطای 500 میدهد
- علت
- عدم بررسی رمزگشایی
- راهحل
- بازگرداندن 400 همراه با خطای مشخص
اولین درخواست شکست میخورد
- علت
- مدل دیر بارگذاری میشود
- راهحل
- بارگذاری هنگام شروع سرویس
خطای OOM گوشی در زمینههای طولانی
- علت
- کش کلید-مقدار برای 32K توکن
- راهحل
- زمینه را روی 4K-8K نگه دارید
افت دقت PTQ بسیار بالاست
- علت
- PTQ استاتیک کافی نیست
- راهحل
- استفاده از QAT با دادههای برچسبدار
اختصارات
اصطلاحها- PTQ
- کوانتیزهسازی پس از آموزش. کوانتیزهسازی مدل آموزشدیده بدون بازآموزی.
- QAT
- آموزش آگاه از کوانتیزهسازی. بهترین دقت. نیازمند دادههای برچسبدار است.
- ONNX
- فرمت مدل بیطرف. تمام محیطهای اجرای اصلی آن را میخوانند.
- FLOPs
- عملیات ممیز شناور در هر گذر رو به جلو. تقریبی کلی از میزان محاسبات.
- ANE
- موتور عصبی اپل (Apple Neural Engine). واحد NPU روی دستگاه با حافظهی یکپارچه.
- QNN
- کیت توسعه نرمافزار شبکه عصبی کوالکام. دسترسی به Hexagon را فراهم میکند.
- حافظهی یکپارچه
- CPU و NPU یک رم مشترک را میبینند. بدون سربار کپی.
پرسشها
پرسش و پاسخ- کدام مدل برای کمتر از 3M پارامتر؟
- مدل MobileNetV3-Small. همهجا کامپایل میشود.
- کدام مدل برای 10 تا 20 میلیون پارامتر؟
- مدل ConvNeXt-Tiny. برای CPU بسیار مناسب است.
- چرا FLOPs بیشتر میتواند سریعتر اجرا شود؟
- کانوولوشنهای Depthwise خوب کامپایل میشوند. کانوولوشنهای بزرگ 7x7 خوب نیستند.
- تاخیر پایپلاین کجا هدر میرود؟
- پیشپردازش روی CPU. آشکارساز 70 تا 90 درصد زمان GPU را میگیرد.
- چرا رمزگشایی در Edge کُند است؟
- رمزگشایی متکی به پهنای باند حافظه است. محاسبات در اولویت دوم قرار دارد.
نکات
نکتهها- تمام مدلهای Edge را به INT8 کوانتیزه کنید مگر اینکه دلیل خاصی خلاف آن داشته باشید.
- تمام خانههای جدول را روی دستگاه هدف اندازه بگیرید، نه روی میز کار سیستم خودتان.
- نام مدل و هش وزنها را در هر پاسخ ثبت کنید.
- زمانبندی هر مرحله را با یک شناسهی ردگیری مختص به درخواست ثبت کنید.
- اگر مهلت زمانی دستهبندیکننده تمام شد، تشخیصها را بدون دستهبندی برگردانید.