آنچه در این مقاله میخوانید
هر چیزی که هر توسعهدهندهی ML/AI باید درباره ONNX بداند
۷ آذر ۱۴۰۴
در دنیای یادگیری عمیق، مدلها قلب پروژههای AI و ML هستند. اما مشکل اصلی این است که مدلهای آموزش دیده اغلب در قالب فریمورکهای خاص ذخیره میشوند و انتقال آنها به محیطهای دیگر میتواند دشوار باشد. اینجا است که ONNX وارد میشود: یک استاندارد باز که امکان جابهجایی آسان مدلهای بین فریمورکهای مختلف را فراهم میکند و از وابستگی به یک ارائهدهنده خاص جلوگیری میکند.
با ONNX، مدلهای شما دیگر محدود به محیط آموزش نیستند. فایلهای مدل، اعم از PyTorch, TensorFlow یا دیگر فریمورکها، میتوانند بهراحتی به محیطهای تولید یا اپلیکیشنهای متفاوت منتقل شوند، بدون نیاز به بازنویسی یا تبدیلهای پیچیده. در نتیجه، توسعهدهندگان میتوانند تمرکز خود را روی بهبود مدل و نوآوری بگذارند، نه روی سازگاری فریمورکها.
در ادامه خواهید خواند:
- پیش نیاز
- معرفی ONNX
- کاربردهای عملی ONNX
- ابزارها و فریمورکهای پشتیبانیشده توسط ONNX
- تفاوت ONNX با فرمتهای اختصاصی مدلها
- جمع بندی

پیش نیاز
- آشنایی پایه با یادگیری ماشین (ML) و یادگیری عمیق (DL): شناخت مفاهیمی مثل شبکههای عصبی، لایهها، مدلها و فرایندهای آموزش.
- آگاهی از فریمورکهای محبوب ML: تجربه کار با حداقل یکی از فریمورکهای اصلی مثل TensorFlow, PyTorch یا Scikit-learn، چون ONNX برای تبدیل مدلها بین این فریمورکها استفاده میشود.
- تجربه در استقرار مدلها: درک پایهای از نحوه استقرار مدلهای یادگیری ماشین در محیطهای تولیدی (Production)، چرا که ONNX به استقرار چندسکویی (cross-platform) کمک میکند.
- آشنایی با بهینهسازی مدل: دانش اولیه از تکنیکهای بهینهسازی مدلهای ML برای افزایش کارایی، زیرا ONNX اغلب برای کارآمدتر کردن مدلها به کار میرود.
- برنامهنویسی پایتون: از آنجایی که ONNX پشتیبانی قوی در پایتون دارد، آشنایی با پایتون برای استفاده از ابزارها و کتابخانههای آن ضروری است.
Open WebUI چیست و چرا کار با مدلهای زبانی را آسانتر میکند؟
Open WebUI
معرفی ONNX
در یک نگاه کلی، ONNX برای ایجاد سازگاری میان فریمورکها طراحی شده است. امروزه کتابخانههای بسیار متنوع و قدرتمندی در حوزه یادگیری ماشین وجود دارند؛ از جمله PyTorch, TensorFlow, MXNet و Caffe که طی سالهای اخیر محبوبیت زیادی پیداکردهاند. علاوه بر اینها، ابزارها و فریمورکهای دیگری هم هستند که هرکدام قابلیتها و مزایای خاص خود را دارند.
ایده اصلی ONNX این است که شما بتوانید مدل خود را با یک ابزار یا فریمورک آموزش دهید و سپس همان مدل را با استفاده از ابزار دیگری در محیط متفاوت برای استنتاج (inference) یا پیشبینی اجرا کنید. برای اینکه این قابلیت بین فریمورکی امکانپذیر باشد، باید مدل خود را به فرمت .onnx صادر کنید. این فرمت در واقع یک نمایش سریالایز شده از مدل در قالب فایل protobuf است.
در حال حاضر، ONNX به صورت بومی (native) از PyTorch, CNTK, MXNet و Caffe2 پشتیبانی میکند. همچنین برای فریمورکهای دیگری مثل TensorFlow و CoreML نیز مبدلهایی (converter) وجود دارد که به شما امکان میدهد مدلهای آموزشدیده در آنها را هم به ONNX تبدیل کنید.
فرض کنید یک مدل در PyTorch آموزش دادهاید و حالا میخواهید آن را در یک اپلیکیشن موبایل iOS که از CoreML پشتیبانی میکند اجرا کنید. به صورت عادی این کار دشوار خواهد بود، اما با ONNX کافی است مدل خود را به .onnx تبدیل کنید و سپس با استفاده از مبدل ONNX-CoreML آن را به فرمت موردنیاز iOS درآورید. این یعنی بدون بازنویسی دوباره کل مدل، میتوانید به راحتی آن را در محیط دیگری به کار بگیرید.
با سرویس آماده هوش مصنوعی لیارا، مدلهای AI خودت رو بدون دردسر اجرا کن و کنترلشون رو دست بگیری.
✅ GPU و CPU قوی✅ مناسب مدلهای متنباز✅ پایداری و اجرا سریع
خرید و راهاندازی سرویس هوش مصنوعی
کاربردهای عملی ONNX
فرض کنید میخواهید مدلی بسازید که بتوانید تشخیص دهد یک ماده غذایی در یخچال هنوز قابل خوردن است یا نه. برای این کار مجموعهای از تصاویر مواد غذایی در مراحل مختلف پس از تاریخ انقضا جمعآوری میکنید و آنها را به یک شبکه عصبی کانولوشنی (CNN) میدهید تا مدل شما یاد بگیرد که آیا غذا هنوز سالم است یا خیر.
پس از آموزش مدل، تصمیم دارید آن را در یک اپلیکیشن iOS پیادهسازی کنید تا کاربران بتوانند بهسادگی با گرفتن عکس، از سلامت غذای خود مطمئن شوند. اما یک مشکل وجود دارد: شما مدل را با PyTorch آموزش دادهاید، در حالی که iOS برای اجرای مدلها از CoreML پشتیبانی میکند. اینجا است که ONNX به کمک میآید. ONNX نقش یک واسط استاندارد را دارد که به شما امکان میدهد مدل را بهراحتی از یک محیط به محیط دیگر منتقل کنید.
در PyTorch، معمولا برای ذخیرهسازی مدل از دستور زیر استفاده میکنید:
torch.save(the_model.state_dict(), PATH)
اما برای صادر کردن مدل به فرمت ONNX کافی است تنها یک خط دیگر اضافه کنید:
torch.onnx.export(model, dummy_input, 'SplitModel.proto', verbose=True)
حالا با استفاده از ابزاری مانند ONNX-CoreML میتوانید مدل آموزش دیده را به فرمتی تبدیل کنید که به سادگی در XCode وارد شود و در اپلیکیشن iOS ادغام گردد. این روند باعث میشود بدون نیاز به بازنویسی کامل مدل، آن را مستقیما در یک محیط کاملا متفاوت به کار بگیرید.
K-Fold Cross-Validation چیست و چرا در یادگیری ماشین اهمیت دارد؟
K-Fold Cross-Validation
ابزارها و فریمورکهای پشتیبانیشده توسط ONNX
ONNX به گونهای طراحی شده که با طیف گستردهای از فریمورکها و ابزارهای یادگیری ماشین سازگار باشد. این سازگاری باعث میشود توسعهدهندگان بتوانند مدلهای خود را در یک فریمورک آموزش دهند و بدون مشکل در فریمورک یا پلتفرم دیگری استفاده کنند.
- فریمورکهای پشتیبانیشده به صورت بومی (Native):
- PyTorch
- CNTK (Microsoft Cognitive Toolkit)
- MXNet
- Caffe2
- فریمورکهای پشتیبانیشده از طریق مبدلها (Converters):
- TensorFlow
- CoreML (برای iOS)
- Keras
- SciKit-Learn
- ابزارها و کتابخانههای مکمل:
- ONNX Runtime برای اجرای سریع مدلها در پلتفرمهای مختلف
- ONNX-CoreML برای تبدیل مدلها به فرمت مناسب اپلیکیشنهای iOS
- ONNX.js برای اجرای مدلها در مرورگر
- OpenVINO برای بهینهسازی و اجرای مدلها روی سختافزارهای اینتل
به لطف این اکوسیستم گسترده، ONNX به پلی قدرتمند میان ابزارها و پلتفرمهای متنوع تبدیل شده و به توسعهدهندگان اجازه میدهد بدون نگرانی از قفل شن در یک فریمورک خاص، روی بهبود مدلهای خود تمرکز کنند.
درک فیلترها در شبکههای عصبی کانولوشنی (CNN): تبدیل تصاویر به اطلاعات
شبکههای عصبی کانولوشنی (CNN)
تفاوت ONNX با فرمتهای اختصاصی مدلها
مدلهای یادگیری ماشین پس از آموزش معمولا در قالب فرمتهای خاص همان فریمورک ذخیره میشوند. برای مثال:
- در PyTorch مدلها به صورت فایلهای
.pthذخیره میشوند. - در TensorFlow مدلها اغلب در قالب
.pbیاSavedModelنگهداری میشوند. - در Keras خروجی مدلها میتواند
.h5باشد.
این فرمتها هرچند برای همان فریمورک بسیار کارآمد هستند، اما یک مشکل بزرگ دارند: وابستگی شدید به همان محیط و ابزار خاص. بهعبارت دیگر، مدلی که در PyTorch آموزش دیده بهطور مستقیم در TensorFlow یا CoreML قابل استفاده نیست، مگر با بازنویسی یا تبدیلهای پیچیده.
اینجا است که ONNX خودش را متمایز میکند. برخلاف فرمتهای اختصاصی، ONNX یک استاندارد باز و مستقل از فریمورک است. وقتی مدلی به فرمت .onnx تبدیل میشود:
- میتوان آن را در محیطها و فریمورکهای مختلف بدون نیاز به بازنویسی اجرا کرد.
- انتقال مدل بین پلتفرمهای متفاوت (مثلا از سرور به موبایل یا از ویندوز به لینوکس) آسانتر میشود.
- خطر vendor lock-in یا همان قفل شدن در یک ابزار خاص از بین میرود.
آموزش موازی سازی دادهها (Data Parallelism) در یادگیری عمیق
Data Parallelism
جمع بندی
با رشد روزافزون فریمورکها و ابزارهای یادگیری ماشین، نیاز به یک استاندارد مشترک برای تبادل مدلها بیش از هر زمان دیگری احساس میشود. ONNX این مشکل را حل کرده و به توسعهدهندگان امکان میدهد بدون نگرانی از قفل شدن در یک فریمورک خاص، مدلهای خود را در محیطهای مختلف آموزش داده، بهینهسازی کرده و بهراحتی در پلتفرمهای گوناگون مستقر کنند.
استفاده از ONNX نهتنها فرآیند توسعه و استقرار مدلها را سادهتر میکند، بلکه به شما آزادی بیشتری در انتخاب ابزارها و فناوریهای میدهد. بنابراین اگر حوزه AI/ML فعالیت میکنید، یادگیری و بهکارگیری ONNX میتواند گام مهمی برای ساخت سیستمهای مقیاسپذیر، منعطف و آیندهنگر باشد.