裝置需要確定性版本,才能驗證裝置端的工作負載 個人化 (ODP) 受信任的執行環境 (TEE),可在以下平台公開取得: 將 Google Cloud 視為機密空間 (CS)。
工作負載映像檔必須產生確定性映像檔雜湊,可用於 工作負載認證的 CS (使用 NIST 的 RFC 9334 遠端 ATtestation 架構) 程序 (RATS) 架構))。
本文件將說明確定性的實作方式及相關支援 建構的 odp-federatedcompute Cloud Storage 也提供目錄同步處理功能ODP 匯總器和 Model Updater 服務會在以下位置執行: 機密空間。這個存放區支援我們所有 或服務,這些是實際工作環境用途的必要條件。
確定性建構
確定性建構作業包含兩個主要元件:
- 必要二進位檔的編譯。包括 jar、共用程式庫 和中繼資料
- 基本映像檔和執行階段依附元件。執行階段環境的基礎 用於執行已編譯二進位檔的映像檔。
目前,ODP 聯合運算存放區支援下列 工作負載:
- Java 與 Spring 工作負載
- TaskAssignment、TaskManagement、Collector
- 使用 JNI Tensorflow 工作負載的 Java + Spring
- ModelUpdater、Aggregator
- Python 工作負載
- TaskBuilder
依附元件
以下列出 ODP 為維護確定性而依附的依附元件 和可用性:
- Bazel
- GitHub
- Maven
- PyPi
- Debian 快照
- DockerHub Registry
- Google Container Registry (GCR)
確定性工作負載
所有工作負載都會使用 Bazel 進行編譯,並搭配 透過 rules_oci。工作區 檔案 根據對應的版本和雜湊定義所有依附元件。
Debian 快照
所有工作負載映像檔都必須在提供的 dockerfile 並以 Debian 快照為基礎Debian 快照可提供具有確定性的穩定存放區快照:
- 系統標頭和程式庫
- 系統架構
- linux_x86_64
- Debian
- C++ 編譯器
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 工作負載映像檔包含兩個層:
- 基本映像檔圖層
- Java 基本映像檔:
gcr.io/distroless/java17-debian11
敬上
- Java 基本映像檔:
- 工作負載層
binary_tar.tar
<service>_application.jar
映像檔設定
- 進入點
java -jar <service>_application.jar
JNI Tensorflow 工作負載
JNI Tensorflow 工作負載是以 Java Spring 工作負載為基礎建構而成。A 罩杯 使用預先建構的 Clang+LLVM 提供 Hermetic Clang+LLVM Bazel 工具鍊 16,內含 Debian 快照映像檔的 sysroot,用於編譯機器程式碼。
JNI 工作負載會編譯至名為 libtensorflow.so
的共用資料庫
<service>_application.jar
。
圖片圖層
JNI Tensorflow 工作負載映像檔包含數個層:
- 基本映像檔圖層
- Java 基本映像檔:
gcr.io/distroless/java17-debian11
敬上
- Java 基本映像檔:
- Debian 套件依附元件層。這些層是以 deb 產生
從 debian-snapshot 下載的封存檔,並重新封裝為映像檔圖層
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
- 工作負載層
binary_tar.tar
<service>_application.jar
libtensorflow-jni.so
libaggregation-jni.so
映像檔設定
- 標籤 (僅適用於建構可在 TEE 中執行的映像檔)
"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"
- 進入點
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/
- 子母畫面套件會儲存在
pypi_<dependency_name>/
下
- Python 發行版本會儲存在
<service>.runfiles_manifest
<service>.runfiles/
目錄的資訊清單檔案
<service>
- 使用 Python 指令碼執行 Python 工作負載
圖片圖層
Python 工作負載映像檔包含四個層:
- 基本映像檔圖層
- Python 基本映像檔 python:slim
- 翻譯層
interpreter_layer.jar
<service>/<service>.runfiles/python_x86_64-unknown-linux-gnu/**
- 套件層
packages_layer.jar
<service>/<service>.runfiles/**/site-packages/**
- 工作負載層
app_tar_manifest.tar
- 包含原始碼、開機指令碼和資訊清單。
<service>/<service>.runfiles_manifest
<service>/<service>
<service>/<service>.runfiles/com_google_ondevicepersonalization_federatedcompute/**
- 包含原始碼、開機指令碼和資訊清單。
映像檔設定
- 進入點
/<service>/<service>
建立映像檔
選好工作負載後,即可開始建構並發布 所以映像檔較小
必要條件
操作程序
映像檔應在 dockerfile。 我們提供兩個腳本,有助於建構最終確定性圖像。
- docker_run.sh
docker_run.sh
會透過掛接的 dockerfile 建構 Docker 映像檔 掛接工作目錄,掛接主機 Docker Daemon,然後執行 提供的 bash 指令在 bash 指令之前傳送的任何變數都會 將視為 Docker 執行標記
- build_images.sh
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。