Bản dựng thuật toán xác định liên kết cho hoạt động Cá nhân hoá trên thiết bị

Các bản dựng có thể xác định là bắt buộc để chứng thực khối lượng công việc trong Môi trường thực thi đáng tin cậy (TEE) của tính năng Cá nhân hoá trên thiết bị (ODP), được cung cấp công khai trên Google Cloud dưới dạng Không gian bảo mật (CS).

Các hình ảnh tải phải tạo ra một hàm băm hình ảnh xác định mà CS có thể dùng để chứng thực tải (sử dụng Cấu trúc Quy trình Chứng thực Từ xa (RATS) RFC 9334 của NIST).

Tài liệu này sẽ trình bày về việc triển khai và hỗ trợ các bản dựng có thể xác định trong kho lưu trữ odp-federatedcompute. Các dịch vụ ODP Aggregator và Model Updater sẽ chạy trong Confidential Space. Kho lưu trữ này hỗ trợ các bản dựng có thể xác định cho tất cả các dịch vụ của chúng tôi, đây là những dịch vụ bắt buộc cho các trường hợp sử dụng trong quá trình sản xuất.

Bản dựng có tính xác định

Các bản dựng xác định bao gồm 2 thành phần chính:

  1. Quy trình biên dịch các tệp nhị phân bắt buộc. Điều này bao gồm các tệp jar, thư viện dùng chung và siêu dữ liệu.
  2. Hình ảnh cơ sở và các phần phụ thuộc trong thời gian chạy. Hình ảnh cơ sở của môi trường thời gian chạy dùng để thực thi các tệp nhị phân đã biên dịch.

Hiện tại, kho lưu trữ ODP Federated Compute hỗ trợ các loại tải sau:

  • Tải Java + Spring
    • TaskAssignment, TaskManagement, Collector
  • Java + Spring với khối lượng công việc JNI tensorflow
    • ModelUpdater, Aggregator
  • Tải Python
    • TaskBuilder

Phần phụ thuộc

Sau đây là danh sách các phần phụ thuộc mà ODP dựa vào để duy trì tính xác định và tính sẵn có:

  • Bazel
  • GitHub
  • Maven
  • PyPi
  • Ảnh chụp nhanh Debian
  • Hệ thống đăng ký DockerHub
  • Google Container Registry (GCR)

Khối lượng công việc có tính xác định

Tất cả các khối lượng công việc đều được biên dịch bằng Bazel với các chuỗi công cụ dành riêng cho ngôn ngữ và hình ảnh vùng chứa được tạo bằng rules_oci. Tệp WORKSPACE xác định tất cả các phần phụ thuộc có phiên bản và hàm băm tương ứng.

Ảnh chụp nhanh Debian

Tất cả hình ảnh về khối lượng công việc đều phải được tạo trong dockerfile được cung cấp, được tạo trên ảnh chụp nhanh Debian. Ảnh chụp nhanh Debian cung cấp ảnh chụp nhanh kho lưu trữ ổn định với các đặc điểm sau:

Tải Java Spring

remotejdk_17 của Bazel được dùng để cung cấp một Java khép kín để biên dịch. Các phần phụ thuộc khác của Java được quản lý và xác định trong tệp WORKSPACE.

Các tải Java Spring sẽ biên dịch thành một tệp jar có tên là <service>_application.jar. Tệp jar này chứa:

  • Tệp lớp Java
  • META-INF/
    • Dữ liệu tệp kê khai Bazel
  • build-data.properties
    • Dữ liệu bản dựng Bazel
  • BOOT-INF/
    • Các phần phụ thuộc jar được đóng gói, do rules_spring tạo.

Lớp hình ảnh

Hình ảnh tải Java Spring bao gồm 2 lớp:

Cấu hình hình ảnh

  • Điểm truy cập
    • java -jar <service>_application.jar

Tải JNI Tensorflow

Tải JNI Tensorflow được xây dựng dựa trên tải Java Spring. Một chuỗi công cụ Bazel Clang+LLVM khép kín được cung cấp bằng cách sử dụng Clang+LLVM 16 dựng sẵn với một sysroot do ảnh chụp nhanh Debian cung cấp để biên dịch mã máy.

Các khối lượng công việc JNI biên dịch thành một thư viện dùng chung có tên là libtensorflow.so cùng với <service>_application.jar.

Lớp hình ảnh

Hình ảnh tải tensorflow JNI bao gồm một số lớp:

  • Lớp hình ảnh cơ sở
  • Các lớp phần phụ thuộc của gói Debian. Các lớp được tạo bằng cách sử dụng các tệp lưu trữ deb được tải xuống từ debian-snapshot và đóng gói lại dưới dạng các lớp hình ảnh
    • 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
  • Lớp tải
    • binary_tar.tar
      • <service>_application.jar
      • libtensorflow-jni.so
      • libaggregation-jni.so

Cấu hình hình ảnh

  • Nhãn (Chỉ dành cho những hình ảnh được tạo để chạy trong TEE)
    • "tee.launch_policy.allow_env_override": "FCP_OPTS"
      • Cho phép đặt biến môi trường FCP_OPTS trong không gian bảo mật. Khối lượng công việc sẽ sử dụng FCP_OPTS khi khởi động để định cấu hình các tham số bắt buộc.
      • Biến môi trường FCP_OPTS được đặt khi hình ảnh được chạy (thay vì được tạo) để duy trì tính xác định của bản dựng.
    • "tee.launch_policy.log_redirect": "always"
    • "tee.launch_policy.monitoring_memory_allow": "always"
  • Điểm truy cập
    • java -Djava.library.path=. -jar <service>_application.jar

Tải Python

rules_python của Bazel được dùng để cung cấp một chuỗi công cụ Python 3.10 khép kín. Một tệp yêu cầu pip bị khoá được dùng để tìm nạp các phần phụ thuộc pip một cách xác định. Hình ảnh chụp nhanh Debian đảm bảo rằng các bản phân phối xác định được tìm nạp dựa trên khả năng tương thích của nền tảng và cung cấp một chuỗi công cụ C++ để biên dịch các bản phân phối nguồn.

Các khối lượng công việc Python sẽ được đóng gói thành một nhóm các gói pip đã tải xuống, một bản phân phối Python 3.10, mã nguồn ODP Python và một tập lệnh khởi động Python.

  • <service>.runfiles/
    • Bản phân phối Python được lưu trữ trong python_x86_64-unknown-linux-gnu/
    • Mã nguồn được lưu trữ trong com_google_ondevicepersonalization_federatedcompute/
    • Các gói Pip được lưu trữ trong pypi_<dependency_name>/
  • <service>.runfiles_manifest
    • Tệp kê khai cho thư mục <service>.runfiles/
  • <service>
    • Tập lệnh Python để chạy khối lượng công việc Python bằng runfiles

Lớp hình ảnh

Hình ảnh tải Python bao gồm 4 lớp:

  • Lớp hình ảnh cơ sở
  • Lớp phiên dịch
    • interpreter_layer.jar
      • <service>/<service>.runfiles/python_x86_64-unknown-linux-gnu/**
  • Lớp gói
    • packages_layer.jar
      • <service>/<service>.runfiles/**/site-packages/**
  • Lớp tải
    • app_tar_manifest.tar
      • Chứa mã nguồn, tập lệnh khởi động và tệp kê khai.
        • <service>/<service>.runfiles_manifest
        • <service>/<service>
        • <service>/<service>.runfiles/com_google_ondevicepersonalization_federatedcompute/**

Cấu hình hình ảnh

  • Điểm truy cập
    • /<service>/<service>

Tạo hình ảnh

Sau khi chọn khối lượng công việc, bạn có thể bắt đầu tạo và xuất bản hình ảnh.

Điều kiện tiên quyết

  • Bazel 6.4.0
    • Yêu cầu cài đặt Java và C++
  • Docker

Cách thực hiện

Hình ảnh phải được tạo trong vùng chứa docker do dockerfile được cung cấp tạo. Chúng tôi cung cấp 2 tập lệnh để giúp bạn tạo ra những hình ảnh cuối cùng có tính xác định.

  • docker_run.sh
    • docker_run.sh sẽ tạo hình ảnh docker từ dockerfile, gắn thư mục công việc, gắn trình nền docker của máy chủ và chạy docker bằng lệnh bash được cung cấp. Mọi biến được truyền trước lệnh bash sẽ được coi là cờ chạy docker.
  • build_images.sh
    • build_images.sh sẽ chạy bazel build cho tất cả hình ảnh và xuất các hàm băm hình ảnh đã tạo cho từng hình ảnh được tạo.

Tạo tất cả hình ảnh

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

Bạn có thể tìm thấy các hàm băm hình ảnh dự kiến cho mỗi bản phát hành trong odp-federatedcompute GitHub releases (các bản phát hành odp-federatedcompute trên GitHub).

Xuất bản hình ảnh

Quá trình xuất bản được định cấu hình bằng các quy tắc oci_push của Bazel. Đối với mỗi dịch vụ, bạn phải định cấu hình kho lưu trữ đích cho tất cả:

  • trang web tổng hợp
  • collector
  • model_updater
  • task_assignment
  • task_management
  • task_scheduler
  • task_builder

Xuất bản một hình ảnh

Cách xuất bản một hình ảnh:

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

Hình ảnh được tạo sẵn

Nhà sáng tạo sẽ cần lưu trữ và lưu trữ tất cả hình ảnh đã tạo, chẳng hạn như trong sổ đăng ký cấu phần phần mềm GCP.