HyperAI

تجميع النموذج وتحسينه باستخدام TVMC

特色图像

المحتويات في لمحة:يوضح هذا القسم كيفية تجميع النموذج وتحسينه باستخدام TVMC. TVMC هو برنامج تشغيل الأوامر لـ TVM، والذي ينفذ وظائف TVM من خلال أسطر الأوامر. يشكل هذا القسم الأساس لفهم كيفية عمل TVM.

الكلمات المفتاحية:التعلم الآلي TVMC TVM   

يقدم هذا القسم TVMC، برنامج تشغيل سطر الأوامر لـ TVM. يقوم TVMC بتنفيذ وظائف TVM من خلال واجهة سطر الأوامر(بما في ذلك الضبط التلقائي والتجميع والتحليل وتنفيذ النماذج).

بعد الانتهاء من هذا القسم،يمكن إنجاز المهام التالية باستخدام TVMC:

  •   قم بتجميع نموذج ResNet-50 v2 المدرب مسبقًا لوقت تشغيل TVM.
  •   استخدم النموذج المجمّع للتنبؤ بالصور الحقيقية وشرح الناتج وأداء النموذج.
  •   استخدم TVM لضبط النموذج على وحدة المعالجة المركزية.
  •   قم بإعادة تجميع النموذج المُحسَّن باستخدام بيانات الضبط التي تم جمعها بواسطة TVM.
  •   توقع الصور باستخدام النماذج المحسنة ومقارنة الأداء الناتج والنموذج.

يوفر هذا القسم نظرة عامة على وظائف TVM و TVMC ويضع الأساس لفهم كيفية عمل TVM.

استخدام TVMC

TVMC هو تطبيق Python وجزء من حزمة TVM Python.عند تثبيت TVM باستخدام حزمة Python، ستحصل على تي في إم سي  تطبيق سطر الأوامر لـ . يختلف موقع هذا الأمر حسب المنصة وطريقة التثبيت.

بالإضافة إلى ذلك، إذا مسار $PYTHON  إذا كانت هناك وحدة Python تسمى TVM على ، فيمكنك استخدام وحدة Python القابلة للتنفيذ (مع بايثون -m tvm.driver.tvmc  (الأمر) للوصول إلى وظيفة برنامج تشغيل سطر الأوامر.

يستخدم هذا البرنامج التعليمي تي في إم سي  أو بايثون -m tvm.driver.tvmc  لفتح سطر أوامر TVMC.

استخدم الأمر التالي لعرض صفحة المساعدة:

tvmc --help

تي في إم سي  الوظائف الرئيسية لـ TVM متاحة من خلال الأوامر الفرعية تجميع ، يجري  و لحن . يستخدم tvmc – مساعدة  عرض الخيارات المحددة لأمر فرعي معين.

سوف يقدم هذا البرنامج التعليمي هذه الأوامر. قبل أن تبدأ، قم بتنزيل نموذج مدرب مسبقًا.

احصل على النموذج

في هذا البرنامج التعليمي، سوف نستخدم ResNet-50 v2. ResNet-50 عبارة عن شبكة عصبية ملتوية عميقة مكونة من 50 طبقة لتصنيف الصور.النموذج الذي سنستخدمه بعد ذلك تم تدريبه مسبقًا على أكثر من مليون صورة من 1000 فئة مختلفة. حجم الصورة المدخلة لهذه الشبكة هو 224×224.

أنصح بتنزيل Netron (عارض نماذج التعلم الآلي المجاني) لاستكشاف الهيكل التنظيمي لنموذج ResNet-50 بشكل أكثر عمقًا.

تحميل برنامج نيترون: https://netron.app/

يستخدم هذا البرنامج التعليمي النموذج بتنسيق ONNX:

wget https://github.com/onnx/models/raw/b9a54e89508f101a1611cd64f4ef56b9cb62c7cf/vision/classification/resnet/model/resnet50-v2-7.onnx

نصائح 1 تنسيقات النماذج المدعومة: 

يدعم TVMC النماذج التي تم إنشاؤها باستخدام Keras، وONNX، وTensorFlow، وTFLite، وTorch. متاح --تنسيق النموذج  يشير الخيار إلى تنسيق النموذج المستخدم. ينفذ tvmc compile – مساعدة  لمزيد من المعلومات.

 نصائح 2: إضافة دعم ONNX إلى TVM: 

يعتمد TVM على مكتبة ONNX Python المتوفرة على نظامك. قم بتثبيت ONNX باستخدام pip3 install –user onnx onnxoptimizer . إذا كان لديك حق الوصول إلى الجذر وترغب في تثبيت ONNX عالميًا، فيمكنك إزالة خيار –user. تعتبر تبعية onnxoptimizer اختيارية ومطلوبة فقط لـ onnx>=1.9.

تجميع نموذج ONNX إلى وقت تشغيل TVM

بعد تنزيل نموذج ResNet-50، استخدم تجميع tvmc  قم بتجميعها. إن مخرجات التجميع عبارة عن أرشيف TAR للنموذج (تم تجميعه في مكتبة ديناميكية لمنصة الهدف). استخدم وقت تشغيل TVM لتشغيل النموذج على الجهاز المستهدف:

# 大概需要几分钟,取决于设备 
tvmc compile \
--target "llvm" \
--input-shapes "data:[1,3,224,224]" \
--output resnet50-v2-7-tvm.tar \
resnet50-v2-7.onnx

يفحص تجميع tvmc  الملفات التي تم إنشاؤها في الوحدة النمطية:

mkdir model
tar -xvf resnet50-v2-7-tvm.tar -C model
ls model

هناك ثلاثة ملفات بعد فك الضغط:

mod.so  إنه نموذج يمكن تحميله بواسطة وقت تشغيل TVM، ويمثله مكتبة C++.

mod.json  إنه تمثيل نصي لرسم حساب TVM Relay.

mod.params  هو ملف يحتوي على معلمات النموذج المدربة مسبقًا.

يمكن تحميل الوحدات النمطية مباشرة بواسطة التطبيقات، بينما يمكن تشغيل النماذج من خلال واجهة برمجة تطبيقات وقت تشغيل TVM.

النصيحة 3: حدد الهدف الصحيح:

حدد الهدف الصحيح (الخيار --هدف ) يمكن أن تعمل على تحسين أداء الوحدات المترجمة بشكل كبير لأنها يمكن أن تستفيد من ميزات الأجهزة المتوفرة على الهدف. راجع ضبط الشبكات التلافيفية تلقائيًا لوحدات المعالجة المركزية x86 للحصول على مزيد من المعلومات. يوصى بتحديد طراز وحدة المعالجة المركزية والميزات الاختيارية التي يجب استخدامها، ثم تعيين الهدف بشكل مناسب.

تشغيل النماذج من الوحدات النمطية المترجمة باستخدام TVMC

بعد تجميع النموذج في وحدة نمطية، يمكنك استخدام وقت تشغيل TVM للتنبؤ به. يحتوي TVMC على وقت تشغيل TVM مدمج، مما يسمح بتشغيل نماذج TVM المترجمة.

لتشغيل نموذج وإجراء تنبؤات باستخدام TVMC، تحتاج إلى:

  •   تم إنشاء الوحدة المترجمة للتو.
  •   مدخلات صالحة للنموذج المستخدم للتنبؤ.

يختلف شكل وتنسيق ونوع بيانات الموتر بين النماذج.لذلك، تتطلب معظم النماذج المعالجة المسبقة والمعالجة اللاحقة للتأكد من أن المدخلات صالحة ويمكن تفسير المخرجات. TVMC يستخدم NumPy .npz  تنسيق الإدخال والإخراج، والذي يدعم بشكل جيد تسلسل مجموعات متعددة في ملف واحد.

الصورة المدخلة المستخدمة في هذا البرنامج التعليمي هي صورة قطة، ولكن يمكنك اختيار صور أخرى حسب رغبتك.

معالجة الإدخال المسبقة

يجب أن يكون الإدخال إلى نموذج ResNet-50 v2 بتنسيق ImageNet. فيما يلي مثال لنص برمجي لمعالجة صورة مسبقًا باستخدام ResNet-50 v2.

الاستخدام الأول تثبيت pip3 – وسادة المستخدم  قم بتنزيل مكتبة التصوير الخاصة بـ Python لتلبية اعتماد البرنامج النصي على مكتبة التصوير.

#!python ./preprocess.py
from tvm.contrib.download import download_testdata
from PIL import Image
import numpy as np

img_url = "https://s3.amazonaws.com/model-server/inputs/kitten.jpg"
img_path = download_testdata(img_url, "imagenet_cat.png", module="data")

# 重设大小为 224x224
resized_image = Image.open(img_path).resize((224, 224))
img_data = np.asarray(resized_image).astype("float32")

# ONNX 需要 NCHW 输入, 因此对数组进行转换
img_data = np.transpose(img_data, (2, 0, 1))

# 根据 ImageNet 进行标准化
imagenet_mean = np.array([0.485, 0.456, 0.406])
imagenet_stddev = np.array([0.229, 0.224, 0.225])
norm_img_data = np.zeros(img_data.shape).astype("float32")
for i in range(img_data.shape[0]):
norm_img_data[i, :, :] = (img_data[i, :, :] / 255 - imagenet_mean[i]) / imagenet_stddev[i]

# 添加 batch 维度
img_data = np.expand_dims(norm_img_data, axis=0)

# 保存为 .npz(输出 imagenet_cat.npz)
np.savez("imagenet_cat", data=img_data)

تشغيل الوحدة النمطية المترجمة

باستخدام النموذج وبيانات الإدخال، دعنا نقوم بتشغيل TVMC للتوصل إلى التوقعات:

tvmc run \
--inputs imagenet_cat.npz \
--output predictions.npz \
resnet50-v2-7-tvm.tar

.قطران  يتضمن ملف النموذج مكتبة C++، وملف وصف لنموذج Relay، وملف معلمات للنموذج. يتضمن TVMC وقت تشغيل TVM (الذي يمكنه تحميل النماذج وإجراء تنبؤات على المدخلات). قم بتشغيل الأمر أعلاه، وسوف يقوم TVMC بإخراج ملف جديد التنبؤات.npz، والذي يحتوي على مخرجات النموذج بتنسيق NumPy.

في هذا المثال، يتم تجميع النموذج على نفس الجهاز الذي يقوم بتشغيله. في بعض الحالات قد يكون من الممكن تشغيله عن بعد باستخدام RPC Tracker. يفحص تشغيل tvmc – مساعدة  لتعلم المزيد عن هذه الخيارات.

معالجة ما بعد الإخراج

كما ذكرنا سابقًا، يوفر كل نموذج مخرجات موتر مختلفة.

في هذا المثال، نحتاج إلى تشغيل بعض عمليات المعالجة اللاحقة لجعل إخراج ResNet-50 v2 في نموذج أكثر قابلية للقراءة باستخدام جدول البحث المقدم لهذا النموذج.

النص التالي هو مثال لمرحلة ما بعد المعالجة يستخرج العلامات من مخرجات الوحدة المترجمة:

#!python ./postprocess.py
import os.path
import numpy as np

from scipy.special import softmax

from tvm.contrib.download import download_testdata

# 下载标签列表
labels_url = "https://s3.amazonaws.com/onnx-model-zoo/synset.txt"
labels_path = download_testdata(labels_url, "synset.txt", module="data")

with open(labels_path, "r") as f:
labels = [l.rstrip() for l in f]

output_file = "predictions.npz"

# 打开并读入输出张量
if os.path.exists(output_file):
with np.load(output_file) as data:
scores = softmax(data["output_0"])
scores = np.squeeze(scores)
ranks = np.argsort(scores)[::-1]

for rank in ranks[0:5]:
print("class='%s' with probability=%f" % (labels[rank], scores[rank]))

إن مخرجات تشغيل هذا البرنامج النصي هي كما يلي:

python postprocess.py
# class='n02123045 tabby, tabby cat' with probability=0.610553
# class='n02123159 tiger cat' with probability=0.367179
# class='n02124075 Egyptian cat' with probability=0.019365
# class='n02129604 tiger, Panthera tigris' with probability=0.001273
# class='n04040759 radiator' with probability=0.000261

استبدل صورة القطة أعلاه بصور أخرى وشاهد ما هي التوقعات التي يقدمها نموذج ResNet.

ضبط نموذج ResNet تلقائيًا

تم تجميع النماذج السابقة لتشغيلها على وقت تشغيل TVM وبالتالي لم تحتوي على تحسينات خاصة بالمنصة.سيقدم هذا القسم كيفية استخدام TVMC لبناء نموذج تحسين لمنصة العمل.

عند التفكير باستخدام الوحدات النمطية المترجمة، قد لا تحصل دائمًا على الأداء المتوقع.في هذه الحالة، يمكن استخدام الموالف التلقائي لتكوين النموذج بشكل أفضل وبالتالي تحسين الأداء.. إن ضبط TVM يعني تحسين النموذج على هدف معين لجعله يعمل بشكل أسرع. على عكس التدريب أو الضبط الدقيق، فإنه لا يؤثر على دقة النموذج، بل يؤثر فقط على أداء وقت التشغيل.

كجزء من عملية الضبط،تقوم TVM بتنفيذ وتشغيل العديد من المتغيرات من المشغلين المختلفين لمعرفة أيهم يعمل بشكل أفضل.يتم تخزين نتائج هذه العمليات في ملف سجل الضبط (الإخراج النهائي لأمر الضبط).

يجب أن يتضمن الضبط على الأقل:

  •   متطلبات النظام الأساسي للأجهزة المستهدفة التي تعمل بهذا الطراز
  •   المسار إلى ملف الإخراج حيث يتم تخزين سجلات الضبط
  •   المسار إلى النموذج للضبط.

يوضح المثال التالي سير العمل الخاص به:

# 默认搜索算法需要 xgboost,有关调优搜索算法的详细信息,参见下文 
pip install xgboost

tvmc tune \
--target "llvm" \
--output resnet50-v2-7-autotuner_records.json \
resnet50-v2-7.onnx

في هذه الحالة، --هدف  عندما تحدد هدفًا أكثر تحديدًا باستخدام العلم، ستحصل على نتائج أفضل. على سبيل المثال، على معالج Intel i7، يمكنك استخدام –target llvm -mcpu=skylake . يستخدم مثال الضبط هذا LLVM كمترجم لهندسة معمارية محددة، وينفذ ضبطًا أصليًا على وحدة المعالجة المركزية.

يقوم TVMC بالبحث في مساحة المعلمات الخاصة بالنموذج، ويحاول تكوينات مختلفة للمشغلين، ثم يختار التكوين الذي يعمل بشكل أسرع على المنصة. على الرغم من أن هذا بحث موجه يعتمد على عمليات وحدة المعالجة المركزية والنموذج، إلا أنه لا يزال يستغرق عدة ساعات لإكمال البحث. سيتم حفظ نتائج البحث في resnet50-v2-7-autotuner_records.json  الملف، والذي يتم استخدامه بعد ذلك لتجميع النموذج الأمثل.

نصائح 4: تحديد وضبط خوارزمية البحث:

تستخدم خوارزمية البحث هذه الإعداد الافتراضي شبكة XGBoost  دليل الخوارزمية. اعتمادًا على تعقيد النموذج والوقت المتاح، يمكن اختيار خوارزميات مختلفة. يمكن الاطلاع على القائمة الكاملة لحن tvmc – مساعدة .

بالنسبة لوحدة المعالجة المركزية Skylake للمستهلك، يكون الناتج هو:

تجميع النموذج وتحسينه باستخدام بيانات الضبط

من ملف الإخراج لعملية الضبط أعلاه `resnet50-v2-7-autotuner_records.json  يمكنك الحصول على سجلات الضبط.

يمكن استخدام هذا الملف لـ:

  •   كمدخل لمزيد من الضبط (عبر لحن tvmc – تسجيلات ضبط )
  •   كمدخلات للمترجم

ينفذ tvmc compile –tuning-cords  يخبر الأمر المترجم باستخدام هذه النتيجة لإنشاء كود عالي الأداء للنموذج على الهدف المحدد. يفحص tvmc compile – مساعدة  لمزيد من المعلومات.

بعد جمع بيانات ضبط النموذج، يمكن إعادة تجميع النموذج باستخدام مشغلين محسّنين لتسريع الحساب.

tvmc compile \
--target "llvm" \
--tuning-records resnet50-v2-7-autotuner_records.json \
--output resnet50-v2-7-tvm_autotuned.tar \
resnet50-v2-7.onnx

تأكد من تشغيل نموذج التحسين وإنتاج نفس النتائج:

tvmc run \
--inputs imagenet_cat.npz \
--output predictions.npz \
resnet50-v2-7-tvm_autotuned.tar

python postprocess.py

تأكد من أن القيم المتوقعة هي نفسها:

# class='n02123045 tabby, tabby cat' with probability=0.610550
# class='n02123159 tiger cat' with probability=0.367181
# class='n02124075 Egyptian cat' with probability=0.019365
# class='n02129604 tiger, Panthera tigris' with probability=0.001273
# class='n04040759 radiator' with probability=0.000261

مقارنة النماذج المضبوطة وغير المضبوطة

توفر TVMC أدوات تقييم الأداء الأساسية بين النماذج.يمكنك تحديد عدد التكرارات وكذلك الوقت الذي يجب تشغيل نموذج تقرير TVMC فيه (بغض النظر عن بدء التشغيل في وقت التشغيل). يمكنك الحصول على فكرة تقريبية عن مدى تحسن أداء النموذج من خلال الضبط.

على سبيل المثال، عند اختباره على نظام Intel i7، يعمل الطراز المضبوط بسرعة 47% أسرع من الطراز غير المضبوط:

tvmc run \
--inputs imagenet_cat.npz \
--output predictions.npz \
--print-time \
--repeat 100 \
resnet50-v2-7-tvm_autotuned.tar

# Execution time summary:
# mean (ms) max (ms) min (ms) std (ms)
# 92.19 115.73 89.85 3.15

tvmc run \
--inputs imagenet_cat.npz \
--output predictions.npz \
--print-time \
--repeat 100 \
resnet50-v2-7-tvm.tar

# Execution time summary:
# mean (ms) max (ms) min (ms) std (ms)
# 193.32 219.97 185.04 7.11

الكلمات الأخيرة

يقدم هذا البرنامج التعليمي TVMC، برنامج تشغيل سطر الأوامر لـ TVM.ويوضح كيفية تجميع النماذج وتشغيلها وضبطها، ويناقش الحاجة إلى المعالجة المسبقة واللاحقة للمدخلات والمخرجات.بعد الضبط، أظهر كيفية مقارنة أداء النماذج غير المحسنة والمحسنة.

يُظهر هذا المستند مثالاً بسيطًا لاستخدام ResNet-50 v2 محليًا. ومع ذلك، يدعم TVMC المزيد من الميزات، بما في ذلك التجميع المتبادل، والتنفيذ عن بعد، والتحليل/التحليل المعياري.

يستخدم tvmc – مساعدة  أمر لرؤية الخيارات الأخرى المتاحة.

سيقدم البرنامج التعليمي التالي، تجميع نموذج وتحسينه باستخدام واجهة Python، نفس خطوات التجميع والتحسين باستخدام واجهة Python.

استمر بالمتابعة، لا تفوتها~