Wdrażanie modeli niestandardowych i zarządzanie nimi

Modele niestandardowe i modele wytrenowane za pomocą AutoML możesz wdrażać i zarządzać nimi za pomocą konsoli Firebase lub pakietów Firebase Admin Python i Node.js SDK. Jeśli chcesz po prostu wdrażać model i co jakiś czas go aktualizować, zwykle najprostszym sposobem jest użycie konsoli Firebase. Pakiet Admin SDK może być pomocny przy integracji z tworzeniem potoków, podczas pracy z notatnikami Colab lub Jupyter oraz innymi przepływami pracy.

Wdrażanie modeli i zarządzanie nimi w konsoli Firebase

Modele TensorFlow Lite

Aby wdrożyć model TensorFlow Lite za pomocą konsoli Firebase:

  1. Otwórz stronę modelu niestandardowego Firebase ML w konsoli Firebase.
  2. Kliknij Dodaj model niestandardowy (lub Dodaj inny model).
  3. Podaj nazwę, która będzie używana do identyfikowania modelu w projekcie Firebase, a potem prześlij plik modelu TensorFlow Lite (zazwyczaj kończy się na .tflite lub .lite).

Po wdrożeniu modelu możesz go znaleźć na stronie „Niestandardowe”. Następnie możesz wykonać takie zadania jak aktualizacja modelu o nowym pliku, pobranie modelu i usunięcie go z projektu.

Wdrażanie modeli i zarządzanie nimi za pomocą pakietu Firebase Admin SDK

W tej sekcji dowiesz się, jak za pomocą pakietu Admin SDK wykonać typowe zadania związane z wdrażaniem modelu i zarządzaniem. Więcej informacji znajdziesz w dokumentacji pakietu SDK dla języków Python i Node.js.

Przykłady użycia pakietu SDK znajdziesz w przykładowym pliku Python quickstartpliku quickstart Node.js.

Zanim zaczniesz

  1. Jeśli nie masz jeszcze projektu Firebase, utwórz nowy w konsoliFirebase. Następnie otwórz projekt i wykonaj te czynności:

    1. Na stronie Ustawienia utwórz konto usługi i pobierz plik klucza konta usługi. Zachowaj ten plik w bezpiecznym miejscu, ponieważ daje on dostęp administracyjny do Twojego projektu.

    2. Na stronie Miejsce na dane włącz Cloud Storage. Zapisz nazwę zasobnika.

      Potrzebujesz zasobnika Cloud Storage, aby tymczasowo przechowywać pliki modelu podczas dodawania ich do projektu Firebase. Jeśli korzystasz z abonamentu Blaze, możesz na potrzeby tego celu utworzyć zasobnik inny niż domyślny.

    3. Jeśli nie masz jeszcze włączonego interfejsu Firebase ML, na stronie Firebase ML kliknij Rozpocznij.

  2. W Konsoli interfejsów API Google otwórz projekt Firebase i włącz interfejs Firebase ML API.

  3. Zainstaluj i inicjuj pakiet Admin SDK

    Podczas inicjowania pakietu SDK podaj dane logowania do konta usługi oraz Cloud Storage zasobnik, którego chcesz używać do przechowywania modeli:

    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();
    

Wdrażanie modeli

pliki TensorFlow Lite,

Aby wdrożyć model TensorFlow Lite z pliku modelu, prześlij go do swojego projektu i opublikuj:

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);

modele TensorFlow i Keras;

Pakiet SDK Pythona pozwala przekonwertować model z formatu zapisanego modelu TensorFlow na TensorFlow Lite i w jednym kroku przesłać go do zasobnika Cloud Storage. Następnie wdrożyć go w taki sam sposób jak plik 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)

Jeśli masz model Keras, możesz go przekonwertować do formatu TensorFlow Lite i przesłać w jednym kroku. Możesz użyć modelu Keras zapisanego w pliku 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.)
# ...

Możesz też przekonwertować i przesłać model Keras bezpośrednio z trenu skryptu:

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.)
# ...

Modele AutoML TensorFlow Lite

Jeśli model Edge został wytrenowany za pomocą interfejsu AutoML Cloud API lub interfejsu użytkownika konsoli Google Cloud, możesz go wdrożyć w Firebase za pomocą pakietu Admin SDK.

Musisz podać identyfikator zasobu modelu, który jest ciągiem znaków podobnym do tego:

projects/PROJECT_NUMBER/locations/STORAGE_LOCATION/models/MODEL_ID
PROJECT_NUMBER Numer projektu zasobnika Cloud Storage, który zawiera model. Może to być Twój projekt Firebase lub inny projekt Google Cloud. Wartość tę znajdziesz na stronie Ustawienia w konsoli Firebase lub na pulpicie konsoli Google Cloud.
STORAGE_LOCATION Lokalizacja zasobu w zasobniku Cloud Storage zawierającym model. Ta wartość jest zawsze us-central1.
MODEL_ID Identyfikator modelu pobrany z interfejsu AutoML Cloud API.

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);

Wyświetlanie listy modeli w projekcie

Możesz wyświetlić listę modeli projektu i opcjonalnie filtrować wyniki:

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);

Dane możesz filtrować według tych pól:

Pole Przykłady
display_name display_name = example_model
display_name != example_model

Wszystkie wyświetlane nazwy z preiksem experimental_:

display_name : experimental_*

Pamiętaj, że obsługiwane jest tylko dopasowywanie prefiksów.

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

Łącz filtry za pomocą operatorów AND, OR i NOT oraz nawiasów ((, )).

Aktualizowanie modeli

Po dodaniu modelu do projektu możesz zaktualizować jego wyświetlaną nazwę, tagi i plik modelu 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);

Cofanie publikacji i usuwanie modeli

Aby cofnąć publikację lub usunąć model, przekaż identyfikator modelu do metody cofnięcia publikacji lub usunięcia. Gdy cofniesz publikację modelu, pozostanie on w Twoim projekcie, ale nie będzie dostępny do pobrania przez Twoje aplikacje. Gdy usuniesz model, zostanie on całkowicie usunięty z Twojego projektu. (cofanie publikacji modelu nie jest przewidziane w standardowym workflow, ale możesz użyć tej opcji, aby natychmiast wycofać nowy model, który został opublikowany przez pomyłkę i nie jest jeszcze używany, lub w przypadkach, gdy dla użytkowników lepszym rozwiązaniem jest pobranie „złego” modelu niż wyświetlenie błędu „Nie znaleziono modelu”).

Jeśli nadal nie masz odwołania do obiektu Model, prawdopodobnie musisz uzyskać identyfikator modelu, wyświetlając modele projektu za pomocą filtra. Aby na przykład usunąć wszystkie modele z tagiem „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);