Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

カスタムモデルの展開と管理

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

Firebase コンソールまたは Firebase Admin Python および Node.js SDK のいずれかを使用して、カスタム モデルと AutoML でトレーニングされたモデルをデプロイおよび管理できます。モデルをデプロイして時々更新するだけの場合は、通常、Firebase コンソールを使用するのが最も簡単です。 Admin 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 を使用して一般的なモデルの展開および管理タスクを完了する方法を示します。追加のヘルプについては、 PythonまたはNode.jsの SDK リファレンスを参照してください。

SDK の使用例については、 Python クイックスタート サンプルNode.js クイックスタート サンプル を参照してください。

あなたが始める前に

  1. Firebase プロジェクトがまだない場合は、 Firebase コンソールで新しいプロジェクトを作成します。次に、プロジェクトを開き、次の操作を行います。

    1. [設定]ページで、サービス アカウントを作成し、サービス アカウント キー ファイルをダウンロードします。このファイルは、プロジェクトへの管理者アクセスを許可するため、安全に保管してください。

    2. [ストレージ] ページで、Cloud Storage を有効にします。バケット名をメモします。

      モデル ファイルを Firebase プロジェクトに追加する際に一時的にモデル ファイルを保存するには、Cloud Storage バケットが必要です。 Blaze プランを利用している場合は、この目的のためにデフォルト以外のバケットを作成して使用できます。

    3. Firebase ML ページで、まだ Firebase ML を有効にしていない場合は、[開始する] をクリックします。

  2. Google API コンソールで Firebase プロジェクトを開き、Firebase ML API を有効にします。

  3. Admin SDK をインストールして初期化します

    SDK を初期化するときに、サービス アカウントの認証情報と、モデルの保存に使用する Cloud Storage バケットを指定します。

    パイソン

    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 モデルをデプロイするには、プロジェクトにアップロードしてから公開します。

パイソン

# 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 バケットに 1 ステップでアップロードできます。次に、TensorFlow Lite ファイルをデプロイするのと同じ方法でデプロイします。

パイソン

# 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 に変換して、1 つのステップでアップロードすることもできます。 HDF5 ファイルに保存された Keras モデルを使用できます。

パイソン

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 モデルを変換してアップロードすることもできます。

パイソン

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 AutoML Cloud API から取得したモデルの ID。

パイソン

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

プロジェクトのモデルを一覧表示する

プロジェクトのモデルを一覧表示し、必要に応じて結果をフィルタリングできます。

パイソン

# 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

フィルターをANDOR 、およびNOT演算子と括弧 ( ( , ) ) で結合します。

モデルの更新

プロジェクトにモデルを追加したら、その表示名、タグ、およびtfliteモデル ファイルを更新できます。

パイソン

# 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 を unpublish メソッドまたは delete メソッドに渡します。モデルを非公開にすると、モデルはプロジェクトに残りますが、アプリでダウンロードできなくなります。モデルを削除すると、プロジェクトから完全に削除されます。 (モデルの非公開は標準的なワークフローでは想定されていませんが、誤って公開してまだどこにも使用されていない新しいモデルをすぐに非公開にする場合や、ユーザーが「悪い」モデルをダウンロードする方が悪い場合に使用できます。モデルが見つからないというエラーを取得するよりもモデルを使用してください)。

モデル オブジェクトへの参照がまだない場合は、プロジェクトのモデルをフィルターで一覧表示して、モデル ID を取得する必要があります。たとえば、「face_detector」とタグ付けされたすべてのモデルを削除するには:

パイソン

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