Implantar e gerenciar modelos personalizados

É possível implantar e gerenciar modelos personalizados e treinados pelo AutoML usando o Console do Firebase ou os SDKs do Node.js e do Python do Administrador do Firebase. Se você quer apenas implantar um modelo e atualizá-lo de vez em quando, geralmente é mais simples usar o Console do Firebase. O SDK Admin pode ser útil ao integrar com pipelines de compilação, trabalhar com notebooks do Colab ou Jupyter e outros fluxos de trabalho.

Implantar e gerenciar modelos no Console do Firebase

Modelos do TensorFlow Lite

Para implantar um modelo do TensorFlow Lite usando o Console do Firebase:

  1. Abra a página de modelos personalizados do Firebase ML no Console do Firebase.
  2. Clique em Adicionar modelo personalizado ou Adicionar outro modelo.
  3. Especifique um nome que será usado para identificar o modelo no projeto do Firebase e faça o upload do arquivo de modelo do TensorFlow Lite (geralmente terminando em .tflite ou .lite).

Depois de implantar o modelo, você poderá encontrá-lo na página de personalização. A partir daí, é possível concluir tarefas como atualizar o modelo com um novo arquivo, fazer o download do modelo e excluí-lo do projeto.

Implantar e gerenciar modelos com o SDK Admin do Firebase

Nesta seção, mostramos como concluir tarefas comuns de implantação e gerenciamento de modelos com o SDK Admin. Consulte a referência do SDK para Python ou Node.js para mais ajuda.

Para exemplos do SDK em uso, consulte as amostras do guia de início rápido do Python e do guia de início rápido do Node.js (links em inglês).

Antes de começar

  1. Se você ainda não tiver um projeto do Firebase, crie um novo no Console do Firebase. Em seguida, abra o projeto e faça o seguinte:

    1. Na página Configurações, crie uma conta de serviço e faça o download do arquivo de chave da conta de serviço. Mantenha esse arquivo seguro porque ele concede acesso de administrador ao seu projeto.

    2. Na página "Storage", ative o Cloud Storage. Anote o nome do bucket.

      Você precisa de um bucket do Cloud Storage para armazenar arquivos de modelos temporariamente enquanto os adiciona ao seu projeto do Firebase. Se você estiver no plano Blaze, poderá criar e usar um bucket diferente do padrão para essa finalidade.

    3. Na página do Firebase ML, clique em Primeiros passos se você ainda não ativou o Firebase ML.

  2. No Console de APIs do Google, abra o projeto do Firebase e ative a API Firebase ML.

  3. Instale e inicialize o SDK Admin.

    Ao inicializar o SDK, especifique as credenciais da conta de serviço e o bucket do Cloud Storage que você quer usar para armazenar os modelos:

    Python

    import firebase_admin
    from firebase_admin import ml
    from firebase_admin import credentials
    
    firebase_admin.initialize_app(
      credentials.Certificate('/path/to/your/service_account_key.json'),
      options={
          'storageBucket': 'your-storage-bucket',
      })
    

    Node.js

    const admin = require('firebase-admin');
    const serviceAccount = require('/path/to/your/service_account_key.json');
    admin.initializeApp({
      credential: admin.credential.cert(serviceAccount),
      storageBucket: 'your-storage-bucket',
    });
    const ml = admin.machineLearning();
    

Implantar modelos

Arquivos do TensorFlow Lite

Para implantar um modelo do TensorFlow Lite usando um arquivo de modelo, faça o upload dele no projeto e publique-o:

Python

# First, import and initialize the SDK as shown above.

# Load a tflite file and upload it to Cloud Storage
source = ml.TFLiteGCSModelSource.from_tflite_model_file('example.tflite')

# Create the model object
tflite_format = ml.TFLiteFormat(model_source=source)
model = ml.Model(
    display_name="example_model",  # This is the name you use from your app to load the model.
    tags=["examples"],             # Optional tags for easier management.
    model_format=tflite_format)

# Add the model to your Firebase project and publish it
new_model = ml.create_model(model)
ml.publish_model(new_model.model_id)

Node.js

// First, import and initialize the SDK as shown above.

(async () => {
  // Upload the tflite file to Cloud Storage
  const storageBucket = admin.storage().bucket('your-storage-bucket');
  const files = await storageBucket.upload('./example.tflite');

  // Create the model object and add the model to your Firebase project.
  const bucket = files[0].metadata.bucket;
  const name = files[0].metadata.name;
  const gcsUri = `gs:/⁠/${bucket}/${name}`;
  const model = await ml.createModel({
    displayName: 'example_model',  // This is the name you use from your app to load the model.
    tags: ['examples'],  // Optional tags for easier management.
    tfliteModel: { gcsTfliteUri: gcsUri },
  });

  // Publish the model.
  await ml.publishModel(model.modelId);

  process.exit();
})().catch(console.error);

Modelos do TensorFlow e da Keras

Com o SDK do Python, é possível converter um modelo do formato de modelo salvo do TensorFlow para o TensorFlow Lite e fazer upload dele para o bucket do Cloud Storage em uma única etapa. Em seguida, implante-o da mesma maneira que um arquivo do TensorFlow Lite.

Python

# First, import and initialize the SDK as shown above.

# Convert the model to TensorFlow Lite and upload it to Cloud Storage
source = ml.TFLiteGCSModelSource.from_saved_model('./model_directory')

# Create the model object
tflite_format = ml.TFLiteFormat(model_source=source)
model = ml.Model(
    display_name="example_model",  # This is the name you use from your app to load the model.
    tags=["examples"],             # Optional tags for easier management.
    model_format=tflite_format)

# Add the model to your Firebase project and publish it
new_model = ml.create_model(model)
ml.publish_model(new_model.model_id)

Se você tiver um modelo da Keras, também poderá convertê-lo para o TensorFlow Lite e fazer upload dele em uma única etapa. É possível usar um modelo da Keras salvo em um arquivo HDF5:

Python

import tensorflow as tf

# Load a Keras model, convert it to TensorFlow Lite, and upload it to Cloud Storage
model = tf.keras.models.load_model('your_model.h5')
source = ml.TFLiteGCSModelSource.from_keras_model(model)

# Create the model object, add the model to your project, and publish it. (See
# above.)
# ...

Ou é possível converter e fazer upload de um modelo da Keras diretamente do script de treinamento:

Python

import tensorflow as tf

# Create a simple Keras model.
x = [-1, 0, 1, 2, 3, 4]
y = [-3, -1, 1, 3, 5, 7]

model = tf.keras.models.Sequential(
    [tf.keras.layers.Dense(units=1, input_shape=[1])])
model.compile(optimizer='sgd', loss='mean_squared_error')
model.fit(x, y, epochs=3)

# Convert the model to TensorFlow Lite and upload it to Cloud Storage
source = ml.TFLiteGCSModelSource.from_keras_model(model)

# Create the model object, add the model to your project, and publish it. (See
# above.)
# ...

Modelos do TensorFlow Lite do AutoML

Se você treinou um modelo do Edge com a API AutoML do Cloud ou com a IU do console do Google Cloud, é possível implantá-lo no Firebase usando o SDK Admin.

Você precisará especificar o identificador de recurso do modelo, que é uma string semelhante ao exemplo a seguir:

projects/PROJECT_NUMBER/locations/STORAGE_LOCATION/models/MODEL_ID
PROJECT_NUMBER O número do projeto do bucket do Cloud Storage que contém o modelo. Pode ser seu projeto do Firebase ou outro projeto do Google Cloud. Esse valor pode ser encontrado na página "Configurações" do Console do Firebase ou no painel do Console do Google Cloud.
STORAGE_LOCATION O local do recurso do bucket do Cloud Storage que contém o modelo. Esse valor é sempre us-central1.
MODEL_ID O ID do modelo que você recebeu da API AutoML do Cloud.

Python

# First, import and initialize the SDK as shown above.

# Get a reference to the AutoML model
source = ml.TFLiteAutoMlSource('projects/{}/locations/{}/models/{}'.format(
    # See above for information on these values.
    project_number,
    storage_location,
    model_id
))

# Create the model object
tflite_format = ml.TFLiteFormat(model_source=source)
model = ml.Model(
    display_name="example_model",  # This is the name you will use from your app to load the model.
    tags=["examples"],             # Optional tags for easier management.
    model_format=tflite_format)

# Add the model to your Firebase project and publish it
new_model = ml.create_model(model)
new_model.wait_for_unlocked()
ml.publish_model(new_model.model_id)

Node.js

// First, import and initialize the SDK as shown above.

(async () => {
  // Get a reference to the AutoML model. See above for information on these
  // values.
  const automlModel = `projects/${projectNumber}/locations/${storageLocation}/models/${modelId}`;

  // Create the model object and add the model to your Firebase project.
  const model = await ml.createModel({
    displayName: 'example_model',  // This is the name you use from your app to load the model.
    tags: ['examples'],  // Optional tags for easier management.
    tfliteModel: { automlModel: automlModel },
  });

  // Wait for the model to be ready.
  await model.waitForUnlocked();

  // Publish the model.
  await ml.publishModel(model.modelId);

  process.exit();
})().catch(console.error);

Listar os modelos do seu projeto

É possível listar os modelos do seu projeto, filtrando opcionalmente os resultados:

Python

# First, import and initialize the SDK as shown above.

face_detectors = ml.list_models(list_filter="tags: face_detector").iterate_all()
print("Face detection models:")
for model in face_detectors:
  print('{} (ID: {})'.format(model.display_name, model.model_id))

Node.js

// First, import and initialize the SDK as shown above.

(async () => {
  let listOptions = {filter: 'tags: face_detector'}
  let models;
  let pageToken = null;
  do {
    if (pageToken) listOptions.pageToken = pageToken;
    ({models, pageToken} = await ml.listModels(listOptions));
    for (const model of models) {
      console.log(`${model.displayName} (ID: ${model.modelId})`);
    }
  } while (pageToken != null);

  process.exit();
})().catch(console.error);

É possível filtrar pelos seguintes campos:

Campo Exemplos
display_name display_name = example_model
display_name != example_model

Todos os nomes de exibição com o prefixo experimental_:

display_name : experimental_*

Apenas a correspondência de prefixo é compatível.

tags tags: face_detector
tags: face_detector AND tags: experimental
state.published state.published = true
state.published = false

Combine filtros com os operadores e parênteses AND, OR e NOT ((, )).

Atualizar modelos

Depois de adicionar um modelo ao projeto, atualize o nome de exibição, as tags e o arquivo de modelo tflite:

Python

# First, import and initialize the SDK as shown above.

model = ...   # Model object from create_model(), get_model(), or list_models()

# Update the model with a new tflite model. (You could also update with a
# `TFLiteAutoMlSource`)
source = ml.TFLiteGCSModelSource.from_tflite_model_file('example_v2.tflite')
model.model_format = ml.TFLiteFormat(model_source=source)

# Update the model's display name.
model.display_name = "example_model"

# Update the model's tags.
model.tags = ["examples", "new_models"]

# Add a new tag.
model.tags += "experimental"

# After you change the fields you want to update, save the model changes to
# Firebase and publish it.
updated_model = ml.update_model(model)
ml.publish_model(updated_model.model_id)

Node.js

// First, import and initialize the SDK as shown above.

(async () => {
  const model = ... // Model object from createModel(), getModel(), or listModels()

  // Upload a new tflite file to Cloud Storage.
  const files = await storageBucket.upload('./example_v2.tflite');
  const bucket = files[0].metadata.bucket;
  const name = files[0].metadata.name;

  // Update the model. Any fields you omit will be unchanged.
  await ml.updateModel(model.modelId, {
    displayName: 'example_model',  // Update the model's display name.
    tags: model.tags.concat(['new']),  // Add a tag.
    tfliteModel: {gcsTfliteUri: `gs:/⁠/${bucket}/${name}`},
  });

  process.exit();
})().catch(console.error);

Cancelar publicação ou excluir modelos

Para cancelar a publicação ou excluir um modelo, transmita o ID do modelo para os métodos de publicação ou exclusão. Quando você cancela a publicação de um modelo, ele permanece no projeto, mas não fica disponível para download dos aplicativos. Quando você exclui um modelo, ele é completamente removido do projeto. O cancelamento da publicação de um modelo não é esperada em um fluxo de trabalho padrão, mas é possível usá-lo para cancelar imediatamente a publicação de um novo modelo que você tiver publicado acidentalmente e ainda não estiver sendo usado em nenhum lugar, ou quando for pior para os usuários fazer o download de um modelo "ruim" do que receber erros de modelo não encontrado.

Se você ainda não tiver uma referência ao objeto Modelo, provavelmente precisará obter o ID do modelo listando os modelos do projeto com um filtro. Por exemplo, para excluir todos os modelos marcados como "face_detector":

Python

# First, import and initialize the SDK as shown above.

face_detectors = ml.list_models(list_filter="tags: 'face_detector'").iterate_all()
for model in face_detectors:
  ml.delete_model(model.model_id)

Node.js

// First, import and initialize the SDK as shown above.

(async () => {
  let listOptions = {filter: 'tags: face_detector'}
  let models;
  let pageToken = null;
  do {
    if (pageToken) listOptions.pageToken = pageToken;
    ({models, pageToken} = await ml.listModels(listOptions));
    for (const model of models) {
      await ml.deleteModel(model.modelId);
    }
  } while (pageToken != null);

  process.exit();
})().catch(console.error);