On-Device Personalization の連携コンピューティングの決定的ビルド

オンデバイスでのワークロード証明書には確定的なビルドが必要です Personalization(ODP)高信頼実行環境(TEE)、以下で一般公開 Confidential Space(CS)としての Google Cloud。

ワークロード イメージは、決定的なイメージハッシュを生成し、 ワークロード証明書の CS(NIST の RFC 9334 リモート認証を使用) 手順(RATS)アーキテクチャをご覧ください。

このドキュメントでは、決定論的手法の実装とサポートについて説明します。 ビルド odp-federatedcompute できます。ODP アグリゲータ サービスと Model Updater サービスは、 Confidential Spaceこのリポジトリでは、決定論的なビルドがサポートされている 本番環境のユースケースに必須です。

確定的なビルド

決定的ビルドは、次の 2 つの主要コンポーネントで構成されています。

  1. 必要なバイナリのコンパイル。これには、jar、共有ライブラリ、 提供します。
  2. ベースイメージとランタイムの依存関係。ランタイム環境のベース コンパイルされたバイナリを実行するために使用されるイメージ。

現在、ODP 連携コンピューティング リポジトリは、次のタイプの ワークロード:

  • Java + Spring ワークロード <ph type="x-smartling-placeholder">
      </ph>
    • TaskAssignment、TaskManagement、Collector
  • JNI TensorFlow ワークロードを使用した Java + Spring <ph type="x-smartling-placeholder">
      </ph>
    • ModelUpdater、Aggregator
  • Python ワークロード <ph type="x-smartling-placeholder">
      </ph>
    • TaskBuilder

依存関係

次のリストは、ODP が決定論を維持するために依存している依存関係です および可用性:

  • Bazel
  • GitHub
  • Maven
  • PyPi
  • Debian スナップショット
  • DockerHub レジストリ
  • Google Container Registry(GCR)

確定的なワークロード

すべてのワークロードは、Bazel を使用してコンパイルされます。 ビルドされたコンテナ イメージ、言語固有のツールチェーン、 rules_ociワークスペース ファイル すべての依存関係を、対応するバージョンおよびハッシュとともに定義します。

Debian スナップショット

すべてのワークロード イメージは、提供されたイメージ内にビルドする必要があります。 dockerfile Debian スナップショット上に構築されています。Debian スナップショットは、安定したリポジトリのスナップショットを確定的に提供します。

  • システム ヘッダーとライブラリ
  • システム アーキテクチャ <ph type="x-smartling-placeholder">
      </ph>
    • linux_x86_64
    • Debian
  • C++ コンパイラ <ph type="x-smartling-placeholder">

Java Spring ワークロード

Bazel remotejdk_17: コンパイル用の密閉型の Java を提供するために使われます。その他の Java 依存関係は、 定義されており、Workspace で 。

Java Spring ワークロードは、 <service>_application.jar。jar には以下のものが入っています。

  • Java クラスファイル
  • META-INF/
    • Bazel マニフェスト データ
  • build-data.properties
    • Bazel ビルドデータ
  • BOOT-INF/
    • パッケージ化された jar 依存関係。 rules_spring

画像レイヤ

Java Spring ワークロード イメージは、次の 2 つのレイヤで構成されています。

  • ベース画像レイヤ <ph type="x-smartling-placeholder">
  • ワークロード レイヤ <ph type="x-smartling-placeholder">
      </ph>
    • binary_tar.tar
      • <service>_application.jar

イメージの構成

  • エントリポイント <ph type="x-smartling-placeholder">
      </ph>
    • java -jar <service>_application.jar

JNI Tensorflow ワークロード

JNI Tensorflow ワークロードは、Java Spring ワークロードの上に構築されています。 密閉型の Clang+LLVM Bazel ツールチェーンは、ビルド済みの Clang+LLVM を使用して提供されています 16 を マシンコードをコンパイルするために、Debian スナップショット イメージによって提供される sysroot。

JNI ワークロードは、libtensorflow.so という名前の共有ライブラリにコンパイルされます。 を <service>_application.jar に置き換えます。

画像レイヤ

JNI TensorFlow ワークロード イメージは、複数のレイヤで構成されています。

  • ベース画像レイヤ <ph type="x-smartling-placeholder">
  • Debian パッケージの依存関係レイヤ。レイヤは、deb を使用して生成されます。 debian-snapshot からダウンロードされ、イメージレイヤとして再パッケージ化されたアーカイブ <ph type="x-smartling-placeholder">
      </ph>
    • libc++1-16_amd64.tar
    • libc++abi1-16_amd64.tar
    • libc6_amd64.tar
    • libunwind-16_amd64.tar
    • libgcc-s1_amd64.tar
    • gcc-13-base_amd64.tar
  • ワークロード レイヤ <ph type="x-smartling-placeholder">
      </ph>
    • binary_tar.tar
      • <service>_application.jar
      • libtensorflow-jni.so
      • libaggregation-jni.so

イメージの構成

  • ラベル(TEE 内で実行するためにビルドされたイメージのみ) <ph type="x-smartling-placeholder">
      </ph>
    • "tee.launch_policy.allow_env_override": "FCP_OPTS"
      • FCP_OPTS 環境変数を設定できる 機密 できます。 ワークロードは、起動時に FCP_OPTS を使用して構成します。 必須パラメータ。
      • FCP_OPTS 環境変数は、イメージの実行時に設定されます。 (ビルドではなく)を使用してビルドの確定性を維持します。
    • "tee.launch_policy.log_redirect": "always"
    • "tee.launch_policy.monitoring_memory_allow": "always"
  • エントリポイント <ph type="x-smartling-placeholder">
      </ph>
    • java -Djava.library.path=. -jar <service>_application.jar

Python ワークロード

Bazel の rules_python を使用して、 密閉型の Python 3.10 ツールチェーンを提供します。固定された pip 要件 ファイル pip の依存関係を確定的に取得するために使用します。Debian スナップショット イメージに基づいて決定的な分布がプラットフォームに基づいて 互換性 ソース ディストリビューションをコンパイルするための C++ ツールチェーンを提供します。

Python ワークロードは、ダウンロードした一連の pip パッケージにパッケージ化されます。 Python 3.10 ディストリビューション、ODP Python ソースコード、Python スタートアップ 使用します。

  • <service>.runfiles/
    • Python ディストリビューションは python_x86_64-unknown-linux-gnu/ に保存されます。
    • ソースコードは com_google_ondevicepersonalization_federatedcompute/
    • pip パッケージは pypi_<dependency_name>/ に保存されます。
  • <service>.runfiles_manifest
    • <service>.runfiles/ ディレクトリのマニフェスト ファイル
  • <service>
    • 実行ファイルを使用して Python ワークロードを実行する Python スクリプト

画像レイヤ

Python ワークロード イメージは、次の 4 つのレイヤで構成されています。

  • ベース画像レイヤ <ph type="x-smartling-placeholder">
  • インタープリタ レイヤ <ph type="x-smartling-placeholder">
      </ph>
    • interpreter_layer.jar
      • <service>/<service>.runfiles/python_x86_64-unknown-linux-gnu/**
  • パッケージ レイヤ <ph type="x-smartling-placeholder">
      </ph>
    • packages_layer.jar
      • <service>/<service>.runfiles/**/site-packages/**
  • ワークロード レイヤ <ph type="x-smartling-placeholder">
      </ph>
    • app_tar_manifest.tar
      • ソースコード、起動スクリプト、マニフェストが含まれています。
        • <service>/<service>.runfiles_manifest
        • <service>/<service>
        • <service>/<service>.runfiles/com_google_ondevicepersonalization_federatedcompute/**

イメージの構成

  • エントリポイント <ph type="x-smartling-placeholder">
      </ph>
    • /<service>/<service>

ビルドイメージ

ワークロードを選択したら、Cloud Functions を 作成します。

前提条件

  • Bazel 6.4.0 <ph type="x-smartling-placeholder">
      </ph>
    • Java と C++ のインストールが必要
  • Docker

手順

イメージは、提供されたサービスによってビルドされた Docker コンテナ内にビルドされる必要があります。 dockerfile。 最終的な決定論的イメージを構築できるように、2 つのスクリプトが提供されています。

  • docker_run.sh <ph type="x-smartling-placeholder">
      </ph>
    • docker_run.sh は、dockerfile から Docker イメージをビルドし、マウントします。 作業ディレクトリを作成し、ホスト Docker デーモンをマウントして、 bash コマンドを実行します。bash コマンドの前に渡された変数は、 docker run フラグとして扱われます
  • build_images.sh <ph type="x-smartling-placeholder">
      </ph>
    • build_images.sh は、すべてのイメージに対して bazel build を実行し、 生成されるイメージ ハッシュが表示されます。

すべてのイメージをビルドする

./scripts/docker/docker_run.sh "./scripts/build_images.sh"

各リリースで想定されるイメージ ハッシュは、 odp-federatedcompute GitHub 。

画像を公開する

公開の設定に使用する方法 oci_push Bazel ルール。サービスごとに、ターゲット リポジトリをサービスごとに すべて:

  • 情報集約サイト
  • コレクタ
  • model_updater
  • task_assignment
  • task_management
  • task_scheduler
  • task_builder

単一の画像を公開する

単一の画像を公開するには:

./scripts/docker/docker_run.sh "bazel run //shuffler/services/<servicename_no_underscore>:<servicename_with_underscore>_image_publish"

作成されたイメージ

構築したすべてのイメージは、イメージとして保存、ホストする( GCP Artifact Registry