Suporte a Artefatos Grandes no Catálogo de Modelos

O tamanho máximo de um artefato de modelo é de 6 GB.

As opções da Console para fazer upload de modelos só suportam artefatos de modelo de até 100 MB de tamanho. Para fazer upload de artefatos de modelo grandes, todos os exemplos a seguir usam Python e ADS. Há suporte para artefatos de modelo grande copiando um artefato de um bucket do Object Storage para o bucket de serviço do catálogo de modelos.

Etapas Preliminares para Usar o ADS

Primeiro, crie alguns métodos de utilitário para que o exemplo funcione:

import os
import oci
import random
import warnings
import numpy as np

import ads
from ads.catalog.model import ModelCatalog
from ads.common.model_metadata import UseCaseType
from ads.model.generic_model import GenericModel

from numpy import array
from numpy import ndarray
from shutil import rmtree

ads.set_auth("resource_principal")
warnings.filterwarnings('ignore')

# ads.set_auth("api_key")
# ads.set_debug_mode(False)
# auth = {"config": oci.config.from_file(os.path.join("~/.oci", "config"))}

from sklearn.datasets import make_classification
import pandas as pd
import os

class Size:
    MB_20 = 6000
    MB_200 = 60000
    MB_2000 = 600000    

def generate_large_csv(size: Size = Size.MB_20, file_path: str = "./large_csv_file.csv"):
    X_big, y_big = make_classification(n_samples=size, n_features=200)
    df_big = pd.concat([pd.DataFrame(X_big), pd.DataFrame(y_big)], axis=0)
    df_big.to_csv(os.path.join(file_path))

Em seguida, crie um modelo de amostra a ser usado nesse exemplo e preencha o modelo com um arquivo CSV de larga escala. Este exemplo usa um arquivo de 20 MB por meio de arquivos de até 6 GB de trabalho.

class Square:
    def predict(self, x):
        x_array = np.array(x)
        return np.ndarray.tolist(x_array * x_array)
    
model = Square()


artifact_dir = "./large_artifact/"

generic_model = GenericModel(
    estimator=model, 
    artifact_dir=artifact_dir
)
generic_model.prepare(
    inference_conda_env="dataexpl_p37_cpu_v3",
    training_conda_env="dataexpl_p37_cpu_v3",
    use_case_type=UseCaseType.MULTINOMIAL_CLASSIFICATION,

    X_sample=X,
    y_sample=array(X) ** 2,
    force_overwrite=True
)

generate_large_csv(Size.MB_20, file_path=os.path.join(artifact_dir, "large_csv_file.csv"))

Salvando um Modelo Grande no Catálogo de Modelos

Você deve ter um bucket do Object Storage para suportar modelos maiores que 2 GB. Você pode criar um bucket na Console ou usando a API do OCI.

Crie um bucket do serviço Object Storage na Console:

  1. Acesse a Console.
  2. Abra o menu de navegação e selecione Armazenamento. Em Object Storage & Archive Storage, selecione Buckets.
  3. Em Escopo da Lista, selecione um Compartimento.
  4. Selecione Criar Bucket.

    Especifique as informações do formulário a seguir no formulário Criar Bucket.

    • Bucket Name: Informe a-bucket-name.
    • Default Storage Tier: Selecione Standard.

      Não selecione as seguintes opções:

      • Ativar Armazenamento Automático em Camadas
      • Ativar Controle de Versão do Objeto
      • Emitir Eventos de Objeto
      • Limpeza de Uploads Multiparte Não Confirmados
    • Encryption: Selecione Encrypt using Oracle Managed Keys
  5. Selecione Criar. O bucket é criado.

Construir o URI do Bucket

O URI do bucket não está listado na página de detalhes do bucket na Console; portanto, você mesmo deve criar o URI. Crie o URI do bucket:

  1. Use o seguinte modelo para criar o URI do bucket:

    oci://<bucket_name>@<namespace>/<objects_folder>/.

    Substitua o nome do bucket pelo que você criou. Para namespace, use um nome de tenancy (por exemplo: my-tenancy). Para a pasta de objetos, use my-object-folder.

    Com os dados fornecidos, o bucket_uri seria: oci://my-bucket-name@my-tenancy/my-object-folder/.

  2. Para fazer upload de artefatos de modelo grande, adicione dois parâmetros extras ao método GenericModel.save(...):
    • bucket_uri: (str, optional) O padrão é Nenhum.

      O URI do Object Storage para o qual o artefato de modelo é copiado temporariamente.

      O bucket_uri só é necessário para fazer upload de artefatos grandes quando o tamanho é maior que 2 GB. No entanto, você também pode usar o método com pequenos artefatos também. Por exemplo:

      oci://<bucket_name>@<namespace>/prefix/.

    • remove_existing_artifact: (bool, optional) O padrão é True.

      O método decide se os artefatos submetidos a upload para o bucket do Object Storage devem ser removidos.

  3. Pegue o artefato de modelo e copie-o de uma sessão de notebook para o bucket_uri.
  4. Em seguida, copie o artefato do bucket (bucket_uri) para o bucket de serviço.

    Se o tamanho do artefato maior que 2 GB e bucket_uri não for fornecido, ocorrerá um erro.

    Por padrão, o atributo remove_existing_artifact é definido como True. O artefato é removido automaticamente do bucket (bucket_uri) após um upload bem-sucedido para o bucket de serviço. Se você não quiser remover o artefato do bucket, defina: remove_existing_artifact = False.

Para resumir, o processo é:

  1. Prepare artefatos de modelo.
  2. Salvar informações base sobre o modelo no catálogo de modelos.
  3. Faça upload de artefatos de modelo para um bucket do Object Storage (bucket_uri).
  4. Faça upload de artefatos de modelo de um bucket para o bucket de serviço do catálogo de modelos.
  5. Remova artefatos temporários de um bucket com base no parâmetro remove_existing_artifact:
    large_model_id = generic_model.save(
        display_name='Generic Model With Large Artifact',
        bucket_uri=<provide bucket uri>,
        remove_existing_artifact=True
    )

Carregando um Modelo Grande no Catálogo de Modelos

Para carregar modelos maiores que 2 GB, adicione dois parâmetros extras ao método GenericModel.from_model_catalog(...):

  • bucket_uri: (str, optional) O padrão é Nenhum.

    O URI do Object Storage para o qual os artefatos de modelo são copiados temporariamente. O bucket_uri só é necessário para fazer download de artefatos grandes com tamanho maior que 2 GB. O método também funciona com os pequenos artefatos. Exemplo: oci://<bucket_name>@<namespace>/prefix/.

  • remove_existing_artifact: (bool, optional) O padrão é `True`.

    O método decide se os artefatos submetidos a upload para o bucket do Object Storage devem ser removidos.

Para resumir, o processo é:

  1. Faça download dos artefatos de modelo do bucket do Object Storage do serviço de catálogo de modelos para um bucket.
  2. Faça download dos artefatos de modelo do bucket para a sessão de notebook.
  3. Remova os artefatos temporários do bucket com base no parâmetro remove_existing_artifact.
  4. Carregue as informações básicas sobre o modelo no catálogo de modelos:

    large_model = GenericModel.from_model_catalog(
        large_model_id,
        "model.pkl",
        "./downloaded_large_artifact/",
        bucket_uri=<provide bucket uri> ,
        force_overwrite=True,
        remove_existing_artifact=True
    )