آموزش PyTorch برای مبتدیان – استنباط مدل با ONNX و Caffe2

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

با این حال ، در بحث پیاده سازی و تولید ، TensorFlow گوگل ، سابقه بیشتری دارد. با استفاده از  TensorFlow Serving استقرار و نصب مدل های یادگیری ماشین بسیار ساده بود.

اما در ماه مه  ۲۰۱۸ ، هنگامی که PyTorch با Caffe2 ادغام شد و خط لوله ( Pipeline ) خود را راه اندازی کرد، شرایط تغییر کرد. این همان خط لوله مورد استفاده در فیسبوک است. آن ها این مدل را با استفاده از PyTorch آموزش می دهند و با استفاده از Caffe2 آن را مستقر می کنند.

توجه : Caffe2 را نباید با Caffe اشتباه گرفت، چراکه آن ها دو چارچوب کاملاً متفاوت هستند. Caffe تا پنج سال پیش بسیار مورد توجه بود، اما اکنون به نظر می رسد مجبوبیت چندانی نداشته باشد.

خط لوله یادگیری عمیق Facebook

” حرکت سریع برای شکستن مرز ها “

شعار فیسبوک

سرعت کار بالای توسعه دهندگان و مهندسان در انجام عملیات ، مستلزم داشتن یک چارچوب توسعه آسان به زبانی است که کارکردن با آن آسان باشد. که PyTorch این امکان را به کاربر می دهد.

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

Caffe2 که در آوریل ۲۰۱۷ توسط فیسبوک معرفی شد، یک مدل چند منظوره است که می تواند در بسیاری از پلتفرم ها ، از جمله تلفن های همراه ، بکار گرفته شود. برنامه های فیسبوک در Caffe2 در بیش از یک میلیارد تلفن همراه iOS و Android نصب شده است.

فیسبوک ، تعامل بین PyTorch و Caffe2 را برقرار می کند. اخیرا در ماه مه ۲۰۱۹ ، با انتشار PyTorch 1.1 پشتیبان TensorBoard اضافه شد که برای مجسم سازی و اشکال زدایی بسیار مناسب است.

تبادل شبکه عصبی آزاد (ONNX)

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

برای استقرار مدل های PyTorch ، متداول ترین روش تبدیل آن ها به فرمت ONNX و سپس بکارگیری مدل ONNX صادر شده با استفاده از Caffe2 است.

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

ما یک فایل محیطی در اختیار شما قرار می دهیم تا بتوانید به راحتی محیط مجازی خود را بسازید، همچنین یک نوت بوک Jupyter در اختیار شما قرار می دهیم تا بتوانید نتایج خود را ببینید و از این کد برای استنباط در پروژه های خودتان استفاده کنید. ما همچنین با استفاده از مدل PyTorch و مدل ONNX ، شباهت ها و تفاوت های نتایج استنباطی را بررسی خواهیم کرد.

برای این کار از PyTorch 1.1.0 و ONNX 1.5.0 با Python3.7 استفاده می کنیم.

تنظیمات محیط

شما باید conda را در سیستم خود نصب کرده و با اجرای دستور زیر محیط مجازی خود را تنظیم می کنیم.

conda env create -f environment.yml

با این کار، بسته های مورد نیاز در یک محیط مجازی به نام pytorch_inference نصب می شوند. سپس آن را با دستور زیر فعال می کنیم.

conda activate pytorch_inference

می توانید مدل Pytorch که با آن کار خواهیم کرد را از اینجا دانلود کنید. این مدل با استفاده از PyTorch 1.1.0 آموزش داده شده است، و محیط مجازی فعلی ما برای استنباط نیز دارای PyTorch 1.1.0 است. حالا می توانیم نوت بوک را برای تبدیل مدل PyTorch به ONNX اجرا کنیم و با استفاده از مدل ONNX در Caffe2 استنباط کنیم.

PyTorch به ONNX

بیایید ببینیم که چگونه مدل.pt پایتورچ را به ONNX صادر کنیم. در زیر قطعه کدی برای انجام این کار آورده شده است.

# Export an ONNX model from a PyTorch .pt model

import torch.onnx

# Loading the input PyTorch model and mapping the tensors to CPU
device = torch.device('cpu')
model = torch.load('animals_caltech.pt', map_location=device)

# Generate a dummy input that is consistent with the network's arhitecture
dummy_input = torch.randn(1, 3, 224, 224)

# Export into an ONNX model using the PyTorch model and the dummy input
torch.onnx.export(model, dummy_input, "animals_caltech.onnx")

از آنجا که ما این استنتاج را با استفاده از Caffe2 در CPU انجام می دهیم، دستگاه را به ” cpu ”  تنظیم کرده و مدل PyTorch را با استفاده از تنظیم سنسورها روی CPU بارگذاری می کنیم. سپس باید یک ورودی ساختگی ایجاد کنیم که متناسب با ورودی ساختار شبکه باشد. در نهایت تابع صدور یک تابع خطی است شامل مدل PyTorch، ورودی ساختگی و فایل ONNX .

توجه داشته باشید که برای نصب Caffe2 ، در حال حاضر باینری های پیش ساخته و بدون پشتیبانی CUDA برای Mac ، Ubuntu و CentOS در دسترس هستند. سایر پلتفرم ها یا پشتیبانی از CUDA نیاز به کامپایل از منبع دارند. در این کار، ما استنباط CPU را در MacOS Mojave و Ubuntu 18.04 امتحان کرده ایم. اگر می خواهید از مدل های ONNX خود با CUDA استفاده کنید ، باید Caffe2 را با توجه به مرجع بسازید.

استنباط در Caffe2 با استفاده از ONNX

در مرحله بعد، اکنون می توانیم مدل ONNX خود را در دستگاه های مختلف مستقر کرده و در Caffe2 استنباط کنیم.

ابتدا اطمینان حاصل کنید که برای اجرای مدل ONNX با Caffe2 محیط موردنظر ما را ایجاد کرده اید و می توانید caffe2.python.onnx.backend را وارد کنید. در مرحله بعدی می توانید مدل ONNX ما را از اینجا دانلود کنید. با استفاده از PyTorch 1.1.0 صادر می شود. یا اگر می توانید مدل ONNX خود را با موفقیت صادر کنید، در صورت تمایل از آن استفاده کنید. سپس کد زیر را برای انجام استنباط اجرا می کنیم.

# Inference in Caffe2 using the ONNX model
import caffe2.python.onnx.backend as backend
import onnx

# First load the onnx model
model = onnx.load("animals_caltech.onnx")

# Prepare the backend
rep = backend.prepare(model, device="CPU")

# Transform the image
transform = transforms.Compose([
        transforms.Resize(size=224),
        transforms.CenterCrop(size=224),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406],
                             [۰٫۲۲۹, ۰٫۲۲۴, ۰٫۲۲۵])
    ])

# Load and show the image
test_image_name = "giraffe.jpg"
test_image = Image.open(test_image_name)
display(test_image)

# Apply the transformations to the input image and convert it into a tensor
test_image_tensor = transform(test_image)

# Make the input image ready to be input as a batch of size 1
test_image_tensor = test_image_tensor.view(1, 3, 224, 224)

# Convert the tensor to numpy array
np_image = test_image_tensor.numpy()

# Pass the numpy array to run through the ONNX model
outputs = rep.run(np_image.astype(np.float32))

# Dictionary with class name and index
idx_to_class = {0: 'bear', 1: 'chimp', 2: 'giraffe', 3: 'gorilla', 4: 'llama', 5: 'ostrich', 6: 'porcupine', 7: 'skunk', 8: 'triceratops', 9: 'zebra'}

ps = torch.exp(torch.from_numpy(outputs[0]))
topk, topclass = ps.topk(10, dim=1)
for i in range(10):
    print("Prediction", '{:2d}'.format(i+1), ":", '{:11}'.format(idx_to_class[topclass.cpu().numpy()[0][i]]), ", Class Id : ", topclass[0][i].numpy(), " Score: ", topk.cpu().detach().numpy()[0][i])

ما مدل ONNX را بارگذاری کرده و آن را به همراه اطلاعات دستگاه به Caffe2 منتقل می کنیم. از آنجا که ما هنگام ساخت مدل ONNX آن را برای CPU صادر کردیم، لذا باید آن روی CPU تنظیم کنیم.

سپس می توانیم تصویر آزمایشی ورودی را بخوانیم ، اندازه آن را به کوچکتر ۲۲۴ تغییر می دهیم و نسبت تصویر هنگام تغییر اندازه را نگه می داریم. مرکز تصویر به ابعاد ۲۲۴ × ۲۲۴ برش داده شده و به یک تنسور تبدیل می شود. این مرحله مقادیر را به محدوده ۰-۱ تبدیل می کند. سپس با میانگین و انحراف معیار ImageNet نسبت به کانال رنگی ImageNet نرمال می شود. بدین صورت

input [channel] = (input [channel] – mean [channel]) / std [channel]

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

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

امتیازات مربوط به هر ۱۰ کلاس را به صورت نزولی چاپ می کنیم ، بدین ترتیب می توانیم امتیازات محاسبه شده در حین استنباط با مدل PyTorch (همانطور که در پست قبلی به آن پرداختیم) را با امتیازات محاسبه شده از استنباط با مدل ONNX در Caffe2 ، مقایسه کنیم.

تصویر زرافه ها برای کلاسه بندی در PyTorch

در اینجا نتایج استنباط در PyTorch با استفاده از مدل pt. پایتورچ و استنباط در Caffe2 با استفاده از مدل onnx. آورده شده است :

شماره پیش بینیکلاس پیش بینی امتیاز مدل pt.امتیاز مدل onnx.
1Giraffe0.99414070.99414057
2Ostrich0.00345403260.0034540326
3Zebra0.00134248220.0013424809
4Llama0.000867224360.00086722267
5Bear7.583614e-057.583578e-05
6Triceratops6.406967e-056.4069485e-05
7Porcupine1.9247866e-051.9247791e-05
8Gorilla1.8487663e-051.8487592e-05
9Chimp1.6452992e-051.6452961e-05
10Skunk1.5678854e-061.5678779e-06

همانطور که در بالا ملاحظه می کنید، امتیازات دو مدل با اختلاف عددی ناچیز بسیار نزدیک است.

زمان استنباط در CPU

مدل های ONNX به طور گسترده در برنامه Caffe2 در برنامه های تلفن همراه و مقیاس بزرگ مثل فیسبوک و همچنین سایر شرکت ها به کار گرفته شده است. در طول سال گذشته، تیم PyTorch در تلاش بوده تا مزایای تولید و عملکرد Caffe2 را به PyTorch ارائه دهد.

به عنوان یک آزمایش ، ما زمان استنباط را روی ۴۰۷ تصویر آزمایشی در دو سناریو مختلف اندازه گیری کردیم.

  • حالت ۱: استنباط با استفاده از مدل PyTorch 1.1.0 .pt در PyTorch 1.1.0
  • مورد ۲: استنباط با استفاده از مدل های صادر شده ONNX در Caffe2

هر دو آزمایش فوق در Ubuntu 18.04 و روی CPU اجرا شد.

میانگین زمان استنباط تصویر روی ۴۰۷ تصویر آزمایشی با استفاده از مدل PyTorch 1.1.0  معادل ۰٫۱۷۳ ثانیه و با استفاده از مدل ONNX در Caffe2 معادل ۰٫۱۳۱ ثانیه بوده است. بنابراین با وجود اینکه Caffe2 در حال حاضر قابلیت های استقرار متقابل پلتفرم و عملکرد بالا را اثبات کرده است، اما PyTorch از نظر عملکرد، به تدریج در حال نزدیک شدن به Caffe2 است.

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

بیشتر بخوانید :

منبع Learn OpenCV

درباره‌ی امیر اقتدائی

همچنین ببینید

آیا می خواهید در زمینه یادگیری ماشین استخدام شوید؟

آیا می خواهید در زمینه یادگیری ماشین استخدام شوید؟

مسیر های شغلی زیادی در حوزه یادگیری ماشین وجود دارد، اما از کجا بفهمیم که …

دیدگاهتان را بنویسید

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