Registro de modelo Snowflake¶
Nota
A API do registro de modelos descrita neste tópico está geralmente disponível a partir da versão 1.5.0 do pacote.
Após o treinamento de um modelo, a operacionalização do modelo e a execução da inferência no Snowflake começam com o registro do modelo no Snowflake Model Registry. O Model Registry permite que você gerencie com segurança os modelos e seus metadados no Snowflake, independentemente da origem e do tipo, e facilita a execução da inferência. Os principais benefícios e recursos do Snowflake Model Registry são:
Capacidade de armazenar e gerenciar versões de modelos, métricas de modelos e outros metadados de modelos
Capacidade de servir modelos e executar inferência distribuída em escala usando Python, SQL ou pontos de extremidade REST API
Capacidade de gerenciar o ciclo de vida do modelo com opções de governança flexíveis e trabalhar com modelos de ambientes de desenvolvimento a produção
Capacidade de monitorar o desempenho e o desvio do modelo usando o Snowflake ML Observability
Capacidade de gerenciar com segurança o acesso ao modelo com controle de acesso baseado em funções
O registro de modelos armazena modelos de aprendizado de máquina como objetos de nível de esquema de primeira classe no Snowflake.
Depois de registrar um modelo, você pode invocar seus métodos (equivalentes a funções ou procedimentos armazenados) para realizar operações de modelo, como inferência, em um warehouse virtual do Snowflake, ou servir o modelo no Snowpark Container Services para inferência baseada em GPU.
O Snowflake Model Registry tem suporte para tipos incorporados para os tipos de modelos mais comuns, incluindo scikit-learn, xgboost, LightGBM, PyTorch, TensorFlow, pipelines do Hugging Face e MLFlow modelos pyfunc. O Model Registry também é flexível e poderoso o suficiente para suportar seus próprios modelos previamente treinados, bem como qualquer código de processamento personalizado.
Dica
Veja exemplos desses tipos de modelos com fluxos de trabalho de ponta a ponta em Exemplos e guias de início rápido.
As principais classes da Snowflake Model Registry Python API são:
snowflake.ml.registry.Registry: gerencia modelos dentro de um esquema.
snowflake.ml.model.Model: representa um modelo.
snowflake.ml.model.ModelVersion: representa uma versão de um modelo.
Este tópico descreve como realizar operações de registro em Python usando a biblioteca snowflake-ml-python
. Você também pode realizar muitas operações de registro em SQL; consulte Model Registry SQL.
Privilégios obrigatórios¶
Para criar um modelo, você deve possuir o esquema onde o modelo foi criado ou ter o privilégio CREATE MODEL
nele. Para usar um modelo, você deve possuir o modelo ou ter o privilégio USAGE nele. O privilégio USAGE permite que os beneficiários usem o modelo para inferência sem poder ver nenhum de seus componentes internos. Para dar aos usuários acesso a todos os modelos existentes em um esquema, use GRANT USAGE ON ALL MODELS IN SCHEMA <schema> TO ROLE <role>;
. Também é possível dar aos usuários acesso a futuros modelos criados em um esquema automaticamente por meio de GRANT USAGE ON FUTURE MODELS IN SCHEMA <schema> TO ROLE <role>;
.
Se a função de um usuário tiver USAGE em um modelo, ela aparecerá na página de registro do modelo Snowsight. Para obter detalhes sobre como os privilégios funcionam no Snowflake, consulte Privilégios de controle de acesso.
Nota
Por padrão, os modelos atualmente não oferecem suporte à replicação. Esse recurso faz parte do pacote BCR 2024_08, que pode ser ativado se você precisar de replicação de modelos. O recurso será ativado por padrão em breve.
Limitações atuais¶
Os seguintes limites se aplicam a modelos e versões de modelo.
Modelos |
|
---|---|
Versões do modelo |
|
Abertura do registro de modelo do Snowflake¶
Os modelos são objetos Snowflake de primeira classe e podem ser organizados em um banco de dados e esquema junto com outros objetos Snowflake. O Registro de modelo Snowflake fornece uma classe Python para gerenciar modelos dentro de um esquema. Assim, qualquer esquema Snowflake pode ser usado como registro. Não é necessário inicializar ou preparar um esquema para essa finalidade. Snowflake recomenda a criação de um ou mais esquemas dedicados para essa finalidade, como ML.REGISTRY. Você pode criar o esquema usando CREATE SCHEMA.
Antes de poder criar ou modificar modelos no registro, você deve abrir o registro. A abertura do registro retorna uma referência a ele, que você pode usar para adicionar novos modelos e obter referências a modelos existentes.
from snowflake.ml.registry import Registry
reg = Registry(session=sp_session, database_name="ML", schema_name="REGISTRY")
Registro de modelos e versões¶
Adicionar um modelo ao registro é chamado de registro em log do modelo. Registre em log um modelo chamando o método log_model
do registro. Este método serializa o modelo – um objeto Python – e cria um objeto modelo Snowflake a partir dele. Este método também adiciona metadados, como uma descrição, ao modelo, conforme especificado na chamada log_model
.
Cada modelo pode ter versões ilimitadas. Para registrar versões adicionais do modelo em log, chame log_model
novamente com o mesmo model_name
, mas com um version_name
diferente.
Você não pode adicionar tags a um modelo quando ele é adicionado ao registro, porque tags são atributos do modelo e log_model
adiciona uma versão específica do modelo, criando um modelo apenas quando adiciona sua primeira versão. Você pode atualizar as tags do modelo depois de registrar a primeira versão do modelo em log.
No exemplo a seguir, clf
, abreviação de “classificador”, é o objeto do modelo Python, que já foi criado em outro lugar em seu código. Você pode adicionar um comentário no momento do registro, conforme mostrado aqui. A combinação de nome e versão deve ser exclusiva no esquema. Você pode especificar listas de conda_dependencies
; os pacotes especificados serão implantados com o modelo.
from snowflake.ml.model import type_hints
mv = reg.log_model(clf,
model_name="my_model",
version_name="v1",
conda_dependencies=["scikit-learn"],
comment="My awesome ML model",
metrics={"score": 96},
sample_input_data=train_features,
task=type_hints.Task.TABULAR_BINARY_CLASSIFICATION)
Os argumentos de log_model
são descritos aqui.
Argumentos exigidos
Argumento |
Descrição |
---|---|
|
O objeto de modelo Python de um tipo de modelo compatível. Deve ser serializável (“selecionável”). |
|
O nome do modelo, usado com |
Nota
A combinação do nome do modelo e da versão deve ser exclusiva no esquema.
Argumentos opcionais
Argumento |
Descrição |
---|---|
|
Cadeia de caracteres especificando a versão do modelo, usada com |
|
Lista de caminhos para diretórios de código a serem importados ao carregar ou implantar o modelo. |
|
Comentário, por exemplo, uma descrição do modelo. |
|
Lista de pacotes Conda exigidos pelo seu modelo. Este argumento especifica nomes de pacotes e versões opcionais em formato Conda, ou seja, |
|
Lista de módulos externos para combinar com o modelo. Compatível com scikit-learn, Snowpark ML, PyTorch, TorchScript e modelos personalizados. |
|
Dicionário com métricas vinculadas à versão do modelo. |
|
Dicionário com opções para criação de modelo. As seguintes opções estão disponíveis para todos os tipos de modelo:
Tipos de modelos individuais podem oferecer suporte a opções adicionais. Consulte Uso de tipos de modelos incorporados. |
|
Lista de especificações de pacote para os pacotes PyPI exigidos pelo seu modelo. Suportado apenas para modelos em execução no Snowpark Container Services. |
|
A versão do Python na qual o modelo será executado. O padrão é |
|
Um DataFrame com os dados de entrada de amostra. Os nomes dos recurso exigidos pelo modelo e seus tipos são extraídos deste DataFrame. Este argumento ou |
|
Modele assinaturas de métodos como um mapeamento do nome do método de destino para assinaturas de entrada e saída. Este argumento ou |
|
A tarefa que define o problema que o modelo pretende resolver. Se não for especificado, o melhor esforço será feito para inferir a tarefa do modelo a partir da classe do modelo ou ela será definida como |
log_model
retorna um objeto snowflake.ml.model.ModelVersion
, que representa a versão do modelo que foi adicionado ao registro.
Após o registro, o modelo em si não pode ser modificado (embora você possa alterar seus metadados). Para excluir um modelo e todas as suas versões, use o método excluir_modelo do registro.
Como trabalhar com artefatos de modelo¶
Depois que um modelo é registrado, seus artefatos (os arquivos que dão suporte ao modelo, incluindo seus objetos Python serializados e vários arquivos de metadados, como seu manifesto) ficam disponíveis em um estágio interno. Os artefatos não podem ser modificados, mas você pode visualizar ou baixar os artefatos dos modelos que possui.
Nota
Ter o privilégio USAGE em um modelo não permite que você acesse seus artefatos; a propriedade é necessária.
Você pode acessar artefatos do modelo de um estágio usando, por exemplo, o comando GET ou seu equivalente em Snowpark Python, FileOperation.get.
No entanto, você não pode abordar artefatos de modelo usando a sintaxe usual do caminho de estágio. Em vez disso, use um snow://
URL, uma maneira mais geral de especificar a localização de objetos no Snowflake. Por exemplo, uma versão dentro de um modelo pode ser especificada por um URL do formulário snow://model/<nome_do_modelo>/versions/<nome_da_versão>/
.
Sabendo o nome do modelo e a versão que você deseja, você pode usar o comando LIST para visualizar os artefatos do modelo da seguinte forma:
LIST 'snow://model/my_model/versions/V3/';
A saída é semelhante a:
name size md5 last_modified
versions/V3/MANIFEST.yml 30639 2f6186fb8f7d06e737a4dfcdab8b1350 Thu, 18 Jan 2024 09:24:37 GMT
versions/V3/functions/apply.py 2249 e9df6db11894026ee137589a9b92c95d Thu, 18 Jan 2024 09:24:37 GMT
versions/V3/functions/predict.py 2251 132699b4be39cc0863c6575b18127f26 Thu, 18 Jan 2024 09:24:37 GMT
versions/V3/model.zip 721663 e92814d653cecf576f97befd6836a3c6 Thu, 18 Jan 2024 09:24:37 GMT
versions/V3/model/env/conda.yml 332 1574be90b7673a8439711471d58ec746 Thu, 18 Jan 2024 09:24:37 GMT
versions/V3/model/model.yaml 25718 33e3d9007f749bb2e98f19af2a57a80b Thu, 18 Jan 2024 09:24:37 GMT
Para recuperar um desses artefatos, use o comando SQL GET.
GET 'snow://model/model_my_model/versions/V3/MANIFEST.yml'
Ou o equivalente com Snowpark Python:
session.file.get('snow://model/my_model/versions/V3/MANIFEST.yml', 'model_artifacts')
Nota
Os nomes e a organização dos artefatos de um modelo podem variar dependendo do tipo do modelo e podem mudar. A lista de artefatos do exemplo anterior tem a intenção de ser ilustrativa, não autoritativa.
Exclusão de modelos¶
Use o método delete_model
do registro para excluir um modelo e todas as suas versões.
reg.delete_model("mymodel")
Dica
Você também pode excluir modelos em SQL usando DROP MODEL.
Como obter modelos do registro¶
Para obter informações sobre cada modelo, use o método show_models
:
model_df = reg.show_models()
Dica
Em SQL, use SHOW MODELS para obter uma lista de modelos.
O resultado de show_models
é um pandas DataFrame. As colunas disponíveis estão listadas aqui:
Coluna |
Descrição |
---|---|
|
Data e hora em que o modelo foi criado. |
|
Nome do modelo. |
|
Banco de dados no qual o modelo é armazenado. |
|
Esquema no qual o modelo é armazenado. |
|
Função proprietária do modelo. |
|
Comentário para o modelo. |
|
Matriz JSON listando versões do modelo. |
|
Versão do modelo utilizado quando se refere ao modelo sem versão. |
Para obter uma lista dos modelos no registro, cada um como uma instância Model
, use o método models
:
model_list = reg.models()
Para obter uma referência a um modelo específico do registro por nome, use o método get_model
do registro.
m = reg.get_model("MyModel")
Nota
As instâncias de Model
não são cópias do objeto de modelo Python original registrado; elas são referências ao objeto de modelo subjacente no registro.
Após ter uma referência para um modelo, seja um da lista retornada pelo método models
ou uma recuperada usando get_model
, é possível trabalhar com seus metadados e suas versões.
Exibição e atualização dos metadados de um modelo¶
Você pode visualizar e atualizar os atributos de metadados de um modelo no registro, incluindo seu nome, comentário, tags e métricas.
Recuperação e atualização de comentários¶
Use o atributo comment
do modelo para recuperar e atualizar o comentário do modelo:
print(m.comment)
m.comment = "A better description than the one I provided originally"
Nota
O atributo description
é um sinônimo de comment
. O código anterior também pode ser escrito desta forma:
print(m.description)
m.description = "A better description than the one I provided originally"
Dica
Você também pode definir o comentário de um modelo em SQL usando ALTER MODEL.
Renomeação de um modelo¶
Use o método rename
para renomear ou mover um modelo. Especifique um nome totalmente qualificado como o novo nome para mover o modelo para um banco de dados ou esquema diferente.
m.rename("MY_MODEL_TOO")
Dica
Você também pode renomear um modelo em SQL usando ALTER MODEL.
Como trabalhar com versões de modelo¶
Um modelo pode ter versões ilimitadas, cada uma identificada por uma cadeia de caracteres. Você pode usar qualquer convenção de nomenclatura de versão que desejar. Registrar um modelo na verdade registra uma versão específica do modelo. Para registrar versões adicionais de um modelo, chame log_model
novamente com o mesmo model_name
, mas com um version_name
diferente.
Dica
Em SQL, use SHOW VERSIONS IN MODEL para ver as versões de um modelo.
Uma versão de um modelo é representada por uma instância da classe snowflake.ml.model.ModelVersion
.
Para obter uma lista de todas as versões de um modelo, chame o método versions
do objeto modelo. O resultado é uma lista de instâncias ModelVersion
:
version_list = m.versions()
Para obter informações sobre cada modelo como um DataFrame, chame o método show_versions
do modelo.
version_df = m.show_versions()
O DataFrame resultante contém as colunas a segui:
Coluna |
Descrição |
---|---|
|
Data e hora em que a versão do modelo foi criada. |
|
Nome da versão. |
|
Banco de dados no qual a versão está armazenada. |
|
Esquema no qual a versão está armazenada. |
|
Nome do modelo ao qual esta versão pertence. |
|
Valor booleano que indica se esta versão é a versão padrão do modelo. |
|
Matriz JSON dos nomes das funções disponíveis nesta versão. |
|
Objeto JSON contendo metadados como pares chave-valor ( |
|
Objeto JSON da seção |
Exclusão das versões do modelo¶
É possível excluir uma versão do modelo usando o método do modelo delete_version
:
m.delete_version("rc1")
Dica
Também é possível excluir uma versão do modelo em SQL usando ALTER MODEL … DROP VERSION.
Versão padrão¶
Uma versão de um modelo pode ser designada como modelo padrão. Recupere ou defina o atributo default
do modelo para obter a versão padrão atual (como um objeto ModelVersion
) ou para alterá-la (usando uma cadeia de caracteres):
default_version = m.default
m.default = "v2"
Dica
Em SQL, use ALTER MODEL para definir a versão padrão.
Aliases da versão de modelo¶
É possível atribuir um alias a uma versão do modelo usando o comando SQL ALTER MODEL. Você pode usar um alias sempre que um nome de versão for necessário, como ao obter uma referência a uma versão de modelo, em Python ou em SQL. Um determinado alias pode ser atribuído a apenas uma versão de modelo por vez.
Além dos aliases que você cria, os seguintes aliases de sistema estão disponíveis em todos os modelos:
DEFAULT
refere-se à versão padrão do modelo.FIRST
refere-se à versão mais antiga do modelo em termos de tempo de criação.LAST
refere-se à versão mais recente do modelo no momento da criação.
Os nomes de alias que você criar não devem ser iguais a nenhum nome de versão ou alias existente no modelo, incluindo aliases do sistema.
Como obter uma referência para uma versão do modelo¶
Para obter uma referência a uma versão específica de um modelo como uma instância ModelVersion
, use o método version
do modelo. Use o atributo default
do modelo para obter a versão padrão do modelo:
m = reg.get_model("MyModel")
mv = m.version("v1")
mv = m.default
Após ter uma referência a uma versão específica de um modelo (como a variável mv
neste exemplo), é possível recuperar ou atualizar seus comentários ou métricas e chamar os métodos (ou funções) do modelo, conforme mostrado nas seções a seguir.
Recuperação e atualização de comentários¶
Assim como acontece com os modelos, as versões do modelo podem ter comentários, que podem ser acessados e definidos por meio do atributo comment
ou description
da versão do modelo.
print(mv.comment)
print(mv.description)
mv.comment = "A model version comment"
mv.description = "Same as setting the comment"
Dica
Também é possível alterar o comentário de uma versão do modelo em SQL usando ALTER MODEL … MODIFY VERSION.
Recuperação e atualização de métricas¶
Métricas são pares chave-valor usados para rastrear a precisão da previsão e outras características da versão do modelo. Você pode definir métricas ao criar uma versão do modelo ou defini-las usando o método set_metric
. Um valor de métrica pode ser qualquer objeto Python que possa ser serializado para JSON, incluindo números, cadeias de caracteres, listas e dicionários. Ao contrário das tags, os nomes das métricas e os valores possíveis não precisam ser definidos antecipadamente.
Uma métrica de precisão de teste pode ser gerada usando accuracy_score
do sklearn:
from sklearn import metrics
test_accuracy = metrics.accuracy_score(test_labels, prediction)
A matriz de confusão pode ser gerada de forma semelhante usando o sklearn:
test_confusion_matrix = metrics.confusion_matrix(test_labels, prediction)
Então é possível definir esses valores como métricas:
# scalar metric
mv.set_metric("test_accuracy", test_accuracy)
# hierarchical (dictionary) metric
mv.set_metric("evaluation_info", {"dataset_used": "my_dataset", "accuracy": test_accuracy, "f1_score": f1_score})
# multivalent (matrix) metric
mv.set_metric("confusion_matrix", test_confusion_matrix)
Para recuperar as métricas de uma versão do modelo como um dicionário Python, use show_metrics
:
metrics = mv.show_metrics()
Para excluir uma métrica, chame delete_metric
:
mv.delete_metric("test_accuracy")
Dica
Também é possível modificar as métricas de uma versão do modelo (que são armazenadas como metadados) em SQL usando ALTER MODEL … MODIFY VERSION.
Recuperação de explicações do modelo¶
O registro do modelo é capaz de explicar os resultados de um modelo, informando quais recursos de entrada contribuem mais para as previsões, calculando os valores de Shapley. Este recurso de versão está disponível por padrão em todas as exibições de modelo criadas no Snowflake 8.31 e posteriores por meio do método explain
do modelo subjacente. É possível chamar explain
de SQL ou por meio de um método run
de exibição de modelo em Python.
Para obter detalhes sobre esse recurso, consulte Explicabilidade do modelo.
Exportação de uma versão do modelo¶
Use mv.export
para exportar os arquivos de um modelo para um diretório local; o diretório é criado se não existir:
mv.export("~/mymodel/")
Por padrão, os arquivos exportados incluem o código, o ambiente para carregar o modelo e os pesos do modelo. Para exportar também os arquivos necessários para executar o modelo em um warehouse, especifique export_mode = ExportMode.FULL
:
mv.export("~/mymodel/", export_mode=ExportMode.FULL)
Carregamento da versão do modelo¶
Use mv.load
para carregar o objeto do modelo Python original que foi adicionado originalmente ao registro. É possível então usar o modelo para inferência como se o tivesse definido em seu código Python:
clf = mv.load()
Para garantir a funcionalidade adequada de um modelo carregado do registro, o ambiente Python de destino (ou seja, as versões do interpretador Python e de todas as bibliotecas) deve ser idêntico ao ambiente do qual o modelo foi registrado. Especifique force=True
na chamada load
para forçar o carregamento do modelo mesmo que o ambiente seja diferente.
Dica
Para garantir que seu ambiente seja o mesmo onde o modelo está hospedado, baixe uma cópia do ambiente conda do registro do modelo:
conda_env = session.file.get("snow://model/<modelName>/versions/<versionName>/runtimes/python_runtime/env/conda.yml", ".")
open("~/conda.yml", "w").write(conda_env)
Em seguida, crie um novo ambiente conda a partir deste arquivo:
conda env create --name newenv --file=~/conda.yml
conda activate newenv
O argumento options
opcional é um dicionário de opções para carregar o modelo. Atualmente, o argumento oferece suporte apenas à opção use_gpu
.
Opção |
Tipo |
Descrição |
Padrão |
---|---|---|---|
|
|
Habilita a lógica de carregamento específica da GPU. |
|
O exemplo a seguir ilustra o uso do argumento options
:
clf = mv.load(options={"use_gpu": True})
Como chamar métodos de modelo¶
As versões do modelo podem ter métodos, que são funções anexadas que podem ser executadas para realizar inferência ou outras operações do modelo. As versões de um modelo podem ter métodos diferentes e as assinaturas desses métodos também podem ser diferentes.
Para chamar um método de uma versão de modelo, use mv.run
, em que mv
é um objeto ModelVersion
. Especifique o nome da função a ser chamada e passe um Snowpark ou pandas DataFrame que contenha os dados de inferência, juntamente com os parâmetros necessários. O método é executado em um warehouse Snowflake.
O valor de retorno do método é um Snowpark ou pandas DataFrame, que corresponde ao tipo de DataFrame passado. DataFrames Snowpark são avaliados lentamente, então o método é executado somente quando o método do DataFrame collect
, show
ou to_pandas
for chamado.
Nota
Invocar um método executa-o no warehouse especificado na sessão que você está usando para se conectar ao registro. Consulte Especificação de um warehouse.
O exemplo a seguir ilustra a execução do método predict
de um modelo. O método predict
deste modelo não requer nenhum parâmetro além dos dados de inferência (test_features
aqui). Se assim fosse, eles seriam passados como argumentos adicionais após os dados de inferência.
remote_prediction = mv.run(test_features, function_name="predict")
remote_prediction.show() # assuming test_features is Snowpark DataFrame
Para ver quais métodos podem ser chamados em um determinado modelo, chame mv.show_functions
. O valor de retorno deste método é uma lista de objetos ModelFunctionInfo
. Cada um desses objetos inclui os seguintes atributos:
name
: o nome da função que pode ser chamada em Python ou SQL.target_method
: o nome do método Python no modelo registrado original.
Dica
Você também pode chamar métodos de modelo em SQL. Consulte Comandos de modelo.
Considerações sobre custo¶
O uso do registro de modelo do Snowflake incorre em custos padrão baseados no consumo do Snowflake. Isso inclui:
Custo de armazenamento de artefatos, metadados e funções do modelo. Para obter informações gerais sobre os custos de armazenamento, consulte Exploração do custo de armazenamento.
Custo de cópia de arquivos entre estágios para o Snowflake. Consulte COPY FILES.
Custo de operações de objetos de modelo sem servidor por meio da interface Snowsight UI ou SQL ou Python, como mostra os modelos e versões de modelo e alteração de comentários, tags e métricas do modelo.
Custos de computação do warehouse, que variam de acordo com o tipo de modelo e a quantidade de dados usados na inferência. Para obter informações gerais sobre os custos de computação do Snowflake, consulte Explicação dos custos de computação. Os custos de computação do warehouse são incorridos para:
Operações de criação de modelo e versão
Invocação dos métodos de um modelo