Build deterministik komputasi gabungan yang dipersonalisasi di Perangkat

Build deterministik diperlukan untuk pengesahan beban kerja di On Device Trusted Execution Environment (TEE) Personalisasi (ODP) yang tersedia untuk umum di Google Cloud sebagai Ruang Rahasia (CS).

Gambar beban kerja harus menghasilkan hash gambar deterministik yang dapat digunakan oleh CS untuk pengesahan beban kerja (yang menggunakan RFC 9334 Remote ATtestation NIST Arsitektur prosedurS (RATS)).

Dokumen ini akan membahas implementasi dan dukungan untuk determenistik dibangun di odp-federatedcompute repositori resource. Layanan Agregator ODP dan Updater Model akan berjalan di Ruang Rahasia. Repositori mendukung build deterministik untuk semua layanan IT, yang diperlukan untuk kasus penggunaan produksi.

Build determenistik

Build deterministik terdiri dari dua komponen utama:

  1. Kompilasi biner yang diperlukan. Termasuk jar, {i>shared library<i}, dan metadata.
  2. Image dasar dan dependensi runtime. Basis lingkungan runtime yang digunakan untuk mengeksekusi biner yang telah dikompilasi.

Saat ini, repositori Federated Compute ODP mendukung jenis workload:

  • Workload Java + Spring
    • Tugas Tugas, Pengelolaan Tugas, Kolektor
  • Java + Spring dengan workload tensorflow JNI
    • ModelUpdater, Agregator
  • Workload Python
    • TaskBuilder

Dependensi

Daftar berikut adalah dependensi yang diandalkan ODP untuk mempertahankan determinisme dan ketersediaan:

  • Bazel
  • GitHub
  • Maven
  • PyPi
  • Snapshot Debian
  • Registry DockerHub
  • Google Container Registry (GCR)

Workload determenistik

Semua workload dikompilasi menggunakan Bazel dengan toolchain khusus bahasa dan image container yang dibangun menggunakan rules_oci. WORKSPACE file mendefinisikan semua dependensi dengan versi dan {i>hash<i} yang sesuai.

Snapshot Debian

Semua image workload harus dibangun dalam dockerfile yang dibuat berdasarkan snapshot Debian. Debian snapshot memberikan snapshot repositori stabil dengan deterministik:

Workload Java Spring

Bazel remotejdk_17 sama dengan yang digunakan untuk menyediakan Java hermetic untuk kompilasi. Dependensi Java lainnya adalah dikelola dan ditetapkan di WORKSPACE .

Workload Java Spring dikompilasi ke file jar bernama <service>_application.jar. Stoples berisi:

  • File class Java
  • META-INF/
    • Data manifes Bazel
  • build-data.properties
    • Data build Bazel
  • BOOT-INF/
    • Dependensi jar yang dipaketkan, yang dihasilkan oleh rules_spring.

Lapisan gambar

Image workload Java Spring terdiri dari dua lapisan:

Konfigurasi gambar

  • Titik entri
    • java -jar <service>_application.jar

Workload Tensorflow JNI

Workload JNI Tensorflow dibangun berdasarkan workload Java Spring. J toolchain Bazel hermetic Clang+LLVM disediakan menggunakan Clang+LLVM bawaan 16 dengan sysroot yang disediakan oleh image snapshot Debian untuk mengompilasi kode mesin.

Beban kerja JNI dikompilasi ke library bersama yang bernama libtensorflow.so bersama dengan <service>_application.jar.

Lapisan gambar

Image beban kerja tensorflow JNI terdiri dari beberapa lapisan:

  • Lapisan image dasar
  • Lapisan dependensi paket Debian. Lapisannya dibuat menggunakan deb arsip yang didownload dari snapshot debian dan dikemas ulang sebagai lapisan gambar
    • 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
  • Lapisan workload
    • binary_tar.tar
      • <service>_application.jar
      • libtensorflow-jni.so
      • libaggregation-jni.so

Konfigurasi gambar

  • Label (Hanya untuk gambar yang dibangun untuk berjalan di dalam TEE)
    • "tee.launch_policy.allow_env_override": "FCP_OPTS"
      • Memungkinkan variabel lingkungan FCP_OPTS untuk disetel di rahasia. ruang penyimpanan. Workload akan menggunakan FCP_OPTS pada saat startup untuk mengonfigurasi parameter yang diperlukan.
      • Variabel lingkungan FCP_OPTS ditetapkan saat gambar dijalankan (bukan dibuat) untuk mempertahankan determinisme build.
    • "tee.launch_policy.log_redirect": "always"
    • "tee.launch_policy.monitoring_memory_allow": "always"
  • Titik entri
    • java -Djava.library.path=. -jar <service>_application.jar

Workload Python

rules_python dari Bazel digunakan untuk menyediakan toolchain Python 3.10 hermetic. Persyaratan pip terkunci file digunakan untuk pengambilan dependensi pip secara deterministik. Snapshot Debian image memastikan distribusi determenistik diambil berdasarkan platform kompatibilitas dan menyediakan toolchain C++ untuk mengompilasi distribusi sumber.

Beban kerja Python akan dikemas ke dalam satu set paket pip yang diunduh, Distribusi Python 3.10, kode sumber Python ODP, dan startup Python {i>script<i}.

  • <service>.runfiles/
    • Distribusi Python disimpan di python_x86_64-unknown-linux-gnu/
    • Kode sumber disimpan di com_google_ondevicepersonalization_federatedcompute/
    • Paket Pip disimpan di pypi_<dependency_name>/
  • <service>.runfiles_manifest
    • File manifes untuk direktori <service>.runfiles/
  • <service>
    • Skrip Python untuk menjalankan workload Python menggunakan runfile

Lapisan gambar

Image workload Python terdiri dari empat lapisan:

  • Lapisan image dasar
  • Lapisan penerjemah
    • interpreter_layer.jar
      • <service>/<service>.runfiles/python_x86_64-unknown-linux-gnu/**
  • Lapisan paket
    • packages_layer.jar
      • <service>/<service>.runfiles/**/site-packages/**
  • Lapisan workload
    • app_tar_manifest.tar
      • Berisi kode sumber, skrip startup, dan manifes.
        • <service>/<service>.runfiles_manifest
        • <service>/<service>
        • <service>/<service>.runfiles/com_google_ondevicepersonalization_federatedcompute/**

Konfigurasi gambar

  • Titik entri
    • /<service>/<service>

Membuat image

Setelah workload dipilih, Anda siap membangun dan memublikasikan gambar.

Prasyarat

  • Bazel 6.4.0
    • Memerlukan penginstalan Java dan C++
  • Docker

Prosedur

Gambar harus dibuat dalam container docker yang dibuat oleh dockerfile Anda. Dua skrip disediakan untuk membantu membangun gambar determenistik akhir.

  • docker_run.sh
    • docker_run.sh akan membangun image Docker dari file Docker, lalu pasang direktori kerja, memasang {i>daemon Docker <i} dan menjalankan{i> Docker <i}dengan memberikan perintah {i>bash<i}. Variabel apa pun yang diteruskan sebelum perintah {i>bash<i} akan diperlakukan sebagai flag run docker.
  • build_images.sh
    • build_images.sh akan menjalankan bazel build untuk semua gambar dan menghasilkan output {i>hash<i} gambar yang dihasilkan untuk setiap gambar yang dibuat.

Buat semua image

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

Hash gambar yang diharapkan untuk setiap rilis dapat ditemukan di GitHub federatedcompute odp rilis.

Memublikasikan gambar

Publikasi dikonfigurasi menggunakan oci_push Aturan Bazel. Untuk setiap layanan, repositori target harus dikonfigurasi untuk semua:

  • agregator
  • kolektor
  • model_updater
  • task_assignment
  • task_management
  • task_scheduler
  • task_builder

Memublikasikan satu gambar

Untuk memublikasikan satu gambar:

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

Image bawaan

Semua gambar yang dibuat harus disimpan dan dihosting oleh kreator, seperti dalam Registry artefak GCP.