การปรับเปลี่ยนอุปกรณ์ในแบบของคุณ (ODP) ออกแบบมาเพื่อปกป้องข้อมูลของผู้ใช้ปลายทางจากแอปพลิเคชัน แอปพลิเคชันจะใช้ ODP เพื่อปรับแต่งผลิตภัณฑ์และบริการของตนสำหรับผู้ใช้ปลายทาง แต่จะไม่สามารถดูการปรับแต่งที่แน่นอนสำหรับผู้ใช้ (เว้นแต่ว่ามีการโต้ตอบโดยตรงนอก ODP ระหว่างแอปพลิเคชันและผู้ใช้ปลายทาง) สำหรับแอปพลิเคชันที่มีโมเดลแมชชีนเลิร์นนิงหรือการวิเคราะห์เชิงสถิติ ODP ให้บริการชุดบริการและอัลกอริทึมเพื่อดูแลให้มีการลบข้อมูลระบุตัวบุคคลอย่างถูกต้องโดยใช้กลไก Differential Privacy ที่เหมาะสม ดูรายละเอียดเพิ่มเติมได้ที่คำอธิบายเกี่ยวกับการปรับตามโปรไฟล์ของผู้ใช้บนอุปกรณ์
ODP จะเรียกใช้โค้ดของนักพัฒนาแอปใน IsolatedProcess
ซึ่งไม่มีสิทธิ์เข้าถึงเครือข่าย ดิสก์ในเครื่อง หรือบริการอื่นๆ ที่ทำงานในอุปกรณ์โดยตรง แต่มีสิทธิ์เข้าถึงแหล่งข้อมูลต่อไปนี้ที่จัดเก็บไว้ในเครื่อง
RemoteData
- ข้อมูลคีย์-ค่าที่เปลี่ยนแปลงไม่ได้ซึ่งดาวน์โหลดจากแบ็กเอนด์ระยะไกลที่นักพัฒนาแอปดำเนินการ (หากมี)LocalData
- ข้อมูลคีย์-ค่าแบบเปลี่ยนแปลงได้ซึ่งนักพัฒนาแอปจัดเก็บไว้ในเครื่อง (หากมี)UserData
- ข้อมูลผู้ใช้ที่ได้จากแพลตฟอร์ม
ระบบรองรับเอาต์พุตต่อไปนี้
- เอาต์พุตถาวร: เอาต์พุตเหล่านี้สามารถใช้กับการประมวลผลในเครื่องในอนาคต การสร้างเอาต์พุตที่แสดง การฝึกโมเดลที่อำนวยความสะดวกโดยการเรียนรู้แบบรวมศูนย์ หรือการวิเคราะห์ทางสถิติข้ามอุปกรณ์ที่อำนวยความสะดวกโดย 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 หลังจากใช้ 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_killสวิตช์: สวิตช์ส่วนกลางสำหรับฟีเจอร์ ODP ทั้งหมด ตั้งค่าเป็น "เท็จ" เพื่อใช้ ODP
- _federated_compute_kill_switch: _สวิตช์ที่ควบคุมฟังก์ชันการฝึก (การเรียนรู้แบบรวมศูนย์) ทั้งหมดของ ODP ตั้งค่าเป็น "เท็จ" เพื่อใช้การฝึก
- _caller_app_allowlist: ควบคุมผู้ที่ได้รับอนุญาตให้เรียกใช้ ODP, แอป (ชื่อ pkg, ใบรับรอง [ไม่บังคับ]) เพิ่มได้ที่นี่ หรือตั้งค่าเป็น * เพื่ออนุญาตทั้งหมด
- _isolated_service_allowlist: ควบคุมบริการที่ทำงานได้ในกระบวนการบริการแบบแยก
คุณเรียกใช้คำสั่งต่อไปนี้เพื่อกำหนดค่าสวิตช์และแฟล็กทั้งหมดให้ใช้ 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
ทั้งหมด แต่ละงานประมวลผลแบบรวมศูนย์จะระบุได้ด้วยชื่อประชากร
ก่อนกำหนดเวลางานประมวลผลแบบรวมศูนย์ใหม่ ให้ทำดังนี้
- ควรสร้างงานที่มีชื่อประชากรนี้ในเซิร์ฟเวอร์ Compute แบบรวมศูนย์ระยะไกลอยู่แล้ว
- คุณควรระบุปลายทาง 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 ข้อ ระบบจะทิ้งเนื้อหาที่ดาวน์โหลดโดยไม่ประมวลผล
ฟิลด์เนื้อหาคือรายการของ Tuple (คีย์ ข้อมูล การเข้ารหัส) 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