Kit de ferramentas de inferência em lote (inferência em lote) é um pacote Python que agrupa tensores de entrada do modelo provenientes de várias solicitações dinamicamente, executa o modelo, desfaz os lotes de tensores de saída e os retorna para cada solicitação, respectivamente. Isso melhorará o rendimento do sistema devido ao melhor paralelismo computacional e melhor localidade do cache. Todo o processo é transparente para os desenvolvedores.
Quando você deseja hospedar inferência de modelo de Deep Learning em servidores em nuvem, especialmente em GPU
Pode melhorar o rendimento do seu servidor várias vezes
Modelo | Taxa de transferência em comparação com a linha de base | Ligações |
---|---|---|
Incorporação Bert | 4,7x | Tutorial |
Conclusão GPT | 16x | Tutorial |
Instalar a partir do Pip
python -m pip install batch-inference --upgrade
Crie e instale a partir do código-fonte (para desenvolvedores)
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
Vamos começar com um modelo de brinquedo para aprender as APIs. Primeiramente, você precisa definir um método predict_batch em sua classe de modelo e, em seguida, adicionar o decorador de lote à sua classe de modelo.
O decorador de lote adiciona o método host() para criar o objeto ModelHost . O método de previsão de ModelHost recebe uma única consulta como entrada e mesclará várias consultas em um lote antes de chamar o método de previsão_batch . O método de previsão também divide as saídas do método de previsão_batch antes de retornar o 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 é responsável por mesclar consultas e dividir resultados. Neste caso, ConcatBatcher irá concatenar tensores de entrada em tensores em lote na primeira dimensão. Fornecemos um conjunto de Batchers integrados para cenários comuns e você também pode implementar seu próprio Batcher. Consulte O que é Batcher para obter mais informações.