ارباب YOLO و ResNet

ميخواي بهترين نمايش رو از مدل هات توي "هيسيلين سيلوون" بگيري. این میتونه کار سختی باشه ميتوني برنامه رو ببيني

اربابین

ميخواي بهترين نمايش رو از مدل هات توي "هيسيلين سيلوون" بگيري. این میتونه کار سختی باشه شما ممکن است نقاشی های عملیات را ببینید یا استفاده از سخت افزارهای بدی را ببینید. معماری Acend NPU چالش هایی منحصر به فرد ارائه می دهد. برای مثال،برای مخفی کردن تاخیر دستیابی حافظه استفاده نمی کنه.

هدف:: این راهنمایی به شما یک جریان کاری کامل برای رسیدن YOLO/ResNet را می دهد. شما ياد ميگيريد که مدل ها رو آماده کنيد، و اونا رو با ترکيب دهنده ي "آسند" تبديل کنيد، و آنها را با استفاده از AscendCL برای کارآمدی اوج استفاده کنید.🚀

حذف کلید

  • مدل خود را برای آماده کنید.HSilicon NPUs. تبدیلش به قالب ONNX. زود ترش کن تا کوچکتر و سريعتر بشه
  • برای تبدیل مدل ONNX شما از کامپایلر Acend Tensor (ATC) استفاده کنید. یک پروندۀ «.om» برای NPU ایجاد می کند.
  • برای افزایش اجرای INT8 استفاده کنید. استفاده از قیدسازی پست آموزشی (PTQ) یا تمرین کامیابی اطلاعات (QAT).
  • استفاده از Profiler Ascend برای پیدا کردن بخشهای آهسته از مدل شما. اين به شما کمک ميکنه که مسائل اجرا رو حل کنيد.
  • خودت رو بفرست.مدل ساخته شدهبا استفاده از آساند سيل برای بررسی سرعت آن را اندازه بگیرید

تقديم ميکنم و يالو/رسنهات براي همکاري

ارائه دادن

اولین قدم شما اینه که مدل رو برای هیسیلیکان N پی آماده کنیم یک مدل آماده شده به خوبی تبدیل می کند و بهتر انجام می دهد. این آماده سازی چندین مرحله کلیدی است .

  1. تبدیل مدل: شما مدل آموزش یافته خود را به یک قالب سازگار با NPU تبدیل می کنید. ترکیب کننده Acend Tensor (ATC) در این فرآیند کمک می کند.
  2. سازگار عملیاتمدل شما ممکنه اپراتور سفارشی داشته باشد. شما باید اینها را برای NPU تطبیق دهید اگر حمایت از نظر بومی نشده باشند.
  3. نمونه مدلشما مدل تبدیل شده روی NPU استفاده می کنید. این شامل بار کردن مدل و تغذیه داده های آن برای دریافت پیش بینی می شود.
  4. دسته سازی اجرا: شما می توانید عملکرد بیشتر با تکنیک هایی مانند کوانتیزی و ترکیب عملیات را بهبود دهید.

استفاده از رز نت

شما می توانید از معماری رزنیت به عنوان استخون پشتی برای مدل YOLO شما استفاده کنید. رز نت اين قدرت به قيمتي مياد ResNet وزن محاسباتی قابل توجهی اضافه می کند. اين باعث ميشه قدم بعدي بشه خيلي مهم براي ذخيره کردن YOLO/ResNet روي دستگاه هاي محدود شده منبع.

تحریک برای سازگاری NPU

. ارتباطات غير ضروري يا نورون ها رو از شبکه عصبيت بر ميداره این فرایند یک مدل کوچکتر و سریع تر را ایجاد می کند بدون ضرر بزرگی در دقت. یک مدل ترکیب شده پارامتر و عملیات کمتری دارد. اين باعث ميشه که براي NPU ايده آل بشه، کاهش ميدهحافظهاستفاده و سرعت ترجيح ميده این یک تکنیک مهمی برای رسیدن YOLO/ResNet است.

صادرات مدل ها به ONNX

باید مدل خود را به قالب شبکه مرغ باز (ONNX) صادر کنید. ONNX یک قالب متوسط است که ATC ابزار متوجه می شود. به راحتی می توانید یک مدل PyTorch را با استفاده از یک فرمان ساده صادر کنید.

مثال:: صادرات مدل YOLOv8n به ONNX.

# این فرمان 'yolov8n.onnx' را از مدل PyTorch شما ایجاد می کند.
مدل صادرات yloso=yolov8n.pt format=onnx

یادداشت: ممکن است با خطاهای طی صادرات روبرو شوید. مسائلینوع داده ONNX پشتیبانی نشده: INT64یا تغییرات تغییر شکلپایگاهMatMulمعمولي هستن معمولاً می توانید اینها را با اطمینان داشته باشید که اندازه ورودی تانسور شما درست است یا با تبدیل نوع داده ها قبل از صادرات.

وارسی گراف ONNX

همیشه باید پروندۀ ONNX صادر شده را وارسی کنید. این بررسی مطمئن می شود که ساختار مدل درست است قبل از اینکه به تبدیل پیش برید چندین ابزار می تواند در این مرحله آماده سازی نهایی به شما کمک کند.⚙شش

  • نترناین یک ابزار تصویری است. میتونی آپلود کنی. درونxپرونده برای دیدن کل گراف مدل این به شما اجازه می دهد که ویژگی ها، ورودی ها و خروجی های هر لایه رو بررسی کنید
  • بررسی ONNX: این کتابخانه پایتون است. ميتوني ازش استفاده کنيOnnx. checker.check_model()توي يه فيلمنامه. به صورت برنامه نویسی تایید میکنه ساختار مدل شما معتبر است و اگر مشکلی پیدا کنه، خطایی را افزایش می دهد.

مدل با آتیس

بعد از آماده کردن مدل ONNX شما، وظیفه بعدی شما تبدیل به یک فرمت است که درباره ی HSilicon NPU می تواند درک کند. از اون استفاده ميکنيترکیب دهنده هستبراي اين قدم حياتي ATC یک ابزار قدرتمند درون CANN (Compute Architecture for Neurals Networks) است.

وظیفه اصلی این است که مدل شما را به یک مدل بسیار بهینه سازی آفلاین.

  • ATC یک ابزار تبدیل اصلی در زنجیره ابزار Huawei CANN است.
  • شما از آن برای تطبیق کردن مدل ها از چارچوب های معروف به یک قالب سازگار با آسسند استفاده می کنید.
  • بهت کمک میکنه که مدل های آموزش دیده شده روی سخت افزار های هوویی آسسند بفرستی.

این فرآیند تبدیل ایجاد میکنه. اُمپرونده، که نهایی مدل اجرایی است که شما در NPU استفاده می کنید.

تبدیل ATC اولیه

می توانید با فرمان پایه ای آغاز کنید تا تبدیل وارسی شده خود را تبدیل کنید. درونxپرونده. این فرمان به ATC مدل ورودی، چارچوب اصلی، نام پرونده خروجی مورد نظر و نسخه هدف Ascend chip می گوید.

💡مدل برون خط چیست (. اُم مدل برون خط پرونده ای است که برای یک هدف سخت افزار خاص بهینه شده است. شامل وظایف هایی مانند ترکیب اپراتور و بهینه سازی حافظه است که به این معنی است که NPU می تواند آن را با کمترین زمان برپایی در طی ترجیحات اجرا کند.

اين يه اساسيآشنامثال خط فرمان:

Atc --model=yolov8n.onnx \
-- فرم کار = ۵ \
-- Output=yolov8n \ >
نسخه:

بیایید از بین ببریم هر بخشی از این فرمان چه میکنه:

پرچمتوصیف
--Model:مسیر ورودی خود را مشخص می کند. درونxپرونده.
-- فرم کار = ۵ATC میگه که مدل در قالب ONNX است. (برای کافه و غیره)
-- خروجینام پایه برای خروجی شما. اُمپرونده
نسخه -- soc_پردازنده هدف را مشخص می کندصعود 310یا اینکه...صعود 710.

پیکربندی ورودیها

مدل شما باید اندازه و قالب دقیق داده هایی که می فرستید رو بدونه. این را طی تبدیل ATC با استفاده از پرچمهای مشخص پیکربندی می کنید. این قدم برای عملکرد و جلوگیری از خطاهای مدت حیاتی است.

تو از اون استفاده کرديشکل --input_پرچم برای تعریف ابعاد تانگر ورودی تان. می توانید یک اندازهٔ دسته ثابت را برای عملکرد ثابت و یا اندازه ی پویا برای انعطاف پذیری تنظیم کنید.

  • اندازۀ دسته:تصویر(پایگاه ۱)
  • اندازۀ دسته پویایی:تصویر: ----( اندازه ی جدول متغیر)

همچنین باید طرح بندی داده را مشخص کنید. بیشتر مدل های دید کامپیوتری که در پیتورچ آموزش دیده شده استفاده از آن استفاده می کنهNCHWقالب این طرح بندی داده های تنظیم را برنامه ریزی می کند) تعداد نمونه ها ، کانال ها ، ارتفاع ، عرض. دریافتن این حق برای کاربردی محاسباتی ضروری است، زیرا این تاثیر می گذارد که NPU به داده ها در حافظه دسترسی دارد. ميتوني ازش استفاده کنيقالب --input_پرچم براي تنظيم اين.

این فرمان افزایش یافته با پیکربندی ورودی است:

Atc --model=yolov8n.onnx \
-- فرم کار = ۵ \
-- Output=yolov8n \ >
--Input_ format=NCHW \ \
--Input_ شکل = " تصویر: 1,33,640,640" \
نسخه:

مدیریت Ops پشتیبانی نشده

گاهی اوقات مدل شما ممکن است شامل لایه های ویژه یا عملیات ("ops") باشد که ATC از نظر مادری پشتیبانی نمی کند. وقتي اين اتفاق بيفته تغيير شکست ميخوره تو ابزار قدرتمندي داري که اين رو حل کني:موتور سبز تنور) TBE (. TBE به شما اجازه می دهد که اپراتور های سفارشی را تعریف و پیاده سازی کنید به طوری که نیروی اولین NPU می تواند اجرا شود.⚙شش

توسعه یک اپراتور سفارشی با TBE یک فرایند پیشرفته است که شامل چند مرحله می شود:

  1. پیمانه DSL: اولین بار منطق ریاضیای اصلی اپراتور را بنویسید. از یک زبان مشخص دامنه برای تعریف گام ها و جریان داده استفاده می کنید.
  2. زمان بندی: بعد، به سخت افزار بگویید که چگونه می تواند به صورت کارآمد شما را اجرا کند. این برنامه ریزی برای بهینه سازی دسترسی حافظه و عملکرد است.
  3. پیمانه IR: TBI بعد یک نماینده ی بین المللی از اپراتور شما را تولید می کند. این یک قالب استاندارد شده است که کامپایلر می تواند درک کند و شروع به به بهینه سازی کند.
  4. پیمانۀ انتقال ترکیب کننده: کامپایلر IR را می گیرد و بهینه سازی های بیشتری درخواست می کند. این استفاده از تکنیک هایی مانند بافرینگ دو برابر و تخفیف حافظه هوشمند برای آماده سازی اپراتور برای سخت افزار خاص NPU است.
  5. کد: در نهایت، ماژول CodeGen یک فایل کد مانند C تولید می کند. این پرونده به یک اپراتور قابل اجرا ترکیب شده است که قابک CANN می تواند مستقیماً روی NPU بار و اجرا شود.

⚠نتیجه:: ایجاد اپراتور سفارشی نیاز به درک عمیق از عملکرد اپراتور و معماری NPU است. تو هميشه بايد اول ليست اپراتور رسمي CANN رو چک کني. فقط یک عملگر سفارشی ایجاد می کند اگر نتوانید یک جایگزینی پشتیبانی شده را پیدا کنید.

ارتباطی و نژادی

تو مدل خودت رو تغيير دادي حالا ميتوني قدرت واقعي "هيسيلين سي پي" رو باز کني. تکنیک های بهینه سازی پیشرفته عملکرد مدل شما رو به اوج میبره این مرحله روی کاهش دقیق مدل و تحلیل رفتار زمان اجرای آن تمرکز می کند تا یافته و تعمیر نفوذ ها.

NPUs مانند معماری داوینچی هیسیکان برای سرعت عملیات ریاضی خاص ساخته شده اند. مدل شما باید از این اپراتور های "انپایی دوستانه" برای رسیدن به سرعت بیشتری استفاده کند. هر عملیاتی که توسط NPU پشتیبانی نمی شود روی CPU آهسته تر اجرا می کند و یک ضربه ی عملیات ایجاد می کند.یک تکنیک کلیدی است که مدل شما را با NPU دوستانه تر می سازد. دقت اعداد مدل شما را به عنوان مثال از نقطه شناور ۳۲ بیتی (FP32) به عدد ۸ بیتی (INT8) کاهش می دهد. این تغییر مدل را کوچک تر و سریع تر می سازد.انآزمايش منمکراين اثر رو واضح نشون ميدهیک مدل که در ۱۲ چارچوب در ثانیه با استفاده از FP32 در ثانیه می تواند ۳۰ چارچوب در ثانیه در صورتی که با کمیت سازی INT8 بهینه شود..

کوچک سازی پس از آموزش) PTQ (

یک تکنیک بسیار قدرتمند برای نتیجهٔ YOLO/ResNet است. تو اين رو به مدل آموزش ديده شده اف پي 32 دريافت ميکني. ابزار اصلی که برای این استفاده می کنید از ابزار فشردن مدل (AMCT) است. PTQ محبوب است زیرا این یک راه سریع و مستقیم برای افزایش نمایش قابل توجه است بدون اینکه مدل شما را برگردوند.

هرچند، PTQ گاهی می تواند باعث افتادگی دقت مدل شما بشه.برای مدلی در بعضی موارد، مخصوصاً با مدل های کوچکتر، این از دست دادن دقت می تواند اهمیت بیشتر باشد. کوانتیزی ایتالیایی INT8 می تواند منجر به یک کاهش دقیق میانه در حدود 3-7% در MAP50-95 مطلق باشد.

اگر از دست دادن دقت PTQ خیلی بالا باشد ، گزینه دیگری دارید:آموزش کوانتیک- افزار) QAT (. QAT شبیه سازی کوانتیزی در حین فرایند آموزشی را معرفی می کند. این اجازه می دهد مدل را یاد بگیرد که چگونه از دست دادن دقیق یاد بگیرد، اغلب منجر به دقت نهایی بهتر است.

این مقایسه ای است که به شما کمک می کند تا تصمیم بگیرید که کدام روش استفاده کنید:

ویژهکوچک سازی پس از آموزش) PTQ (آموزش کوانتیک- افزار) QAT (
مرحله کاربردیک مدل قبل از آموزش دیده استمستقیما در فرایند آموزش مدل متصل شده
آموزش مجدد لازمهنه، لازم نيست دوبارهبله ، زمان طولاني تر از تمرين براي سازگاري با کميت سازي نياز داره
پیچیدگیساده تر و سریعتر برای پیاده سازیپیچیده تر، چون در طول دوره آموزش کمونی سازی را شبیه سازی می کند
تأثیر دقتیممکنه نتيجه ي دقت قابل ملاحظه باشهاغلب دقت بهتری به دست می آورد

کي بايد يکي رو برتر از ديگري انتخاب کني؟

  • انتخاب PTQوقتي که نميتوني مدل خودت رو دوباره برگردوني يا يک قطره دقت کوچک براي يک سود سرعت بزرگ قابل قبوله
  • انتخاب QATNameوقتي دقت اولويت اولويت شماست و شما منابع طولاني تر و پيچيده تري داريد

آماده کردن داده سازی درجه بندی

برای اجرای PTQ شما نیاز داریددستگاه داده درجه بندی. این مجموعه ای کوچک نماینده داده های ورودی است که AMCT از آن استفاده می کند. این داده را از طریق مدل شما اجرا می کند تا محدودهٔ مقادیر فعال سازی را تحلیل کند. این اطلاعات کمک می کند تا محاسبهٔ فاکتورهای مقیاس بهینه برای تبدیل مقادیر FP32 به INT8 بدون از دست دادن بیش از حد اطلاعات.

ساختن یک مجموعه داده های خوب درجه بندی برای کمونی سازی موفق ضروری است.

  • کیفیت در برابر حدت: شما به یک دستگاه داده های بزرگ نیاز ندارید. يه مجموعه اطراف1024 تصویر متنوع و خوب آماده شده استاغلب کافيه فقط استفاده از تصاویر بیشتری همیشه بهتر نیست. یک مجموعه داده های متعادل یا بی ارزش می تواند آمار درجه بندی را دریافت کند. این می تواند باعث بشه مدل کوانتیک شده به ضعیف در طول جهان واقعی عمل کند.
  • نمایش کلید است: تصاویر درجه بندی شما باید گوناگونی از داده هایی که مدل شما در تولید خواهد دید. شامل تصاویر با شرایط روشنایی مختلف، اندازه های شیء و پس زمینه هایی که مطمئن می شود فرایند درجه بندی قوی است.

یک مجموعه درجه بندی به خوبی انتخاب شده یک گوشه ای از کوانتیزی موثر در زمانی که YOLO/ResNet زیر می شود است.

پرونده با Profiler Ascend

بعد از اینکه مدل خود را تبدیل و کمیته کنید، باید عملکرد آن را اندازه گیری کنید. ...پروندۀ اضافیابزاريه که ازش استفاده ميکني اين بهت يک شکست جزئياتي ميده که چطور مدل شما روي NPU اجرا ميکنه

می توانید از داده های profiler

  • کدوم اپراتور ها بیشتر وقت دارن؟
  • هيچ اپراتوري
  • آیا حرکت داده های بین میزبان و دستگاه وجود داره؟

پروفایلر Ascend دو اجزای کلیدی برای این تحلیل دارد:

  1. تحلیل خط زمانی: این منظره به شما یک نمایش تصویری از اجرای مدل شما را می دهد. هر بلوک رنگ بر روی خط زمانی زمان و زمان آغاز یک عملگر را نشان می دهد. دقیقا می توانید ببینید کدوم اپراتورها روی این کار ادامه دارنداییکور(NPU اصلی)AICPU. . .HOSTCPU. اين به شما کمک ميکنه که اپراتورها رو با زمان هاي طولاني اجرا نشون بديد می توانید این دادۀ خط زمانی را به عنوان یک پروندۀ JSON بارگیری و آن را در ابزارهایی مثل باز کنیدکروم_tracing:يه نگاه عميق تر.

  2. تحلیل کاربر عملیات: این مؤلفه آمارهای سطح بالایی را فراهم می کند. زمان اجرای اپراتور در جدول ها و نمودارها را نمایش می دهد که بر اساس مدت مرتب شده است. می توانید سریع را ببینید که چه نوع اپراتوری (مثلاً AICORE در برابر AICPU) و چه اپراتورهای مشخصی بیشتر وقت استفاده می کنند. اين براي شناسايي عاليه اگه يک بخش مهم از زمان اجراي مدل شما براي چند عمليات آروم صرف بشه

با استفاده از این دو دیدگاه با یکدیگر، می توانید به صورت موثر بررسی مشکلات عملیات را تشخیص دهید. برای مثال اگر پروفیلر نشان دهد که یک عملگر سفارشی یا پشتیبانی نشده در HOSTCPU اجرا می شود، شما ميدونيد که ساختن يک اپراتور "تيبي" سفارشي براي اون احتمالاً سرعت زيادي ميده

عوض شدن

دفاع

تو مدل خودت رو بهینه کردی حالا ميخواي توي "هيسيلين سي پي" کار کني. اين مرحله آخر جاييه که مدل خودت رو براي پيش بيني کردن دنياي واقعي انجام ميدي از اون استفاده ميکنيزبان محاسبتارتباط با سخت افزار و نمايش نهايي مدل شما را اندازه بگيريد.

مقداردهی اولیۀ دستگاه

اول بايد NPU رو براي تصوير برقرار کني. تو براي انجام اين کار استفاده ميکني. Python Ascend Computing Language (pyACL) یک کتابخانه Python API است که این فرایند را ساده می کند. بهت اجازه ميده که پردازش کننده ي AI رو مستقيما از کد پايتون کنترل کني.

جریان کاری استاندارد برای اجرای یک مدل یک دنباله ی واضح می شود:

  1. اولیۀ پایACL: شما کتابخانه PACL را برای آماده کردن منابع سیستم آغاز کنید.
  2. تخلیۀ منابعName: شما منابع کاری را که درخواست شما نیاز دارد کنار گذاشتید.
  3. انتقال داده: شما داده های ورودی خود را، مثل تصاویر، به حافظه ی دستگاه منتقل می کنید.
  4. دادۀ فرایند: می توانید تغییرات تصویر آخرین دقیقه را انجام دهید، مانند تغییر اندازه.
  5. اجرای مدل: تو پرش میکنی. اُممدل و برنامه ريزي رو انجام بديد
  6. خراب کردن انصرافاتها: بعد از اينکه تصميم کامل بشه منابع دوره رو آزاد ميکنيد.
  7. دیinitialize pyACL: شما کتابخانه را خاموش می کنید تا تمام منابع را آزاد کنید.

کد ترجیح نوشتن

متن تصوير شما همه اين قدم ها رو به هم مياره اين کد موتوري

💡استفاده از PyACL برای ترجیح ...پیACLکتابخانه ابزار اصلی شما برای این تکلیف است. تو از عملکردهایش برای مدیریت دستگاه استفاده میکنی، حافظه رو کنترل میکنی. اُممدل و اجراش کن بهت کنترل کامل روی کل خط لوله ی توسط یک محیط پایتون میده

فيلمنامه ي شما اطلاعات ورودي رو از پيش پردازش کرده رو بار ميکنه به NPU ميفرسته و بعدش خروجی رو از مدل پرداز کنید

اجرای برنامه گذاری

بعد از پخش، شما بايد نمايش مدل خود را اندازه بگيري اين بهت ميگه که مدل شما چقدر سريع انجام ميشه. دو متریک کلیدی برای این ارزیابی ضروری است:

  • لاتینس: این زمان است که مدل شما برای پردازش یک ورودی ، به میلی ثانیه اندازه گیری می شود. بهتره
  • قابک ها در ثانیه) FPS (: این اندازه گیری می کند که چند مدل می تواند در یک ثانیه پردازش کند. اف پی اس بالاتر بهتره

این دو متریک به طور مستقیم مرتبط هستند.برای یک برنامه ویدئویی زمان واقعی که در 30 اف پی اس اجرا می شود مدل شما باید کمتر از 33.3 میلی متری باشد.سایر متریک های مهم نیز می تواند به شما بفهمد.

  • زمان به اولین نشانه: زمانی که برای گرفتن اولین قطعه خروجی طول می کشد.
  • زمان کل تولید: زمان پایان به پایان از ورودی به خروجی کامل.

اندازه گیری این اعداد کمک می کند تایید کنید که کار بهینه سازی شما موفق بود.🚀


شما در حال حاضر یک جریان کامل برای بهینه سازی NPU استاد کرده اید. اين راهنما تو رو از چهار مرحله ضروري رد کرد:

  1. آماده سازی مدل
  2. تبدیل ATC
  3. تنظیم کوانتیک سازی
  4. پخش اضافی سیل

به دنبال این فرایند ساختار شده کلید قفل کردن کامل نمایش های دید کامپیوتری شما است.سخت افزار هیسیلون.

حالا این تکنیک ها روی پروژه های خودتون به کار ببرید برای کمک بیشتر از مدارک رسمی CANN یا فروم های اجتماعی مراجعه کنید. موفق باشي🚀

FAQ

تفاوت اصلی بین PTQ و QAT چیست؟

یک مدل آموزش پست آموزشی (PTQ) را به مدل آموزش داده می کنید. سريعه ولي ميتونه دقت کمتر بشه طی فرایند آموزشی از دوره های آموزشی (Quantization-Aware) QAT ( استفاده می کنید. این روش زمان بیشتری طول می کشه اما اغلب دقیق را بالا نگه می دارد .

چرا ONNX قالب ترجیح میده برای تبدیل؟

از ONNX به عنوان قالب جهانی استفاده می کنید. ترکیب کننده "آسند تنور" (ATC) فایل های ONNX را درک می کند. این باعث میشه به راحتی مدل ها را از چارچوب هایی مثل پیتورچ تبدیل کنی. اُمقالب که NPU می تواند اجرا شود.

اگه تبدیل ارتباطی من شکست خورد باید چیکار کنم؟

اغلب یک شکست ATC به این معنی است که مدل شما یک اپراتور نشده دارد. اول، گزارش هاي خطا رو براي سرنخ بررسي کن برای حل مشکل نیاز به اپراتور سفارشی ایجاد کنید.⚙شش

چند تا تصویر برای یک مجموعه اطلاعات درجه بندی لازم دارم؟

تو به هزاران تصوير نياز نداري یک مجموعه متنوع از حدود 1024 تصویر اغلب کافی است. کليد کيفيته اطلاعات درجه بندی شما باید نشان دهنده چیزی که مدل شما در تولید خواهد دید.

Related Articles