Kompilieren Und Optimieren Sie Das Modell Mit TVMC

Inhalte im Überblick:In diesem Abschnitt wird erläutert, wie das Modell mit TVMC kompiliert und optimiert wird. TVMC ist der Befehlstreiber von TVM, der TVM-Funktionen über Befehlszeilen ausführt. Dieser Abschnitt bildet die Grundlage zum Verständnis der Funktionsweise von TVM.
Schlüsselwörter:TVMC TVM Maschinelles Lernen
Dieser Abschnitt stellt TVMC vor, den Befehlszeilentreiber für TVM. TVMC führt TVM-Funktionen über die Befehlszeilenschnittstelle aus(Einschließlich automatischer Abstimmung, Kompilierung, Analyse und Ausführung von Modellen).
Nachdem Sie diesen Abschnitt abgeschlossen haben,Mit TVMC können folgende Aufgaben erledigt werden:
- Kompilieren Sie das vortrainierte ResNet-50 v2-Modell für die TVM-Laufzeit.
- Verwenden Sie das kompilierte Modell, um reale Bilder vorherzusagen und die Ausgabe und Modellleistung zu erklären.
- Verwenden Sie TVM, um das Modell auf der CPU zu optimieren.
- Kompilieren Sie das optimierte Modell mithilfe der von TVM gesammelten Tuningdaten neu.
- Sagen Sie Bilder mithilfe der optimierten Modelle voraus und vergleichen Sie die Ausgabe und die Modellleistung.
Dieser Abschnitt bietet einen Überblick über die Funktionen von TVM und TVMC und legt die Grundlage für das Verständnis der Funktionsweise von TVM.
Verwenden von TVMC
TVMC ist eine Python-Anwendung und Teil des TVM-Python-Pakets.Wenn Sie TVM mit dem Python-Paket installieren, erhalten Sie eine tvmc Befehlszeilen-Anwendung für . Der Speicherort dieses Befehls variiert je nach Plattform und Installationsmethode.
Darüber hinaus, wenn $PYTHONPATH Wenn es ein Python-Modul namens TVM auf dem gibt, können Sie das ausführbare Python-Modul verwenden (mit python -m tvm.driver.tvmc Befehl), um auf die Befehlszeilentreiberfunktionalität zuzugreifen.
Dieses Tutorial verwendet tvmc oder python -m tvm.driver.tvmc um die TVMC-Befehlszeile zu öffnen.
Verwenden Sie den folgenden Befehl, um die Hilfeseite anzuzeigen:
tvmc --help
tvmc Die Hauptfunktionen von TVM sind über Unterbefehle verfügbar kompilieren , laufen Und Melodie . verwenden tvmc –Hilfe Zeigen Sie die spezifischen Optionen für einen bestimmten Unterbefehl an.
Dieses Tutorial stellt diese Befehle vor. Laden Sie vor dem Beginn ein vortrainiertes Modell herunter.
Holen Sie sich das Modell
In diesem Tutorial verwenden wir ResNet-50 v2. ResNet-50 ist ein 50-schichtiges tiefes Convolutional Neural Network zur Bildklassifizierung.Das Modell, das wir als nächstes verwenden werden, wurde anhand von über 1 Million Bildern aus 1.000 verschiedenen Kategorien vortrainiert. Die Eingabebildgröße dieses Netzwerks beträgt 224×224.
Ich empfehle, Netron (einen kostenlosen ML-Modell-Viewer) herunterzuladen, um die Organisationsstruktur des ResNet-50-Modells genauer zu erkunden.
Laden Sie Netron herunter: https://netron.app/
Dieses Tutorial verwendet das Modell im ONNX-Format:
wget https://github.com/onnx/models/raw/b9a54e89508f101a1611cd64f4ef56b9cb62c7cf/vision/classification/resnet/model/resnet50-v2-7.onnx
Tipps 1 Unterstützte Modellformate:
TVMC unterstützt mit Keras, ONNX, TensorFlow, TFLite und Torch erstellte Modelle. Verfügbar --model-format Die Option gibt das verwendete Modellformat an. implementieren tvmc kompilieren –Hilfe für weitere Informationen.
Tipps 2: Fügen Sie TVM Unterstützung für ONNX hinzu:
TVM setzt voraus, dass die ONNX Python-Bibliothek auf Ihrem System verfügbar ist. Installieren Sie ONNX mit pip3 install –user onnx onnxoptimizer. Wenn Sie Root-Zugriff haben und ONNX global installieren möchten, können Sie die Option –user entfernen. Die Abhängigkeit von onnxoptimizer ist optional und nur für onnx>=1.9 erforderlich.
Kompilieren Sie das ONNX-Modell in die TVM-Runtime
Nachdem Sie das ResNet-50-Modell heruntergeladen haben, verwenden Sie tvmc kompilieren Kompilieren Sie es. Die Ausgabe der Kompilierung ist ein TAR-Archiv des Modells (kompiliert in eine dynamische Bibliothek für die Zielplattform). Verwenden Sie die TVM-Laufzeit, um das Modell auf dem Zielgerät auszuführen:
# 大概需要几分钟,取决于设备
tvmc compile \
--target "llvm" \
--input-shapes "data:[1,3,224,224]" \
--output resnet50-v2-7-tvm.tar \
resnet50-v2-7.onnx
Überprüfen tvmc kompilieren Im Modul erstellte Dateien:
mkdir model
tar -xvf resnet50-v2-7-tvm.tar -C model
ls model
Nach der Dekomprimierung gibt es drei Dateien:
* mod.so Es handelt sich um ein Modell, das von der TVM-Laufzeit geladen werden kann und als C++-Bibliothek dargestellt wird.
* mod.json Es handelt sich um eine Textdarstellung des TVM-Relay-Berechnungsdiagramms.
* mod.params ist eine Datei, die die vortrainierten Modellparameter enthält.
Module können direkt von Anwendungen geladen werden, während Modelle über die TVM-Runtime-API ausgeführt werden können.
Tipp 3: Definieren Sie das richtige ZIEL:
Geben Sie das richtige Ziel an (Option --Ziel ) kann die Leistung kompilierter Module erheblich verbessern, da sie die auf dem Ziel verfügbaren Hardwarefunktionen nutzen können. Weitere Informationen finden Sie unter Automatisches Optimieren von Faltungsnetzwerken für x86-CPUs. Es wird empfohlen, das CPU-Modell und die optionalen Funktionen zu bestimmen, die verwendet werden sollen, und dann das Ziel entsprechend festzulegen.
Führen Sie Modelle aus kompilierten Modulen mit TVMC aus
Nachdem Sie das Modell in ein Modul kompiliert haben, können Sie mithilfe der TVM-Laufzeit Vorhersagen dazu treffen. TVMC verfügt über eine integrierte TVM-Laufzeitumgebung, die die Ausführung kompilierter TVM-Modelle ermöglicht.
Um mit TVMC ein Modell auszuführen und Vorhersagen zu treffen, benötigen Sie:
- Das gerade generierte kompilierte Modul.
- Gültige Eingaben für das zur Vorhersage verwendete Modell.
Form, Format und Datentyp von Tensoren variieren zwischen den Modellen.Daher erfordern die meisten Modelle eine Vor- und Nachverarbeitung, um sicherzustellen, dass die Eingabe gültig ist und die Ausgabe interpretiert werden kann. TVMC verwendet NumPy .npz Formatieren Sie Eingabe und Ausgabe, was die Serialisierung mehrerer Arrays in eine einzelne Datei gut unterstützt.
Als Bildeingabe wird in diesem Tutorial das Bild einer Katze verwendet, Sie können jedoch auch andere Bilder Ihrer Wahl auswählen.

Eingabevorverarbeitung
Die Eingabe für das ResNet-50 v2-Modell sollte im ImageNet-Format erfolgen. Unten finden Sie ein Beispielskript zur Vorverarbeitung eines Bildes mit ResNet-50 v2.
Erster Gebrauch pip3 install –user pillow Laden Sie die Python Imaging Library herunter, um die Abhängigkeit des Skripts von der Imaging Library zu erfüllen.
#!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)
Führen Sie das kompilierte Modul aus
Lassen Sie uns mit dem Modell und den Eingabedaten TVMC ausführen, um Vorhersagen zu treffen:
tvmc run \
--inputs imagenet_cat.npz \
--output predictions.npz \
resnet50-v2-7-tvm.tar
.Teer Die Modelldatei enthält eine C++-Bibliothek, eine Beschreibungsdatei des Relay-Modells und eine Parameterdatei des Modells. TVMC umfasst eine TVM-Laufzeit (die Modelle laden und Vorhersagen zu Eingaben treffen kann). Führen Sie den obigen Befehl aus, TVMC gibt eine neue Datei aus Vorhersagen.npz, das die Modellausgabetensoren im NumPy-Format enthält.
In diesem Beispiel wird das Modell auf derselben Maschine kompiliert, auf der es ausgeführt wird. In einigen Fällen ist es möglicherweise möglich, es mithilfe von RPC Tracker remote auszuführen. Überprüfen tvmc run –help um mehr über diese Optionen zu erfahren.
Ausgabenachbearbeitung
Wie bereits erwähnt, liefert jedes Modell unterschiedliche Ausgabetensoren.
In diesem Beispiel müssen wir einige Nachbearbeitungen durchführen, um die Ausgabe von ResNet-50 v2 mithilfe der für dieses Modell bereitgestellten Nachschlagetabelle in eine besser lesbare Form zu bringen.
Das folgende Skript ist ein Nachbearbeitungsbeispiel, das Beschriftungen aus der Ausgabe eines kompilierten Moduls extrahiert:
#!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]))
Die Ausgabe der Ausführung dieses Skripts lautet wie folgt:
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
Ersetzen Sie das obige Katzenbild durch andere Bilder und sehen Sie, welche Vorhersagen das ResNet-Modell macht.
Automatisches Optimieren des ResNet-Modells
Frühere Modelle wurden für die Ausführung auf der TVM-Laufzeit kompiliert und enthielten daher keine plattformspezifischen Optimierungen.In diesem Abschnitt wird erläutert, wie Sie mit TVMC ein Optimierungsmodell für die Arbeitsplattform erstellen.
Beim Arbeiten mit kompilierten Modulen erzielen Sie möglicherweise nicht immer die erwartete Leistung.In diesem Fall kann der Auto-Tuner verwendet werden, um das Modell besser zu konfigurieren und so die Leistung zu verbessern.. Tuning in TVM bedeutet, das Modell auf ein bestimmtes Ziel zu optimieren, damit es schneller läuft. Im Gegensatz zum Training oder der Feinabstimmung wirkt es sich nicht auf die Genauigkeit des Modells aus, sondern nur auf die Laufzeitleistung.
Als Teil des Tuning-ProzessesTVM implementiert und betreibt viele Variationen verschiedener Operatoren, um herauszufinden, welche die beste Leistung bringt.Die Ergebnisse dieser Läufe werden in der Tuning-Protokolldatei gespeichert (die endgültige Ausgabe des Tune-Befehls).
Das Tuning sollte mindestens Folgendes umfassen:
- Plattformanforderungen für Zielgeräte, auf denen dieses Modell ausgeführt wird
- Pfad zur Ausgabedatei, in der die Tuning-Datensätze gespeichert sind
- Der Pfad zum zu optimierenden Modell.
Das folgende Beispiel veranschaulicht den Arbeitsablauf:
# 默认搜索算法需要 xgboost,有关调优搜索算法的详细信息,参见下文
pip install xgboost
tvmc tune \
--target "llvm" \
--output resnet50-v2-7-autotuner_records.json \
resnet50-v2-7.onnx
In diesem Fall, --Ziel Wenn Sie mit der Flagge ein spezifischeres Ziel angeben, erhalten Sie bessere Ergebnisse. Auf einem Intel i7-Prozessor können Sie beispielsweise –target llvm -mcpu=skylake . Dieses Tuning-Beispiel verwendet LLVM als Compiler für eine bestimmte Architektur und führt ein natives Tuning auf der CPU durch.
TVMC durchsucht den Parameterraum des Modells, probiert verschiedene Konfigurationen für die Operatoren aus und wählt dann die Konfiguration aus, die auf der Plattform am schnellsten läuft. Obwohl es sich um eine geführte Suche auf Basis von CPU- und Modelloperationen handelt, dauert es dennoch mehrere Stunden, bis die Suche abgeschlossen ist. Die Ergebnisse der Suche werden gespeichert unter resnet50-v2-7-autotuner_records.json Datei, die dann zum Kompilieren des optimierten Modells verwendet wird.
Tipp 4: Definieren und optimieren Sie den Suchalgorithmus:
Dieser Suchalgorithmus verwendet die Standardeinstellung XGBoost-Raster Algorithmus-Leitfaden. Je nach Modellkomplexität und verfügbarer Zeit können unterschiedliche Algorithmen gewählt werden. Die vollständige Liste finden Sie unter TVMC-Melodie – Hilfe .
Für eine Skylake-CPU für Verbraucher lautet die Ausgabe wie folgt:

Kompilieren und optimieren Sie das Modell mithilfe von Tuningdaten
Aus der Ausgabedatei des obigen Tuning-Prozesses `resnet50-v2-7-autotuner_records.json Sie können Stimmaufzeichnungen erhalten.
Diese Datei kann für Folgendes verwendet werden:
- Als Input für die weitere Abstimmung (über TVMC-Melodie – Tuning-Records )
- Als Eingabe für den Compiler
implementieren tvmc kompilieren – Tuning-Records Der Befehl weist den Compiler an, dieses Ergebnis zu verwenden, um Hochleistungscode für das Modell auf dem angegebenen Ziel zu generieren. Überprüfen tvmc kompilieren –Hilfe für weitere Informationen.
Nachdem die Daten zur Modelloptimierung erfasst wurden, kann das Modell mit optimierten Operatoren neu kompiliert werden, um die Berechnung zu beschleunigen.
tvmc compile \
--target "llvm" \
--tuning-records resnet50-v2-7-autotuner_records.json \
--output resnet50-v2-7-tvm_autotuned.tar \
resnet50-v2-7.onnx
Überprüfen Sie, ob das Optimierungsmodell ausgeführt wird und dieselben Ergebnisse liefert:
tvmc run \
--inputs imagenet_cat.npz \
--output predictions.npz \
resnet50-v2-7-tvm_autotuned.tar
python postprocess.py
Überprüfen Sie, ob die vorhergesagten Werte gleich sind:
# 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
Vergleich von abgestimmten und ungestimmten Modellen
TVMC bietet grundlegende Tools zur Leistungsbewertung zwischen Modellen.Sie können die Anzahl der Wiederholungen und auch den Zeitpunkt angeben, zu dem das TVMC-Berichtsmodell ausgeführt werden soll (unabhängig vom Start der Laufzeit). Sie können sich einen ungefähren Eindruck davon verschaffen, wie sehr sich die Leistung des Modells durch das Tuning verbessert hat.
Beispielsweise läuft das optimierte Modell bei einem Test auf einem Intel i7-System 47% schneller als das nicht optimierte Modell:
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
Letzte Worte
Dieses Tutorial stellt TVMC vor, den Befehlszeilentreiber für TVM.Es zeigt, wie Modelle kompiliert, ausgeführt und optimiert werden, und erörtert die Notwendigkeit der Vor- und Nachbearbeitung von Eingaben und Ausgaben.Zeigen Sie nach der Feinabstimmung, wie die Leistung der nicht optimierten und optimierten Modelle verglichen wird.
Dieses Dokument zeigt ein einfaches Beispiel für die lokale Verwendung von ResNet-50 v2. TVMC unterstützt jedoch mehr Funktionen, darunter Cross-Kompilierung, Remote-Ausführung und Profiling/Benchmarking.
verwenden tvmc –Hilfe Befehl, um andere verfügbare Optionen anzuzeigen.
Das nächste Tutorial, „Kompilieren und Optimieren eines Modells mit der Python-Schnittstelle“, stellt dieselben Kompilierungs- und Optimierungsschritte mithilfe der Python-Schnittstelle vor.
Bleiben Sie dran, verpassen Sie es nicht~