يجب توفّر إصدارات حتمية لإثبات صحة أحمال العمل في بيئة التنفيذ الموثوقة (TEE) الخاصة بميزة "التخصيص على الجهاز" (ODP)، وهي متاحة للجميع على Google Cloud باسم Confidential Space (CS).
يجب أن تنشئ صور أحمال العمل تجزئة صور محددة يمكن أن تستخدمها خدمة "التحقّق من صحة البرامج" للتحقّق من صحة أحمال العمل (التي تستخدم بنية RFC 9334 Remote ATtestation procedureS (RATS) الصادرة عن المعهد الوطني للمعايير والتكنولوجيا).
سيتناول هذا المستند عملية التنفيذ والدعم لعمليات الإنشاء الحتمية في مستودع odp-federatedcompute. سيتم تشغيل خدمات "مجمّع بيانات الخصوصية التفاضلية" و"أداة تعديل النموذج" ضمن "المساحة الآمنة". يتيح المستودع عمليات إنشاء حتمية لجميع خدماتنا، وهي مطلوبة لحالات الاستخدام في مرحلة الإنتاج.
عمليات الإنشاء الحتمية
تتألف الإصدارات الحتمية من مكوّنين رئيسيَّين:
- تجميع الملفات الثنائية المطلوبة ويشمل ذلك ملفات JAR والمكتبات المشتركة والبيانات الوصفية.
- الصورة الأساسية والتبعيات في وقت التشغيل صورة الأساس لبيئة وقت التشغيل المستخدَمة لتنفيذ الملفات الثنائية المجمَّعة
في الوقت الحالي، يتيح مستودع 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 من طبقتَين:
- طبقة الصورة الأساسية
- صورة Java الأساسية:
gcr.io/distroless/java17-debian11
- صورة Java الأساسية:
- طبقة حجم المعالجة
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 من عدة طبقات:
- طبقة الصورة الأساسية
- صورة Java الأساسية:
gcr.io/distroless/java17-debian11
- صورة Java الأساسية:
- طبقات تبعية حزمة Debian يتم إنشاء الطبقات باستخدام أرشيفات deb التي تم تنزيلها من debian-snapshot وإعادة تجميعها كطبقات صور
libc++1-16_amd64.tarlibc++abi1-16_amd64.tarlibc6_amd64.tarlibunwind-16_amd64.tarlibgcc-s1_amd64.targcc-13-base_amd64.tar
- طبقة حجم المعالجة
binary_tar.tar<service>_application.jarlibtensorflow-jni.solibaggregation-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>/
- يتم تخزين حزمة Python ضمن
<service>.runfiles_manifest- ملف البيان الخاص بالدليل
<service>.runfiles/
- ملف البيان الخاص بالدليل
<service>- نص Python البرمجي لتشغيل عبء عمل Python باستخدام ملفات التشغيل
طبقات الصور
تتكوّن صورة عبء عمل Python من أربع طبقات:
- طبقة الصورة الأساسية
- صورة أساسية لـ Python python:slim
- طبقة المترجم
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>
إنشاء صور
بعد اختيار أحمال العمل، يمكنك إنشاء الصور ونشرها.
المتطلبات الأساسية
الإجراء
يجب إنشاء الصور داخل حاوية 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.