裝置端個人化功能聯合運算決定版本

裝置需要確定性版本,才能驗證裝置端的工作負載 個人化 (ODP) 受信任的執行環境 (TEE),可在以下平台公開取得: 將 Google Cloud 視為機密空間 (CS)。

工作負載映像檔必須產生確定性映像檔雜湊,可用於 工作負載認證的 CS (使用 NIST 的 RFC 9334 遠端 ATtestation 架構) 程序 (RATS) 架構))。

本文件將說明確定性的實作方式及相關支援 建構的 odp-federatedcompute Cloud Storage 也提供目錄同步處理功能ODP 匯總器和 Model Updater 服務會在以下位置執行: 機密空間。這個存放區支援我們所有 或服務,這些是實際工作環境用途的必要條件。

確定性建構

確定性建構作業包含兩個主要元件:

  1. 必要二進位檔的編譯。包括 jar、共用程式庫 和中繼資料
  2. 基本映像檔和執行階段依附元件。執行階段環境的基礎 用於執行已編譯二進位檔的映像檔。

目前,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 快照可提供具有確定性的穩定存放區快照:

Java Spring 工作負載

Bazel 的 remotejdk_17 是 來提供基因的 Java 檔案以進行編譯其他 Java 依附元件 管理並定義於 WORKSPACE 檔案

Java Spring 工作負載會編譯為名為 <service>_application.jar。jar 檔案包含:

  • Java 類別檔案
  • META-INF/
    • Bazel 資訊清單資料
  • build-data.properties
    • Bazel 建構資料
  • BOOT-INF/

圖片圖層

Java Spring 工作負載映像檔包含兩個層:

映像檔設定

  • 進入點
    • 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 工作負載映像檔包含數個層:

  • 基本映像檔圖層
  • 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>/
  • <service>.runfiles_manifest
    • <service>.runfiles/ 目錄的資訊清單檔案
  • <service>
    • 使用 Python 指令碼執行 Python 工作負載

圖片圖層

Python 工作負載映像檔包含四個層:

  • 基本映像檔圖層
  • 翻譯層
    • 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