ต้องมีบิลด์เชิงกำหนดสำหรับเอกสารรับรองภาระงานในอุปกรณ์ สภาพแวดล้อมการดำเนินการที่เชื่อถือได้ (TEE) ที่ปรับเปลี่ยนในแบบของคุณ (ODP) พร้อมใช้งานแบบสาธารณะใน Google Cloud ในฐานะ Confidential Space (CS)
อิมเมจภาระงานต้องสร้างแฮชอิมเมจเชิงกำหนดที่สามารถใช้งานได้โดย CS สำหรับการยืนยันภาระงาน (ซึ่งใช้เอกสารรับรองระยะไกล RFC 9334 ของ NIST สถาปัตยกรรมกระบวนการโพรเซส (RATS))
เอกสารนี้จะกล่าวถึงการติดตั้งใช้งานและการสนับสนุนสำหรับการกำหนดทิศทาง ใน odp-federatedcompute ที่เก็บได้ บริการ ODP Aggregator และ Model Updater จะทำงานภายใน ข้อมูลลับ ที่เก็บรองรับบิลด์เชิงกำหนดสำหรับ บริการ ซึ่งจำเป็นสำหรับกรณีการใช้งานจริง
บิลด์เชิงกำหนด
บิลด์เชิงกำหนดประกอบด้วยองค์ประกอบหลัก 2 ส่วน ได้แก่
- การคอมไพล์ไบนารีที่จำเป็น ซึ่งรวมถึง jar, คลังภาพที่แชร์ และข้อมูลเมตา
- ทรัพยากร 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 เดเบียน สแนปชอตจะมีสแนปชอตของที่เก็บที่เสถียรพร้อมการกำหนดสิ่งต่อไปนี้
- ส่วนหัวของระบบและไลบรารี
- สถาปัตยกรรมของระบบ
- linux_x86_64
- เดเบียน
- คอมไพเลอร์ C++
ภาระงานของ 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 เลเยอร์ ดังนี้
- เลเยอร์รูปภาพฐาน
- อิมเมจฐานของ Java:
gcr.io/distroless/java17-debian11
- อิมเมจฐานของ Java:
- เลเยอร์ภาระงาน
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 ประกอบด้วยหลายเลเยอร์ ดังนี้
- เลเยอร์รูปภาพฐาน
- อิมเมจฐานของ Java:
gcr.io/distroless/java17-debian11
- อิมเมจฐานของ Java:
- เลเยอร์ทรัพยากร 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>/
- การกระจาย Python จัดเก็บอยู่ภายใต้
<service>.runfiles_manifest
- ไฟล์ Manifest สำหรับไดเรกทอรี
<service>.runfiles/
- ไฟล์ Manifest สำหรับไดเรกทอรี
<service>
- สคริปต์ Python เพื่อเรียกใช้ภาระงาน Python โดยใช้รันไฟล์
เลเยอร์รูปภาพ
อิมเมจภาระงาน Python ประกอบด้วย 4 เลเยอร์ดังนี้
- เลเยอร์รูปภาพฐาน
- อิมเมจฐาน 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
- ประกอบด้วยซอร์สโค้ด สคริปต์เริ่มต้น และไฟล์ Manifest
<service>/<service>.runfiles_manifest
<service>/<service>
<service>/<service>.runfiles/com_google_ondevicepersonalization_federatedcompute/**
- ประกอบด้วยซอร์สโค้ด สคริปต์เริ่มต้น และไฟล์ Manifest
การกำหนดค่าอิมเมจ
- การเข้าถึงเครื่องมือ
/<service>/<service>
สร้างอิมเมจ
เมื่อเลือกภาระงานแล้ว คุณก็พร้อมที่จะสร้างและเผยแพร่ รูปภาพ
ข้อกำหนดเบื้องต้น
ขั้นตอน
รูปภาพควรสร้างภายในคอนเทนเนอร์ 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