অন-ডিভাইস ব্যক্তিগতকরণ বিকাশকারী নির্দেশিকা,অন-ডিভাইস ব্যক্তিগতকরণ বিকাশকারী নির্দেশিকা,অন-ডিভাইস ব্যক্তিগতকরণ বিকাশকারী নির্দেশিকা

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

ODP একটি IsolatedProcess এ ডেভেলপার কোড চালায় যার নেটওয়ার্ক, স্থানীয় ডিস্ক বা ডিভাইসে চলমান অন্যান্য পরিষেবাগুলিতে সরাসরি অ্যাক্সেস নেই তবে নিম্নলিখিত স্থানীয়ভাবে স্থায়ী ডেটা উৎসগুলিতে অ্যাক্সেস রয়েছে:

  • RemoteData - প্রযোজ্য ক্ষেত্রে, দূরবর্তী, ডেভেলপার পরিচালিত ব্যাকএন্ড থেকে ডাউনলোড করা অপরিবর্তনীয় কী-মান ডেটা।
  • LocalData - প্রযোজ্য ক্ষেত্রে, ডেভেলপার দ্বারা স্থানীয়ভাবে স্থায়ী পরিবর্তনযোগ্য কী-মান ডেটা।
  • UserData - প্ল্যাটফর্ম দ্বারা সরবরাহিত ব্যবহারকারীর ডেটা।

নিম্নলিখিত আউটপুটগুলি সমর্থিত:

  • স্থায়ী আউটপুট: এই আউটপুটগুলি ভবিষ্যতে স্থানীয় প্রক্রিয়াকরণ, প্রদর্শিত আউটপুট তৈরি, ফেডারেটেড লার্নিং সুবিধাপ্রাপ্ত মডেল প্রশিক্ষণ, অথবা ফেডারেটেড অ্যানালিটিক্স সুবিধাপ্রাপ্ত ক্রস-ডিভাইস পরিসংখ্যান বিশ্লেষণে ব্যবহার করা যেতে পারে।
    • ডেভেলপাররা স্থানীয় REQUESTS টেবিলে অনুরোধ এবং তাদের প্রক্রিয়াকরণের ফলাফল লিখতে পারেন।
    • ডেভেলপাররা EVENTS টেবিলে পূর্বের অনুরোধের সাথে সম্পর্কিত অতিরিক্ত ডেটা লিখতে পারেন।
  • প্রদর্শিত আউটপুট:
    • ডেভেলপাররা SurfaceView এর ভেতরে WebView এ ODP দ্বারা রেন্ডার করা HTML ফেরত দিতে পারে। সেখানে রেন্ডার করা কন্টেন্ট ইনভোকিং অ্যাপে দৃশ্যমান হবে না।
    • ডেভেলপাররা রেন্ডার করা HTML এর সাথে ব্যবহারকারীর মিথস্ক্রিয়ার লগিং এবং প্রক্রিয়াকরণ ট্রিগার করার জন্য HTML আউটপুটের মধ্যে ODP-প্রদত্ত ইভেন্ট URL গুলি এম্বেড করতে পারে। ODP সেই URL গুলিতে অনুরোধগুলিকে আটকায় এবং EVENTS টেবিলে লেখা ডেটা তৈরি করার জন্য কোড আহ্বান করে।

ক্লায়েন্ট অ্যাপ এবং SDK গুলি ODP API ব্যবহার করে SurfaceView এ HTML কন্টেন্ট প্রদর্শনের জন্য ODP ব্যবহার করতে পারে। SurfaceView এ রেন্ডার করা কন্টেন্ট কলিং অ্যাপে দৃশ্যমান হয় না। ক্লায়েন্ট অ্যাপ বা SDK ODP-এর সাথে ডেভেলপ করা অ্যাপ থেকে আলাদা একটি সত্তা হতে পারে।

ODP পরিষেবাটি সেই ক্লায়েন্ট অ্যাপ পরিচালনা করে যা ODP ব্যবহার করে তার UI-এর মধ্যে ব্যক্তিগতকৃত কন্টেন্ট দেখাতে চায়। এটি ডেভেলপারদের দেওয়া এন্ডপয়েন্ট থেকে কন্টেন্ট ডাউনলোড করে এবং ডাউনলোড করা ডেটার পোস্টপ্রসেসিংয়ের জন্য লজিক ব্যবহার করে। এটি IsolatedProcess এবং অন্যান্য পরিষেবা এবং অ্যাপের মধ্যে সমস্ত যোগাযোগের মধ্যস্থতা করে।

ক্লায়েন্ট অ্যাপগুলি OnDevicePersonalizationManager ক্লাসের পদ্ধতি ব্যবহার করে IsolatedProcess এ চলমান ডেভেলপারের কোডের সাথে ইন্টারঅ্যাক্ট করে। IsolatedProcess এ চলমান ডেভেলপারের কোড IsolatedService ক্লাসকে প্রসারিত করে এবং IsolatedWorker ইন্টারফেস প্রয়োগ করে। IsolatedService প্রতিটি অনুরোধের জন্য IsolatedWorker এর একটি উদাহরণ তৈরি করতে হবে।

নিচের চিত্রটি OnDevicePersonalizationManager এবং IsolatedWorker এর পদ্ধতিগুলির মধ্যে সম্পর্ক দেখায়।

OnDevicePersonalizationManager এবং IsolatedWorker এর মধ্যে সম্পর্কের চিত্র।

একটি ক্লায়েন্ট অ্যাপ IsolatedService নামের execute পদ্ধতি ব্যবহার করে ODP কল করে। ODP পরিষেবাটি IsolatedWorker এর onExecute পদ্ধতিতে কলটি ফরোয়ার্ড করে। IsolatedWorker স্থায়ী হওয়ার জন্য রেকর্ড এবং প্রদর্শিত কন্টেন্ট ফেরত দেয়। ODP পরিষেবা REQUESTS বা EVENTS টেবিলে স্থায়ী হওয়া আউটপুট লিখে, এবং ক্লায়েন্ট অ্যাপে প্রদর্শিত আউটপুটের জন্য একটি অস্বচ্ছ রেফারেন্স ফেরত দেয়। ক্লায়েন্ট অ্যাপটি ভবিষ্যতে requestSurfacePackage কলে এই অস্বচ্ছ রেফারেন্স ব্যবহার করে তার UI এর মধ্যে যেকোনো ডিসপ্লে কন্টেন্ট প্রদর্শন করতে পারে।

স্থায়ী আউটপুট

ডেভেলপার কর্তৃক onExecute রিটার্ন বাস্তবায়নের পরেও ODP পরিষেবা REQUESTS টেবিলে একটি রেকর্ড বজায় রাখে। REQUESTS টেবিলের প্রতিটি রেকর্ডে ODP পরিষেবা দ্বারা তৈরি কিছু সাধারণ প্রতি-অনুরোধ ডেটা এবং ফিরে আসা Rows একটি তালিকা থাকে। প্রতিটি Row (key, value) জোড়ার একটি তালিকা থাকে। প্রতিটি মান একটি স্কেলার, স্ট্রিং বা ব্লব। সংখ্যাসূচক মানগুলি একত্রিত করার পরে রিপোর্ট করা যেতে পারে এবং স্থানীয় বা কেন্দ্রীয় ডিফারেনশিয়াল গোপনীয়তা প্রয়োগ করার পরে স্ট্রিং বা ব্লব ডেটা রিপোর্ট করা যেতে পারে। ডেভেলপাররা EVENTS টেবিলে পরবর্তী ব্যবহারকারীর ইন্টারঅ্যাকশন ইভেন্টগুলিও লিখতে পারেন— EVENTS টেবিলের প্রতিটি রেকর্ড REQUESTS টেবিলের একটি সারির সাথে যুক্ত। ODP পরিষেবা স্বচ্ছভাবে একটি টাইমস্ট্যাম্প এবং কলিং অ্যাপের প্যাকেজ নাম এবং ODP ডেভেলপারের APK প্রতিটি রেকর্ডের সাথে লগ করে।

শুরু করার আগে

ODP দিয়ে ডেভেলপমেন্ট শুরু করার আগে, আপনাকে আপনার প্যাকেজ ম্যানিফেস্ট সেট আপ করতে হবে এবং ডেভেলপার মোড সক্ষম করতে হবে।

প্যাকেজ ম্যানিফেস্ট সেটিংস

ODP ব্যবহার করার জন্য নিম্নলিখিতগুলি প্রয়োজন:

  1. AndroidManifest.xml এ একটি <property> ট্যাগ যা প্যাকেজের একটি XML রিসোর্সকে নির্দেশ করে যেখানে ODP কনফিগারেশন তথ্য রয়েছে।
  2. AndroidManifest.xml এ একটি <service> ট্যাগ যা IsolatedService প্রসারিত করে এমন ক্লাসকে চিহ্নিত করে, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে। <service> ট্যাগের পরিষেবাটিতে অবশ্যই exported এবং isolatedProcess true তে সেট করা থাকতে হবে।
  3. ধাপ ১-এ উল্লেখিত XML রিসোর্সে একটি <service> ট্যাগ যা ধাপ ২ থেকে পরিষেবা ক্লাস সনাক্ত করে। <service> ট্যাগে অবশ্যই ট্যাগের ভিতরে অতিরিক্ত ODP-নির্দিষ্ট সেটিংস অন্তর্ভুক্ত থাকতে হবে, যেমনটি দ্বিতীয় উদাহরণে দেখানো হয়েছে।

অ্যান্ড্রয়েডম্যানিফেস্ট.এক্সএমএল

<!-- Contents of AndroidManifest.xml -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.odpsample" >
    <application android:label="OdpSample">
        <!-- XML resource that contains other ODP settings. -->
        <property android:name="android.ondevicepersonalization.ON_DEVICE_PERSONALIZATION_CONFIG"
                  android:resource="@xml/OdpSettings"></property>
        <!-- The service that ODP binds to. -->
        <service android:name="com.example.odpsample.SampleService"
                android:exported="true" android:isolatedProcess="true" />
    </application>
</manifest>

XML রিসোর্সে ODP-নির্দিষ্ট ম্যানিফেস্ট

<property> ট্যাগে উল্লেখিত XML রিসোর্স ফাইলটিকে অবশ্যই একটি <service> ট্যাগে পরিষেবা শ্রেণী ঘোষণা করতে হবে এবং URL এন্ডপয়েন্ট নির্দিষ্ট করতে হবে যেখান থেকে ODP কন্টেন্ট ডাউনলোড করে RemoteData টেবিলটি পূরণ করবে, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে। আপনি যদি ফেডারেটেড কম্পিউট বৈশিষ্ট্যগুলি ব্যবহার করেন, তাহলে আপনাকে ফেডারেটেড কম্পিউট সার্ভার URL এন্ডপয়েন্টও নির্দিষ্ট করতে হবে যার সাথে ফেডারেটেড কম্পিউট ক্লায়েন্ট সংযুক্ত হবে।

<!-- Contents of res/xml/OdpSettings.xml -->
<on-device-personalization>
   <!-- Name of the service subclass -->
   <service name="com.example.odpsample.SampleService">
     <!-- If this tag is present, ODP will periodically poll this URL and
          download content to populate REMOTE_DATA. Developers that do not need to
          download content from their servers can skip this tag. -->
     <download-settings url="https://example.com/get" />
     <!-- If you want to use federated compute feature to train a model, you
          need to specify this tag. -->
     <federated-compute-settings url="https://fcpserver.example.com/" />
   </service>
</on-device-personalization>

বিকাশকারী মোড সক্ষম করুন

অ্যান্ড্রয়েড স্টুডিও ডকুমেন্টেশনের "ডেভেলপার বিকল্পগুলি সক্ষম করুন" বিভাগে নির্দেশাবলী অনুসরণ করে ডেভেলপার মোড সক্ষম করুন।

স্যুইচ এবং ফ্ল্যাগ সেটিংস

ODP-তে কিছু সুইচ এবং ফ্ল্যাগ রয়েছে যা নির্দিষ্ট কার্যকারিতা নিয়ন্ত্রণ করতে ব্যবহৃত হয়:

  • _global_kill সুইচ : সকল ODP বৈশিষ্ট্যের জন্য গ্লোবাল সুইচ; ODP ব্যবহার করার জন্য false এ সেট করা হয়েছে
  • _federated_compute_kill_switch: _ ODP-এর সমস্ত প্রশিক্ষণ (ফেডারেটেড লার্নিং) কার্যকারিতা নিয়ন্ত্রণকারী সুইচ; প্রশিক্ষণ ব্যবহারের জন্য false এ সেট করা হয়েছে
  • _caller_app_allow তালিকা : ODP-তে কাকে কল করার অনুমতি দেওয়া হবে তা নিয়ন্ত্রণ করে, অ্যাপস (pkg নাম, [ঐচ্ছিক] সার্টিফিকেট) এখানে যোগ করা যেতে পারে অথবা সকলকে অনুমতি দেওয়ার জন্য * হিসেবে সেট করা যেতে পারে।
  • _isolated_service_allow list : আইসোলেটেড সার্ভিস প্রক্রিয়ায় কোন পরিষেবাগুলি চালানো যাবে তা নিয়ন্ত্রণ করে।

আপনি নিম্নলিখিত কমান্ডগুলি ব্যবহার করে সমস্ত সুইচ এবং ফ্ল্যাগগুলিকে সীমাবদ্ধতা ছাড়াই ODP ব্যবহার করার জন্য কনফিগার করতে পারেন:

# Set flags and killswitches
adb shell device_config set_sync_disabled_for_tests persistent
adb shell device_config put on_device_personalization global_kill_switch false
adb shell device_config put on_device_personalization federated_compute_kill_switch false
adb shell device_config put on_device_personalization caller_app_allow_list \"*\"
adb shell device_config put on_device_personalization isolated_service_allow_list \"*\"

ডিভাইস-সাইড API গুলি

ODP-এর জন্য Android API রেফারেন্স ডকুমেন্টেশনটি দেখুন।

IsolatedService সাথে মিথস্ক্রিয়া

IsolatedService ক্লাস হল একটি বিমূর্ত বেস ক্লাস যা ODP-এর বিপরীতে ডেভেলপ করতে ইচ্ছুক সকল ডেভেলপারদের অবশ্যই প্রসারিত করতে হবে এবং তাদের প্যাকেজ ম্যানিফেস্টে একটি আইসোলেটেড প্রক্রিয়ায় চলমান হিসাবে ঘোষণা করতে হবে। ODP পরিষেবা এই পরিষেবাটি একটি আইসোলেটেড প্রক্রিয়ায় শুরু করে এবং এতে অনুরোধ করে। IsolatedService ODP পরিষেবা থেকে অনুরোধ গ্রহণ করে এবং অনুরোধটি পরিচালনা করার জন্য একটি IsolatedWorker তৈরি করে।

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

OnDevicePersonalizationManager ক্লাসটি অ্যাপ এবং SDK গুলিকে একটি API প্রদান করে যা একটি বিচ্ছিন্ন প্রক্রিয়ায় চলমান একটি ডেভেলপার-বাস্তবায়িত IsolatedService এর সাথে ইন্টারঅ্যাক্ট করে। নিম্নলিখিত কিছু উদ্দেশ্যপ্রণোদিত ব্যবহারের উদাহরণ দেওয়া হল:

সারফেসভিউতে প্রদর্শনের জন্য HTML কন্টেন্ট তৈরি করুন

OnDevicePersonalizationManager#execute ব্যবহার করে প্রদর্শনের জন্য কন্টেন্ট তৈরি করতে, কলিং অ্যাপটি পরবর্তী requestSurfacePackage কলে ফিরে আসা SurfacePackageToken অবজেক্ট ব্যবহার করে ফলাফলটি SurfaceView এ রেন্ডার করার অনুরোধ করতে পারে।

সফল হলে, ODP পরিষেবা দ্বারা রেন্ডার করা একটি ভিউয়ের জন্য রিসিভারকে একটি SurfacePackage দিয়ে ডাকা হয়। ক্লায়েন্ট অ্যাপ্লিকেশনগুলিকে তাদের ভিউ হায়ারার্কির মধ্যে একটি SurfaceViewSurfacePackage সন্নিবেশ করতে হবে।

যখন কোনও অ্যাপ পূর্ববর্তী OnDevicePersonalizationManager#execute দ্বারা ফেরত পাঠানো SurfacePackageToken ব্যবহার করে requestSurfacePackage কল করে, তখন ODP পরিষেবাটি একটি ফেন্সড ফ্রেমের মধ্যে রেন্ডার করার জন্য HTML স্নিপেট আনতে IsolatedWorker#onRender কল করে। এই পর্যায়ে একজন ডেভেলপারের LocalData বা UserData অ্যাক্সেস থাকে না। এটি ডেভেলপারকে জেনারেট করা HTML-এর মধ্যে অ্যাসেট ফেচ URL-এর মধ্যে সম্ভাব্য সংবেদনশীল UserData এম্বেড করতে বাধা দেয়। ডেভেলপাররা জেনারেট করা HTML-এ অন্তর্ভুক্ত করার জন্য ট্র্যাকিং URL তৈরি করতে IsolatedService#getEventUrlProvider ব্যবহার করতে পারে। যখন HTML রেন্ডার করা হয়, তখন ODP পরিষেবা এই URL-গুলিতে অনুরোধগুলিকে আটকাবে এবং IsolatedWorker#onEvent কল করবে। onRender() প্রয়োগ করার সময় কেউ getRemoteData() ব্যবহার করতে পারে।

HTML কন্টেন্টের মধ্যে ইভেন্ট ট্র্যাক করুন

EventUrlProvider ক্লাসটি ইভেন্ট ট্র্যাকিং URL তৈরি করার জন্য API প্রদান করে যা ডেভেলপাররা তাদের HTML আউটপুটে অন্তর্ভুক্ত করতে পারে। যখন HTML রেন্ডার করা হয়, তখন ODP ইভেন্ট URL এর পেলোড সহ IsolatedWorker#onEvent আহ্বান করবে।

ODP পরিষেবাটি রেন্ডার করা HTML-এর মধ্যে ODP জেনারেটেড ইভেন্ট URL-এর অনুরোধগুলিকে আটকায়, IsolatedWorker#onEvent কল করে এবং ফিরে আসা EventLogRecord EVENTS টেবিলে লগ করে।

স্থায়ী ফলাফল লিখুন

OnDevicePersonalizationManager#execute এর মাধ্যমে, পরিষেবাটিতে স্থায়ী স্টোরেজে ডেটা লেখার বিকল্প রয়েছে ( REQUESTS এবং EVENTS টেবিল)। এই টেবিলগুলিতে যে এন্ট্রিগুলি লেখা যেতে পারে তা এখানে দেওয়া হল:

  • REQUESTS টেবিলে একটি RequestLogRecord যোগ করতে হবে।
  • EVENTS টেবিলে যোগ করার জন্য EventLogRecord অবজেক্টের একটি তালিকা, প্রতিটিতে পূর্বে লেখা RequestLogRecord এর একটি পয়েন্টার থাকবে।

ডিভাইসে স্টোরেজের স্থায়ী ফলাফল ফেডারেটেড লার্নিং দ্বারা মডেল প্রশিক্ষণের জন্য ব্যবহার করা যেতে পারে।

ডিভাইসে প্রশিক্ষণের কাজগুলি পরিচালনা করুন

যখন একটি ফেডারেটেড কম্পিউট প্রশিক্ষণ কাজ শুরু হয় তখন ODP পরিষেবা IsolatedWorker#onTrainingExample কল করে এবং ODP গ্রহণকারী ডেভেলপারদের দ্বারা প্রদত্ত প্রশিক্ষণের উদাহরণ পেতে চায়। onTrainingExample() বাস্তবায়নের সময় আপনি getRemoteData() , getLocalData() , getUserData() এবং getLogReader() ব্যবহার করতে পারেন।

ফেডারেটেড কম্পিউট কাজগুলি নির্ধারণ বা বাতিল করতে, আপনি FederatedComputeScheduler ক্লাস ব্যবহার করতে পারেন যা সমস্ত ODP IsolatedService এর জন্য API প্রদান করে। প্রতিটি ফেডারেটেড কম্পিউট কাজ তার জনসংখ্যার নাম দ্বারা চিহ্নিত করা যেতে পারে।

নতুন ফেডারেটেড কম্পিউট কাজের সময়সূচী নির্ধারণ করার আগে:

  • এই পপুলেশন নামের একটি টাস্ক ইতিমধ্যেই রিমোট ফেডারেটেড কম্পিউট সার্ভারে তৈরি করা উচিত।
  • ফেডারেটেড কম্পিউট সার্ভার URL এন্ডপয়েন্টটি প্যাকেজ ম্যানিফেস্ট সেটিংসে federated-compute-settings ট্যাগ সহ ইতিমধ্যেই নির্দিষ্ট করা উচিত।

স্থায়ী আউটপুটের সাথে মিথস্ক্রিয়া

নিম্নলিখিত বিভাগে ODP-তে স্থায়ী আউটপুটের সাথে কীভাবে ইন্টারঅ্যাক্ট করতে হয় তা বর্ণনা করা হয়েছে।

স্থানীয় টেবিলগুলি পড়ুন

LogReader ক্লাসটি REQUESTS এবং EVENTS টেবিলগুলি পড়ার জন্য API প্রদান করে। এই টেবিলগুলিতে onExecute() বা onEvent() কলের সময় IsolatedService দ্বারা লেখা ডেটা থাকে। এই টেবিলগুলির ডেটা ফেডারেটেড লার্নিং সুবিধাপ্রাপ্ত মডেল প্রশিক্ষণ, অথবা ফেডারেটেড অ্যানালিটিক্স সুবিধাপ্রাপ্ত ক্রস-ডিভাইস পরিসংখ্যানগত বিশ্লেষণের জন্য ব্যবহার করা যেতে পারে।

ডাউনলোড করা কন্টেন্টের সাথে ইন্টারঅ্যাকশন

নিম্নলিখিত বিভাগে ODP-তে ডাউনলোড করা সামগ্রীর সাথে কীভাবে ইন্টারঅ্যাক্ট করতে হয় তা বর্ণনা করা হয়েছে।

সার্ভার থেকে কন্টেন্ট ডাউনলোড করুন

ODP পরিষেবাটি পর্যায়ক্রমে IsolatedService এর প্যাকেজ ম্যানিফেস্টে ঘোষিত URL থেকে কন্টেন্ট ডাউনলোড করে এবং ডাউনলোড শেষ হওয়ার পরে onDownloadCompleted কল করে। ডাউনলোডটি একটি JSON-ফাইল যার মধ্যে কী-মান জোড়া রয়েছে।

ODP গ্রহণকারী ডেভেলপাররা ডাউনলোড করা কন্টেন্টের কোন সাবসেটটি RemoteData টেবিলে যোগ করা উচিত এবং কোনটি বাদ দেওয়া উচিত তা বেছে নিতে পারেন। ডেভেলপাররা ডাউনলোড করা কন্টেন্ট পরিবর্তন করতে পারবেন না - এটি নিশ্চিত করে যে RemoteData টেবিলে কোনও ব্যবহারকারীর ডেটা নেই। এছাড়াও, ডেভেলপাররা তাদের পছন্দ মতো LocalData টেবিলটি পূরণ করতে স্বাধীন; উদাহরণস্বরূপ, তারা কিছু পূর্ব-গণিত ফলাফল ক্যাশে করতে পারে।

অনুরোধের ফর্ম্যাট ডাউনলোড করুন

ODP পর্যায়ক্রমে ডেভেলপার প্যাকেজ ম্যানিফেস্টে ঘোষিত URL এন্ডপয়েন্টের উপর ভোট দেয় যাতে RemoteData টেবিলটি পূরণ করার জন্য কন্টেন্ট আনা যায়।

এন্ডপয়েন্টটি পরে বর্ণিত হিসাবে একটি JSON প্রতিক্রিয়া প্রদান করবে বলে আশা করা হচ্ছে। JSON প্রতিক্রিয়াতে একটি syncToken থাকতে হবে যা প্রেরিত ডেটার সংস্করণ সনাক্ত করে, সাথে কী-মান জোড়ার তালিকাও পূরণ করতে হবে। syncToken মানটি সেকেন্ডে একটি টাইমস্ট্যাম্প হতে হবে, যা UTC ঘন্টা সীমানায় আটকানো থাকবে। ডাউনলোড অনুরোধের অংশ হিসাবে, ODP পূর্বে সম্পন্ন ডাউনলোডের syncToken এবং ডাউনলোড URL-এ syncToken এবং দেশের পরামিতি হিসাবে ডিভাইসের দেশ সরবরাহ করে। ক্রমবর্ধমান ডাউনলোডগুলি বাস্তবায়নের জন্য সার্ভার পূর্ববর্তী syncToken ব্যবহার করতে পারে।

ফাইল ফর্ম্যাট ডাউনলোড করুন

ডাউনলোড করা ফাইলটি হল একটি JSON ফাইল যার কাঠামো নিম্নরূপ। JSON ফাইলটিতে একটি syncToken থাকবে বলে আশা করা হচ্ছে যা ডাউনলোড করা ডেটার সংস্করণ সনাক্ত করবে। syncToken অবশ্যই একটি UTC টাইমস্ট্যাম্প হতে হবে যা একটি ঘন্টার সীমানায় আটকানো থাকবে এবং পূর্ববর্তী ডাউনলোডের syncToken অতিক্রম করতে হবে। যদি syncToken উভয় প্রয়োজনীয়তা পূরণ না করে, তাহলে ডাউনলোড করা সামগ্রী প্রক্রিয়াকরণ ছাড়াই বাতিল করা হবে।

কন্টেন্ট ফিল্ডটি হল (কী, ডেটা, এনকোডিং) টিপলের একটি তালিকা। key একটি UTF-8 স্ট্রিং হবে বলে আশা করা হচ্ছে। encoding ফিল্ডটি একটি ঐচ্ছিক প্যারামিটার যা data ফিল্ডটি কীভাবে এনকোড করা হবে তা নির্দিষ্ট করে - এটি "utf8" অথবা "base64" তে সেট করা যেতে পারে এবং ডিফল্টরূপে "utf8" হিসাবে ধরে নেওয়া হয়। key ফিল্ডটি একটি String অবজেক্টে রূপান্তরিত হয় এবং onDownloadCompleted(). কল করার আগে data ফিল্ডটি একটি বাইট অ্যারেতে রূপান্তরিত হয়।

{
  // syncToken must be a UTC timestamp clamped to an hour boundary, and must be
  // greater than the syncToken of the previously completed download.
  "syncToken": <timeStampInSecRoundedToUtcHour>,
  "contents": [
    // List of { key, data } pairs.
    { "key": "key1",
      "data": "data1"
    },
    { "key": "key2",
      "data": "data2",
      "encoding": "base64"
    },
    // ...
  ]
}

সার্ভার-সাইড API গুলি

এই বিভাগটি ফেডারেটেড কম্পিউট সার্ভার API গুলির সাথে কীভাবে ইন্টারঅ্যাক্ট করতে হয় তা বর্ণনা করে।

ফেডারেটেড কম্পিউট সার্ভার API গুলি

ক্লায়েন্ট সাইডে একটি ফেডারেটেড কম্পিউট কাজের সময়সূচী নির্ধারণ করতে, আপনার দূরবর্তী ফেডারেটেড কম্পিউট সার্ভারে তৈরি একটি জনসংখ্যার নাম সহ একটি টাস্ক প্রয়োজন। এই বিভাগে, আমরা ফেডারেটেড কম্পিউট সার্ভারে এই জাতীয় একটি টাস্ক কীভাবে তৈরি করবেন তা আলোচনা করব।

ফেডারেটেড কম্পিউট ক্লায়েন্ট-সার্ভার টপোলজির চিত্র।

টাস্ক বিল্ডারের জন্য একটি নতুন টাস্ক তৈরি করার সময়, ODP ডেভেলপারদের দুটি সেট ফাইল সরবরাহ করা উচিত:

  1. tff.learning.models.save_functional_model API কল করে একটি সংরক্ষিত tff.learning.models.FunctionalModel মডেল। আপনি আমাদের GitHub সংগ্রহস্থলে একটি নমুনা খুঁজে পেতে পারেন।
  2. একটি fcp_server_config.json যাতে নীতিমালা, ফেডারেটেড লার্নিং সেটআপ এবং ডিফারেনশিয়াল গোপনীয়তা সেটআপ অন্তর্ভুক্ত থাকে। নিচে একটি fcp_server_config.json এর একটি উদাহরণ দেওয়া হল:
{
  # Task execution mode.
  mode: TRAINING_AND_EVAL
  # Identifies the set of client devices that participate.
  population_name: "mnist_cnn_task"
  policies {
    # Policy for sampling on-device examples. It is checked every
    # time a device is attempting to start a new training.
    min_separation_policy {
      # The minimum separation required between two successful
      # consective task executions. If a client successfully contributes
      # to a task at index `x`, the earliest they can contribute again
      # is at index `(x + minimum_separation)`. This is required by
      # DP.
      minimum_separation: 1
    }
    data_availability_policy {
      # The minimum number of examples on a device to be considered
      # eligible for training.
      min_example_count: 1
    }
    # Policy for releasing training results to developers adopting ODP.
    model_release_policy {
      # The maximum number of training rounds.
      num_max_training_rounds: 512
    }
  }

  # Federated learning setups. They are applied inside Task Builder.
  federated_learning {
    # Use federated averaging to build federated learning process.
    # Options you can choose:
      # * FED_AVG: Federated Averaging algorithm
      #            (https://arxiv.org/abs/2003.00295)
      # * FED_SGD: Federated SGD algorithm
      #            (https://arxiv.org/abs/1602.05629)
    type: FED_AVG
    learning_process {
      # Optimizer used at client side training. Options you can choose:
      # * ADAM
      # * SGD
      client_optimizer: SGD
      # Learning rate used at client side training.
      client_learning_rate: 0.02
      # Optimizer used at server side training. Options you can choose:
      # * ADAM
      # * SGD
      server_optimizer: SGD
      # Learning rate used at server side training.
      server_learning_rate: 1.0
      runtime_config {
        # Number of participating devices for each round of training.
      report_goal: 2
      }
      metrics {
        name: "sparse_categorical_accuracy"
      }
    }
    evaluation {
      # A checkpoint selector controls how checkpoints are chosen for
      # evaluation. One evaluation task typically runs per training
      # task, and on each round of execution, the eval task
      # randomly picks one checkpoint from the past 24 hours that has
      # been selected for evaluation by these rules.
      # Every_k_round and every_k_hour are definitions of quantization
      # buckets which each checkpoint is placed in for selection.
      checkpoint_selector: "every_1_round"
      # The percentage of a populate that should delicate to this
      # evaluation task.
      evaluation_traffic: 0.2
      # Number of participating devices for each round of evaluation.
      report_goal: 2
    }
  }

  # Differential Privacy setups. They are enforced inside the Task
  # Builder.
  differential_privacy {
    # * fixed_gaussian: DP-SGD with fixed clipping norm described in
    #                   "Learning Differentially Private Recurrent
    #                   Language Models"
    #                   (https://arxiv.org/abs/1710.06963).
    type: FIXED_GAUSSIAN
    #   The value of the clipping norm.
    clip_norm: 0.1
    # Noise multiplier for the Gaussian noise.
    noise_multiplier: 0.1
  }
}

আপনি আমাদের GitHub সংগ্রহস্থলে আরও নমুনা পেতে পারেন।

এই দুটি ইনপুট প্রস্তুত করার পর, আর্টিফ্যাক্ট তৈরি করতে এবং নতুন টাস্ক তৈরি করতে টাস্ক বিল্ডার ব্যবহার করুন। আরও বিস্তারিত নির্দেশাবলী আমাদের GitHub রিপোজিটরিতে পাওয়া যাবে।