إصدار حاسوب موحّد خاص بالتخصيص على الجهاز

يجب توفّر إصدارات حتمية لإثبات صحة أحمال العمل في بيئة التنفيذ الموثوقة (TEE) الخاصة بميزة "التخصيص على الجهاز" (ODP)، وهي متاحة للجميع على Google Cloud باسم Confidential Space (CS).

يجب أن تنشئ صور أحمال العمل تجزئة صور محددة يمكن أن تستخدمها خدمة "التحقّق من صحة البرامج" للتحقّق من صحة أحمال العمل (التي تستخدم بنية RFC 9334 Remote ATtestation procedureS (RATS)‎ الصادرة عن المعهد الوطني للمعايير والتكنولوجيا).

سيتناول هذا المستند عملية التنفيذ والدعم لعمليات الإنشاء الحتمية في مستودع odp-federatedcompute. سيتم تشغيل خدمات "مجمّع بيانات الخصوصية التفاضلية" و"أداة تعديل النموذج" ضمن "المساحة الآمنة". يتيح المستودع عمليات إنشاء حتمية لجميع خدماتنا، وهي مطلوبة لحالات الاستخدام في مرحلة الإنتاج.

عمليات الإنشاء الحتمية

تتألف الإصدارات الحتمية من مكوّنين رئيسيَّين:

  1. تجميع الملفات الثنائية المطلوبة ويشمل ذلك ملفات JAR والمكتبات المشتركة والبيانات الوصفية.
  2. الصورة الأساسية والتبعيات في وقت التشغيل صورة الأساس لبيئة وقت التشغيل المستخدَمة لتنفيذ الملفات الثنائية المجمَّعة

في الوقت الحالي، يتيح مستودع ODP Federated Compute أنواع أحمال العمل التالية:

  • أحمال عمل Java وSpring
    • TaskAssignment, TaskManagement, Collector
  • Java + Spring مع أحمال عمل JNI tensorflow
    • ModelUpdater, Aggregator
  • أحمال عمل Python
    • TaskBuilder

التبعيات

في ما يلي قائمة بالتبعيات التي يعتمد عليها ODP للحفاظ على التحديد والتوفر:

  • Bazel
  • GitHub
  • Maven
  • PyPi
  • لقطات Debian
  • DockerHub Registry
  • Google Container Registry (GCR)

أحمال العمل الحتمية

يتم تجميع جميع أحمال العمل باستخدام Bazel مع سلاسل أدوات خاصة باللغة وصور حاويات تم إنشاؤها باستخدام rules_oci. يحدّد ملف WORKSPACE جميع التبعيات مع الإصدارات والتجزئات المقابلة.

لقطات Debian

يجب إنشاء جميع صور أحمال العمل ضمن dockerfile المتوفّر، ويجب أن تستند إلى لقطة Debian. تقدّم لقطات Debian مستودعًا ثابتًا للقطات مع ما يلي:

  • عناوين النظام ومكتباته
  • بنية النظام
    • linux_x86_64
    • Debian
  • برنامج تجميع C++‎

أحجام عمل Java Spring

يتم استخدام remotejdk_17 من Bazel لتوفير Java محكم للتجميع. تتم إدارة تبعيات Java الأخرى وتحديدها في ملف WORKSPACE.

يتم تجميع أحمال عمل Java Spring في ملف jar باسم <service>_application.jar. يتضمّن الوعاء ما يلي:

  • ملفات فئات Java
  • META-INF/
    • بيانات بيان Bazel
  • build-data.properties
    • بيانات إنشاء Bazel
  • BOOT-INF/
    • ملفات JAR المجمّعة التي تم إنشاؤها بواسطة rules_spring

طبقات الصور

تتألف صورة عبء العمل Java Spring من طبقتَين:

  • طبقة الصورة الأساسية
  • طبقة حجم المعالجة
    • binary_tar.tar
      • <service>_application.jar

إعدادات الصور

  • Entrypoint
    • java -jar <service>_application.jar

أحمال عمل JNI Tensorflow

تم إنشاء أحمال عمل JNI Tensorflow استنادًا إلى أحمال عمل Java Spring. يتم توفير سلسلة أدوات Bazel محكمة الإغلاق ومتوافقة مع Clang+LLVM باستخدام الإصدار 16 من Clang+LLVM المُنشأ مسبقًا مع توفير sysroot من خلال صورة لقطة Debian لتجميع رمز الآلة.

يتم تجميع أحمال عمل JNI في مكتبة مشتركة باسم libtensorflow.so بالإضافة إلى <service>_application.jar.

طبقات الصور

تتألف صورة عبء عمل JNI tensorflow من عدة طبقات:

  • طبقة الصورة الأساسية
  • طبقات تبعية حزمة Debian يتم إنشاء الطبقات باستخدام أرشيفات deb التي تم تنزيلها من debian-snapshot وإعادة تجميعها كطبقات صور
    • 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
  • طبقة حجم المعالجة
    • binary_tar.tar
      • <service>_application.jar
      • libtensorflow-jni.so
      • libaggregation-jni.so

إعدادات الصور

  • التصنيفات (للصور المصمَّمة للتشغيل داخل بيئة التنفيذ الموثوقة فقط)
    • "tee.launch_policy.allow_env_override": "FCP_OPTS"
      • يسمح بضبط متغيّر البيئة FCP_OPTS في مساحة سرية. سيستهلك عبء العمل FCP_OPTS عند بدء التشغيل لضبط المَعلمات المطلوبة.
      • يتم ضبط متغيّر البيئة FCP_OPTS عند تشغيل الصورة (بدلاً من إنشائها) للحفاظ على تحديد الإنشاء.
    • "tee.launch_policy.log_redirect": "always"
    • "tee.launch_policy.monitoring_memory_allow": "always"
  • Entrypoint
    • java -Djava.library.path=. -jar <service>_application.jar

أحجام العمل في Python

يتم استخدام rules_python في Bazel لتوفير سلسلة أدوات محكمة الإغلاق لإصدار Python 3.10. يُستخدم ملف متطلبات pip مقفل لجلب ملحقات pip بشكل حتمي. تضمن صورة لقطة Debian استرجاع التوزيعات المحدّدة استنادًا إلى توافق النظام الأساسي وتوفّر سلسلة أدوات C++ لتجميع توزيعات المصدر.

سيتم تجميع أحمال عمل Python في مجموعة من حِزم pip التي تم تنزيلها، وتوزيع Python 3.10، ورمز مصدر ODP Python، ونص برمجي لبدء تشغيل Python.

  • <service>.runfiles/
    • يتم تخزين حزمة Python ضمن python_x86_64-unknown-linux-gnu/
    • يتم تخزين رمز المصدر ضمن com_google_ondevicepersonalization_federatedcompute/
    • يتم تخزين حِزم Pip ضمن pypi_<dependency_name>/
  • <service>.runfiles_manifest
    • ملف البيان الخاص بالدليل <service>.runfiles/
  • <service>
    • نص Python البرمجي لتشغيل عبء عمل Python باستخدام ملفات التشغيل

طبقات الصور

تتكوّن صورة عبء عمل Python من أربع طبقات:

  • طبقة الصورة الأساسية
  • طبقة المترجم
    • interpreter_layer.jar
      • <service>/<service>.runfiles/python_x86_64-unknown-linux-gnu/**
  • طبقة الحِزم
    • packages_layer.jar
      • <service>/<service>.runfiles/**/site-packages/**
  • طبقة حجم المعالجة
    • app_tar_manifest.tar
      • يحتوي على رمز المصدر ونص برمجي للتشغيل وبيان.
        • <service>/<service>.runfiles_manifest
        • <service>/<service>
        • <service>/<service>.runfiles/com_google_ondevicepersonalization_federatedcompute/**

إعدادات الصور

  • Entrypoint
    • /<service>/<service>

إنشاء صور

بعد اختيار أحمال العمل، يمكنك إنشاء الصور ونشرها.

المتطلبات الأساسية

  • Bazel‏ 6.4.0
    • يتطلّب تثبيت Java وC++‎
  • Docker

الإجراء

يجب إنشاء الصور داخل حاوية Docker التي تم إنشاؤها بواسطة dockerfile المقدَّم. يتم توفير نصَّين برمجيَّين للمساعدة في إنشاء الصور النهائية المحدَّدة.

  • docker_run.sh
    • ستنشئ docker_run.sh صورة Docker من ملف Dockerfile، وستركّب دليل العمل، وستركّب برنامج Docker الخفي على الجهاز المضيف، وستشغّل Docker باستخدام أمر bash المقدَّم. سيتم التعامل مع أي متغيرات تم تمريرها قبل أمر bash كعلامات docker run.
  • build_images.sh
    • سيتم تشغيل build_images.sh على bazel build لجميع الصور وسيتم عرض رموز التجزئة الخاصة بالصور التي تم إنشاؤها لكل صورة تم إنشاؤها.

إنشاء جميع الصور

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

يمكن العثور على رموز التجزئة المتوقّعة لكل إصدار ضمن إصدارات GitHub الخاصة بـ odp-federatedcompute.

نشر الصور

يتم ضبط إعدادات النشر باستخدام قواعد oci_push في Bazel. بالنسبة إلى كل خدمة، يجب ضبط المستودع المستهدف على ما يلي:

  • العارض
  • المجمِّع
  • model_updater
  • task_assignment
  • task_management
  • task_scheduler
  • task_builder

نشر صورة واحدة

لنشر صورة واحدة:

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

الصور المضمّنة

على صانع المحتوى تخزين جميع الصور التي تم إنشاؤها واستضافتها، مثلاً في مستودع عناصر Google Cloud Platform.