গুগল ক্লাউডে কনফিডেনশিয়াল স্পেস (CS) হিসেবে সর্বজনীনভাবে উপলব্ধ, অন ডিভাইস পার্সোনালাইজেশন (ODP) ট্রাস্টেড এক্সিকিউশন এনভায়রনমেন্ট (TEE) তে ওয়ার্কলোড অ্যাটেস্টেশনের জন্য ডিটারমিনিস্টিক বিল্ড প্রয়োজন।
ওয়ার্কলোড ইমেজগুলিকে অবশ্যই একটি ডিটারমিনিস্টিক ইমেজ হ্যাশ তৈরি করতে হবে যা CS দ্বারা ওয়ার্কলোড অ্যাটেস্টেশনের জন্য ব্যবহার করা যেতে পারে (যা NIST এর RFC 9334 রিমোট ATtestation পদ্ধতি (RATS) আর্কিটেকচার ব্যবহার করে)।
এই ডকুমেন্টটি odp-federatedcompute রিপোজিটরিতে ডিটারমিনিস্টিক বিল্ডের বাস্তবায়ন এবং সহায়তা নিয়ে আলোচনা করবে। ODP অ্যাগ্রিগেটর এবং মডেল আপডেটার পরিষেবাগুলি গোপনীয় স্থানের মধ্যে চলবে। রিপোজিটরিটি আমাদের সমস্ত পরিষেবার জন্য ডিটারমিনিস্টিক বিল্ড সমর্থন করে, যা উৎপাদন ব্যবহারের ক্ষেত্রে প্রয়োজনীয়।
নির্ধারক বিল্ডস
নির্ধারক বিল্ড দুটি প্রধান উপাদান নিয়ে গঠিত:
- প্রয়োজনীয় বাইনারিগুলির সংকলন। এর মধ্যে রয়েছে জার, শেয়ার্ড লাইব্রেরি এবং মেটাডেটা।
- বেস ইমেজ এবং রানটাইম নির্ভরতা। রানটাইম এনভায়রনমেন্টের বেস ইমেজ যা কম্পাইল করা বাইনারিগুলি কার্যকর করতে ব্যবহৃত হয়।
এখন পর্যন্ত, ODP ফেডারেটেড কম্পিউট রিপোজিটরি নিম্নলিখিত ধরণের ওয়ার্কলোড সমর্থন করে:
- জাভা + স্প্রিং ওয়ার্কলোড
- টাস্ক অ্যাসাইনমেন্ট, টাস্ক ম্যানেজমেন্ট, কালেক্টর
- JNI টেনসরফ্লো ওয়ার্কলোড সহ জাভা + স্প্রিং
- মডেলআপডেটার, অ্যাগ্রিগেটর
- পাইথন ওয়ার্কলোড
- টাস্কবিল্ডার
নির্ভরতা
নিম্নলিখিত তালিকায় নির্ভরতা রয়েছে যেগুলোর উপর ODP নির্ধারণবাদ এবং প্রাপ্যতা বজায় রাখার জন্য নির্ভর করে:
- বাজেল
- গিটহাব
- মাভেন
- পাইপিআই
- ডেবিয়ান স্ন্যাপশট
- ডকারহাব রেজিস্ট্রি
- গুগল কন্টেইনার রেজিস্ট্রি (GCR)
নির্ধারক কাজের চাপ
সমস্ত ওয়ার্কলোড Bazel ব্যবহার করে কম্পাইল করা হয়, ভাষা-নির্দিষ্ট টুলচেইন এবং rules_oci ব্যবহার করে তৈরি কন্টেইনার ইমেজ সহ। WORKSPACE ফাইলটি সংশ্লিষ্ট সংস্করণ এবং হ্যাশ সহ সমস্ত নির্ভরতা সংজ্ঞায়িত করে।
ডেবিয়ান স্ন্যাপশট
সমস্ত ওয়ার্কলোড ইমেজ একটি ডেবিয়ান স্ন্যাপশটের উপরে নির্মিত প্রদত্ত ডকারফাইলের মধ্যে তৈরি করা উচিত। ডেবিয়ান স্ন্যাপশটগুলি একটি স্থিতিশীল রিপোজিটরি স্ন্যাপশট প্রদান করে যার মধ্যে রয়েছে নির্ধারক:
- সিস্টেম হেডার এবং লাইব্রেরি
- সিস্টেম আর্কিটেকচার
- লিনাক্স_এক্স৮৬_৬৪
- ডেবিয়ান
- সি++ কম্পাইলার
জাভা স্প্রিং কাজের চাপ
Bazel এর remotejdk_17 কম্পাইলেশনের জন্য একটি হারমেটিক জাভা প্রদান করতে ব্যবহৃত হয়। অন্যান্য জাভা নির্ভরতা WORKSPACE ফাইলে পরিচালিত এবং সংজ্ঞায়িত করা হয়।
জাভা স্প্রিং ওয়ার্কলোডগুলি <service>_application.jar নামক একটি jar ফাইলে কম্পাইল করে। jarটিতে রয়েছে:
- জাভা ক্লাস ফাইল
-
META-INF/- ব্যাজেল ম্যানিফেস্ট ডেটা
-
build-data.properties- ব্যাজেল বিল্ড-ডেটা
-
BOOT-INF/- প্যাকেজড জার ডিপেন্ডেন্সি, rules_spring দ্বারা তৈরি।
ছবির স্তর
জাভা স্প্রিং ওয়ার্কলোড ইমেজ দুটি স্তর নিয়ে গঠিত:
- বেস ইমেজ লেয়ার
- জাভা বেস ইমেজ:
gcr.io/distroless/java17-debian11
- জাভা বেস ইমেজ:
- কাজের চাপ স্তর
-
binary_tar.tar-
<service>_application.jar
-
-
চিত্র কনফিগারেশন
- প্রবেশ বিন্দু
-
java -jar <service>_application.jar
-
জেএনআই টেনসরফ্লো ওয়ার্কলোড
JNI Tensorflow ওয়ার্কলোডগুলি জাভা স্প্রিং ওয়ার্কলোডের উপরে তৈরি করা হয়। মেশিন কোড কম্পাইল করার জন্য ডেবিয়ান স্ন্যাপশট ইমেজ দ্বারা প্রি-বিল্ট Clang+LLVM 16 ব্যবহার করে একটি হারমেটিক Clang+LLVM Bazel টুলচেইন সরবরাহ করা হয়।
JNI ওয়ার্কলোডগুলি libtensorflow.so নামক একটি শেয়ার্ড লাইব্রেরিতে কম্পাইল করে, সাথে <service>_application.jar ।
ছবির স্তর
JNI টেনসরফ্লো ওয়ার্কলোড ইমেজটি বেশ কয়েকটি স্তর নিয়ে গঠিত:
- বেস ইমেজ লেয়ার
- জাভা বেস ইমেজ:
gcr.io/distroless/java17-debian11
- জাভা বেস ইমেজ:
- ডেবিয়ান প্যাকেজ নির্ভরতা স্তর। স্তরগুলি debian-snapshot থেকে ডাউনলোড করা deb আর্কাইভ ব্যবহার করে তৈরি করা হয় এবং চিত্র স্তর হিসাবে পুনরায় প্যাকেজ করা হয়।
-
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
-
পাইথন ওয়ার্কলোড
Bazel এর rules_python একটি হারমেটিক Python 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>
-
ছবি তৈরি করুন
একবার আপনার কাজের চাপ নির্বাচন করা হয়ে গেলে আপনি আপনার ছবি তৈরি এবং প্রকাশ করতে প্রস্তুত।
পূর্বশর্ত
পদ্ধতি
প্রদত্ত dockerfile দ্বারা নির্মিত docker কন্টেইনারের মধ্যে ছবিগুলি তৈরি করা উচিত। চূড়ান্ত নির্ধারক চিত্র তৈরিতে সহায়তা করার জন্য দুটি স্ক্রিপ্ট সরবরাহ করা হয়েছে।
- ডকার_রান.শ
-
docker_run.shdockerfile থেকে docker ইমেজ তৈরি করবে, ওয়ার্ক ডিরেক্টরি মাউন্ট করবে, হোস্ট docker ডেমন মাউন্ট করবে এবং প্রদত্ত bash কমান্ড ব্যবহার করে docker চালাবে। bash কমান্ডের আগে পাস করা যেকোনো ভেরিয়েবলকে docker run ফ্ল্যাগ হিসেবে গণ্য করা হবে।
-
- বিল্ড_ইমেজ.এসএইচ
-
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 আর্টিফ্যাক্ট রেজিস্ট্রিতে ।