HyperAIHyperAI

Command Palette

Search for a command to run...

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

Featured Image

**المحتويات في لمحة:**يوضح هذا القسم كيفية تجميع النموذج وتحسينه باستخدام 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.

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