डिवाइस पर मौजूद मनमुताबिक अनुभव (ओडीपी) को असली उपयोगकर्ताओं की जानकारी को ऐप्लिकेशन से सुरक्षित रखने के लिए बनाया गया है. ऐप्लिकेशन, अपने प्रॉडक्ट और सेवाओं को असली उपयोगकर्ताओं के हिसाब से बनाने के लिए, ओडीपी का इस्तेमाल करते हैं. हालांकि, वे उपयोगकर्ता की पसंद के मुताबिक किए गए बदलाव नहीं देख पाएंगे. ऐसा तब तक नहीं होगा, जब तक ऐप्लिकेशन और असली उपयोगकर्ता के बीच ओडीपी के बाहर डायरेक्ट इंटरैक्शन न हो. मशीन लर्निंग मॉडल या आंकड़ों के विश्लेषण वाले ऐप्लिकेशन के लिए, ODP सेवाओं और एल्गोरिदम का एक सेट उपलब्ध कराता है. इससे यह पक्का किया जा सकता है कि अलग-अलग निजता मशीन के सही तरीके का इस्तेमाल करके, उपयोगकर्ता की पहचान ज़ाहिर न की जाए. ज़्यादा जानकारी के लिए, डिवाइस पर मनमुताबिक अनुभव देने की सुविधा पर दी गई जानकारी देखें.
ओडीपी, डेवलपर कोड को IsolatedProcess
में चलाता है. इसकी वजह से, डिवाइस पर चल रहे नेटवर्क, लोकल डिस्क या अन्य सेवाओं का सीधा ऐक्सेस नहीं होता. हालांकि, इसके पास स्थानीय तौर पर सेव किए गए इन डेटा सोर्स का ऐक्सेस होता है:
RemoteData
- अगर लागू हो, तो रिमोट और डेवलपर के ऑपरेट किए जाने वाले बैकएंड से डाउनलोड किया गया की-वैल्यू डेटा बदला नहीं जा सकता.LocalData
- डेवलपर के स्टोर किए गए, बदलाव किए जा सकने वाले की-वैल्यू डेटा को लोकल स्टोरेज में सेव किया जाता है. हालांकि, ऐसा सिर्फ़ तब होता है, जब डेवलपर ने ऐसा किया हो.UserData
- प्लैटफ़ॉर्म से मिला उपयोगकर्ता का डेटा.
ये आउटपुट काम करते हैं:
- स्थायी आउटपुट: इन आउटपुट का इस्तेमाल, आने वाले समय में होने वाली लोकल प्रोसेसिंग, दिखाए जाने वाले आउटपुट तैयार करने, फ़ेडरेटेड लर्निंग की सुविधा वाले मॉडल की ट्रेनिंग या फ़ेडरेटेड Analytics की मदद से क्रॉस-डिवाइस स्टैटिस्टिक्स विश्लेषण की सुविधा देने के लिए किया जा सकता है.
- दिखाया गया आउटपुट:
- डेवलपर,
SurfaceView
में मौजूदWebView
में, ODP से रेंडर किया गया एचटीएमएल दिखा सकते हैं. वहां रेंडर किया गया कॉन्टेंट, ऐप्लिकेशन को नहीं दिखेगा. - डेवलपर, रेंडर किए गए एचटीएमएल के साथ उपयोगकर्ता इंटरैक्शन को लॉग करने और प्रोसेस करने के लिए, एचटीएमएल आउटपुट में ओडीपी के दिए गए इवेंट यूआरएल को जोड़ सकते हैं. ODP उन यूआरएल के अनुरोधों को इंटरसेप्ट करता है और डेटा जनरेट करने के लिए कोड को लागू करता है. यह डेटा,
EVENTS
टेबल में सेव हो जाता है.
- डेवलपर,
क्लाइंट ऐप्लिकेशन और SDK टूल, ODP API का इस्तेमाल करके SurfaceView
में एचटीएमएल कॉन्टेंट दिखाने के लिए, ODP को कॉल कर सकते हैं. SurfaceView
में रेंडर किया गया कॉन्टेंट, कॉल करने वाले ऐप्लिकेशन को नहीं दिखता. क्लाइंट ऐप्लिकेशन या SDK टूल, ODP के साथ डेवलप किए जा रहे ऐप्लिकेशन से अलग इकाई हो सकता है.
ODP सेवा, उस क्लाइंट ऐप्लिकेशन को मैनेज करती है जो अपने यूज़र इंटरफ़ेस (यूआई) में उपयोगकर्ताओं के हिसाब से कॉन्टेंट दिखाने के लिए, ODP को इनवोक करना चाहता है. यह डेवलपर के दिए गए एंडपॉइंट से कॉन्टेंट डाउनलोड करता है. साथ ही, डाउनलोड किए गए डेटा को पोस्ट-प्रोसेस करने के लिए लॉजिक को लागू करता है. साथ ही, यह IsolatedProcess
और दूसरी सेवाओं और ऐप्लिकेशन के बीच होने वाले सभी कम्यूनिकेशन की मध्यस्थता भी करता है.
क्लाइंट ऐप्लिकेशन, IsolatedProcess
में चल रहे डेवलपर के कोड के साथ इंटरैक्ट करने के लिए, OnDevicePersonalizationManager
क्लास में मौजूद तरीकों का इस्तेमाल करते हैं. IsolatedProcess
में चलने वाला डेवलपर का कोड, IsolatedService
क्लास को बढ़ाता है और IsolatedWorker
इंटरफ़ेस को लागू करता है. IsolatedService
को हर अनुरोध के लिए IsolatedWorker
का एक इंस्टेंस बनाना होगा.
इस डायग्राम में, OnDevicePersonalizationManager
और IsolatedWorker
के तरीकों के बीच का संबंध दिखाया गया है.
OnDevicePersonalizationManager
और IsolatedWorker
के बीच के संबंध का डायग्राम.एक क्लाइंट ऐप्लिकेशन, IsolatedService
नाम वाले execute
तरीके का इस्तेमाल करके ओडीपी को कॉल करता है. ओडीपी सेवा कॉल को IsolatedWorker
के onExecute
तरीके पर फ़ॉरवर्ड करती है. IsolatedWorker
, रिकॉर्ड होने और कॉन्टेंट दिखाने के लिए दिखाता है. ODP सेवा, REQUESTS
या EVENTS
टेबल में पर्सिस्टेंट आउटपुट को लिखती है. साथ ही, क्लाइंट ऐप्लिकेशन को दिखाए गए आउटपुट का एक अस्पष्ट रेफ़रंस दिखाती है. क्लाइंट ऐप्लिकेशन, आने वाले समय में requestSurfacePackage
कॉल में इस अस्पष्ट रेफ़रंस का इस्तेमाल करके, अपने यूज़र इंटरफ़ेस (यूआई) में कोई भी डिसप्ले कॉन्टेंट दिखा सकता है.
परसिस्टेंट आउटपुट
डेवलपर के onExecute
रिटर्न लागू करने के बाद, ओडीपी सेवा का रिकॉर्ड REQUESTS
टेबल में बना रहता है. REQUESTS
टेबल के हर रिकॉर्ड में, हर अनुरोध के लिए ODP सेवा से जनरेट किया गया सामान्य डेटा और Rows
की सूची होती है. हर Row
में (key, value)
पेयर की सूची होती है. हर वैल्यू स्केलर, स्ट्रिंग या ब्लॉब होती है. एग्रीगेशन के बाद, संख्या वाली वैल्यू की रिपोर्ट की जा सकती है. साथ ही, स्थानीय या केंद्रीय डिफ़रेंशियल प्राइवसी लागू करने के बाद, स्ट्रिंग या ब्लॉब डेटा की रिपोर्ट की जा सकती है. डेवलपर, EVENTS
टेबल में उपयोगकर्ता के बाद के इंटरैक्शन इवेंट भी लिख सकते हैं. EVENTS
टेबल का हर रिकॉर्ड, REQUESTS
टेबल की किसी लाइन से जुड़ा होता है. ODP सेवा, हर रिकॉर्ड के साथ टाइमस्टैंप और कॉल करने वाले ऐप्लिकेशन के पैकेज का नाम और ODP डेवलपर के APK को साफ़ तौर पर लॉग करती है.
शुरू करने से पहले
ODP का इस्तेमाल करके डेवलपमेंट शुरू करने से पहले, आपको अपना पैकेज मेनिफ़ेस्ट सेट अप करना होगा और डेवलपर मोड चालू करना होगा.
पैकेज मेनिफ़ेस्ट की सेटिंग
ओडीपी का इस्तेमाल करने के लिए, ये ज़रूरी हैं:
AndroidManifest.xml
में मौजूद एक<property>
टैग, जो पैकेज में मौजूद ऐसे एक्सएमएल संसाधन पर ले जाता है जिसमें ओडीपी कॉन्फ़िगरेशन की जानकारी मौजूद होती है.AndroidManifest.xml
में मौजूद<service>
टैग,IsolatedService
को बढ़ाने वाली क्लास की पहचान करता है, जैसा कि इस उदाहरण में दिखाया गया है.<service>
टैग में मौजूद सेवा के लिए,exported
औरisolatedProcess
एट्रिब्यूट की वैल्यूtrue
पर सेट होनी चाहिए.- पहले चरण में बताए गए एक्सएमएल रिसॉर्स में मौजूद
<service>
टैग, जो दूसरे चरण में बताई गई सेवा क्लास की पहचान करता है.<service>
टैग में, टैग के अंदर अन्य ओडीपी-खास सेटिंग भी शामिल होनी चाहिए, जैसा कि दूसरे उदाहरण में दिखाया गया है.
AndroidManifest.xml
<!-- 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>
एक्सएमएल संसाधन में ओडीपी-स्पेसिफ़िक मेनिफ़ेस्ट
<property>
टैग में बताई गई एक्सएमएल रिसॉर्स फ़ाइल में, <service>
टैग में भी सेवा क्लास की जानकारी होनी चाहिए. साथ ही, उस यूआरएल एंडपॉइंट की जानकारी भी होनी चाहिए जिससे ODP, RemoteData
टेबल को पॉप्युलेट करने के लिए कॉन्टेंट डाउनलोड करेगा. इस बारे में यहां दिए गए उदाहरण में बताया गया है. अगर फ़ेडरेटेड कंप्यूट सुविधाओं का इस्तेमाल किया जा रहा है, तो आपको फ़ेडरेटेड कंप्यूट सर्वर का यूआरएल एंडपॉइंट भी बताना होगा. इससे, फ़ेडरेटेड कंप्यूट क्लाइंट कनेक्ट करेगा.
<!-- 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>
डेवलपर मोड चालू करना
Android Studio के दस्तावेज़ में, 'डेवलपर के लिए सेटिंग और टूल' चालू करें सेक्शन में दिए गए निर्देशों का पालन करके, डेवलपर मोड चालू करें.
'स्विच करें और फ़्लैग करें' सेटिंग
ओडीपी में स्विच और फ़्लैग का एक सेट होता है. इनका इस्तेमाल कुछ फ़ंक्शन को कंट्रोल करने के लिए किया जाता है:
- _global_killswitch: सभी ओडीपी सुविधाओं के लिए ग्लोबल स्विच; ओडीपी का इस्तेमाल करने के लिए इसे 'गलत' पर सेट करें
- _federated_compute_kill_switch: _यह स्विच, ODP की सभी ट्रेनिंग (फ़ेडरेटेड लर्निंग) सुविधाओं को कंट्रोल करता है. ट्रेनिंग का इस्तेमाल करने के लिए, इसे 'गलत' पर सेट करें
- _caller_app_allowlist: इससे यह कंट्रोल होता है कि किस ऐप्लिकेशन को ओडीपी को कॉल करने की अनुमति है. यहां ऐप्लिकेशन (pkg name, [optional] certificate) जोड़े जा सकते हैं या सभी को अनुमति देने के लिए इसे * पर सेट किया जा सकता है
- _isolated_service_allowसूची: यह कंट्रोल करती है कि आइसोलेटेड सेवा वाली प्रोसेस में कौनसी सेवाएं चलाई जा सकती हैं.
सभी स्विच और फ़्लैग कॉन्फ़िगर करने के लिए, नीचे दिए गए निर्देशों का पालन करें, ताकि वे बिना किसी पाबंदी के ओडीपी का इस्तेमाल कर सकें:
# 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 \"*\"
डिवाइस-साइड एपीआई
ODP के लिए, Android API का रेफ़रंस दस्तावेज़ देखें.
IsolatedService
के साथ इंटरैक्शन
IsolatedService
क्लास एक ऐसी एब्स्ट्रैक्ट बेस क्लास है जिसे ओडीपी के लिए डेवलप करने वाले सभी डेवलपर को एक्सटेंड़ करना होगा. साथ ही, अपने पैकेज मेनिफ़ेस्ट में यह एलान करना होगा कि यह क्लास अलग-अलग प्रोसेस में चल रही है. ओडीपी सेवा इस सेवा को एक अलग प्रोसेस से शुरू करती है और इसके लिए अनुरोध करती है. IsolatedService
को ODP सेवा से अनुरोध मिलते हैं और अनुरोध को मैनेज करने के लिए IsolatedWorker
बनाया जाता है.
क्लाइंट ऐप्लिकेशन के अनुरोधों, डाउनलोड पूरा होने की संख्या, और रेंडर किए गए एचटीएमएल से ट्रिगर हुए इवेंट को मैनेज करने के लिए, डेवलपर को IsolatedWorker
इंटरफ़ेस के तरीकों को लागू करना होगा. इन सभी तरीकों को डिफ़ॉल्ट रूप से लागू नहीं किया जाता. इसलिए, डेवलपर उन तरीकों को लागू करने से बच सकते हैं जिनमें उनकी दिलचस्पी नहीं है.
OnDevicePersonalizationManager
क्लास, ऐप्लिकेशन और SDK टूल के लिए एक एपीआई उपलब्ध कराती है. इसकी मदद से, ऐप्लिकेशन और SDK टूल, डेवलपर के लागू किए गए IsolatedService
के साथ इंटरैक्ट कर सकते हैं. IsolatedService
, अलग-अलग प्रोसेस में चलता है. यहां कुछ मकसद के इस्तेमाल के उदाहरण दिए गए हैं:
SurfaceView में दिखाने के लिए एचटीएमएल कॉन्टेंट जनरेट करना
दिखाने के लिए कॉन्टेंट जनरेट करने के लिए, OnDevicePersonalizationManager#execute
का इस्तेमाल करके कॉल करने वाला ऐप्लिकेशन, अगले requestSurfacePackage
कॉल में लौटाए गए SurfacePackageToken
ऑब्जेक्ट का इस्तेमाल कर सकता है. ऐसा वह, नतीजे को SurfaceView
में रेंडर करने का अनुरोध करने के लिए कर सकता है.
सफल होने पर, ओडीपी सेवा से रेंडर किए गए व्यू के लिए, पाने वाले को SurfacePackage
कॉल किया जाता है. क्लाइंट ऐप्लिकेशन को अपने व्यू की हैरारकी में, SurfacePackage
को SurfaceView
में डालना होगा.
जब कोई ऐप्लिकेशन, OnDevicePersonalizationManager#execute
कॉल से मिले SurfacePackageToken
के साथ requestSurfacePackage
कॉल करता है, तो ओडीपी सेवा, IsolatedWorker#onRender
कॉल करती है. इससे, फ़ेंस किए गए फ़्रेम में रेंडर किए जाने के लिए एचटीएमएल स्निपेट फ़ेच किया जाता है. इस चरण के दौरान, डेवलपर के पास LocalData
या UserData
का ऐक्सेस नहीं होता. इससे डेवलपर, जनरेट किए गए एचटीएमएल में एसेट फ़ेच करने वाले यूआरएल में, संभावित संवेदनशील UserData
को एम्बेड नहीं कर पाएगा. डेवलपर IsolatedService#getEventUrlProvider
का इस्तेमाल करके, ट्रैकिंग यूआरएल जनरेट कर सकते हैं और उन्हें जनरेट किए गए एचटीएमएल में शामिल कर सकते हैं. एचटीएमएल रेंडर होने के बाद, ओडीपी सेवा इन यूआरएल के अनुरोधों को इंटरसेप्ट करेगी और IsolatedWorker#onEvent
को कॉल करेगी. onRender()
लागू करते समय, getRemoteData()
को लागू किया जा सकता है.
एचटीएमएल कॉन्टेंट में इवेंट ट्रैक करना
EventUrlProvider
क्लास, एपीआई की मदद से इवेंट ट्रैकिंग यूआरएल जनरेट करती है, जिन्हें डेवलपर अपने एचटीएमएल आउटपुट में शामिल कर सकते हैं. एचटीएमएल रेंडर होने के बाद, ODP, इवेंट यूआरएल के पेलोड के साथ IsolatedWorker#onEvent
को कॉल करेगा.
ओडीपी सेवा, रेंडर किए गए एचटीएमएल में ओडीपी वाले इवेंट यूआरएल के अनुरोधों को इंटरसेप्ट करती है. साथ ही, IsolatedWorker#onEvent
को कॉल करती है और लौटाए गए EventLogRecord
को EVENTS
टेबल में लॉग करती है.
स्थायी नतीजे लिखें
OnDevicePersonalizationManager#execute
के साथ, सेवा के पास स्थायी स्टोरेज (REQUESTS
और EVENTS
टेबल) में डेटा सेव करने का विकल्प होता है. इन टेबल में, यहां दी गई जानकारी डाली जा सकती है:
REQUESTS
टेबल में जोड़ा जाने वालाRequestLogRecord
.EVENTS
टेबल में जोड़े जाने वालेEventLogRecord
ऑब्जेक्ट की सूची. इनमें से हर ऑब्जेक्ट में, पहले से लिखे गएRequestLogRecord
का पॉइंटर होता है.
मॉडल ट्रेनिंग के लिए, Fedeated Learning टेक्नोलॉजी का इस्तेमाल करके, डिवाइस के स्टोरेज में लगातार रहने वाले नतीजों का इस्तेमाल किया जा सकता है.
डिवाइस पर ट्रेनिंग के टास्क मैनेज करें
जब कोई फ़ेडरेटेड कंप्यूट ट्रेनिंग जॉब शुरू करता है और ओडीपी का इस्तेमाल करने वाले डेवलपर से मिले ट्रेनिंग के उदाहरण पाना चाहता है, तो ओडीपी सेवा IsolatedWorker#onTrainingExample
को कॉल करती है. onTrainingExample()
लागू करते समय, getRemoteData()
, getLocalData()
, getUserData()
, और getLogReader()
को शुरू किया जा सकता है.
फ़ेडरेटेड कंप्यूट जॉब शेड्यूल करने या रद्द करने के लिए, FederatedComputeScheduler
क्लास का इस्तेमाल किया जा सकता है. यह क्लास, सभी ODP IsolatedService
के लिए एपीआई उपलब्ध कराती है. हर फ़ेडरेटेड कंप्यूट जॉब की पहचान जनसंख्या के नाम से की जा सकती है.
कोई नया फ़ेडरेटेड कंप्यूट जॉब शेड्यूल करने से पहले:
- इस पॉप्युलेशन के नाम वाला टास्क, रिमोट फ़ेडरेटेड कंप्यूट सर्वर पर पहले से ही बना होना चाहिए.
- फ़ेडरेटेड कंप्यूट सर्वर के यूआरएल एंडपॉइंट को
federated-compute-settings
टैग के साथ, पैकेज मेनिफ़ेस्ट की सेटिंग में पहले से ही बताया जाना चाहिए.
पर्सिस्टेंट आउटपुट के साथ इंटरैक्शन
इस सेक्शन में, ओडीपी में मौजूदा आउटपुट के साथ इंटरैक्ट करने का तरीका बताया गया है.
लोकल टेबल पढ़ना
LogReader
क्लास, REQUESTS
और EVENTS
टेबल को पढ़ने के लिए एपीआई उपलब्ध कराती है. इन टेबल में वह डेटा होता है जिसे IsolatedService
ने onExecute()
या onEvent()
कॉल के दौरान लिखा था. इन टेबल में मौजूद डेटा का इस्तेमाल, फ़ेडरेटेड लर्निंग की मदद से मॉडल को ट्रेनिंग देने या फ़ेडरेटेड Analytics की मदद से क्रॉस-डिवाइस के आंकड़ों का विश्लेषण करने के लिए किया जा सकता है.
डाउनलोड किए गए कॉन्टेंट से इंटरैक्शन
नीचे दिए गए सेक्शन में, ओडीपी में डाउनलोड किए गए कॉन्टेंट के साथ इंटरैक्ट करने का तरीका बताया गया है.
सर्वर से कॉन्टेंट डाउनलोड करना
ओडीपी सेवा, समय-समय पर IsolatedService
के पैकेज मेनिफ़ेस्ट में बताए गए यूआरएल से कॉन्टेंट डाउनलोड करती है. साथ ही, डाउनलोड पूरा होने के बाद onDownloadCompleted
को कॉल करती है. डाउनलोड, एक JSON फ़ाइल है, जिसमें की-वैल्यू पेयर हैं.
ओडीपी का इस्तेमाल करने वाले डेवलपर यह चुन सकते हैं कि डाउनलोड किए गए कॉन्टेंट का कौनसा सबसेट RemoteData
टेबल में जोड़ा जाए और किन्हें नहीं. डेवलपर, डाउनलोड किए गए कॉन्टेंट में बदलाव नहीं कर सकते. इससे यह पक्का होता है कि RemoteData
टेबल में उपयोगकर्ता का कोई डेटा शामिल नहीं है. इसके अलावा, डेवलपर अपने हिसाब से LocalData
टेबल को अपने-आप भर सकते हैं. उदाहरण के लिए, वे पहले से कंप्यूट किए गए कुछ नतीजों को कैश मेमोरी में सेव कर सकते हैं.
डाउनलोड के अनुरोध का फ़ॉर्मैट
ओडीपी, समय-समय पर डेवलपर के पैकेज मेनिफ़ेस्ट में बताए गए यूआरएल एंडपॉइंट को पोल करता है, ताकि RemoteData
टेबल में कॉन्टेंट को अपने-आप भरा जा सके.
एंडपॉइंट से JSON रिस्पॉन्स मिलने की उम्मीद है, जैसा कि बाद में बताया गया है. JSON रिस्पॉन्स में syncToken
होना चाहिए, जो भेजे जा रहे डेटा के वर्शन की पहचान करता है. साथ ही, इसमें पॉप्युलेट किए जाने वाले की-वैल्यू पेयर की सूची भी होनी चाहिए. syncToken
वैल्यू, सेकंड में टाइमस्टैंप होनी चाहिए. यह वैल्यू, यूटीसी के घंटे की सीमा के हिसाब से होनी चाहिए. डाउनलोड करने के अनुरोध के तौर पर, ओडीपी, पहले पूरे किए गए डाउनलोड का syncToken
और डाउनलोड के यूआरएल में सिंक टोकन और देश के पैरामीटर के तौर पर डिवाइस के देश की जानकारी देता है. इंक्रीमेंटल डाउनलोड लागू करने के लिए, सर्वर पिछले syncToken
का इस्तेमाल कर सकता है.
फ़ाइल फ़ॉर्मैट डाउनलोड करना
डाउनलोड की गई फ़ाइल, JSON फ़ॉर्मैट में होती है. इसका स्ट्रक्चर यहां दिया गया है. डाउनलोड किए जा रहे डेटा के वर्शन की पहचान करने के लिए, JSON फ़ाइल में syncToken होना चाहिए. SyncToken, यूटीसी टाइमस्टैंप होना चाहिए और उसे घंटे की सीमा के अंदर रखना चाहिए. साथ ही, यह पिछले डाउनलोड के SyncToken से ज़्यादा होना चाहिए. अगर SyncToken दोनों ज़रूरी शर्तों को पूरा नहीं करता है, तो डाउनलोड किया गया कॉन्टेंट बिना प्रोसेस किए ही खारिज कर दिया जाएगा.
कॉन्टेंट फ़ील्ड, (की, डेटा, कोड में बदलना) टपल की सूची होती है. key
, UTF-8 स्ट्रिंग होनी चाहिए. encoding
फ़ील्ड एक वैकल्पिक पैरामीटर है, जो बताता है कि data
फ़ील्ड को कैसे एन्कोड किया जाता है. इसे "utf8" या "base64" पर सेट किया जा सकता है और डिफ़ॉल्ट रूप से इसे "utf8" माना जाता है. onDownloadCompleted().
को कॉल करने से पहले, key
फ़ील्ड को String
ऑब्जेक्ट में और 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"
},
// ...
]
}
सर्वर-साइड एपीआई
इस सेक्शन में, फ़ेडरेटेड कंप्यूट सर्वर एपीआई के साथ इंटरैक्ट करने का तरीका बताया गया है.
फ़ेडरेटेड कंप्यूट सर्वर एपीआई
क्लाइंट साइड पर फ़ेडरेटेड कंप्यूट जॉब शेड्यूल करने के लिए, आपके पास ऐसा टास्क होना चाहिए जिसका नाम, रिमोट फ़ेडरेटेड कंप्यूट सर्वर पर बनाया गया हो. इस सेक्शन में, हमने फ़ेडरेटेड कंप्यूट सर्वर पर इस तरह का टास्क बनाने का तरीका बताया है.
टास्क बिल्डर के लिए नया टास्क बनाते समय, ओडीपी डेवलपर को दो तरह की फ़ाइलें उपलब्ध करानी चाहिए:
- tff.learning.models.save_functional_model एपीआई कॉल का इस्तेमाल करके, सेव किया गया tff.learning.models.FunctionalModel मॉडल. आपको GitHub रिपॉज़िटरी में एक सैंपल मिल सकता है.
- 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 रिपॉज़िटरी में उपलब्ध हैं.