آموزش TensorRT و کاربردهای آن — راهنمای مقدماتی + آموزش نصب

۵۹۰ بازدید
آخرین به‌روزرسانی: ۰۷ خرداد ۱۴۰۲
زمان مطالعه: ۱۱ دقیقه
آموزش TensorRT و کاربردهای آن — راهنمای مقدماتی + آموزش نصب

TensorRT که به اختصار TRT خطاب می‌شود، کتابخانه‌ای است که توسط شرکت NVIDIA برای استنتاج آماری سریع‌تر با استفاده از سخت‌افزارهای پردازش گرافیکی NVIDIA ارائه شده است. TensorRT بهینه‌سازی‌هایی را برای انواع داده INT8 و FP16 را با هدف استقرار کاربردهای استنتاج یادگیری عمیق از جمله پخش ویدیو، تشخیص گفتار، پیشنهاد دهی، تشخیص کلاهبرداری و پردازش زبان طبیعی فراهم می‌کند. در این مقاله به آموزش TensorRT در سطح مقدماتی و شرح کاربردهای این کتابخانه پرداخته شده است. در پایان نیز نحوه نصب TensorRT در لینوکس آموزش داده می‌شود.

TensorRT چیست ؟

امروزه هوش مصنوعی کاربردهای بسیاری در حوزه‌های مختلف جامعه دارد و در اکثر سیستم‌هایی که با آن‌ها سر و کار داریم از الگوریتم‌های هوش مصنوعی استفاده شده است. برای مثال می‌توان به سیستم‌هایی مانند گوشی‌های تلفن همراه، دوربین‌ها، برخی از وب سایت‌ها و سایر موارد اشاره کرد. برای ساخت یک پروژه هوش مصنوعی نیاز است که مجموعه داده یا همان دیتاست کاملی داشته باشیم. به همین دلیل، مدلی که در انتها و پس از آموزش مجموعه داده به دست می‌آوریم، ممکن است که حجم بالایی داشته باشد.

از طرفی برخی از سخت افزارهایی که برای پیاده سازی الگوریتم‌ها و مدل‌های هوش مصنوعی استفاده می‌شوند به جهت اینکه اندازه، وزن و ساختار ساده‌ای داشته باشند، دارای حجم حافظه پایینی هستند. TensorRT بر پایه CUDA ساخته شده است؛ CUDA به عنوان مدل و ابزار برنامه نویسی موازی شرکت NVIDIA شناخته می‌شود. TensorRT امکان ارائه استنباط و استنتاج آماری را با سرعت چهار تا پنج برابری در بسیاری از کاربردها و خدمات زمان واقعی تعبیه شده (Embedded) فراهم می‌کند. مقاله «آموزش TensorRT و کاربردهای آن» با هدف ارائه روشی برای برطرف کردن سرعت پایین اجرای الگوریتم‌ها و مدل‌های هوش مصنوعی با به کارگیری TensorRT تهیه شده است. در ادامه به بررسی مقدمات این فریم ورک بسیار کاربردی یعنی همان TensorRT می‌پردازیم.

تنسورآرتی در مقابل تنسورفلو | آموزش TensorRT و کاربردهای آن | راهنمای مقدماتی + آموزش نصب

آموزش TensorRT مقدماتی

TensorRT یک فریم ورک یادگیری ماشین به حساب می‌آید که توسط شرکت Nvidia منتشر شده است تا الگوریتم‌ها و مدل‌هایی را که توسط یادگیری ماشین و شبکه‌های عصبی مصنوعی تولید می‌شوند بر روی سخت افزارهای مورد استفاده برای پیاده‌سازی شبکه‌های عصبی اجرا کند. در پروژه‌های یادگیری ماشین این نیاز احساس می‌شود که مدل سنگینی که دارای حجم بالایی است با استفاده از یک پلتفرم جدید به مدلی سبک‌تر و ساده‌تر برای تعبیه در سخت افزار مورد نظر تبدیل شود. از این رو، پلتفرم تنسورآرتی توسط شرکت NVIDIA  ارائه شده است تا متخصصین و توسعه دهندگان هوش مصنوعی به راحتی بتوانند الگوریتم‌های خود را بر روی سخت افزارهای گرافیکی این شرکت پیاده‌سازی کنند.

فریم ورک TensorRT برای اجرا بر روی پردازنده‌های گرافیکی NVIDIA به بهترین نحو بهینه شده است. در زمان انتشار این مقاله، فریم ورک TensorRT سریع‌ترین روش برای اجرای یک مدل به حساب می‌آید. برای اینکه توسعه دهندگان و متخصصین هوش مصنوعی بخواهند از TensorRT استفاده کنند، معمولاً ابتدا الگوریتم را در پلتفرمی مانند PyTorch یا TensorFlow اجرا ‌می‌کنند و مدل به دست آمده از پلتفرم‌های پای‌تورچ یا تنسورفلو را به مدلی بر پایه TensorRT تبدیل می‌کنند. حال در ادامه به بررسی کارایی این فریم ورک پرداخته شده است.

به دست آوردن کارایی بالا با استفاده از TensorRT

فریم ورک تنسورآرتی باعث می‌شود که کارایی یک مدل شبکه عصبی و یادگیری عمیق با استفاده از پردازنده GPU افزایش پیدا کند. در مقاله «آموزش TensorRT و کاربردهای آن» به طور دقیق و عمیق‌ به نکات و ترفندهایی پرداخته می‌شود تا بیشترین بهره در استفاده از فریم ورک تنسورآرتی در مدل شبکه عصبی حاصل شود.

در این مقاله مقدمات فریم ورک TensorRT به صورت کاربردی مورد بررسی قرار می‌گیرند. در طول این مقاله موضوعات زیر به طور کامل بررسی خواهند شد:

  • مدل‌هایی که توسط فریم ورک تنسورآرتی پشتیبانی می‌شوند و جریان کاری را یکپارچه‌سازی می‌کنند.
  • تکنیک‌های جدیدی مانند آموزش کوانتیزاسیون (کوانتیزه‌سازی | Quantization) برای رسیدن به دقت INT8 ارائه می‌شوند.
  • روش نصب تنسورآرتی روی سیستم عامل Ubuntu نیز مورد بررسی قرار گرفته است.

کوانتیزاسیون int8 نه تنها برای فریم ورک‌های نرم افزاری یادگیری ماشین مانند TensorFlow و PyTorch، بلکه برای فریم ورک‌های سخت‌افزاری مانند TensorRT نیز به یک رویکرد محبوب برای روش‌های بهینه‌سازی تبدیل شده است. عمدتاً به این دلیل که int8 از اعداد صحیح 8 بیتی استفاده می‌کند، نیازهای حافظه و محاسبات را کاهش می‌دهد. در بخش بعدی درباره چند مرحله اصلی بهینه‌سازی تنسورفلو-تنسورآرتی صحبت خواهد شد.

مراحل بهینه سازی با TensorFlow-TensorRT

پس از آموزش «Train» کامل یک الگوریتم شبکه عصبی و به دست آوردن مدل نهایی، مدل به مرحله پیاده‌سازی و استقرار بر روی فریم ورک سخت افزاری TensorRT می‌رسد. برای یادگیری و تست این فریم ورک می‌توان از مدل‌های از پیش آموزش داده شده گیت‌هاب [+] نیز استفاده کرد که برای یادگیری TensorRT مناسب هستند. این مدل‌ها از آخرین APIهای TensorFlow استفاده می‌کنند و مرتباً به‌روزرسانی می‌شوند.

در فریم ورک TensorRT زمانی که مدل شبکه عصبی مورد نظر بر پایه رابط تنسورفلو پیاده‌سازی شود، این مدل به یک مدل تنسورآرتی با پردازنده GPU تبدیل خواهد شد. مدل‌های TensorFlow که با TensorRT بهینه‌سازی شده‌اند را می‌توان در پردازنده‌های گرافیکی T4 در یک مرکز داده (مانند Google Colab)، همچنین پردازنده‌های گرافیکی Jetson Nano ،Xavier و رزبری پای (Raspberry Pi) پیاده‌سازی کرد.

نحوه عملکرد TensorRT چگونه است؟

NVIDIA TensorRT یک بهینه‌ساز ارتباطی با زمان اجرا و کارایی مناسب به حساب می‌آید که می‌تواند با کمی دقت پایین‌تر (FP16 و INT8) بر روی پردازنده‌های گرافیکی نیز استفاده شود. استفاده از فریم ورک تنسورآرتی بر روی مدل‌های TensorFlow این امکان را می‌دهد که بهینه‌سازی‌های TensorRT در مدل‌های TensorFlow تنها با چند خط کد، اعمال شوند.

زمانی که یک متخصص هوش مصنوعی در محیط TensorFlow خود در حال برنامه نویسی است، تا 8 برابر عملکرد بالاتری نسبت به مدل TensorFlow در سخت افزار دریافت می‌کند. این تبدیل مدل از تنسورفلو به تنسورآرتی، بهینه‌سازی‌هایی را برای گراف‌های پشتیبانی شده اعمال می‌کند و عملیات پشتیبانی نشده را دست نخورده باقی می‌گذارد تا به صورت قبلی در TensorFlow اجرا شوند.

این تغییر مدل از یک فریم ورک مانند تنسورفلو به تنسورآرتی را می‌توان برای پروژه‌های شبکه عصبی و یادگیری عمیقی مانند تشخیص اشیا (Object Detection)، ترجمه متن (با استفاده از NLP)، سیستم‌های توصیه‌‌گر (Recommendation System) و یادگیری تقویتی (Reinforcement Learning) اعمال کرد. در مدل‌هایی مانند ‌‌MobileNet، NASNet، Inception، Yolo، ResNet و سایر موارد می‌توان از این فریم ورک استفاده کرد.

زمانی که فریم ورک TensorRT نصب شد و آموزش داده‌های مدل TensorFlow به پایان رسید، مدل در قالب (فرمت) مورد نظر ذخیره می‌شود و برای تبدیل شدن به تنسورآرتی به عنوان ورودی وارد تنسورآرتی خواهد شد. سپس، تبدیل مدل تنسورفلو به مدل بهینه شده تنسورآرتی برای زیرگراف‌های پشتیبانی شده اعمال می‌شود.

خروجی این مدل جدید، یک گراف TensorFlow با زیرگراف‌های پشتیبانی شده است. این زیرگراف‌های پشتیبانی شده با موتورهای بهینه‌سازی شده TensorRT جایگزین شده‌اند که توسط TensorFlow اجرا می‌شوند. جریان کار توضیح داده شده در مقاله آموزش TensorRT در شکل و کد پایتون زیر به صورت فلوچارتی مشاهده می‌شود:

فلوچارت توضیح تبدیل مدل تنسورفلو به مدل تنسور آر تی۱ | مقدمات TensorRT و کاربردهای آن | همراه نصب
فلوچارت توضیح تبدیل مدل تنسورفلو به مدل تنسور آر تی۲ | مقدمات TensorRT و کاربردهای آن | همراه نصب
1import tensorflow.contrib.tensorrt as trt
2trt.create_inference_graph(
3    input_saved_model_dir = input_saved_model_dir,
4    output_saved_model_dir = output_saved_model_dir)
تصویر فلوچارت تبدیل مدل تنسورفلو به تنسور آر تی۳ | مقدمات TensorRT و کاربردهای آن | همراه نصب

رویکرد دیگری نیز برای تبدیل مدل TensorFlow به یک مدل TensorRT وجود دارد، که این روش به صورت فریز کردن (Freeze) گراف مدل یادگیری انجام می‌شود. فریز کردن فرآیندی شامل شناسایی و ذخیره‌سازی تمام موارد از قبیل گراف، وزن و غیره در یک فایل واحد است تا بتوان به راحتی از آن استفاده کرد.

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

1import tensorflow.contrib.tensorrt as trt
2converted _graph_def = trt.create_inference_graph(
3     input_graph_def = frozen_graph,
4     outputs-[‘logits’, ‘classes’])

به طور کلی سه عملیات در مرحله بهینه‌سازی فرآیند ذکر شده در بالا انجام می‌شود:

  1. تقسیم‌بندی گراف: TensorRT گراف TensorFlow را برای زیرگراف‌هایی اسکن می‌کند که می‌توانند بر اساس عملیات پشتیبانی شده بهینه‌سازی شوند.
  2. لایه تبدیل: این لایه، لایه‌های TensorFlow پشتیبانی شده در هر زیرگراف را به لایه‌های TensorRT تبدیل می‌کند.
  3. بهینه‌سازی موتور: در نهایت، زیرگراف‌ها به موتورهای TensorRT تبدیل می‌شوند و در گراف والد TensorFlow جایگزین می‌شوند.

مثالی برای TensorRT

به عنوان مثالی برای مقاله آموزش TensorRT و کاربردهای آن، نمودارهای زیر را در نظر بگیرید. بلوک‌های سبز گزینه‌های برجسته شده توسط TensorRT و بلوک‌های خاکستری یک عملیات پشتیبانی نشده (Cast) را نشان می‌دهند. گراف از قسمت تابع فعالیت (Activation Function) به نام Relu به صورت عقب‌گرد پیمایش می‌شود و همان‌طور که در شکل اول قابل مشاهده است در هر مرحله یک گره (Node) از گراف‌ها انتخاب ‌شده است تا در نهایت به بزرگ‌ترین زیرگراف ممکن برسد. تنها محدودیت این است که زیرگراف باید یک نمودار چرخه‌ای مستقیم باشد و نباید هیچ حلقه‌ای داشته باشد. بزرگ‌ترین زیرگراف ساخته شده در شکل سوم مشاهده می‌شود.

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

تصویر فلوچارت شبکه تنسور آر تی و توضیح loop در آن | مقدمات TensorRT و کاربردهای آن | همراه نصب

در این مرحله و پس از بررسی‌های ابتدایی و آموزش TensorRT به نحوه کنترل حداقل تعداد گره‌ها در موتور TensorRT پرداخته می‌شود.

کنترل حداقل تعداد گره‌ها در موتور TensorRT

در مثال بالا، دو زیر گراف بهینه‌سازی تنسورآرتی تولید شد که یکی از آن‌ها برای عملگر «reshape» و دیگری برای همه عملیات غیر از «Cast» است. گراف‌های کوچک، مانند گراف‌هایی که فقط یک گره دارند، تعادلی بین بهینه‌سازی‌های انجام شده توسط TensorRT و هزینه‌های سربار (Overhead) ساخت و راه‌اندازی موتورهای TRT ارائه می‌کنند.

سایز زیرگراف‌ها با پارامتر «minimum_segment_size» کنترل می‌شود. مقدار پیش فرض این پارامتر ۳ است.

1converted_graph_def = create_inference_graph(
2    input_saved_model_dir=model_dir,
3    minimum_segment_size=3,
4    is_dynamic_op=True,
5    maximum_cached_engines=1)

اجرای کد پایتون بالا شکل پنجم از تصاویر فوق را تولید می‌کند. در بخش بعدی مقاله «آموزش TensorRT و کاربردهای آن» به انواع شکل‌های ورودی متغیرها پرداخته شده است.

انواع شکل‌های ورودی متغیرها

TensorRT معمولاً به انتخاب بهینه‌ترین هسته‌های CUDA نیاز دارد تا همه اشکال در مدل مورد نظر به طور کامل تعریف شوند. در صورتی که شکل ورودی مدل به طور کامل تعریف و تعیین شده باشد، می‌توان تنظیمات پیش‌فرض «is_dynamic_op=False» را برای ساخت موتورهای TensorRT به صورت ایستا در طول فرآیند تبدیل اولیه مورد استفاده قرار داد.

اگر مدل مورد نظر اشکال ناشناخته‌ای برای مدل‌هایی مانند BERT یا Mask R-CNN داشته باشد، می‌توان بهینه‌سازی TensorRT را تا زمان اجرا و وقتی به تاخیر انداخت که اشکال ورودی به طور کامل مشخص می‌شوند. برای این روش، کد «is_dynamic_op» در حالت «True» قرار می‌گیرد. کد زیر این روش را نشان می‌دهد:

1converted_graph_def = create_inference_graph(
2    input_saved_model_dir=model_dir,
3    minimum_segment_size=3,
4    is_dynamic_op=false,
5    maximum_cached_engines=1)

توپولوژی نمودار TRT

در این مرحله از مقاله آموزش TensorRT و کاربردهای آن، نمودار به صورت توپولوژیکی پیمایش می‌شود تا هر عملیات TensorFlow در زیرگراف به یک یا چند لایه TensorRT تبدیل شوند. در نهایت TensorRT بهینه‌سازی‌های نهایی را از جمله کالیبراسیون برای دقت کم‌تر و تنظیم خودکار کرنل اعمال می‌کند.

بهینه‌سازی‌هایی برای کاربر و پردازنده گرافیکی انجام می‌شوند که مدل را برای رسیدن به یک مدل سبُک و ساده از فریم ورک TensorFlow به TensorRT تبدیل کرده‌اند.

تصویر توپولوژي تنسور آر تی و توضیح شبکه آن با توپولوژی | مقدمات TensorRT و کاربردهای آن | همراه نصب

تا به اینجا بررسی‌های لازم از نظر فلوچارتی و توپولوژیکی بر روی فریم ورک تنسورآرتی انجام و مزایا و بهینه‌سازی سودمند فریم ورک TensorRT بیان شدند. اکنون در بخش بعدی مقاله «آموزش TensorRT و کاربردهای آن» به بررسی کش موتور TensorRT و متغییرهای Batch Size پرداخته خواهد شد.

کَش موتور TensorRT و اندازه Batch Size ها

موتورهای TensorRT را می‌توان در حافظه پنهان LRU واقع در قسمت TRTEngineOp ذخیره کرد. کلید این کش، شکل ورودی‌های عملیاتی است.

بنابراین، اگر کش خالی باشد یا موتوری برای یک شکل ورودی مشخص در کش وجود نداشته باشد، یک موتور جدید ایجاد خواهد شد. می‌توان تعداد موتورهای کش را با استفاده از قطعه کد زیر و پارامتر «maximum_cached_engines» کنترل کرد.

1converted_graph_def = create_inference_graph(
2    input_saved_model_dir=model_dir
3    minimum_segment_size=3,
4    is_dynamic_op=True,
5    maximum_cached_engines=1)

با تنظیم مقدار یک برای پارامتر مورد نظر، هر بار که موتور جدیدی ایجاد می‌شود، حافظه پنهان موجود را وادار به تخلیه می‌کند. فریم ورک TensorRT از اندازه batch ورودی‌ها به عنوان یکی از پارامترها برای انتخاب هسته‌های CUDA با بالاترین عملکرد استفاده می‌کند. اندازه batch به عنوان اولین بُعد ورودی‌ها ارائه می‌شود. اندازه Batch با اشکال ورودی در طول اجرا زمانی که پارامتر «is_dynamic_op» به صورت «true» است و همچنین در پارامتر «max_batch_size» زمانی که «is_dynamic_op» به صورت «false» باشد، تعیین می‌شود. یک موتور را می‌توان برای یک ورودی جدید استفاده مجدد کرد، اگر:

  • اندازه Batch موتور بزرگتر یا مساوی اندازه Batch یک ورودی جدید باشد.
  • ابعاد غیر Batch با ورودی جدید تطابق داشته باشند.

ارتباط تنسورآرتی با معیار دقت INT8

فناوری Turing Tensor Core با طیف کامل دقت ارتباطی برای تبدیل مدل‌ها از FP32 تا FP16 تا INT8 در پردازنده‌های گرافیکی Tesla T4 معرفی شده‌اند. هسته‌های Tensor تا 30 teraOPS یا همان TOPS، توان عملیاتی بالایی را در GPU‌های Tesla T4 ارائه می‌دهند.

استفاده از INT8 و دقت ترکیبی، ردپای حافظه را کاهش می‌دهد و مدل‌های بزرگ‌تر یا مینی‌بچ‌های بزرگ‌تر را برای ارتباط ممکن می‌سازد. فریم ورک TensorRT از «کوانتیزاسیون خطی متقارن» برای کوانتیزه کردن استفاده می‌کند. عملیات مقیاس‌بندی آن از محدوده FP32 (که در شکل بین ۶- تا 6 است) تا محدوده INT8 است (که در شکل زیر برای حفظ تقارن از 127- تا 127 است).

تصویر مرتبط به INT8 در تنسور آر تی | مقدمات TensorRT و کاربردهای آن | همراه نصب

پس از بررسی ارتباط تنسورآرتی با معیار دقت INT8، روش‌های اشکال‌زدایی برای برنامه‌های TensorFlow-TensorRT را در ادامه بحث آموزش TensorRT بررسی خواهیم کرد و سپس به آموزش نصب فریم ورک تنسورآرتی خواهیم پرداخت.

روش‌های اشکال‌زدایی برای برنامه‌های TensorFlow-TensorRT

ابزارها و روش‌های زیادی برای اشکال‌زدایی و استفاده از دستورات TensorFlow-TensorRT وجود دارند. از نمایه‌گر (Profiler) خط فرمان (CMD) گرفته تا ابزارهای رابط کاربری گرافیکی، از جمله nvprof ،NVIDIA NSIGHT Systems ،TensorFlow Profiler و TensorBoard که می‌توان هر یک از این ابزارها را برای استفاده از فریم ورک تنسورآرتی انتخاب کرد. ساده‌ترین راه برای شروع کار با تنسورآرتی، nvprof است، استفاده از nvprof یک نمایه‌گر خط فرمان است که در لینوکس، ویندوز و سیستم عامل مک او اس «Mac OS X» می‌توان از آن استفاده کرد. nvprof یک برنامه با وزن کم است که نمای کلی از هسته‌های GPU و نسخه‌های حافظه در برنامه مورد نظر را ارائه می‌دهد.

بحث بررسی فریم ورک TensorRT از جهات مختلف بسیار گسترده است. تا اینجا به مباحث مقدماتی آموزش TensorRT پرداخته شد. حال در ادامه این مقاله به نحوه نصب این فریم ورک در سیستم عامل‌ Ubuntu پرداخته شده است. بهتر است که برای نصب این فریم ورک از سیستم عامل لینوکس استفاده شود، اگر دسترسی به این سیستم عامل میسر نبود می‌توان از سرویس آنلاین با پردازنده‌های گرافیکی گوگل ‌کولب استفاده کرد.

آموزش TensorRT : نصب و استفاده از TensorFlow-TensorRT (TF-TRT) API

در این قسمت با ارائه آموزش نصب تنسورآرتی مشاهده می‌شود که چگونه TRT مدل را برای ارتباط سریع‌تر و تأخیر کمتر بهینه می‌کند. سپس، API TensorFlow-TRT برای بهینه‌سازی مدل‌های یادگیری عمیق و رسیدن به نتیجه‌گیری سریع‌تر بررسی شده است. ابتدا به بررسی تنظیمات محیطی پرداخته می‌شود که برنامه در آن نصب و پیاده سازی می‌شود.

تنظیمات محیط TensorRT

برای راه اندازی TensorRT بر روی سیستم مورد نظر، باید دستورات زیر را در ترمینال اجرا کرد. این دستورات برای TensorRT در سیستم عامل اوبونتو 18.04 نسخه 64 بیتی و نسخه TensorFlow بزرگتر یا مساوی ۲ راه اندازی می‌شود. فقط در صورتی که در حین بهینه‌سازی از پردازنده گرافیکی NVIDIA استفاده شود، باید بسته یادگیری ماشین NVIDIA و libnvinfer5 نیز نصب شوند. کدهای مربوط به نصب TensorFlow و سایر نرم افزارهای یادگیری ماشین به صورت زیر است:

1
2pip install tensorflow-gpu==2.0.0
3
4wget https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb
5  
6dpkg -i nvidia-machine-learning-repo-*.deb
7apt-get update
8
9sudo apt-get install libnvinfer5

برای اطمینان حاصل کردن از وجود پردازنده گرافیکی Tensor-core در سیستم و اینکه آیا این پردازنده وجود دارد یا خیر، با استفاده از دستور زیر وجود یا عدم وجود پردازنده گرافیکی Tensor-core بررسی می‌شود:

1
2from tensorflow.python.client import device_lib
3
4def check_tensor_core_gpu_present():
5    local_device_protos = device_lib.list_local_devices()
6    for line in local_device_protos:
7        if "compute capability" in str(line):
8            compute_capability = float(line.physical_device_desc.split("compute capability: ")[-1])
9            if compute_capability>=7.0:
10                return True
11    
12print("Tensor Core GPU Present:", check_tensor_core_gpu_present())
13tensor_core_gpu = check_tensor_core_gpu_present()

در ابتدا trt_converter و یک مدل resnet50 از پیش آموزش دیده شده (pretrained) که نیاز به بهینه‌سازی دارد، به عنوان ورودی به سیستم ارجاع شده است. اگر قصد تغییر دقت و بهینه شدن مدل به FP16 یا FP32 وجود داشته باشد، فقط با تغییر پارامتر precision_mode می‌توان این تغییر را اعمال کرد.

همچنین با تنظیم پارامتر max_workspace_size_bytes می‌توان حداکثر ظرفیت RAM سیستم را مشاهده کرد. در ادامه دستور مربوط به این دو پارامتر آمده است:

1
2from tensorflow.python.compiler.tensorrt import trt_convert as trt
3from tensorflow.keras.applications.resnet50 import ResNet50
4
5model = ResNet50(weights='imagenet')
6
7
8print('Converting to TF-TRT FP32...')
9conversion_params = trt.DEFAULT_TRT_CONVERSION_PARAMS._replace(precision_mode=trt.TrtPrecisionMode.FP32,
10                                                               max_workspace_size_bytes=8000000000)
11
12converter = trt.TrtGraphConverterV2(input_saved_model_dir='resnet50_saved_model',
13                                    conversion_params=conversion_params)
14converter.convert()
15converter.save(output_saved_model_dir='resnet50_saved_model_TFTRT_FP32')
16print('Done Converting to TF-TRT FP32')

با این حال، در حین تبدیل دقت فریم ورک تنسورآرتی به INT نیاز است که داده‌های کالیبراسیون به داده‌های ورودی کالیبراسیون هنگام فراخوانی تابع تبدیل (Convert Function) تبدیل شوند. در قطعه کد زیر به طور کامل این روش نشان داده شده است:

1batch_size = 8
2batched_input = np.zeros((batch_size, 224, 224, 3), dtype=np.float32)
3
4for i in range(batch_size):
5  img_path = './data/img%d.JPG' % (i % 4)
6  img = image.load_img(img_path, target_size=(224, 224))
7  x = image.img_to_array(img)
8  x = np.expand_dims(x, axis=0)
9  x = preprocess_input(x)
10  batched_input[i, :] = x
11batched_input = tf.constant(batched_input)
12print('batched_input shape: ', batched_input.shape)
13
14print('Converting to TF-TRT INT8...')
15conversion_params = trt.DEFAULT_TRT_CONVERSION_PARAMS._replace(
16    precision_mode=trt.TrtPrecisionMode.INT8, 
17    max_workspace_size_bytes=8000000000, 
18    use_calibration=True)
19converter = trt.TrtGraphConverterV2(
20    input_saved_model_dir='resnet50_saved_model', 
21    conversion_params=conversion_params)
22
23def calibration_input_fn():
24    yield (batched_input, )
25converter.convert(calibration_input_fn=calibration_input_fn)
26
27converter.save(output_saved_model_dir='resnet50_saved_model_TFTRT_INT8')
28print('Done Converting to TF-TRT INT8')

آزمایش و قطعه کدهایی که در مقاله «آموزش TensorRT و کاربردهای آن» ارائه شدند، فقط برای نسخه‌های تنسورفلو ۲ به بالا قابل پیاده‌سازی هستند، چنان که نسخه تنسورفلو موجود در سیستم مورد نظر پایین‌تر از این عدد باشد، بایستی تنسورفلو را به‌روزرسانی کرد.

اگر به هر دلیلی قصد تغییر نسخه تنسورفلو وجود نداشت، در کد گراف تنسورآرتی می‌توان از TrtGraphConverterV1 به جای TrtGraphConverterV2 استفاده کرد تا فریم ورک TensorRT به درستی کار کند. در بخش پایانی مقاله «آموزش TensorRT و کاربردهای آن» به معرفی فیلم‌هایی پرداخته شده است که بیش‌ترین ارتباط را با تنسورآرتی دارند و ممکن است برای علاقمندان به هوش مصنوعی و یادگیری ماشین مفید واقع شوند.

جمع‌بندی

انتظار می‌رود که در تبدیل مدل تنسورفلو به تنسورآرتی (TensorFlow-TensorFlowRT) و همچنین با استفاده از GPU‌های NVIDIA، ضمن حفظ سهولت و انعطاف‌پذیری مدل TensorFlow، بتوان بالاترین عملکرد ممکن را همراه با کم‌حجم‌ترین حالت مدل تضمین کرد. توسعه‌دهندگان و برنامه‌نویسان هوش مصنوعی به طور خودکار از مزایای به‌روزرسانی‌ها بهره‌مند می‌شوند، زیرا TensorRT بدون اینکه تغییری در کدهای موجود ایجاد شود، از شبکه‌های عصبی بیش‌تری پشتیبانی می‌کند.

در مقاله «آموزش TensorRT و کاربردهای آن» بعد از بررسی تنسورآرتی در قالب یک شبکه عصبی ساده و از منظر توپولوژیکی، به بررسی روش نصب فریم ورک TensorRT بر روی سیستم عامل ‌Ubuntu پرداخته شد. در پایان نیز دوره‌های آموزشی مرتبط معرفی شدند.

بر اساس رای ۱۵ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
roboflowmathworksblog.tensorflow.orgmedium
۱ دیدگاه برای «آموزش TensorRT و کاربردهای آن — راهنمای مقدماتی + آموزش نصب»

عالی بود

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *