ما هي النماذج التي تستخدمها ، أو تأمل في استخدامها ، مع Tensorrt؟ لا تتردد في الانضمام إلى المناقشة هنا.
Torch2trt هو Pytorch to Tensorrt الذي يستخدم API Tensorrt Python. المحول هو
سهل الاستخدام - تحويل الوحدات النمطية باستخدام وظيفة استدعاء وظيفة واحدة torch2trt
من السهل تمديده - اكتب محول الطبقة الخاصة بك في Python وتسجيله باستخدام @tensorrt_converter
إذا وجدت مشكلة ، فيرجى إخبارنا!
يرجى ملاحظة أن هذا المحول لديه تغطية محدودة لـ Tensorrt / Pytorch. لقد أنشأناها بشكل أساسي لتحسين النماذج المستخدمة بسهولة في مشروع JetBot. إذا وجدت المحول مفيدًا مع الطرز الأخرى ، فيرجى إخبارنا بذلك.
فيما يلي بعض أمثلة الاستخدام ، لمزيد من الراجع من دفاتر الملاحظات.
import torch
from torch2trt import torch2trt
from torchvision . models . alexnet import alexnet
# create some regular pytorch model...
model = alexnet ( pretrained = True ). eval (). cuda ()
# create example data
x = torch . ones (( 1 , 3 , 224 , 224 )). cuda ()
# convert to TensorRT feeding sample data as input
model_trt = torch2trt ( model , [ x ]) يمكننا تنفيذ TRTModule المرتجعة تمامًا مثل نموذج Pytorch الأصلي
y = model ( x )
y_trt = model_trt ( x )
# check the output against PyTorch
print ( torch . max ( torch . abs ( y - y_trt ))) يمكننا حفظ النموذج باعتباره state_dict .
torch . save ( model_trt . state_dict (), 'alexnet_trt.pth' ) يمكننا تحميل النموذج المحفوظ في TRTModule
from torch2trt import TRTModule
model_trt = TRTModule ()
model_trt . load_state_dict ( torch . load ( 'alexnet_trt.pth' ))اختبرنا المحول مقابل هذه النماذج باستخدام البرنامج النصي test.sh. يمكنك إنشاء النتائج عن طريق الاتصال
./test.sh TEST_OUTPUT.mdتظهر النتائج أدناه الإنتاجية في FPS. يمكنك العثور على الإخراج الخام ، والذي يتضمن الكمون ، في مجلد المعايير.
| نموذج | نانو (بيتورش) | نانو (Tensorrt) | كزافييه (Pytorch) | كزافييه (Tensorrt) |
|---|---|---|---|---|
| اليكسنيت | 46.4 | 69.9 | 250 | 580 |
| Squeezenet1_0 | 44 | 137 | 130 | 890 |
| Squeezenet1_1 | 76.6 | 248 | 132 | 1390 |
| RESNET18 | 29.4 | 90.2 | 140 | 712 |
| resnet34 | 15.5 | 50.7 | 79.2 | 393 |
| RESNET50 | 12.4 | 34.2 | 55.5 | 312 |
| RESNET101 | 7.18 | 19.9 | 28.5 | 170 |
| RESNET152 | 4.96 | 14.1 | 18.9 | 121 |
| Densenet121 | 11.5 | 41.9 | 23.0 | 168 |
| Densenet169 | 8.25 | 33.2 | 16.3 | 118 |
| Densenet201 | 6.84 | 25.4 | 13.3 | 90.9 |
| Densenet161 | 4.71 | 15.6 | 17.2 | 82.4 |
| VGG11 | 8.9 | 18.3 | 85.2 | 201 |
| VGG13 | 6.53 | 14.7 | 71.9 | 166 |
| VGG16 | 5.09 | 11.9 | 61.7 | 139 |
| VGG19 | 54.1 | 121 | ||
| VGG11_BN | 8.74 | 18.4 | 81.8 | 201 |
| VGG13_BN | 6.31 | 14.8 | 68.0 | 166 |
| VGG16_BN | 4.96 | 12.0 | 58.5 | 140 |
| VGG19_BN | 51.4 | 121 |
ملاحظة: يعتمد Torch2Trt على API Tensorrt Python. على Jetson ، يتم تضمين هذا مع أحدث Jetpack. لسطح المكتب ، يرجى اتباع دليل تثبيت Tensorrt. يمكنك أيضًا محاولة تثبيت Torch2trt داخل إحدى حاويات NGC Pytorch Docker لسطح المكتب أو Jetson.
لتثبيت مكتبة Torch2trt Python ، اتصل بما يلي
git clone https://github.com/NVIDIA-AI-IOT/torch2trt
cd torch2trt
python setup.py installلتثبيت مكتبة Torch2Trt Plugins ، اتصل بما يلي
cmake -B build . && cmake --build build --target install && ldconfigيتضمن ذلك دعمًا لبعض الطبقات التي قد لا يتم دعمها أصليًا بواسطة Tensorrt. بمجرد العثور على هذه المكتبة في النظام ، يتم تمكين محولات الطبقة المرتبطة في Torch2Trt ضمنيًا.
ملاحظة: يحافظ Torch2Trt الآن على المكونات الإضافية كمكتبة مستقلة تم تجميعها مع CMake. وهذا يجعل محركات Tensorrt المترجمة أكثر محمولة. إذا لزم الأمر ، فقد لا يزال يتم تثبيت المكونات الإضافية التي تم إهمالها (والتي تعتمد على Pytorch) عن طريق استدعاء
python setup.py install --plugins.
لتثبيت Torch2Trt مع ميزات المجتمع التجريبي المساهمة تحت torch2trt.contrib ، مثل التدريب على Quality Aware (Qat) ( requires TensorRT>=7.0 ) ، اتصل بما يلي ،
git clone https://github.com/NVIDIA-AI-IOT/torch2trt
cd torch2trt/scripts
bash build_contrib.sh يمكّنك ذلك من تشغيل مثال QAT الموجود هنا.
يعمل هذا المحول عن طريق ربط وظائف التحويل (مثل convert_ReLU ) بالمكالمات الوظيفية Pytorch الأصلية (مثل torch.nn.ReLU.forward ). يتم تمرير بيانات إدخال العينة عبر الشبكة ، تمامًا كما كان من قبل ، باستثناء الآن عندما يتم مواجهة وظيفة مسجلة ( torch.nn.ReLU.forward ) ، يتم استدعاء المحول المقابل ( convert_ReLU ) بعد ذلك. يتم تمرير المحول للوسائط وبيان الإرجاع لوظيفة Pytorch الأصلية ، وكذلك شبكة Tensorrt التي يتم بناؤها. يتم تعديل موتر الإدخال إلى وظيفة Pytorch الأصلية للحصول على سمة _trt ، وهي نظير Tensorrt إلى Tensor Pytorch. تستخدم وظيفة التحويل هذا _trt لإضافة طبقات إلى شبكة Tensorrt ، ثم تقوم بتعيين سمة _trt لمترات الإخراج ذات الصلة. بمجرد تنفيذ النموذج بالكامل ، يتم تمييز عائدات الموترات النهائية كمخرجات لشبكة Tensorrt ، وتم بناء محرك Tensorrt المحسن.
نعرض هنا كيفية إضافة محول لوحدة ReLU باستخدام API Tensorrt Python.
import tensorrt as trt
from torch2trt import tensorrt_converter
@ tensorrt_converter ( 'torch.nn.ReLU.forward' )
def convert_ReLU ( ctx ):
input = ctx . method_args [ 1 ]
output = ctx . method_return
layer = ctx . network . add_activation ( input = input . _trt , type = trt . ActivationType . RELU )
output . _trt = layer . get_output ( 0 ) يأخذ المحول وسيطة واحدة ، وهو ConversionContext ، والذي سيحتوي على ما يلي
ctx.network - شبكة tensorrt التي يتم بناؤها.
ctx.method_args - الوسائط الموضعية التي تم تمريرها إلى وظيفة pytorch المحددة. تم تعيين سمة _trt لمترات الإدخال ذات الصلة.
ctx.method_kwargs - وسيطات الكلمات الرئيسية التي تم تمريرها إلى وظيفة pytorch المحددة.
ctx.method_return - القيمة التي يتم إرجاعها بواسطة وظيفة pytorch المحددة. يجب أن يقوم المحول بتعيين سمة _trt حيث ذات صلة.
يرجى الاطلاع على هذا المجلد لمزيد من الأمثلة.
Jetbot - روبوت منظمة العفو الدولية التعليمية على أساس Nvidia Jetson Nano
Jetracer - سيارة سباق AI التعليمية باستخدام Nvidia Jetson Nano
Jetcam - واجهة كاميرا Python سهلة الاستخدام لـ Nvidia Jetson
JetCard - صورة بطاقة SD لمشاريع AI برمجة الويب مع Nvidia Jetson Nano