คู่มือนักพัฒนาซอฟต์แวร์ในการปรับเปลี่ยนอุปกรณ์ในแบบของคุณ

การปรับเปลี่ยนอุปกรณ์ในแบบของคุณ (ODP) ออกแบบมาเพื่อปกป้องข้อมูลของผู้ใช้ปลายทางจากแอปพลิเคชัน แอปพลิเคชันจะใช้ ODP เพื่อปรับแต่งผลิตภัณฑ์และบริการของตนสำหรับผู้ใช้ปลายทาง แต่จะไม่สามารถดูการปรับแต่งที่แน่นอนสำหรับผู้ใช้ (เว้นแต่ว่ามีการโต้ตอบโดยตรงนอก ODP ระหว่างแอปพลิเคชันและผู้ใช้ปลายทาง) สำหรับแอปพลิเคชันที่มีโมเดลแมชชีนเลิร์นนิงหรือการวิเคราะห์เชิงสถิติ ODP ให้บริการชุดบริการและอัลกอริทึมเพื่อดูแลให้มีการลบข้อมูลระบุตัวบุคคลอย่างถูกต้องโดยใช้กลไก Differential Privacy ที่เหมาะสม ดูรายละเอียดเพิ่มเติมได้ที่คำอธิบายเกี่ยวกับการปรับตามโปรไฟล์ของผู้ใช้บนอุปกรณ์

ODP จะเรียกใช้โค้ดของนักพัฒนาแอปใน IsolatedProcess ซึ่งไม่มีสิทธิ์เข้าถึงเครือข่าย ดิสก์ในเครื่อง หรือบริการอื่นๆ ที่ทำงานในอุปกรณ์โดยตรง แต่มีสิทธิ์เข้าถึงแหล่งข้อมูลต่อไปนี้ที่จัดเก็บไว้ในเครื่อง

  • RemoteData - ข้อมูลคีย์-ค่าที่เปลี่ยนแปลงไม่ได้ซึ่งดาวน์โหลดจากแบ็กเอนด์ระยะไกลที่นักพัฒนาแอปดำเนินการ (หากมี)
  • LocalData - ข้อมูลคีย์-ค่าแบบเปลี่ยนแปลงได้ซึ่งนักพัฒนาแอปจัดเก็บไว้ในเครื่อง (หากมี)
  • UserData - ข้อมูลผู้ใช้ที่ได้จากแพลตฟอร์ม

ระบบรองรับเอาต์พุตต่อไปนี้

  • เอาต์พุตถาวร: เอาต์พุตเหล่านี้สามารถใช้กับการประมวลผลในเครื่องในอนาคต การสร้างเอาต์พุตที่แสดง การฝึกโมเดลที่อำนวยความสะดวกโดยการเรียนรู้แบบรวมศูนย์ หรือการวิเคราะห์ทางสถิติข้ามอุปกรณ์ที่อำนวยความสะดวกโดย Federated Analytics
    • นักพัฒนาแอปสามารถเขียนคําขอและผลการประมวลผลลงในตาราง REQUESTS ในพื้นที่ได้
    • นักพัฒนาแอปสามารถเขียนข้อมูลเพิ่มเติมที่เชื่อมโยงกับคำขอก่อนหน้าลงในตาราง EVENTS
  • เอาต์พุตที่แสดง:
    • นักพัฒนาแอปสามารถแสดงผล HTML ที่ ODP แสดงผลใน WebView ภายใน SurfaceView แอปที่เรียกใช้จะไม่เห็นเนื้อหาที่แสดงผลในนั้น
    • นักพัฒนาซอฟต์แวร์สามารถฝัง URL เหตุการณ์ที่ ODP ระบุไว้ในเอาต์พุต HTML เพื่อทริกเกอร์การบันทึกและการประมวลผลการโต้ตอบของผู้ใช้กับ HTML ที่แสดงผล ODP จะสกัดกั้นคำขอที่ส่งไปยัง URL เหล่านั้น แล้วเรียกใช้โค้ดเพื่อสร้างข้อมูลที่จะเขียนลงในตาราง EVENTS

แอปไคลเอ็นต์และ 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 คุณต้องระบุสิ่งต่อไปนี้

  1. แท็ก <property> ใน AndroidManifest.xml ที่ชี้ไปยังทรัพยากร XML ในแพ็กเกจที่มีข้อมูลการกําหนดค่า ODP
  2. แท็ก <service> ใน AndroidManifest.xml ที่ระบุคลาสที่ขยาย IsolatedService ดังที่แสดงในตัวอย่างต่อไปนี้ บริการในแท็ก <service> ต้องตั้งค่าแอตทริบิวต์ exported และ isolatedProcess เป็น true
  3. แท็ก <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 ชุดดังนี้

  1. โมเดล tff.learning.models.FunctionalModel ที่บันทึกไว้ผ่านการเรียก API tff.learning.models.save_functional_model คุณดูตัวอย่าง 1 รายการได้ที่ที่เก็บ 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 ของเรา

หลังจากเตรียมอินพุต 2 รายการนี้แล้ว ให้เรียกใช้ Task Builder เพื่อสร้างอาร์ติแฟกต์และสร้างงานใหม่ โปรดดูวิธีการโดยละเอียดเพิ่มเติมในที่เก็บข้อมูล GitHub