Das Batch Inference Toolkit (batch-inference) ist ein Python-Paket, das aus mehreren Anfragen stammende Modelleingabetensoren dynamisch stapelt, das Modell ausführt, Ausgabetensoren entbündelt und sie dann jeweils an jede Anfrage zurückgibt. Dadurch wird der Systemdurchsatz aufgrund einer besseren Rechenparallelität und einer besseren Cache-Lokalität verbessert. Der gesamte Prozess ist für Entwickler transparent.
Wenn Sie Deep-Learning-Modellinferenzen auf Cloud-Servern hosten möchten, insbesondere auf GPUs
Es kann den Durchsatz Ihres Servers um ein Vielfaches steigern
Modell | Durchsatz im Vergleich zum Ausgangswert | Links |
---|---|---|
Bert Einbettung | 4,7x | Anleitung |
GPT-Abschluss | 16x | Anleitung |
Von Pip installieren
python -m pip install batch-inference --upgrade
Erstellen und Installieren aus der Quelle (für Entwickler)
git clone https://github.com/microsoft/batch-inference.git
python -m pip install -e .[docs,testing]
# if you want to format the code before commit
pip install pre-commit
pre-commit install
# run unittests
python -m unittest discover tests
Beginnen wir mit einem Spielzeugmodell, um die APIs zu lernen. Zuerst müssen Sie eine Predict_batch -Methode in Ihrer Modellklasse definieren und dann den Batch- Dekorator zu Ihrer Modellklasse hinzufügen.
Der Batch- Dekorator fügt die Methode host() hinzu, um ein ModelHost- Objekt zu erstellen. Die Predict- Methode von ModelHost verwendet eine einzelne Abfrage als Eingabe und führt mehrere Abfragen zu einem Stapel zusammen, bevor die Predict_batch -Methode aufgerufen wird. Die Predict-Methode teilt auch die Ausgaben der Predict_batch-Methode auf, bevor sie ein Ergebnis zurückgibt.
import numpy as np
from batch_inference import batching
from batch_inference . batcher . concat_batcher import ConcatBatcher
@ batching ( batcher = ConcatBatcher (), max_batch_size = 32 )
class MyModel :
def __init__ ( self , k , n ):
self . weights = np . random . randn ( k , n ). astype ( "f" )
# shape of x: [batch_size, m, k]
def predict_batch ( self , x ):
y = np . matmul ( x , self . weights )
return y
# initialize MyModel with k=3 and n=3
host = MyModel . host ( 3 , 3 )
host . start ()
# shape of x: [1, 3, 3]
def process_request ( x ):
y = host . predict ( x )
return y
host . stop ()
Batcher ist dafür verantwortlich, Abfragen zusammenzuführen und Ausgaben aufzuteilen. In diesem Fall konkatiert ConcatBatcher Eingabetensoren in gestapelten Tensoren in der ersten Dimension. Wir bieten eine Reihe integrierter Batcher für gängige Szenarien. Sie können auch Ihren eigenen Batcher implementieren. Weitere Informationen finden Sie unter Was ist Batcher?