オンデバイスでのワークロード証明書には確定的なビルドが必要です Personalization(ODP)高信頼実行環境(TEE)、以下で一般公開 Confidential Space(CS)としての Google Cloud。
ワークロード イメージは、決定的なイメージハッシュを生成し、 ワークロード証明書の CS(NIST の RFC 9334 リモート認証を使用) 手順(RATS)アーキテクチャをご覧ください。
このドキュメントでは、決定論的手法の実装とサポートについて説明します。 ビルド odp-federatedcompute できます。ODP アグリゲータ サービスと Model Updater サービスは、 Confidential Spaceこのリポジトリでは、決定論的なビルドがサポートされている 本番環境のユースケースに必須です。
確定的なビルド
決定的ビルドは、次の 2 つの主要コンポーネントで構成されています。
- 必要なバイナリのコンパイル。これには、jar、共有ライブラリ、 提供します。
- ベースイメージとランタイムの依存関係。ランタイム環境のベース コンパイルされたバイナリを実行するために使用されるイメージ。
現在、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">
- </ph>
- ビルド済みの Clang+LLVM 16 歳
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>
- Java ベースイメージ:
gcr.io/distroless/java17-debian11
- Java ベースイメージ:
- ワークロード レイヤ
<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">
- </ph>
- Java ベースイメージ:
gcr.io/distroless/java17-debian11
- Java ベースイメージ:
- 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>/
に保存されます。
- Python ディストリビューションは
<service>.runfiles_manifest
<service>.runfiles/
ディレクトリのマニフェスト ファイル
<service>
- 実行ファイルを使用して Python ワークロードを実行する Python スクリプト
画像レイヤ
Python ワークロード イメージは、次の 4 つのレイヤで構成されています。
- ベース画像レイヤ
<ph type="x-smartling-placeholder">
- </ph>
- Python ベースイメージ python:slim
- インタープリタ レイヤ
<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 を 作成します。
前提条件
手順
イメージは、提供されたサービスによってビルドされた 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。