Für eine ausführliche Erklärung der Put up-Coaching-Quantisierung und einen Vergleich von ONNX Runtime und OpenVINO empfehle ich diesen Artikel:
In diesem Abschnitt werden insbesondere zwei beliebte Techniken der Put up-Coaching-Quantisierung betrachtet:
ONNX-Laufzeit
Ein beliebter Ansatz zur Beschleunigung der Inferenz auf der CPU bestand darin, die endgültigen Modelle in zu konvertieren ONNX (Open Neural Community Alternate)-Format [2, 7, 9, 10, 14, 15].
Die relevanten Schritte zur Quantisierung und Beschleunigung der Inferenz auf der CPU mit ONNX Runtime sind unten aufgeführt:
Vorbereitung: Installieren Sie ONNX Runtime
pip set up onnxruntime
Schritt 1: Konvertieren Sie das PyTorch-Modell in ONNX
import torch
import torchvision# Outline your mannequin right here
mannequin = ...
# Practice mannequin right here
...
# Outline dummy_input
dummy_input = torch.randn(1, N_CHANNELS, IMG_WIDTH, IMG_HEIGHT, system="cuda")
# Export PyTorch mannequin to ONNX format
torch.onnx.export(mannequin, dummy_input, "mannequin.onnx")
Schritt 2: Treffen Sie Vorhersagen mit einer ONNX Runtime-Sitzung
import onnxruntime as rt# Outline X_test with form (BATCH_SIZE, N_CHANNELS, IMG_WIDTH, IMG_HEIGHT)
X_test = ...
# Outline ONNX Runtime session
sess = rt.InferenceSession("mannequin.onnx")
# Make prediction
y_pred = sess.run([], {'enter' : X_test})[0]
OpenVINO
Der ebenso beliebte Ansatz zur Beschleunigung der Inferenz auf der CPU conflict die Verwendung von OpenVINO (Open Visible Inference and Neural Community Optimization). [5, 6, 12] wie gezeigt in dieses Kaggle-Notizbuch:
Die relevanten Schritte zur Quantisierung und Beschleunigung eines Deep-Studying-Modells mit OpenVINO sind unten aufgeführt:
Vorbereitung: Installieren Sie OpenVINO
!pip set up openvino-dev[onnx]
Schritt 1: Konvertieren Sie das PyTorch-Modell in ONNX (siehe Schritt 1 von ONNX-Laufzeit)
Schritt 2: Konvertieren Sie das ONNX-Modell in OpenVINO
mo --input_model mannequin.onnx
Dadurch werden eine XML-Datei und eine BIN-Datei ausgegeben, von denen wir im nächsten Schritt die XML-Datei verwenden.
Schritt 3: Quantisieren auf INT8
mit OpenVINO
import openvino.runtime as ovcore = ov.Core()
openvino_model = core.read_model(mannequin='mannequin.xml')
compiled_model = core.compile_model(openvino_model, device_name="CPU")
Schritt 4: Machen Sie Vorhersagen mit einer OpenVINO-Inferenzanfrage
# Outline X_test with form (BATCH_SIZE, N_CHANNELS, IMG_WIDTH, IMG_HEIGHT)
X_test = ...# Create inference request
infer_request = compiled_model.create_infer_request()
# Make prediction
y_pred = infer_request.infer(inputs=[X_test, 2])
Vergleich: ONNX vs. OpenVINO vs. Alternativen
Sowohl ONNX als auch OpenVINO sind Frameworks, die für die Bereitstellung von Modellen auf CPUs optimiert sind. Die Inferenzzeiten eines mit ONNX und OpenVINO quantisierten neuronalen Netzwerks sollen vergleichbar sein [12].
Einige Konkurrenten nutzten PyTorch JIT [3] oder TorchScript [1] als Various zur Beschleunigung der Inferenz auf der CPU. Andere Konkurrenten teilten jedoch mit, dass ONNX erheblich schneller als TorchScript sei [10].
Ein weiterer beliebter Ansatz zur Beschleunigung der Inferenz auf der CPU conflict die Verwendung von Multithreading mit ThreadPoolExecutor [2, 3, 9, 15] zusätzlich zur Put up-Coaching-Quantisierung, wie in gezeigt dieses Kaggle-Notizbuch:
Dies ermöglichte es den Wettbewerbern, mehrere Schlussfolgerungen gleichzeitig durchzuführen.
Im folgenden Beispiel von ThreadPoolExecutor Von der Konkurrenz können wir eine Liste mit Audiodateien ableiten.
audios = ['audio_1.ogg',
'audio_2.ogg',
# ...,
'audio_n.ogg',]
Als Nächstes müssen Sie eine Inferenzfunktion definieren, die eine Audiodatei als Eingabe verwendet und die Vorhersagen zurückgibt.
def predict(audio_path):
# Outline any preprocessing of the audio file right here
...# Make predictions
...
return predictions
Mit der Liste der Audios (z. B. audios
) und die Inferenzfunktion (z. B. predict()
), können Sie jetzt verwenden ThreadPoolExecutor um mehrere Inferenzen gleichzeitig (parallel) und nicht nacheinander auszuführen, was Ihnen eine schöne Steigerung der Inferenzzeit verschafft.
import concurrent.futureswith concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
dicts = listing(executor.map(predict, audios))
Aus der Durchsicht der Lernressourcen, die Kagglers im Laufe des Jahres erstellt hat, können noch viele weitere Lehren gezogen werden „BirdCLEF 2023“ Wettbewerb. Auch für diese Artwork der Problemstellung gibt es viele unterschiedliche Lösungsansätze.
In diesem Artikel haben wir uns auf den allgemeinen Ansatz konzentriert, der bei vielen Wettbewerbern beliebt conflict:
- Modellauswahl: Wählen Sie die Modellgröße entsprechend dem besten Kompromiss zwischen Leistung und Inferenzzeit aus. Nutzen Sie außerdem größere und kleinere Modelle in Ihrem Ensemble.
- Quantisierung nach dem Training: Die Quantisierung nach dem Coaching kann zu schnelleren Inferenzzeiten führen, da die Datentypen der Modellgewichte und Aktivierungen für die {Hardware} optimiert werden. Dies kann jedoch zu einem leichten Leistungsverlust des Modells führen.
- Multithreading: Führen Sie mehrere Inferenzen parallel statt nacheinander aus. Dadurch wird die Inferenzzeit verlängert.
Wenn Sie daran interessiert sind, wie Sie die Audioklassifizierung mit Deep Studying angehen können, was der Hauptaspekt dieses Wettbewerbs conflict, lesen Sie den Artikel dazu BirdCLEF 2022 Wettbewerb: