การปรับเปลี่ยนในอุปกรณ์ (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) แต่ละค่าเป็นสเกลาร์ สตริง หรือ Blob ระบบจะรายงานค่าตัวเลขได้หลังจากการรวม และรายงานข้อมูลสตริงหรือ Blob ได้หลังจากใช้ความเป็นส่วนตัวแบบแตกต่างในเครื่องหรือส่วนกลาง นักพัฒนาแอปยังเขียนเหตุการณ์การโต้ตอบของผู้ใช้ที่ตามมาลงในตาราง 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 มีชุดสวิตช์และค่าสถานะที่ใช้ควบคุมฟังก์ชันการทำงานบางอย่าง ดังนี้
- _global_killswitch: สวิตช์ส่วนกลางสำหรับฟีเจอร์ ODP ทั้งหมด ตั้งค่าเป็น false เพื่อใช้ ODP
- _federated_compute_kill_switch: _สวิตช์ที่ควบคุมฟังก์ชันการทำงานของการฝึกทั้งหมด (การเรียนรู้แบบรวมศูนย์) ของ ODP ตั้งค่าเป็น false เพื่อใช้การฝึก
- _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 สำหรับ View ที่บริการ ODP แสดง แอปพลิเคชันไคลเอ็นต์ต้องแทรก SurfacePackage ลงใน SurfaceView ภายในลำดับชั้นของ View
เมื่อแอปทำการเรียก requestSurfacePackage โดยมี SurfacePackageToken ที่ส่งคืนจากการเรียก OnDevicePersonalizationManager#execute ก่อนหน้านี้ บริการ ODP จะเรียก IsolatedWorker#onRender เพื่อดึงข้อมูลโค้ด HTML ที่จะแสดงผลภายใน Fenced Frame นักพัฒนาแอปจะไม่มีสิทธิ์เข้าถึง 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() คุณสามารถใช้ข้อมูลในตารางเหล่านี้เพื่อการฝึกโมเดลที่อำนวยความสะดวกในการเรียนรู้แบบรวมศูนย์ หรือการวิเคราะห์ทางสถิติแบบข้ามอุปกรณ์ที่อำนวยความสะดวกในการวิเคราะห์แบบรวมศูนย์
การโต้ตอบกับเนื้อหาที่ดาวน์โหลด
ส่วนต่อไปนี้จะอธิบายวิธีโต้ตอบกับเนื้อหาที่ดาวน์โหลดใน 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 ที่ยึดตามขอบเขตชั่วโมง และต้องมากกว่า 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 APIs
หากต้องการกำหนดเวลางานการประมวลผลแบบรวมที่ฝั่งไคลเอ็นต์ คุณต้องมีงานที่มีชื่อกลุ่มประชากรซึ่งสร้างขึ้นในเซิร์ฟเวอร์การประมวลผลแบบรวมระยะไกล ในส่วนนี้ เราจะอธิบายวิธีสร้างงานดังกล่าวในเซิร์ฟเวอร์การประมวลผลแบบรวม
เมื่อสร้างงานใหม่สำหรับเครื่องมือสร้างงาน นักพัฒนา ODP ควรระบุไฟล์ 2 ชุดดังนี้
- โมเดล tff.learning.models.FunctionalModel ที่บันทึกไว้ผ่านการเรียก API tff.learning.models.save_functional_model คุณดูตัวอย่างได้ในที่เก็บ 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 รายการนี้แล้ว ให้เรียกใช้เครื่องมือสร้างงานเพื่อสร้างอาร์ติแฟกต์และสร้างงานใหม่ โปรดดูวิธีการแบบละเอียดเพิ่มเติมได้ในที่เก็บ GitHub ของเรา