Artefatos e modelos no MLflow
Este artigo explica o que são artefatos do MLflow e modelos do MLflow e como os modelos do MLflow diferem de outros artefatos. O artigo também explica como o Azure Machine Learning usa as características de um modelo do MLflow para habilitar fluxos de trabalho de implantação simplificados.
Artefatos e modelos
No MLflow, há algumas diferenças fundamentais entre registrar artefatos de arquivo simples e registrar modelos do MLflow em log.
Artefato
Um artefato é qualquer arquivo gerado e capturado a partir da execução ou do trabalho de um experimento. Um artefato pode ser um modelo serializado como um arquivo de picles, os pesos de um modelo PyTorch ou TensorFlow ou um arquivo de texto que contém os coeficientes de uma regressão linear. Alguns artefatos não têm nada a ver com o próprio modelo, mas contêm configurações de execução, informações de pré-processamento ou dados de exemplo. Artefatos podem ter vários formatos.
O exemplo a seguir registra um artefato de arquivo.
filename = 'model.pkl'
with open(filename, 'wb') as f:
pickle.dump(model, f)
mlflow.log_artifact(filename)
Modelar
Um modelo do MLflow é um artefato para o qual você faz suposições mais fortes que fornecem um contrato claro entre os arquivos salvos e o que eles significam. Se, no entanto, você registrar os arquivos do modelo simplesmente como artefatos, precisará saber o que cada um dos arquivos significa e como carregá-los para inferência.
Você pode registrar modelos do MLflow usando o SDK do MLflow, por exemplo:
import mlflow
mlflow.sklearn.log_model(sklearn_estimator, "classifier")
Registrar modelos do MLflow no Azure Machine Learning tem as seguintes vantagens:
- Você pode implantar modelos do MLflow em pontos de extremidade em tempo real ou em lote sem fornecer um script de pontuação ou um ambiente.
- Quando você implanta modelos do MLflow, as implantações geram automaticamente um arquivo Swagger, para que você possa usar o recurso de Teste no Estúdio do Azure Machine Learning.
- Você pode usar modelos do MLflow diretamente como entradas de pipeline.
- Você pode usar o painel de IA responsável com modelos do MLflow.
O formato MLmodel
Para modelos registrados como arquivos de artefato simples, você precisa saber o que o construtor de modelos pretendia para cada arquivo antes de carregar o modelo para inferência. No entanto, para modelos do MLflow, você carrega o modelo usando o formato MLmodel para especificar o contrato entre os artefatos e o que eles representam.
O formato MLmodel armazena ativos em uma pasta que não tem nenhum requisito de nomenclatura específico. Entre os ativos está um arquivo chamado MLmodel que é a única fonte de verdade para como carregar e usar o modelo.
A imagem a seguir mostra uma pasta de modelo do MLflow chamada credit_defaults_model no Estúdio do Azure Machine Learning. A pasta contém o arquivo MLmodel e outros artefatos de modelo.
O exemplo a seguir mostra um arquivo MLmodel para um modelo de pesquisa visual computacional treinado com fastai
:
artifact_path: classifier
flavors:
fastai:
data: model.fastai
fastai_version: 2.4.1
python_function:
data: model.fastai
env: conda.yaml
loader_module: mlflow.fastai
python_version: 3.8.12
model_uuid: e694c68eba484299976b06ab9058f636
run_id: e13da8ac-b1e6-45d4-a9b2-6a0a5cfac537
signature:
inputs: '[{"type": "tensor",
"tensor-spec":
{"dtype": "uint8", "shape": [-1, 300, 300, 3]}
}]'
outputs: '[{"type": "tensor",
"tensor-spec":
{"dtype": "float32", "shape": [-1,2]}
}]'
Variantes de modelo
Considerando o grande número de estruturas de machine learning disponíveis, o MLflow introduziu o conceito de variante como uma forma de fornecer contratos exclusivos para todas as estruturas de machine learning. Uma variante indica o que esperar de um determinado modelo criado com uma estrutura específica. Por exemplo, o TensorFlow tem a sua própria variante, que especifica como persistir e carregar um modelo do TensorFlow.
Como cada variante de modelo indica como persistir e carregar o modelo para uma determinada estrutura, o formato MLmodel não impõe um só mecanismo de serialização a que todos os modelos devem dar suporte. Portanto, cada variante pode usar os métodos que fornecem o melhor desempenho ou o melhor suporte de acordo com suas práticas recomendadas, sem comprometer a compatibilidade com o padrão MLmodel.
O exemplo a seguir mostra a seção flavors
de um modelo fastai
.
flavors:
fastai:
data: model.fastai
fastai_version: 2.4.1
python_function:
data: model.fastai
env: conda.yaml
loader_module: mlflow.fastai
python_version: 3.8.12
Assinatura de modelo
Uma assinatura de modelo do MLflow é uma parte importante da especificação do modelo, pois serve como um contrato de dados entre o modelo e o servidor que executa o modelo. Uma assinatura de modelo também é importante para analisar e impor os tipos de entrada do modelo no momento da implantação. Se uma assinatura estiver disponível, o MLflow imporá os tipos de entrada quando os dados forem enviados ao seu modelo. Para mais informações, confira imposição de assinatura do MLflow.
As assinaturas são indicadas no momento em que os modelos são registrados e persistidas na seção signature
do arquivo MLmodel. O recurso Autolog no MLflow faz automaticamente um melhor esforço para inferir assinaturas. No entanto, você poderá registrar modelos manualmente se as assinaturas inferidas não forem as necessárias. Para obter mais informações, consulte Como registrar modelos com assinaturas.
Há dois tipos de assinaturas:
- As assinaturas baseadas em coluna operam em dados tabulares. Para modelos com esse tipo de assinatura, o MLflow fornece
pandas.DataFrame
objetos como entradas. - As assinaturas baseadas em tensor operam com matrizes ou tensores n-dimensionais. Para modelos com esta assinatura, o MLflow fornece
numpy.ndarray
como entradas ou um dicionário denumpy.ndarray
para tensores nomeados.
O exemplo a seguir mostra a seção signature
de um modelo de pesquisa visual computacional treinado com fastai
. Esse modelo recebe um lote de imagens representadas como tensores de forma (300, 300, 3)
com a sua representação RGB como inteiros sem sinal. O modelo gera lotes de previsões como probabilidades para duas classes.
signature:
inputs: '[{"type": "tensor",
"tensor-spec":
{"dtype": "uint8", "shape": [-1, 300, 300, 3]}
}]'
outputs: '[{"type": "tensor",
"tensor-spec":
{"dtype": "float32", "shape": [-1,2]}
}]'
Dica
O Azure Machine Learning gera um arquivo Swagger para uma implantação de um modelo do MLflow que tem uma assinatura disponível. Esse arquivo facilita o teste de implantações usando o Estúdio do Azure Machine Learning.
Ambiente de modelo
Os requisitos para a execução do modelo são especificados no arquivo conda.yaml. O MLflow pode detectar dependências automaticamente ou você pode indicá-las manualmente chamando o método mlflow.<flavor>.log_model()
. Chamar o método pode ser útil se as bibliotecas que o MLflow incluiu em seu ambiente não forem as que você pretende usar.
O exemplo conda.yaml a seguir mostra um ambiente para um modelo criado com a estrutura fastai
:
channels:
- conda-forge
dependencies:
- python=3.8.5
- pip
- pip:
- mlflow
- astunparse==1.6.3
- cffi==1.15.0
- configparser==3.7.4
- defusedxml==0.7.1
- fastai==2.4.1
- google-api-core==2.7.1
- ipython==8.2.0
- psutil==5.9.0
name: mlflow-env
Observação
Um ambiente do MLflow opera no nível do modelo, mas um ambiente do Azure Machine Learning opera no nível do workspace para ambientes registrados ou no nível de trabalhos/implantações para ambientes anônimos. Quando você implanta modelos do MLflow, o Azure Machine Learning cria o ambiente de modelo e o usa para implantação. Você pode usar a CLI do Azure Machine Learning para substituir este comportamento e implantar modelos do MLflow em um ambiente específico do Azure Machine Learning.
Função Predict
Todos os modelos do MLflow contêm uma função predict
, que é chamada quando o modelo é implantado usando uma implantação sem código. O que a função predict
retorna – por exemplo, classes, probabilidades ou uma previsão – depende da estrutura ou da variante usada para treinamento. A documentação de cada variante descreve o que ela retorna.
Você pode personalizar a função predict
para alterar a maneira como a inferência é executada. Você pode registrar em log modelos com um comportamento diferente ou registrar uma variante de modelo personalizado.
Fluxos de trabalho para carregar modelos de MLflow
Você pode carregar modelos do MLflow dos seguintes locais:
- Diretamente da execução em que os modelos foram registrados
- No sistema de arquivos em que os modelos são salvos
- No registro de modelo em que os modelos são registrados
O MLflow fornece uma maneira consistente de carregar esses modelos independentemente da localização.
Há dois fluxos de trabalho para carregar modelos:
Carregue de volta o mesmo objeto e tipos que foram registrados. Você pode carregar modelos usando o SDK do MLflow e obter uma instância do modelo com tipos pertencentes à biblioteca de treinamento. Por exemplo, um modelo Open Neural Network Exchange (ONNX) retorna um
ModelProto
, enquanto um modelo de árvore de decisão treinado comscikit-learn
retorna um objetoDecisionTreeClassifier
. Usemlflow.<flavor>.load_model()
para carregar de volta o mesmo objeto de modelo e tipos que foram registrados.Carregue de volta um modelo para executar a inferência. Você pode carregar modelos usando o SDK do MLflow e obter um wrapper que tenha uma função
predict
garantida. Não importa qual variante você usa, pois cada modelo do MLflow tem uma funçãopredict
.O MLflow garante que você pode chamar essa função usando argumentos do tipo
pandas.DataFrame
,numpy.ndarray
oudict[string, numpyndarray]
, dependendo da assinatura do modelo. O MLflow lida com a conversão para o tipo de entrada que o modelo espera. Usemlflow.pyfunc.load_model()
para carregar de volta um modelo para executar a inferência.