บิลด์เชิงกำหนดของการประมวลผลแบบรวมศูนย์สำหรับการปรับเปลี่ยนอุปกรณ์ในแบบของคุณ

ต้องมีบิลด์เชิงกำหนดสำหรับเอกสารรับรองภาระงานในอุปกรณ์ สภาพแวดล้อมการดำเนินการที่เชื่อถือได้ (TEE) ที่ปรับเปลี่ยนในแบบของคุณ (ODP) พร้อมใช้งานแบบสาธารณะใน Google Cloud ในฐานะ Confidential Space (CS)

อิมเมจภาระงานต้องสร้างแฮชอิมเมจเชิงกำหนดที่สามารถใช้งานได้โดย CS สำหรับการยืนยันภาระงาน (ซึ่งใช้เอกสารรับรองระยะไกล RFC 9334 ของ NIST สถาปัตยกรรมกระบวนการโพรเซส (RATS))

เอกสารนี้จะกล่าวถึงการติดตั้งใช้งานและการสนับสนุนสำหรับการกำหนดทิศทาง ใน odp-federatedcompute ที่เก็บได้ บริการ ODP Aggregator และ Model Updater จะทำงานภายใน ข้อมูลลับ ที่เก็บรองรับบิลด์เชิงกำหนดสำหรับ บริการ ซึ่งจำเป็นสำหรับกรณีการใช้งานจริง

บิลด์เชิงกำหนด

บิลด์เชิงกำหนดประกอบด้วยองค์ประกอบหลัก 2 ส่วน ได้แก่

  1. การคอมไพล์ไบนารีที่จำเป็น ซึ่งรวมถึง jar, คลังภาพที่แชร์ และข้อมูลเมตา
  2. ทรัพยากร Dependency ของอิมเมจฐานและรันไทม์ ฐานของสภาพแวดล้อมรันไทม์ ที่ใช้ดำเนินการกับไบนารีที่คอมไพล์แล้ว

ปัจจุบันที่เก็บ ODP Federated Compute รองรับประเภทต่อไปนี้ ภาระงาน:

  • ภาระงาน Java + Spring
    • การมอบหมายงาน การจัดการงาน ผู้รวบรวม
  • Java + Spring กับภาระงาน tensorflow ของ JNI
    • ModelUpdater, ผู้รวบรวมข้อมูล
  • ภาระงาน Python
    • TaskBuilder

การอ้างอิง

รายการต่อไปนี้คือทรัพยากร Dependency ที่ ODP ใช้เพื่อรักษาการกำหนดเชิงกำหนด และความพร้อมจำหน่ายสินค้า

  • Bazel
  • GitHub
  • Maven
  • PyPi
  • สแนปชอต Debian
  • รีจิสทรี DockerHub
  • Google Container Registry (GCR)

ภาระงานเชิงกำหนด

ภาระงานทั้งหมดได้รับการคอมไพล์โดยใช้ Bazel ที่มี Toolchains เฉพาะภาษาและอิมเมจคอนเทนเนอร์ที่สร้างขึ้นโดยใช้ rules_oci พื้นที่ทำงาน ไฟล์ กำหนดทรัพยากร Dependency ทั้งหมดด้วยเวอร์ชันและแฮชที่เกี่ยวข้อง

สแนปชอต Debian

อิมเมจภาระงานทั้งหมดควรสร้างภายในตามที่กำหนด dockerfile สร้างต่อยอดจากสแนปชอต Debian เดเบียน สแนปชอตจะมีสแนปชอตของที่เก็บที่เสถียรพร้อมการกำหนดสิ่งต่อไปนี้

ภาระงานของ Java Spring

บาเซล remotejdk_17 คือ ซึ่งใช้ในการจัดเตรียม Java ที่สอดแทรกไว้สำหรับการคอมไพล์ ทรัพยากร Dependency ของ Java อื่นๆ มีการจัดการและกำหนดไว้ใน WORKSPACE ไฟล์

ภาระงานของ Java Spring คอมไพล์ไปยังไฟล์ Jar ชื่อ <service>_application.jar ในโหลจะมีข้อมูลต่อไปนี้

  • ไฟล์คลาส Java
  • META-INF/
    • ข้อมูลไฟล์ Manifest ของ Bazel
  • build-data.properties
    • ข้อมูลบิลด์ของ Bazel
  • BOOT-INF/
    • ทรัพยากร Dependency ของ Jar แบบแพ็กเกจสร้างขึ้นโดย rules_spring

เลเยอร์รูปภาพ

อิมเมจภาระงาน Java Spring ประกอบด้วย 2 เลเยอร์ ดังนี้

  • เลเยอร์รูปภาพฐาน
  • เลเยอร์ภาระงาน
    • binary_tar.tar
      • <service>_application.jar

การกำหนดค่าอิมเมจ

  • การเข้าถึงเครื่องมือ
    • java -jar <service>_application.jar

ภาระงานของ JNI Tensorflow

ภาระงานของ JNI Tensorflow สร้างขึ้นจากภาระงาน Java Spring ต เชนเครื่องมือ Clang+LLVM Bazel แบบแยกส่วนนั้นให้บริการโดยใช้ Clang+LLVM ที่สร้างไว้ล่วงหน้า 16 ด้วย sysroot ได้มาจากอิมเมจสแนปชอต Debian เพื่อคอมไพล์โค้ดของเครื่อง

คอมไพล์ภาระงาน JNI ไปยังไลบรารีที่แชร์ชื่อ libtensorflow.so พร้อมกับ ด้วย <service>_application.jar

เลเยอร์รูปภาพ

อิมเมจภาระงาน JNI tensorflow ประกอบด้วยหลายเลเยอร์ ดังนี้

  • เลเยอร์รูปภาพฐาน
  • เลเยอร์ทรัพยากร Debian ของแพ็กเกจ 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 เท่านั้น)
    • "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"
  • การเข้าถึงเครื่องมือ
    • java -Djava.library.path=. -jar <service>_application.jar

ภาระงาน Python

rules_python ของ Bazel ใช้เพื่อ จะมีเครื่องมือเชน Python 3.10 ที่สอดแทรกไว้ ข้อกำหนดของ PIP ที่ล็อก ไฟล์ ใช้สำหรับการดึงข้อมูลเชิงกำหนดของทรัพยากร Dependency ของ 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
    • ไฟล์ Manifest สำหรับไดเรกทอรี <service>.runfiles/
  • <service>
    • สคริปต์ Python เพื่อเรียกใช้ภาระงาน Python โดยใช้รันไฟล์

เลเยอร์รูปภาพ

อิมเมจภาระงาน Python ประกอบด้วย 4 เลเยอร์ดังนี้

  • เลเยอร์รูปภาพฐาน
  • เลเยอร์โหมดล่าม
    • interpreter_layer.jar
      • <service>/<service>.runfiles/python_x86_64-unknown-linux-gnu/**
  • เลเยอร์แพ็กเกจ
    • packages_layer.jar
      • <service>/<service>.runfiles/**/site-packages/**
  • เลเยอร์ภาระงาน
    • app_tar_manifest.tar
      • ประกอบด้วยซอร์สโค้ด สคริปต์เริ่มต้น และไฟล์ Manifest
        • <service>/<service>.runfiles_manifest
        • <service>/<service>
        • <service>/<service>.runfiles/com_google_ondevicepersonalization_federatedcompute/**

การกำหนดค่าอิมเมจ

  • การเข้าถึงเครื่องมือ
    • /<service>/<service>

สร้างอิมเมจ

เมื่อเลือกภาระงานแล้ว คุณก็พร้อมที่จะสร้างและเผยแพร่ รูปภาพ

ข้อกำหนดเบื้องต้น

  • Bazel 6.4.0
    • ต้องมีการติดตั้ง Java และ C++
  • Docker

ขั้นตอน

รูปภาพควรสร้างภายในคอนเทนเนอร์ Docker ที่สร้างโดย dockerfile สคริปต์ 2 ชุดมีเพื่อช่วยสร้างรูปภาพที่กำหนดในขั้นสุดท้าย

  • docker_run.sh
    • docker_run.sh จะสร้างอิมเมจ Docker จาก Dockerfile, Mount ไดเรกทอรีงาน ให้ต่อเชื่อม Daemon ของ Docker โฮสต์และเรียกใช้ Docker ด้วย คำสั่ง Bash ที่มีให้ ตัวแปรใดๆ ที่ส่งผ่านก่อนคำสั่ง Bash ถือเป็นแฟล็กการเรียกใช้ Docker
  • build_images.sh
    • build_images.sh จะเรียกใช้ bazel build สำหรับรูปภาพทั้งหมดและเอาต์พุต แฮชของอิมเมจที่สร้างขึ้นสำหรับอิมเมจที่สร้างขึ้นแต่ละภาพ

สร้างรูปภาพทั้งหมด

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

คุณสามารถดูแฮชรูปภาพที่คาดไว้สําหรับแต่ละรุ่นได้ในส่วน odp-federatedcompute GitHub รุ่นต่างๆ

เผยแพร่ภาพ

กำหนดค่าการเผยแพร่โดยใช้ 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"

รูปภาพที่สร้างขึ้น

รูปภาพที่สร้างขึ้นทั้งหมดจะต้องจัดเก็บและโฮสต์โดยผู้สร้าง เช่น รีจิสทรีอาร์ติแฟกต์ของ GCP