部署和管理自訂模型

您可以使用 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 控制台 UI 訓練了 Edge 模型,則可以使用 Admin SDK 將模型部署到 Firebase。

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

projects/PROJECT_NUMBER/locations/STORAGE_LOCATION/models/MODEL_ID
PROJECT_NUMBER包含模型的 Cloud Storage 儲存分區的項目編號。這可能是您的 Firebase 專案或其他 Google Cloud 專案。您可以在 Firebase 控制台或 Google Cloud 控制台資訊中心的「設定」頁面上找到該值。
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);