部署和管理自定義模型

您可以使用 Firebase 控制台或 Firebase 管理 Python 和 Node.js SDK 來部署和管理自定義模型以及經過 AutoML 訓練的模型。如果您只想部署模型並偶爾更新它,通常最簡單的方法是使用 Firebase 控制台。管理 SDK 在與構建管道集成、使用 Colab 或 Jupyter 筆記本以及其他工作流程時非常有用。

在 Firebase 控制台中部署和管理模型

TensorFlow Lite 模型

要使用 Firebase 控制台部署 TensorFlow Lite 模型:

  1. 在 Firebase 控制台中打開Firebase ML 自定義模型頁面
  2. 單擊添加自定義模型(或添加其他模型)。
  3. 指定用於在 Firebase 項目中識別模型的名稱,然後上傳 TensorFlow Lite 模型文件(通常以.tflite.lite結尾)。

部署模型後,您可以在自定義頁面上找到它。從那裡,您可以完成諸如使用新文件更新模型、下載模型以及從項目中刪除模型等任務。

使用 Firebase Admin SDK 部署和管理模型

本部分介紹如何使用 Admin SDK 完成常見模型部署和管理任務。請參閱PythonNode.js的 SDK 參考以獲取更多幫助。

有關使用的 SDK 的示例,請參閱Python 快速入門示例Node.js 快速入門示例

在你開始之前

  1. 如果您還沒有 Firebase 項目,請在Firebase 控制台中創建一個新項目。然後,打開您的項目並執行以下操作:

    1. “設置”頁面上,創建服務帳戶並下載服務帳戶密鑰文件。確保此文件安全,因為它授予管理員對您的項目的訪問權限。

    2. 在存儲頁面,啟用雲存儲。記下您的存儲桶名稱。

      您需要一個 Cloud Storage 存儲分區來臨時存儲模型文件,同時將它們添加到 Firebase 項目中。如果您使用 Blaze 計劃,則可以為此目的創建並使用默認存儲桶以外的存儲桶。

    3. 如果您尚未啟用 Firebase ML,請在 Firebase ML 頁面上單擊開始

  2. Google API 控制台中,打開您的 Firebase 項目並啟用 Firebase ML API。

  3. 安裝並初始化管理 SDK

    初始化 SDK 時,指定您的服務帳號憑據以及要用於存儲模型的 Cloud Storage 存儲桶:

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

部署模型

TensorFlow Lite 文件

要從模型文件部署 TensorFlow Lite 模型,請將其上傳到您的項目,然後發布:

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

TensorFlow 和 Keras 模型

借助 Python SDK,您只需一步即可將模型從 TensorFlow 保存的模型格式轉換為 TensorFlow Lite,並將其上傳到您的 Cloud Storage 存儲桶。然後,以與部署 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)

如果您有 Keras 模型,還可以將其轉換為 TensorFlow Lite 並一步上傳。您可以使用保存到 HDF5 文件的 Keras 模型:

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

或者,您可以直接從訓練腳本轉換並上傳 Keras 模型:

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

AutoML TensorFlow Lite 模型

如果您使用AutoML Cloud API或 Google Cloud Console UI 訓練了 Edge 模型,則可以使用 Admin SDK 將模型部署到 Firebase。

您需要指定模型的資源標識符,它是一個類似於以下示例的字符串:

projects/PROJECT_NUMBER/locations/STORAGE_LOCATION/models/MODEL_ID
PROJECT_NUMBER包含模型的 Cloud Storage 存儲分區的項目編號。這可能是您的 Firebase 項目或其他 Google Cloud 項目。您可以在 Firebase 控制台或 Google Cloud Console 信息中心的“設置”頁面上找到該值。
STORAGE_LOCATION包含模型的 Cloud Storage 存儲分區的資源位置。該值始終為us-central1
MODEL_ID模型的 ID,您從 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);

列出您的項目模型

您可以列出項目的模型,並可選擇過濾結果:

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

您可以按以下字段進行過濾:

場地例子
display_name display_name = example_model
display_name != example_model

所有帶有experimental_前綴的顯示名稱:

display_name : experimental_*

請注意,僅支持前綴匹配。

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

使用ANDORNOT運算符以及括號 ( ( , ) ) 組合過濾器。

更新模型

將模型添加到項目後,您可以更新其顯示名稱、標籤和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);

取消發布或刪除模型

要取消發布或刪除模型,請將模型 ID 傳遞給取消發布或刪除方法。當您取消發布模型時,它仍保留在您的項目中,但無法供您的應用程序下載。當您刪除模型時,它會從您的項目中完全刪除。 (在標準工作流程中不需要取消發布模型,但您可以使用它來立即取消發布您意外發布且尚未在任何地方使用的新模型,或者在用戶下載“不良”模型更糟糕的情況下模型而不是得到模型未找到的錯誤。)

如果您仍然沒有對 Model 對象的引用,您可能需要通過使用過濾器列出項目的模型來獲取模型 ID。例如,要刪除所有標記為“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);