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:
- 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.
- 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:
- Thư viện và tiêu đề hệ thống
- Cấu trúc hệ thống
- linux_x86_64
- Debian
- Trình biên dịch C++
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:
- Lớp hình ảnh cơ sở
- Hình ảnh cơ sở Java:
gcr.io/distroless/java17-debian11
- Hình ảnh cơ sở Java:
- Lớp tải
binary_tar.tar<service>_application.jar
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ở
- Hình ảnh cơ sở Java:
gcr.io/distroless/java17-debian11
- Hình ảnh cơ sở Java:
- 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.tarlibc++abi1-16_amd64.tarlibc6_amd64.tarlibunwind-16_amd64.tarlibgcc-s1_amd64.targcc-13-base_amd64.tar
- Lớp tải
binary_tar.tar<service>_application.jarlibtensorflow-jni.solibaggregation-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_OPTStrong không gian bảo mật. Khối lượng công việc sẽ sử dụngFCP_OPTSkhi 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.
- Cho phép đặt biến môi trườ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>/
- Bản phân phối Python được lưu trữ trong
<service>.runfiles_manifest- Tệp kê khai cho thư mục
<service>.runfiles/
- Tệp kê khai cho thư mục
<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ở
- Hình ảnh cơ sở Python python:slim
- 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/**
- Chứa mã nguồn, tập lệnh khởi động và tệp kê khai.
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
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.shsẽ 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.shsẽ chạybazel buildcho 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.