Cihaz üzerinde kişiselleştirme birleşik işlem belirleyici derleme

Cihaz Üzerinde Kişiselleştirme (ODP) Güvenilir Yürütme Ortamı'nda (TEE) iş yükü onayı için deterministik derlemeler gerekir. Bu ortam, Google Cloud'da Confidential Space (CS) olarak herkese açık bir şekilde sunulur.

İş yükü resimleri, iş yükü onaylama için CS tarafından kullanılabilen deterministik bir resim karması oluşturmalıdır (NIST'nin RFC 9334 Uzaktan Onaylama Prosedürleri (RATS) Mimarisi kullanılır).

Bu dokümanda, odp-federatedcompute deposunda deterministik derlemelerin uygulanması ve desteklenmesi ele alınmaktadır. ODP Toplayıcı ve Model Güncelleyici hizmetleri, Gizli Alan içinde çalışır. Depo, üretim kullanım alanları için gerekli olan tüm hizmetlerimizde deterministik derlemeleri destekler.

Belirleyici derlemeler

Belirleyici derlemeler iki ana bileşenden oluşur:

  1. Gerekli ikili dosyaların derlenmesi. Buna JAR'lar, paylaşılan kitaplıklar ve meta veriler dahildir.
  2. Temel görüntü ve çalışma zamanı bağımlılıkları. Derlenmiş ikili dosyaları yürütmek için kullanılan temel çalışma zamanı ortamı görüntüsü.

Şu anda ODP Federated Compute deposu aşağıdaki iş yükü türlerini desteklemektedir:

  • Java + Spring iş yükleri
    • TaskAssignment, TaskManagement, Collector
  • JNI tensorflow iş yükleriyle Java + Spring
    • ModelUpdater, Aggregator
  • Python iş yükleri
    • TaskBuilder

Bağımlılıklar

Aşağıdaki listede, ODP'nin determinizmi ve kullanılabilirliği korumak için kullandığı bağımlılıklar yer almaktadır:

  • Bazel
  • GitHub
  • Maven
  • PyPi
  • Debian anlık görüntüleri
  • DockerHub Registry
  • Google Container Registry (GCR)

Belirleyici iş yükleri

Tüm iş yükleri, Bazel kullanılarak derlenir. Dilinize özel araç zincirleri ve rules_oci kullanılarak oluşturulmuş kapsayıcı görüntüleri içerir. WORKSPACE dosyası tüm bağımlılıkları ilgili sürümler ve karma değerleriyle birlikte tanımlar.

Debian anlık görüntüleri

Tüm iş yükü görüntüleri, Debian anlık görüntüsü üzerine oluşturulmuş, sağlanan Dockerfile içinde oluşturulmalıdır. Debian anlık görüntüleri, aşağıdakilerle birlikte kararlı bir depo anlık görüntüsü sağlar:

  • Sistem üstbilgileri ve kitaplıkları
  • Sistem mimarisi
    • linux_x86_64
    • Debian
  • C++ derleyicisi

Java Spring iş yükleri

Bazel'in remotejdk_17, derleme için hermetik bir Java sağlamak amacıyla kullanılır. Diğer Java bağımlılıkları WORKSPACE dosyasında yönetilir ve tanımlanır.

Java Spring iş yükleri, <service>_application.jar adlı bir JAR dosyası olarak derlenir. Jar dosyası şunları içerir:

  • Java sınıf dosyaları
  • META-INF/
    • Bazel manifest verileri
  • build-data.properties
    • Bazel build-data
  • BOOT-INF/
    • rules_spring tarafından oluşturulan paketlenmiş jar bağımlılıkları.

Resim katmanları

Java Spring iş yükü resmi iki katmandan oluşur:

Resim yapılandırması

  • Giriş noktası
    • java -jar <service>_application.jar

JNI Tensorflow iş yükleri

JNI Tensorflow iş yükleri, Java Spring iş yüklerinin üzerine kurulur. Makine kodu derlemek için Debian anlık görüntü resmi tarafından sağlanan bir sysroot ile önceden oluşturulmuş Clang+LLVM 16 kullanılarak hermetik bir Clang+LLVM Bazel araç zinciri sağlanır.

JNI iş yükleri, <service>_application.jar ile birlikte libtensorflow.so adlı bir paylaşılan kitaplıkta derlenir.

Resim katmanları

JNI tensorflow iş yükü resmi çeşitli katmanlardan oluşur:

  • Temel resim katmanı
  • Debian paketi bağımlılık katmanları. Katmanlar, debian-snapshot'tan indirilen ve görüntü katmanları olarak yeniden paketlenen deb arşivleri kullanılarak oluşturulur.
    • 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
  • İş yükü katmanı
    • binary_tar.tar
      • <service>_application.jar
      • libtensorflow-jni.so
      • libaggregation-jni.so

Resim yapılandırması

  • Etiketler (Yalnızca TEE'de çalışacak şekilde oluşturulan resimler için)
    • "tee.launch_policy.allow_env_override": "FCP_OPTS"
      • FCP_OPTS ortam değişkeninin gizli alanda ayarlanmasına olanak tanır. İş yükü, gerekli parametreleri yapılandırmak için başlangıçta FCP_OPTS kullanır.
      • Derleme determinizmini korumak için görüntü oluşturulmak yerine çalıştırıldığında FCP_OPTS ortam değişkeni ayarlanır.
    • "tee.launch_policy.log_redirect": "always"
    • "tee.launch_policy.monitoring_memory_allow": "always"
  • Giriş noktası
    • java -Djava.library.path=. -jar <service>_application.jar

Python iş yükleri

Bazel'in rules_python, hermetik bir Python 3.10 araç zinciri sağlamak için kullanılır. Pip bağımlılıklarının belirgin şekilde getirilmesi için kilitli bir pip requirements file kullanılır. Debian anlık görüntü resmi, platform uyumluluğuna göre deterministik dağıtımların getirilmesini sağlar ve kaynak dağıtımları derlemek için bir C++ araç zinciri sunar.

Python iş yükleri; indirilen bir dizi pip paketi, Python 3.10 dağıtımı, ODP Python kaynak kodu ve bir Python başlangıç komut dosyası olarak paketlenir.

  • <service>.runfiles/
    • Python dağıtımı python_x86_64-unknown-linux-gnu/ altında depolanır.
    • Kaynak kodu, com_google_ondevicepersonalization_federatedcompute/ altında saklanır.
    • Pip paketleri pypi_<dependency_name>/ altında depolanır.
  • <service>.runfiles_manifest
    • <service>.runfiles/ dizini için manifest dosyası
  • <service>
    • runfiles kullanarak Python iş yükünü çalıştırmak için Python komut dosyası

Resim katmanları

Python iş yükü resmi dört katmandan oluşur:

  • Temel resim katmanı
  • Yorumlayıcı katmanı
    • interpreter_layer.jar
      • <service>/<service>.runfiles/python_x86_64-unknown-linux-gnu/**
  • Paketler katmanı
    • packages_layer.jar
      • <service>/<service>.runfiles/**/site-packages/**
  • İş yükü katmanı
    • app_tar_manifest.tar
      • Kaynak kodu, başlangıç komut dosyası ve manifest içerir.
        • <service>/<service>.runfiles_manifest
        • <service>/<service>
        • <service>/<service>.runfiles/com_google_ondevicepersonalization_federatedcompute/**

Resim yapılandırması

  • Giriş noktası
    • /<service>/<service>

Görüntü oluşturma

İş yükleriniz seçildikten sonra, resimlerinizi oluşturup yayınlamaya hazırsınız.

Ön koşullar

Prosedür

Resimler, sağlanan Dockerfile ile oluşturulan Docker container'ı içinde oluşturulmalıdır. Son deterministik görüntülerin oluşturulmasına yardımcı olmak için iki komut dosyası sağlanır.

  • docker_run.sh
    • docker_run.sh, Dockerfile'dan Docker görüntüsünü oluşturur, çalışma dizinini bağlar, ana makine Docker daemon'ını bağlar ve Docker'ı sağlanan bash komutuyla çalıştırır. Bash komutundan önce iletilen tüm değişkenler, Docker çalıştırma işaretleri olarak değerlendirilir.
  • build_images.sh
    • build_images.sh, tüm resimler için bazel build komutunu çalıştırır ve oluşturulan her resim için oluşturulan resim karmalarını çıkarır.

Tüm resimleri oluşturma

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

Her sürüm için beklenen resim karmalarını odp-federatedcompute GitHub sürümlerinde bulabilirsiniz.

Görüntü yayınlama

Yayınlama, Bazel kuralları olan oci_push kullanılarak yapılandırılır. Her hizmet için hedef depo, aşağıdakilerin tümü için yapılandırılmalıdır:

  • toplayıcı
  • toplayıcı
  • model_updater
  • task_assignment
  • task_management
  • task_scheduler
  • task_builder

Tek bir resim yayınlama

Tek bir resim yayınlamak için:

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

Oluşturulan resimler

Oluşturulan tüm görüntülerin, içerik üretici tarafından depolanması ve barındırılması gerekir. Örneğin, GCP Artifact Registry'de.