การปรับเปลี่ยนในอุปกรณ์ (ODP) ออกแบบมาเพื่อปกป้องข้อมูลของผู้ใช้ปลายทางจากแอปพลิเคชัน แอปพลิเคชันใช้ ODP เพื่อปรับแต่งผลิตภัณฑ์และบริการสำหรับผู้ใช้ปลายทาง แต่จะไม่เห็นการปรับแต่งที่เจาะจงสำหรับผู้ใช้ (เว้นแต่จะมีการโต้ตอบโดยตรงนอก ODP ระหว่างแอปพลิเคชันกับผู้ใช้ปลายทาง) สําหรับแอปพลิเคชันที่มีโมเดลแมชชีนเลิร์นนิงหรือการวิเคราะห์ทางสถิติ ODP มีชุดบริการและอัลกอริทึมเพื่อให้มั่นใจว่าข้อมูลดังกล่าวได้รับการลบข้อมูลระบุตัวตนอย่างเหมาะสมโดยใช้กลไกการคุ้มครองความเป็นส่วนตัวแบบต่างระดับที่เหมาะสม ดูรายละเอียดเพิ่มเติมได้ที่คำอธิบายเกี่ยวกับการปรับตามโปรไฟล์ของผู้ใช้บนอุปกรณ์
ODP จะเรียกใช้โค้ดของนักพัฒนาแอปใน IsolatedProcess
ซึ่งไม่มีสิทธิ์เข้าถึงเครือข่าย ดิสก์ในเครื่อง หรือบริการอื่นๆ ที่ทำงานในอุปกรณ์โดยตรง แต่มีสิทธิ์เข้าถึงแหล่งข้อมูลต่อไปนี้ที่จัดเก็บไว้ในเครื่อง
RemoteData
- ข้อมูลคีย์-ค่าแบบคงที่ที่ดาวน์โหลดจากแบ็กเอนด์ระยะไกลที่นักพัฒนาซอฟต์แวร์เป็นผู้ดำเนินการ หากมีLocalData
- ข้อมูลคีย์-ค่าแบบปรับเปลี่ยนได้ซึ่งนักพัฒนาแอปจัดเก็บไว้ในเครื่อง (หากมี)UserData
- ข้อมูลผู้ใช้ที่ได้จากแพลตฟอร์ม
ระบบรองรับเอาต์พุตต่อไปนี้
- เอาต์พุตถาวร: เอาต์พุตเหล่านี้สามารถใช้กับการประมวลผลในเครื่องในอนาคต การสร้างเอาต์พุตที่แสดง การฝึกโมเดลที่อำนวยความสะดวกโดย Federated Learning หรือการวิเคราะห์ทางสถิติข้ามอุปกรณ์ที่อำนวยความสะดวกโดย Federated Analytics
- เอาต์พุตที่แสดง:
- นักพัฒนาแอปสามารถแสดงผล HTML ที่ ODP แสดงผลใน
WebView
ภายในSurfaceView
แอปที่เรียกใช้จะไม่เห็นเนื้อหาที่แสดงผลในนั้น - นักพัฒนาซอฟต์แวร์สามารถฝัง URL เหตุการณ์ที่ ODP ระบุไว้ในเอาต์พุต HTML เพื่อทริกเกอร์การบันทึกและการประมวลผลการโต้ตอบของผู้ใช้กับ HTML ที่แสดงผล ODP จะขัดขวางคำขอไปยัง URL เหล่านั้นและเรียกใช้โค้ดเพื่อสร้างข้อมูลที่เขียนลงในตาราง
EVENTS
- นักพัฒนาแอปสามารถแสดงผล HTML ที่ ODP แสดงผลใน
แอปและ SDK ของไคลเอ็นต์สามารถเรียกใช้ ODP เพื่อแสดงเนื้อหา HTML ใน SurfaceView
โดยใช้ ODP API แอปที่เรียกใช้จะไม่เห็นเนื้อหาที่แสดงผลใน SurfaceView
แอปไคลเอ็นต์หรือ SDK อาจเป็นเอนทิตีอื่นที่ไม่ใช่แอปที่พัฒนาด้วย ODP
บริการ ODP จะจัดการแอปไคลเอ็นต์ที่ต้องการเรียกใช้ ODP เพื่อแสดงเนื้อหาที่ปรับเปลี่ยนในแบบของคุณภายใน UI โดยจะดาวน์โหลดเนื้อหาจากปลายทางที่นักพัฒนาแอประบุและเรียกใช้ตรรกะสําหรับการประมวลผลข้อมูลหลังการดาวน์โหลด รวมถึงเป็นสื่อกลางการสื่อสารทั้งหมดระหว่าง IsolatedProcess
กับบริการและแอปอื่นๆ ด้วย
แอปไคลเอ็นต์ใช้เมธอดในคลาส OnDevicePersonalizationManager
เพื่อโต้ตอบกับโค้ดของนักพัฒนาแอปที่ทำงานใน IsolatedProcess
โค้ดของนักพัฒนาแอปที่ทํางานใน IsolatedProcess
จะขยายคลาส IsolatedService
และใช้อินเทอร์เฟซ IsolatedWorker
IsolatedService
จะต้องสร้างอินสแตนซ์ของ IsolatedWorker
สำหรับคำขอแต่ละรายการ
แผนภาพต่อไปนี้แสดงความสัมพันธ์ระหว่างเมธอดใน OnDevicePersonalizationManager
กับ IsolatedWorker
OnDevicePersonalizationManager
กับ IsolatedWorker
แอปไคลเอ็นต์เรียก ODP โดยใช้เมธอด execute
ที่มี IsolatedService
ที่มีชื่อ บริการ ODP จะส่งต่อการเรียกไปยังเมธอด onExecute
ของ IsolatedWorker
IsolatedWorker
จะแสดงผลระเบียนเพื่อเก็บไว้และแสดงเนื้อหา บริการ ODP จะเขียนเอาต์พุตถาวรลงในตาราง REQUESTS
หรือ EVENTS
และแสดงผลลัพธ์ที่แสดงไปยังแอปไคลเอ็นต์โดยส่งการอ้างอิงแบบทึบไปยังแอปไคลเอ็นต์ แอปไคลเอ็นต์สามารถใช้การอ้างอิงแบบทึบนี้ในการเรียกใช้ requestSurfacePackage
ในอนาคตเพื่อแสดงเนื้อหาที่แสดงภายใน UI ของแอป
เอาต์พุตถาวร
บริการ ODP จะเก็บเรคคอร์ดไว้ในตาราง REQUESTS
หลังจากที่นักพัฒนาแอปติดตั้งใช้งาน onExecute
แล้ว แต่ละระเบียนในตาราง REQUESTS
มีข้อมูลทั่วไปตามคำขอบางอย่างที่บริการ ODP สร้างขึ้น และรายการ Rows
ที่แสดงผล Row
แต่ละรายการมีรายการคู่ (key, value)
โดยแต่ละค่าจะเป็นสเกลาร์ สตริง หรือบล็อก ระบบจะรายงานค่าตัวเลขได้หลังจากการรวบรวมข้อมูล และรายงานข้อมูลสตริงหรือบล็อกได้หลังจากใช้ Differential Privacy แบบกลางหรือแบบท้องถิ่น นอกจากนี้ นักพัฒนาซอฟต์แวร์ยังเขียนเหตุการณ์การโต้ตอบของผู้ใช้ที่ตามมาลงในตาราง EVENTS
ได้ด้วย โดยแต่ละระเบียนในตาราง EVENTS
จะเชื่อมโยงกับแถวในตาราง REQUESTS
บริการ ODP จะบันทึกการประทับเวลาและชื่อแพ็กเกจของแอปที่เรียกใช้และ APK ของนักพัฒนาแอป ODP กับแต่ละระเบียนอย่างโปร่งใส
ก่อนเริ่มต้น
ก่อนเริ่มพัฒนาด้วย ODP คุณต้องตั้งค่าไฟล์ Manifest ของแพ็กเกจและเปิดใช้โหมดนักพัฒนาซอฟต์แวร์
การตั้งค่าไฟล์ Manifest ของแพ็กเกจ
หากต้องการใช้ ODP คุณต้องมีสิ่งต่อไปนี้
- แท็ก
<property>
ในAndroidManifest.xml
ที่ชี้ไปยังทรัพยากร XML ในแพ็กเกจที่มีข้อมูลการกําหนดค่า ODP - แท็ก
<service>
ในAndroidManifest.xml
ที่ระบุคลาสที่ขยายIsolatedService
ดังที่แสดงในตัวอย่างต่อไปนี้ บริการในแท็ก<service>
ต้องตั้งค่าแอตทริบิวต์exported
และisolatedProcess
เป็นtrue
- แท็ก
<service>
ในทรัพยากร XML ที่ระบุไว้ในขั้นตอนที่ 1 ซึ่งระบุคลาสบริการจากขั้นตอนที่ 2 แท็ก<service>
ต้องมีการตั้งค่าเพิ่มเติมสำหรับ ODP ภายในแท็กด้วย ดังที่แสดงในตัวอย่างที่ 2
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>
ไฟล์ Manifest สำหรับ ODP โดยเฉพาะในทรัพยากร XML
ไฟล์ทรัพยากร XML ที่ระบุในแท็ก <property>
จะต้องประกาศคลาสบริการในแท็ก <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>
เปิดใช้โหมดนักพัฒนาแอป
เปิดใช้โหมดนักพัฒนาแอปโดยทําตามวิธีการในส่วนเปิดใช้ตัวเลือกสําหรับนักพัฒนาแอปของเอกสารประกอบ Android Studio
การตั้งค่าสวิตช์และการตั้งค่าการแจ้งว่าไม่เหมาะสม
ODP มีชุดสวิตช์และ Flag ที่ใช้ควบคุมฟังก์ชันการทำงานบางอย่าง ดังนี้
- _global_killswitch: สวิตช์ส่วนกลางสําหรับฟีเจอร์ ODP ทั้งหมด ตั้งค่าเป็นเท็จเพื่อใช้ ODP
- _federated_compute_kill_switch: _สวิตช์ที่ควบคุมฟังก์ชันการฝึก (การเรียนรู้แบบรวมศูนย์) ทั้งหมดของ ODP ตั้งค่าเป็นเท็จเพื่อใช้การฝึก
- _caller_app_allowlist: ควบคุมผู้ที่ได้รับอนุญาตให้เรียกใช้ ODP โดยสามารถเพิ่มแอป (ชื่อแพ็กเกจ ใบรับรอง [ไม่บังคับ]) ที่นี่หรือตั้งค่าเป็น * เพื่ออนุญาตทั้งหมด
- _isolated_service_allowlist: ควบคุมบริการที่ทำงานได้ในกระบวนการบริการแบบแยก
คุณสามารถเรียกใช้คําสั่งต่อไปนี้เพื่อกําหนดค่าสวิตช์และ Flag ทั้งหมดให้ใช้ 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 ฝั่งอุปกรณ์
ดูเอกสารประกอบข้อมูลอ้างอิงของ Android API สำหรับ ODP
การโต้ตอบกับ IsolatedService
คลาส IsolatedService
เป็นคลาสฐานนามธรรมที่นักพัฒนาแอปทุกคนที่ต้องการพัฒนากับ ODP ต้องขยาย และประกาศในไฟล์ Manifest ของแพ็กเกจว่าทํางานในกระบวนการแยกต่างหาก บริการ ODP จะเริ่มต้นบริการนี้ในกระบวนการแยกต่างหากและส่งคําขอไปยังบริการดังกล่าว IsolatedService
จะได้รับคําขอจากบริการ ODP และสร้าง IsolatedWorker
เพื่อจัดการคําขอ
นักพัฒนาซอฟต์แวร์ต้องใช้เมธอดจากอินเทอร์เฟซ IsolatedWorker
เพื่อจัดการคําขอแอปไคลเอ็นต์ การดาวน์โหลดที่เสร็จสมบูรณ์ และเหตุการณ์ที่ HTML ที่แสดงผลเรียกให้แสดง เมธอดทั้งหมดเหล่านี้มีการใช้งานแบบไม่ดำเนินการโดยค่าเริ่มต้น นักพัฒนาแอปจึงข้ามการติดตั้งใช้งานเมธอดที่ไม่สนใจได้
คลาส OnDevicePersonalizationManager
มี API สําหรับแอปและ SDK เพื่อโต้ตอบกับ IsolatedService
ที่นักพัฒนาแอปติดตั้งใช้งานซึ่งทํางานในกระบวนการแยกต่างหาก กรณีการใช้งานที่ต้องการมีดังนี้
สร้างเนื้อหา HTML เพื่อแสดงใน SurfaceView
หากต้องการสร้างเนื้อหาเพื่อแสดงด้วย OnDevicePersonalizationManager#execute
แอปที่เรียกใช้สามารถใช้ออบเจ็กต์ SurfacePackageToken
ที่แสดงผลในการเรียกใช้ requestSurfacePackage
ถัดไปเพื่อขอให้แสดงผลลัพธ์ใน SurfaceView
หากดำเนินการสำเร็จ ระบบจะเรียกใช้ตัวรับด้วย SurfacePackage
สำหรับมุมมองที่แสดงผลโดยบริการ ODP แอปพลิเคชันไคลเอ็นต์ต้องแทรก SurfacePackage
ลงใน SurfaceView
ภายในลําดับชั้นมุมมอง
เมื่อแอปเรียกใช้ requestSurfacePackage
ที่มี SurfacePackageToken
ซึ่งแสดงผลโดย OnDevicePersonalizationManager#execute
ก่อนหน้านี้ บริการ ODP จะเรียกใช้ IsolatedWorker#onRender
เพื่อดึงข้อมูลข้อมูลโค้ด HTML เพื่อแสดงผลภายในเฟรมที่มีการป้องกัน นักพัฒนาแอปจะไม่มีสิทธิ์เข้าถึง LocalData
หรือ UserData
ในระยะนี้ ซึ่งจะป้องกันไม่ให้นักพัฒนาซอฟต์แวร์ฝัง UserData
ที่อาจมีความละเอียดอ่อนภายใน URL การดึงข้อมูลชิ้นงานใน HTML ที่สร้างขึ้น นักพัฒนาแอปสามารถใช้ IsolatedService#getEventUrlProvider
เพื่อสร้าง URL ติดตามเพื่อรวมไว้ใน HTML ที่สร้างขึ้น เมื่อแสดงผล HTML แล้ว บริการ ODP จะขัดขวางคำขอไปยัง URL เหล่านี้และเรียก IsolatedWorker#onEvent
ผู้ใช้สามารถเรียกใช้ getRemoteData()
เมื่อติดตั้งใช้งาน onRender()
ติดตามเหตุการณ์ภายในเนื้อหา HTML
คลาส EventUrlProvider
มี API ในการสร้าง URL ติดตามเหตุการณ์ที่นักพัฒนาแอปอาจรวมไว้ในเอาต์พุต HTML เมื่อแสดงผล HTML แล้ว ODP จะเรียกใช้ IsolatedWorker#onEvent
ด้วยเพย์โหลดของ URL เหตุการณ์
บริการ ODP จะขัดขวางคําขอ URL เหตุการณ์ที่ ODP สร้างขึ้นภายใน HTML ที่แสดงผล เรียกใช้ IsolatedWorker#onEvent
และบันทึก EventLogRecord
ที่แสดงผลลงในตาราง EVENTS
เขียนผลลัพธ์ถาวร
เมื่อใช้ OnDevicePersonalizationManager#execute
บริการจะมีตัวเลือกในการเขียนข้อมูลไปยังพื้นที่เก็บข้อมูลถาวร (ตาราง REQUESTS
และ EVENTS
) รายการที่เขียนลงในตารางเหล่านี้ได้มีดังนี้
RequestLogRecord
ที่จะเพิ่มลงในตารางREQUESTS
- รายการออบเจ็กต์
EventLogRecord
ที่จะเพิ่มลงในตารางEVENTS
โดยแต่ละรายการจะมีพอยน์เตอร์ไปยังRequestLogRecord
ที่เขียนไว้ก่อนหน้านี้
การเรียนรู้แบบรวมศูนย์สามารถใช้ผลลัพธ์ถาวรในพื้นที่เก็บข้อมูลในอุปกรณ์เพื่อฝึกโมเดลได้
จัดการงานการฝึกอบรมในอุปกรณ์
บริการ ODP จะเรียก IsolatedWorker#onTrainingExample
เมื่องานการฝึกการประมวลผลแบบรวมศูนย์เริ่มต้นขึ้นและต้องการตัวอย่างการฝึกที่นักพัฒนาซอฟต์แวร์ที่ใช้ ODP ระบุ คุณสามารถเรียกใช้ getRemoteData()
, getLocalData()
, getUserData()
และ getLogReader()
เมื่อติดตั้งใช้งาน onTrainingExample()
หากต้องการตั้งเวลาหรือยกเลิกงานประมวลผลแบบรวมศูนย์ คุณสามารถใช้คลาส FederatedComputeScheduler
ซึ่งมี API สำหรับ ODP IsolatedService
ทั้งหมด แต่ละงานประมวลผลแบบรวมศูนย์จะระบุได้ด้วยชื่อประชากร
ก่อนกำหนดเวลางานประมวลผลแบบรวมศูนย์ใหม่ ให้ทำดังนี้
- ระบบควรสร้างงานที่มีชื่อการแจกแจงข้อมูลนี้ในเซิร์ฟเวอร์การประมวลผลแบบรวมศูนย์ระยะไกลแล้ว
- คุณควรระบุปลายทาง URL ของเซิร์ฟเวอร์การประมวลผลแบบรวมศูนย์ไว้ในการตั้งค่าไฟล์ Manifest ของแพ็กเกจด้วยแท็ก
federated-compute-settings
แล้ว
การโต้ตอบกับเอาต์พุตถาวร
ส่วนต่อไปนี้อธิบายวิธีโต้ตอบกับเอาต์พุตถาวรใน ODP
อ่านตารางในเครื่อง
คลาส LogReader
มี API ในการอ่านตาราง REQUESTS
และ EVENTS
ตารางเหล่านี้มีข้อมูลที่ IsolatedService
เขียนระหว่างการเรียกใช้ onExecute()
หรือ onEvent()
ข้อมูลในตารางเหล่านี้สามารถใช้สําหรับการฝึกโมเดลที่อำนวยความสะดวกโดยการเรียนรู้แบบรวมศูนย์ หรือการวิเคราะห์ทางสถิติข้ามอุปกรณ์ที่อำนวยความสะดวกโดย Federated Analytics
การโต้ตอบกับเนื้อหาที่ดาวน์โหลด
ส่วนต่อไปนี้อธิบายวิธีโต้ตอบกับเนื้อหาที่ดาวน์โหลดใน ODP
ดาวน์โหลดเนื้อหาจากเซิร์ฟเวอร์
บริการ ODP จะดาวน์โหลดเนื้อหาจาก URL ที่ประกาศไว้ในไฟล์ Manifest ของ IsolatedService
เป็นระยะๆ และเรียกใช้ onDownloadCompleted
หลังจากการดาวน์โหลดเสร็จสิ้น การดาวน์โหลดคือไฟล์ JSON ที่มีคู่คีย์-ค่า
นักพัฒนาแอปที่ใช้ ODP จะเลือกชุดย่อยของเนื้อหาที่ดาวน์โหลดมาเพื่อเพิ่มลงในตาราง RemoteData
และชุดย่อยที่ควรละทิ้งได้ นักพัฒนาแอปจะแก้ไขเนื้อหาที่ดาวน์โหลดไม่ได้ ซึ่งช่วยให้มั่นใจได้ว่าตาราง RemoteData
จะไม่มีข้อมูลผู้ใช้ นอกจากนี้ นักพัฒนาแอปยังป้อนข้อมูลในตาราง LocalData
ได้ตามต้องการ เช่น แคชผลลัพธ์ที่คำนวณไว้ล่วงหน้าบางส่วน
รูปแบบคำขอดาวน์โหลด
ODP จะตรวจสอบปลายทาง URL ที่ประกาศไว้ใน ไฟล์ Manifest ของแพ็กเกจของนักพัฒนาแอปเป็นระยะเพื่อดึงข้อมูลเนื้อหามาแสดงในตาราง RemoteData
ปลายทางควรแสดงผลการตอบกลับเป็น JSON ตามที่อธิบายไว้ภายหลัง การตอบกลับ JSON ต้องมี syncToken
ที่ระบุเวอร์ชันของข้อมูลที่ส่ง พร้อมด้วยรายการคู่คีย์-ค่าที่จะป้อน ค่า syncToken
ต้องเป็นการประทับเวลาเป็นวินาทีที่จำกัดขอบเขตตามเขตเวลา UTC เป็นส่วนหนึ่งของคำขอดาวน์โหลด ODP จะระบุ syncToken
ของการดาวน์โหลดที่เสร็จสมบูรณ์ก่อนหน้านี้และประเทศของอุปกรณ์เป็นพารามิเตอร์ syncToken และ country ใน URL ของการดาวน์โหลด เซิร์ฟเวอร์สามารถใช้ syncToken
ก่อนหน้าเพื่อใช้การดาวน์โหลดแบบเพิ่ม
รูปแบบไฟล์ที่ดาวน์โหลด
ไฟล์ที่ดาวน์โหลดเป็นไฟล์ JSON ที่มีโครงสร้างดังต่อไปนี้ ไฟล์ JSON ควรมี syncToken เพื่อระบุเวอร์ชันของข้อมูลที่ดาวน์โหลด syncToken ต้องเป็นการประทับเวลา UTC ที่จำกัดขอบเขตเป็น 1 ชั่วโมง และต้องมากกว่า syncToken ของการดาวน์โหลดครั้งก่อนหน้า หาก syncToken ไม่เป็นไปตามข้อกำหนดทั้ง 2 ข้อ ระบบจะทิ้งเนื้อหาที่ดาวน์โหลดไว้โดยไม่ประมวลผล
ช่องเนื้อหาคือรายการทูเพลต (คีย์ ข้อมูล การเข้ารหัส) key
ควรเป็นสตริง UTF-8 ฟิลด์ encoding
คือพารามิเตอร์ที่ไม่บังคับซึ่งระบุวิธีเข้ารหัสฟิลด์ data
โดยสามารถตั้งค่าเป็น "utf8" หรือ "base64" และระบบจะถือว่า "utf8" โดยค่าเริ่มต้น ระบบจะแปลงช่อง key
เป็นออบเจ็กต์ String
และแปลงช่อง data
เป็นอาร์เรย์ไบต์ก่อนเรียกใช้ onDownloadCompleted().
{
// 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 ของเซิร์ฟเวอร์คอมพิวตที่รวมศูนย์
Federated Compute Server API
หากต้องการกำหนดเวลางานการประมวลผลแบบรวมศูนย์ฝั่งไคลเอ็นต์ คุณต้องมีงานที่มีชื่อประชากรซึ่งสร้างขึ้นในเซิร์ฟเวอร์การประมวลผลแบบรวมศูนย์ระยะไกล ในส่วนนี้ เราจะกล่าวถึงวิธีสร้างงานดังกล่าวในเซิร์ฟเวอร์ประมวลผลแบบรวมศูนย์
เมื่อสร้างงานใหม่สำหรับ Task Builder นักพัฒนา ODP ควรจัดเตรียมไฟล์ 2 ชุด ดังนี้
- โมเดล tff.learning.models.FunctionalModel ที่บันทึกไว้ผ่านการเรียก API tff.learning.models.save_functional_model คุณดูตัวอย่าง 1 รายการได้ที่ที่เก็บ 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 ของเรา
หลังจากเตรียมอินพุต 2 รายการนี้แล้ว ให้เรียกใช้ Task Builder เพื่อสร้างอาร์ติแฟกต์และสร้างงานใหม่ โปรดดูวิธีการโดยละเอียดเพิ่มเติมในที่เก็บข้อมูล GitHub