部署及管理自訂模型

您可以使用下列兩種方式部署及管理自訂模型和 AutoML 訓練的模型: Firebase 控制台,或是 Firebase Admin Python 和 Node.js SDK。如果發生以下情況: 只想部署模型並不定期更新時,最簡單的方式就是 請使用 Firebase 控制台。Admin SDK 可有效整合 建構管線、使用 Colab 或 Jupyter 筆記本和其他工作流程

Firebase 控制台中部署及管理模型

TensorFlow Lite 模型

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

  1. 在「自訂模型」頁面中開啟Firebase ML「自訂模型」頁面Firebase 控制台。
  2. 按一下「新增自訂模式」或「新增其他模式」
  3. 指定在 Firebase 專案中用於識別模型的名稱,然後上傳 TensorFlow Lite 模型檔案 (通常結尾為 .tflite.lite)。

部署模型後,您可以在「自訂」頁面中找到該模型。接下來 像是用新檔案更新模型、下載 並從專案中刪除模型

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

本節說明如何完成常見的模型部署與管理作業 運用 Admin SDK 完成任務請參閱 Python 的 SDK 參考資料 或 Node.js 來取得其他說明。

如需使用中 SDK 的範例,請參閱 Python 快速入門導覽課程範例Node.js 快速入門導覽課程範例

事前準備

  1. 如果您還沒有 Firebase 專案,請在 Firebase 控制台。接著,請開啟專案並執行下列操作:

    1. 在「Settings」頁面中建立服務帳戶,然後下載服務帳戶金鑰檔案。這個檔案安全無虞,因此請妥善保存 授予專案的管理員存取權

    2. 在「Storage」頁面上啟用 Cloud Storage。請記下值區名稱。

      您需要 Cloud Storage 值區,才能暫時儲存模型檔案 加入 Firebase 專案如果您使用的是 Blaze 除了預設值區外,您也能建立及使用預設值區 發展路徑可能包括 縮小技術提議用途的範圍

    3. 如果您尚未在 Firebase ML 頁面中點選「開始使用」,請先完成這項操作。 已啟用「Firebase ML」。

  2. Google API 控制台中,開啟 Firebase ,並啟用 Firebase ML API

  3. 安裝並初始化 Admin 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 訓練 Edge 模型 或透過 Google Cloud 控制台 UI,您可以使用以下方法將模型部署至 Firebase: Admin SDK

您必須指定模型的資源 ID,該 ID 是 如下所示:

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 從 AutoML Cloud API 取得的模型 ID。

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