অন-ডিভাইস ব্যক্তিগতকরণ ফেডারেটেড কম্পিউট ডিটারমিনিস্টিক বিল্ড

ডিভাইস পার্সোনালাইজেশন (ODP) ট্রাস্টেড এক্সিকিউশন এনভায়রনমেন্ট (TEE)-এ ওয়ার্কলোড অ্যাটেস্টেশনের জন্য ডিটারমিনিস্টিক বিল্ডগুলি প্রয়োজন, যা গোপনীয় স্থান (CS) হিসাবে Google ক্লাউডে সর্বজনীনভাবে উপলব্ধ।

কাজের চাপের চিত্রগুলিকে অবশ্যই একটি নির্ধারক ইমেজ হ্যাশ তৈরি করতে হবে যা CS দ্বারা ওয়ার্কলোড প্রত্যয়নের জন্য ব্যবহার করা যেতে পারে (যা NIST এর RFC 9334 Remote ATtestation processS (RATS) আর্কিটেকচার ব্যবহার করে)।

এই নথিটি ওডিপি-ফেডারেটেড কম্পিউট রিপোজিটরিতে ডিটারমিনিস্টিক বিল্ডগুলির বাস্তবায়ন এবং সমর্থনের উপর যাবে। ODP অ্যাগ্রিগেটর এবং মডেল আপডেটার পরিষেবাগুলি গোপনীয় স্থানের মধ্যে চলবে৷ রিপোজিটরি আমাদের সমস্ত পরিষেবার জন্য নির্ধারক বিল্ড সমর্থন করে, যা উত্পাদন ব্যবহারের ক্ষেত্রে প্রয়োজনীয়।

ডিটারমিনিস্টিক তৈরি করে

নির্ধারক বিল্ড দুটি প্রধান উপাদান নিয়ে গঠিত:

  1. প্রয়োজনীয় বাইনারিগুলির সংকলন। এর মধ্যে রয়েছে জার, শেয়ার করা লাইব্রেরি এবং মেটাডেটা।
  2. বেস ইমেজ এবং রানটাইম নির্ভরতা। রানটাইম এনভায়রনমেন্টের বেস ইমেজ কম্পাইল করা বাইনারি চালানোর জন্য ব্যবহৃত হয়।

এখন পর্যন্ত, ODP ফেডারেটেড কম্পিউট রিপোজিটরি নিম্নলিখিত ধরনের কাজের চাপ সমর্থন করে:

  • জাভা + স্প্রিং ওয়ার্কলোড
    • টাস্ক অ্যাসাইনমেন্ট, টাস্ক ম্যানেজমেন্ট, কালেক্টর
  • জাভা + জেএনআই টেনসরফ্লো ওয়ার্কলোড সহ স্প্রিং
    • মডেল আপডেটার, অ্যাগ্রিগেটর
  • পাইথন কাজের চাপ
    • টাস্কবিল্ডার

নির্ভরতা

নিম্নলিখিত তালিকা হল নির্ভরতা যা ODP নির্ধারকতা এবং প্রাপ্যতা বজায় রাখার জন্য নির্ভর করে:

  • বাজেল
  • গিটহাব
  • মাভেন
  • PyPi
  • ডেবিয়ান স্ন্যাপশট
  • ডকারহাব রেজিস্ট্রি
  • Google কন্টেইনার রেজিস্ট্রি (GCR)

নির্ধারক কাজের চাপ

সমস্ত কাজের বোঝা ভাষা-নির্দিষ্ট টুলচেন এবং রুলস_oci ব্যবহার করে নির্মিত কন্টেইনার ইমেজ সহ Bazel ব্যবহার করে সংকলিত হয়। WORKSPACE ফাইল সংশ্লিষ্ট সংস্করণ এবং হ্যাশ সহ সমস্ত নির্ভরতা সংজ্ঞায়িত করে।

ডেবিয়ান স্ন্যাপশট

সমস্ত কাজের চাপের ছবি একটি ডেবিয়ান স্ন্যাপশটের উপরে নির্মিত প্রদত্ত ডকারফাইলের মধ্যে তৈরি করা উচিত। ডেবিয়ান স্ন্যাপশটগুলি নির্ধারক সহ একটি স্থিতিশীল সংগ্রহস্থল স্ন্যাপশট প্রদান করে:

জাভা স্প্রিং কাজের চাপ

Bazel এর remotejdk_17 সংকলনের জন্য একটি হারমেটিক জাভা প্রদান করতে ব্যবহৃত হয়। অন্যান্য জাভা নির্ভরতা WORKSPACE ফাইলে পরিচালিত এবং সংজ্ঞায়িত করা হয়।

জাভা স্প্রিং ওয়ার্কলোডগুলি <service>_application.jar নামে একটি জার ফাইলে কম্পাইল করে। জারটিতে রয়েছে:

  • জাভা ক্লাস ফাইল
  • META-INF/
    • Bazel ম্যানিফেস্ট ডেটা
  • build-data.properties
    • বেজেল বিল্ড-ডেটা
  • BOOT-INF/

ইমেজ স্তর

জাভা স্প্রিং ওয়ার্কলোড ইমেজ দুটি স্তর নিয়ে গঠিত:

  • বেস ইমেজ স্তর
  • কাজের চাপ স্তর
    • binary_tar.tar
      • <service>_application.jar

ইমেজ কনফিগারেশন

  • এন্ট্রিপয়েন্ট
    • java -jar <service>_application.jar

JNI টেনসরফ্লো কাজের চাপ

JNI টেনসরফ্লো ওয়ার্কলোডগুলি জাভা স্প্রিং ওয়ার্কলোডের উপরে তৈরি করা হয়েছে। মেশিন কোড কম্পাইল করার জন্য ডেবিয়ান স্ন্যাপশট ইমেজ দ্বারা প্রদত্ত একটি sysroot সহ প্রি-বিল্ট ক্ল্যাং+এলএলভিএম 16 ​​ব্যবহার করে একটি হারমেটিক ক্ল্যাং+এলএলভিএম ব্যাজেল টুলচেন প্রদান করা হয়।

JNI ওয়ার্কলোডগুলি <service>_application.jar সহ libtensorflow.so নামে একটি শেয়ার্ড লাইব্রেরিতে কম্পাইল করে।

ইমেজ স্তর

JNI টেনসরফ্লো ওয়ার্কলোড ইমেজটি বিভিন্ন স্তর নিয়ে গঠিত:

  • বেস ইমেজ স্তর
  • ডেবিয়ান প্যাকেজ নির্ভরতা স্তর। স্তরগুলি ডেবিয়ান-স্ন্যাপশট থেকে ডাউনলোড করা ডেব আর্কাইভ ব্যবহার করে তৈরি করা হয় এবং চিত্র স্তর হিসাবে পুনরায় প্যাকেজ করা হয়
    • 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

পাইথন কাজের চাপ

বেজেলের নিয়ম_পাইথন একটি হারমেটিক পাইথন 3.10 টুলচেন প্রদান করতে ব্যবহৃত হয়। একটি লক করা পিপ প্রয়োজনীয়তা ফাইলটি পিপ নির্ভরতা নির্ধারণের জন্য ব্যবহৃত হয়। ডেবিয়ান স্ন্যাপশট চিত্রটি নিশ্চিত করে যে প্ল্যাটফর্ম সামঞ্জস্যের উপর ভিত্তি করে নির্ধারক বিতরণগুলি আনা হয়েছে এবং উত্স বিতরণগুলি কম্পাইল করার জন্য একটি C++ টুলচেন সরবরাহ করে।

পাইথন ওয়ার্কলোডগুলি ডাউনলোড করা পিপ প্যাকেজ, একটি পাইথন 3.10 ডিস্ট্রিবিউশন, ODP পাইথন সোর্স কোড এবং একটি পাইথন স্টার্টআপ স্ক্রিপ্টের একটি সেটে প্যাকেজ করা হবে।

  • <service>.runfiles/
    • পাইথন বিতরণ python_x86_64-unknown-linux-gnu/ এর অধীনে সংরক্ষণ করা হয়
    • সোর্স কোড com_google_ondevicepersonalization_federatedcompute/ এর অধীনে সংরক্ষণ করা হয়
    • পিপ প্যাকেজগুলি pypi_<dependency_name>/ এর অধীনে সংরক্ষণ করা হয়
  • <service>.runfiles_manifest
    • <service>.runfiles/ ডিরেক্টরির জন্য ম্যানিফেস্ট ফাইল
  • <service>
    • পাইথন স্ক্রিপ্ট রানফাইল ব্যবহার করে পাইথন ওয়ার্কলোড চালানোর জন্য

ইমেজ স্তর

পাইথন ওয়ার্কলোড চিত্রটি চারটি স্তর নিয়ে গঠিত:

  • বেস ইমেজ স্তর
  • দোভাষী স্তর
    • 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/**

ইমেজ কনফিগারেশন

  • এন্ট্রিপয়েন্ট
    • /<service>/<service>

ছবি তৈরি করুন

একবার আপনার ওয়ার্কলোডগুলি বেছে নেওয়া হয়ে গেলে আপনি আপনার ছবিগুলি তৈরি এবং প্রকাশ করতে প্রস্তুত৷

পূর্বশর্ত

  • Bazel 6.4.0
    • Java এবং C++ ইনস্টলেশনের প্রয়োজন
  • ডকার

পদ্ধতি

প্রদত্ত ডকারফাইল দ্বারা নির্মিত ডকার কন্টেইনারের মধ্যে ছবিগুলি তৈরি করা উচিত৷ চূড়ান্ত নির্ধারক ইমেজ নির্মাণে সাহায্য করার জন্য দুটি স্ক্রিপ্ট প্রদান করা হয়েছে।

  • docker_run.sh
    • docker_run.sh ডকারফাইল থেকে ডকার ইমেজ তৈরি করবে, ওয়ার্ক ডিরেক্টরি মাউন্ট করবে, হোস্ট ডকার ডেমন মাউন্ট করবে এবং প্রদত্ত ব্যাশ কমান্ড দিয়ে ডকার রান করবে। ব্যাশ কমান্ডের আগে পাস করা যেকোনো ভেরিয়েবলকে ডকার রান ফ্ল্যাগ হিসেবে গণ্য করা হবে।
  • build_images.sh
    • build_images.sh সমস্ত ছবির জন্য bazel build চালাবে এবং প্রতিটি বিল্ট ইমেজের জন্য জেনারেট করা ইমেজ হ্যাশ আউটপুট করবে।

সমস্ত ছবি তৈরি করুন

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

প্রতিটি রিলিজের জন্য প্রত্যাশিত ইমেজ হ্যাশগুলি odp-federatedcompute GitHub রিলিজের অধীনে পাওয়া যাবে।

ছবি প্রকাশ করুন

oci_push Bazel নিয়ম ব্যবহার করে প্রকাশনা কনফিগার করা হয়েছে। প্রতিটি পরিষেবার জন্য, লক্ষ্য সংগ্রহস্থলটি সকলের জন্য কনফিগার করা উচিত:

  • সমষ্টিকারী
  • সংগ্রাহক
  • মডেল_আপডেটার
  • কাজের কার্যভার
  • কার্য ব্যবস্থাপনা
  • কাজের সূচি
  • টাস্ক_বিল্ডার

একটি একক ছবি প্রকাশ করুন

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

নির্মিত ছবি

সমস্ত তৈরি করা ছবিগুলিকে স্রষ্টার দ্বারা সংরক্ষণ এবং হোস্ট করতে হবে, যেমন একটি GCP আর্টিফ্যাক্ট রেজিস্ট্রিতে