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àm 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:
- 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.
- 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:
- 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 công việc
binary_tar.tar
<service>_application.jar
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ở
- Hình ảnh cơ sở Java:
gcr.io/distroless/java17-debian11
- Hình ảnh cơ sở Java:
- 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ụngFCP_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.
- 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
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>/
- 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 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ở
- Hình ảnh cơ sở của 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)
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/**
- 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
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
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ủ 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ạybazel 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
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 đã 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.