Artefatos e modelos no MLflow
Este artigo explica artefatos MLflow e modelos MLflow, e como os modelos MLflow diferem de outros artefatos. O artigo também explica como o Azure Machine Learning usa as características de um modelo 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 MLflow.
Artefacto
Um artefato é qualquer arquivo gerado e capturado a partir da execução ou trabalho de um experimento. Um artefato pode ser um modelo serializado como um arquivo pickle, os pesos de um modelo PyTorch ou TensorFlow ou um arquivo de texto contendo os coeficientes de uma regressão linear. Alguns artefatos não têm nada a ver com o modelo em si, mas contêm configurações de execução, informações de pré-processamento ou dados de exemplo. Os 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)
Modelo
Um modelo 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 seu modelo simplesmente como artefatos, você precisa saber o que cada um dos arquivos significa e como carregá-los para inferência.
Você pode registrar modelos MLflow usando o SDK MLflow, por exemplo:
import mlflow
mlflow.sklearn.log_model(sklearn_estimator, "classifier")
O registo de modelos MLflow no Azure Machine Learning tem as seguintes vantagens:
- Você pode implantar modelos 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 MLflow, as implantações geram automaticamente um arquivo swagger, para que você possa usar o recurso Test no estúdio do Azure Machine Learning.
- Você pode usar modelos MLflow diretamente como entradas de pipeline.
- Você pode usar o painel de IA responsável com modelos 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. Mas para modelos 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 sobre como carregar e usar o modelo.
A imagem a seguir mostra uma pasta de modelo 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 visão 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]}
}]'
Sabores do modelo
Considerando o grande número de estruturas de aprendizado de máquina disponíveis, o MLflow introduziu o conceito de sabor como uma maneira de fornecer um contrato exclusivo para todas as estruturas de aprendizado de máquina. Um sabor indica o que esperar de um determinado modelo criado com uma estrutura específica. Por exemplo, o TensorFlow tem seu próprio sabor, que especifica como persistir e carregar um modelo do TensorFlow.
Como cada sabor de modelo indica como persistir e carregar o modelo para uma determinada estrutura, o formato MLmodel não impõe um único mecanismo de serialização que todos os modelos devem suportar. Portanto, cada sabor pode usar os métodos que fornecem o melhor desempenho ou melhor suporte de acordo com suas melhores práticas, sem comprometer a compatibilidade com o padrão MLmodel.
O exemplo a seguir mostra a flavors
seção de um fastai
modelo.
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
Modelo de assinatura
Uma assinatura de modelo MLflow é uma parte importante da especificação do modelo, porque 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 de um 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 obter mais informações, consulte Imposição de assinatura MLflow.
As assinaturas são indicadas no momento em que os modelos são registrados e persistem na signature
seção do arquivo MLmodel . O recurso Autolog no MLflow faz automaticamente um esforço melhor para inferir assinaturas. No entanto, você pode registrar modelos manualmente se as assinaturas inferidas não forem as necessárias. Para obter mais informações, consulte Como registrar modelos com assinaturas.
Existem dois tipos de assinaturas:
- As assinaturas baseadas em colunas 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 essa assinatura, o MLflow fornece
numpy.ndarray
como entradas ou um dicionário denumpy.ndarray
tensores nomeados.
O exemplo a seguir mostra a signature
seção para um modelo de visão computacional treinado com fastai
. Este modelo recebe um lote de imagens representadas como tensores de forma (300, 300, 3)
com sua representação RGB como inteiros não assinados. O modelo produz 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]}
}]'
Gorjeta
O Azure Machine Learning gera um arquivo swagger para uma implantação de um modelo MLflow que tem uma assinatura disponível. Esse arquivo facilita o teste de implantações usando o estúdio do Azure Machine Learning.
Ambiente do modelo
Os requisitos para que o modelo seja executado são especificados no arquivo conda.yaml . MLflow pode detetar automaticamente dependências, ou você pode indicá-las manualmente chamando o mlflow.<flavor>.log_model()
método. Chamar o método pode ser útil se as bibliotecas que o MLflow incluiu em seu ambiente não forem as que você pretendia usar.
O exemplo conda.yaml a seguir mostra um ambiente para um modelo criado com a fastai
estrutura:
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
Nota
Um ambiente MLflow opera no nível do modelo, mas um ambiente do Azure Machine Learning opera no nível do espaço de trabalho para ambientes registrados ou no nível de trabalhos/implantações para ambientes anônimos. Quando você implanta modelos MLflow, o Aprendizado de Máquina do Azure cria o ambiente do modelo e o usa para implantação. Você pode usar a CLI do Azure Machine Learning para substituir esse comportamento e implantar modelos MLflow em um ambiente específico do Azure Machine Learning.
Função de previsão
Todos os modelos MLflow contêm uma predict
função, que é chamada quando o modelo é implantado usando uma implantação sem código. O que a predict
função retorna, por exemplo, classes, probabilidades ou uma previsão, depende da estrutura ou do sabor usado para o treinamento. A documentação de cada sabor descreve o que ele retorna.
Você pode personalizar a predict
função para alterar a maneira como a inferência é executada. Você pode registrar modelos com um comportamento diferente ou registrar um sabor de modelo personalizado.
Fluxos de trabalho para carregar modelos MLflow
Você pode carregar modelos MLflow dos seguintes locais:
- Diretamente da corrida onde os modelos foram registrados
- A partir do sistema de ficheiros onde os modelos são guardados
- A partir do registo modelo onde os modelos estão registados
O MLflow fornece uma maneira consistente de carregar esses modelos independentemente do local.
Há dois fluxos de trabalho para carregar modelos:
Carregue de volta o mesmo objeto e os mesmos tipos que foram registrados. Você pode carregar modelos usando o SDK MLflow e obter uma instância do modelo com tipos pertencentes à biblioteca de treinamento. Por exemplo, um modelo ONNX (Open Neural Network Exchange) retorna um
ModelProto
, enquanto um modelo de árvore de decisão treinado comscikit-learn
retorna umDecisionTreeClassifier
objeto. Usemlflow.<flavor>.load_model()
para carregar de volta o mesmo objeto de modelo e os tipos que foram registrados.Carregue de volta um modelo para executar a inferência. Você pode carregar modelos usando o SDK MLflow e obter um wrapper que tenha uma função garantida
predict
. Não importa qual sabor você usa, porque cada modelo MLflow tem umapredict
funçã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. MLflow manipula a conversão de tipo para o tipo de entrada que o modelo espera. Usemlflow.pyfunc.load_model()
para carregar de volta um modelo para executar inferência.