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ần có bản dựng tất định để chứng thực khối lượng công việc trong ứng dụng Trên thiết bị Môi trường thực thi đáng tin cậy (TEE) sẽ được cá nhân hoá (ODP), công khai trên Google Cloud là Không gian bảo mật (CS).

Các hình ảnh của khối lượng công việc phải tạo một hàm băm hình ảnh xác định để CS để chứng thực khối lượng công việc (sử dụng tính năng RFC 9334 Từ xa kiểm chứng của NIST Cấu trúc thủ tục (RATS)).

Tài liệu này sẽ trình bày việc triển khai và hỗ trợ cho thuật toán tất định bản dựng trong odp-federatedcompute kho lưu trữ. Dịch vụ Trình tổng hợp và cập nhật mô hình ODP sẽ hoạt động trong Không gian bí mật. Kho lưu trữ hỗ trợ các bản dựng tất định cho tất cả dịch vụ bắt buộc đối với các trường hợp sử dụng trong môi trường thực tế.

Bản dựng tất định

Bản dựng dựa trên thuật toán tất định bao gồm hai thành phần chính:

  1. Tổng hợp các tệp nhị phân bắt buộc. Danh mục này bao gồm 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 thời gian chạy. Cơ sở của môi trường thời gian chạy hình ảnh dùng để thực thi các tệp nhị phân đã biên dịch.

Đến nay, kho lưu trữ Điện toán liên kết ODP hỗ trợ các loại tải công việc:

  • Khối lượng công việc Java + Spring
    • Phân công công việc, Quản lý công việc, Người thu thập
  • Java + Spring có khối lượng công việc tensorflow JNI
    • Trình cập nhật mô hình, Công cụ tổng hợp
  • Khối lượng công việc Python
    • TaskBuilder

Phần phụ thuộc

Danh sách sau đây là các phần phụ thuộc mà ODP dựa vào để duy trì tính tất định và khả năng sử dụng:

  • Bazel
  • GitHub
  • Maven
  • PyPi
  • Ảnh chụp nhanh trên Debian
  • Đăng ký DockerHub
  • Hệ thống đăng ký vùng chứa của Google (GCR)

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

Tất cả các tải công việc đều được biên dịch bằng Bazel với 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. WORKSPACE tệp 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 trên Debian

Tất cả hình ảnh về khối lượng công việc phải được xây dựng trong dockerfile được xây dựng dựa trên ảnh chụp nhanh Debian. Debian ảnh chụp nhanh cung cấp ảnh chụp nhanh kho lưu trữ ổn định với thuật toán tất định:

  • Tiêu đề hệ thống và thư viện
  • Cấu trúc hệ thống
    • linux_x86_64
    • Debian
  • Trình biên dịch C++

Khối lượng công việc Java Spring

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

Khối lượng công việc trong Java Spring biên dịch thành một tệp jar có tên <service>_application.jar. Bình 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, được tạo bởi rules_spring.

Các lớp hình ảnh

Hình ảnh khối lượng công việc 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

Khối lượng công việc JNI Tensorflow

Khối lượng công việc JNI Tensorflow được xây dựng dựa trên các khối lượng công việc Java Spring. Đáp Chuỗi công cụ Clang+LLVM Bazel kín được cung cấp bằng Clang+LLVM tạo sẵn 16 với sysroot do hình ảnh tổng quan nhanh Debian cung cấp để biên dịch mã máy.

Tải 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 bằng <service>_application.jar.

Các lớp hình ảnh

Hình ảnh khối lượng công việc tensorflow JNI bao gồm một số lớp:

  • Lớp hình ảnh cơ sở
  • Các lớp phụ thuộc của gói Debian. Các lớp được tạo bằng cách sử dụng deb các tệp lưu trữ được tải xuống từ debian-snapshot và được đóng gói lại dưới dạng 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 công việc
    • 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 các 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 bí mật không gian. Khối lượng công việc sẽ sử dụng FCP_OPTS khi khởi động để định cấu hình 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ì đã tạo) để duy trì tính tất đị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

Khối lượng công việc Python

Bạn có thể sử dụng rules_python của Bazel để cung cấp chuỗi công cụ Python 3.10 kín. Yêu cầu về pip bị khoá tệp được dùng để tìm nạp thuật toán các phần phụ thuộc pip. Tổng quan nhanh về Debian hình ảnh đảm bảo các lượt phân phối tất định được tìm nạp dựa trên nền tảng khả năng tương thích và cung cấp chuỗi công cụ C++ để biên dịch các bản phân phối nguồn.

Khối lượng công việc Python sẽ được đóng gói thành một tập hợp 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à khởi động Python tập lệnh.

  • <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/
    • 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 các runfile

Các lớp hình ảnh

Hình ảnh khối lượng công việc 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)
    • packages_layer.jar
      • <service>/<service>.runfiles/**/site-packages/**
  • Lớp tải công việc
    • 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

Khi đã chọn xong khối lượng công việc, tức là bạn đã sẵn sàng xây dựng 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

Bạn nên tạo hình ảnh trong vùng chứa Docker được tạo bởi dockerfile. Hai tập lệnh được cung cấp để giúp xây dựng hình ảnh có tính tất định cuối cùng.

  • docker_run.sh
    • docker_run.sh sẽ tạo hình ảnh Docker từ tệp dockerfile, giá trị gắn kết thư mục công việc, gắn trình nền docker máy chủ lưu trữ và chạy docker bằng đã cung cấp lệnh bash. Mọi biến được truyền trước lệnh bash sẽ sẽ được coi là cờ docker chạy.
  • build_images.sh
    • build_images.sh sẽ chạy bazel build cho tất cả hình ảnh và xuất đã tạo hàm băm hình ảnh cho từng hình ảnh đã 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 hàm băm hình ảnh dự kiến cho từng bản phát hành trong odp-liên kết tính toán trên GitHub bản phát hành.

Xuất bản hình ảnh

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

  • trang web tổng hợp
  • bộ sưu tập
  • model_updater
  • task_assignment
  • task_management
  • task_scheduler
  • task_builder

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 đã tạo

Tất cả hình ảnh đã tạo cần được người tạo lưu trữ và lưu trữ, chẳng hạn như trong một Đăng ký cấu phần phần mềm GCP.