چیت‌شیت

پایپ‌لاین‌های بینایی ماشین و استقرار روی Edge

Vision Pipelines and Edge Deployment

سنجش، کوانتیزه‌سازی، خروجی گرفتن و سرو پایپ‌لاین بینایی ماشین. تعیین اندازه رمزگشایی LLM روی اهداف Edge بر اساس پهنای باند حافظه.

  • ۱۳ بخش
  • ۳ درس مرتبط
  • کد و دستورها عیناً از دوره‌ی اصلی
فهرست مطالب
  1. مراحل پایپ‌لاین بینایی ماشین
  2. وظایف در کد
  3. اندازه‌گیری صحیح تاخیر
  4. کوانتیزه‌سازی و خروجی گرفتن
  5. سرو و اجرا
  6. اصول اندازه‌گیری
  7. پیش‌فرض‌ها و ارقام
  8. اهداف Edge و فرمت‌ها
  9. پهنای باند، سقف رمزگشایی را تعیین می‌کند
  10. عیب‌یابی
  11. اختصارات
  12. پرسش‌ها
  13. نکات

مراحل پایپ‌لاین بینایی ماشین

معماری
درخواست HTTPبایت‌های تصویررمزگشاییپیش‌پردازشآشکارساز (Detector)YOLO یا Mask R-CNNبرش و تغییر اندازههر تشخیصدسته‌بندی‌کننده (Classifier)ConvNeXt-Tinyتجمیعتشخیص‌ها و کلاس‌هاPydanticاعتبارسنجیپاسخ JSON

وظایف در کد

کار و کد
وظیفهکد
صدک‌های تاخیرmeasure_latency(model, input_shape)
شمارش پارامترهاparameter_count(model)
تخمین FLOPsflops_estimate(model, input_shape)
کوانتیزه‌سازی استاتیک INT8quantise_ptq(model, calibration_loader)
خروجی گرفتن به ONNXexport_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

اصول اندازه‌گیری

گام‌به‌گام
  1. گرم‌کردن اولیهاجرای 5 تا 10 گذر رو به جلو تصنعی. آن‌ها را نادیده بگیرید.
  2. همگام‌سازیفراخوانی torch.cuda.synchronize() قبل و بعد از بلوک زمان‌گیری‌شده.
  3. ثابت نگه‌داشتن ابعاد ورودیاز رزولوشن محیط عملیاتی استفاده کنید. 224x224 با 512x512 فرق دارد.
  4. زمان‌گیریاستفاده از time.perf_counter() در اطراف هر گذر.
  5. گزارشارائه‌ی p50، p95 و p99. میانگین دم توزیع را پنهان می‌کند.
  6. تصمیم‌گیریاستفاده از FLOPs برای جستجوی معماری. استفاده از تاخیر روی دستگاه برای عرضه‌ی نهایی.

پیش‌فرض‌ها و ارقام

پیش‌فرض‌ها
تنظیمپیش‌فرضنکته
opset_version17خروجی ONNX
Latency loopwarmup=10, iters=50مستندات. کد از 5 و 20 استفاده می‌کند
min_crop32مستندات. کد از 16 استفاده می‌کند. باکس‌های کوچک‌تر از دسته‌بندی‌کننده رد می‌شوند
Crop resize224مستندات. کد از 64 استفاده می‌کند
backendx86qconfig مربوط به PTQ
Micro-batch window20msجمع‌آوری درخواست‌ها، سپس دسته‌بندی (batch)
INT8 accuracy loss0.1-1درصد امتیاز با PTQ استاتیک
CPU stage times300-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 کوانتیزه کنید مگر اینکه دلیل خاصی خلاف آن داشته باشید.
  • تمام خانه‌های جدول را روی دستگاه هدف اندازه بگیرید، نه روی میز کار سیستم خودتان.
  • نام مدل و هش وزن‌ها را در هر پاسخ ثبت کنید.
  • زمان‌بندی هر مرحله را با یک شناسه‌ی ردگیری مختص به درخواست ثبت کنید.
  • اگر مهلت زمانی دسته‌بندی‌کننده تمام شد، تشخیص‌ها را بدون دسته‌بندی برگردانید.