Batch Inference Toolkit (batch-inference) es un paquete de Python que agrupa dinámicamente por lotes los tensores de entrada del modelo provenientes de múltiples solicitudes, ejecuta el modelo, desagrupa los tensores de salida y luego los devuelve a cada solicitud respectivamente. Esto mejorará el rendimiento del sistema debido a un mejor paralelismo informático y una mejor localidad de caché. Todo el proceso es transparente para los desarrolladores.
Cuando desee alojar la inferencia del modelo de aprendizaje profundo en servidores en la nube, especialmente en GPU
Puede mejorar el rendimiento de su servidor hasta varias veces.
Modelo | Rendimiento en comparación con la línea de base | Campo de golf |
---|---|---|
Incrustación de Bert | 4,7x | Tutorial |
Finalización del GPT | 16x | Tutorial |
Instalar desde Pip
python -m pip install batch-inference --upgrade
Compilación e instalación desde el código fuente (para desarrolladores)
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
Comencemos con un modelo de juguete para aprender las API. En primer lugar, debe definir un método predict_batch en su clase de modelo y luego agregar el decorador por lotes a su clase de modelo.
El decorador por lotes agrega el método host() para crear el objeto ModelHost . El método de predicción de ModelHost toma una única consulta como entrada y fusionará varias consultas en un lote antes de llamar al método predict_batch . El método de predicción también divide los resultados del método predict_batch antes de devolver el resultado.
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 es responsable de fusionar consultas y dividir resultados. En este caso, ConcatBatcher concatizará los tensores de entrada en tensores por lotes en la primera dimensión. Proporcionamos un conjunto de Batchers integrados para escenarios comunes y también puede implementar su propio Batcher. Consulte ¿Qué es Batcher para obtener más información?