本頁面由 Cloud Translation API 翻譯而成。
Switch to English

Federated Learning

總覽

本文檔介紹了可促進聯合學習任務的接口,例如使用TensorFlow中實現的現有機器學習模型進行聯合培訓或評估。在設計這些接口時,我們的主要目標是可以在不需要了解其幕後工作原理的情況下進行聯邦學習實驗,並在各種現有模型和數據上評估已實施的聯邦學習算法。我們鼓勵您回饋平台。 TFF的設計考慮了可擴展性和可組合性,我們歡迎您提供幫助;我們很高興看到您的想法!

該層提供的接口包括以下三個關鍵部分:

  • 型號 。類和幫助程序函數使您可以包裝現有模型以與TFF一起使用。打包模型就像調用單個打包函數(例如tff.learning.from_keras_model )或定義tff.learning.Model接口的子類以實現完全可定制性一樣簡單。

  • 聯邦計算建造商 。使用現有模型構建用於訓練或評估的聯合計算的幫助程序功能。

  • 數據集 。您可以在Python中下載和訪問的罐裝數據集合,以用於模擬聯合學習方案。儘管聯邦學習旨在用於不能在集中位置簡單下載的分散數據,但在研究和開發階段,使用可以在本地下載和操作的數據進行初始實驗通常很方便,特別是對於可能新方法。

這些接口主要在tff.learning命名空間中定義,但研究數據集和其他與仿真相關的功能已分組在tff.simulation 。使用Federated Core(FC)提供的較低級接口來實現該層,該接口還提供了運行時環境。

在繼續之前,我們建議您首先閱讀有關圖像分類文本生成的教程,因為它們使用具體示例介紹了此處介紹的大多數概念。如果您想了解有關TFF如何工作的更多信息,則可能需要跳過自定義算法教程,作為對我們用來表示聯邦計算邏輯並研究TFF的現有實現的較低級接口的介紹。 tff.learning接口。

楷模

體系結構假設

序列化

TFF旨在支持各種分佈式學習方案,在這些方案中,您編寫的機器學習模型代碼可能在具有各種功能的大量異構客戶端上執行。在某種程度上,雖然在某些應用程序中那些客戶端可能是功能強大的數據庫服務器,但我們平台打算支持的許多重要用途涉及資源有限的移動和嵌入式設備。我們不能假定這些設備能夠託管Python運行時。我們唯一可以假設的是,它們能夠託管本地TensorFlow運行時。因此,我們在TFF中做出的基本架構假設是,您的模型代碼必須可序列化為TensorFlow圖。

您可以(並且應該)仍然遵循最新的最佳做法(例如使用“急切模式”)來開發TF代碼。但是,最終代碼必須是可序列化的(例如,可以將其包裝為eager-mode代碼的tf.function )。這樣可以確保執行時所需的任何Python狀態或控制流都可以序列化(可能在Autograph的幫助下)。

當前,TensorFlow不完全支持對急切模式TensorFlow進行序列化和反序列化。因此,TFF中的序列化當前遵循TF 1.0模式,其中所有代碼都必須在TFF控制的tf.Graph中構造。這意味著當前的TFF無法使用已經構建的模型。取而代之的是,模型定義邏輯打包在無參數的函數中,該函數返回tff.learning.Model 。然後TFF調用此函數以確保模型的所有組件都已序列化。此外,作為強類型環境,TFF將需要一點額外的元數據 ,例如模型輸入類型的規範。

聚合

我們強烈建議大多數用戶使用Keras構建模型,請參見下面的Keras轉換器 。這些包裝器自動處理模型更新的匯總以及為模型定義的任何度量。但是,了解一般tff.learning.Model聚合處理方式仍然有用。

聯合學習中始終至少有兩層聚合:本地設備上聚合和跨設備(或聯合)聚合:

  • 本地聚集 。聚合級別是指單個客戶擁有的多批示例之間的聚合。它同時適用於模型參數(變量)和模型計算的統計信息(例如平均損失,準確性和其他指標),模型參數(變量)隨著模型在本地訓練而不斷地演化,模型參數將再次在本地更新遍歷每個客戶端的本地數據流。

    在此級別執行聚合是您的模型代碼的責任,並且可以使用標準的TensorFlow構造來完成。

    處理的一般結構如下:

    • 該模型首先構造tf.Variable來保存聚合,例如批數或處理的示例數,每批或每示例損失的總和等。

    • TFF多次調用Model上的forward_pass方法,依次處理後續一批客戶端數據,這使您可以更新保留各種聚合的變量,這是一個副作用。

    • 最後,TFF在模型上調用report_local_outputs方法,以使您的模型可以將收集到的所有匯總統計信息編譯為一組緊湊的度量標準,以供客戶端導出。例如,在此處,您的模型代碼可以將損失之和除以處理後的示例數量,以導出平均損失,等等。

  • 聯合聚合 。此聚合級別是指系統中多個客戶端(設備)之間的聚合。同樣,它既適用於在客戶端之間平均的模型參數(變量),也適用於模型由於本地聚合而導出的度量。

    在此級別執行聚合是TFF的職責。但是,作為模型創建者,您可以控制此過程(有關更多信息,請參見下文)。

    處理的一般結構如下:

    • 服務器將初始模型和培訓所需的任何參數分發給一部分客戶,這些客戶將參加一輪培訓或評估。

    • 在每個客戶端上,獨立且並行地,對本地數據批處理流重複調用您的模型代碼,以生成一組新的模型參數(在訓練時)和一組新的局部指標,如上所述(這是本地的聚合)。

    • TFF運行分佈式聚合協議,以在整個系統上累積和聚合模型參數和本地導出的指標。在模型的federated_output_computation. ,使用TFF自己的聯合計算語言(不在TensorFlow中)以聲明性方式表示此邏輯federated_output_computation.有關聚合API的更多信息,請參見自定義算法教程。

抽象接口

基本的構造函數 + 元數據接口由接口tff.learning.Model表示,如下所示:

  • 構造函數, forward_passreport_local_outputs方法應相應地構造模型變量,正向傳遞和要報告的統計信息。如上所述,通過這些方法構造的TensorFlow必須可序列化。

  • input_spec屬性以及返回可訓練的,不可訓練的和局部變量的子集的3個屬性表示元數據。 TFF使用此信息來確定如何將模型的各個部分連接到聯合優化算法,並定義內部類型簽名以幫助驗證構造的系統的正確性(這樣就無法在不匹配模型的數據上實例化模型。該模型旨在使用)。

另外,抽象接口tff.learning.Model公開了一個federated_output_computation屬性,該屬性與前面提到的report_local_outputs屬性一起允許您控制匯總摘要統計信息的過程。

您可以在我們的圖像分類教程的第二部分中找到有關如何定義自己的自定義tf.learning.Model的示例,以及在model_examples.py用於測試的示例模型中。

Keras轉換器

TFF幾乎需要的所有信息都可以通過調用tf.keras接口來獲得,因此,如果您有tff.learning.from_keras_model模型,則可以依靠tff.learning.from_keras_model構造一個tff.learning.Model

請注意,TFF仍然希望您提供構造函數-無參模型函數 ,如下所示:

def model_fn():
  keras_model = ...
  return tff.learning.from_keras_model(keras_model, sample_batch, loss=...)

除了模型本身之外,您還提供了一批數據樣本,TFF使用這些數據來確定模型輸入的類型和形狀。這確保了TFF可以為客戶端設備上實際存在的數據正確地實例化模型(因為我們假設在構造要序列化的TensorFlow時通常無法使用該數據)。

在我們的圖像分類文本生成教程中說明了Keras包裝器的使用。

聯合計算構建器

tff.learning軟件包提供了與幾個建築商tff.Computation s表示執行學習相關的任務;我們希望此類計算的集合將來會擴展。

體系結構假設

執行

運行聯合計算有兩個不同的階段。

  • 編譯 :TFF首先聯合學習算法編譯為整個分佈式計算的抽象序列化表示。這是TensorFlow序列化發生的時間,但可以進行其他轉換以支持更有效的執行。我們將編譯器發出的序列化表示形式稱為聯合計算

  • 執行 TFF提供了執行這些計算的方法。目前,僅通過本地模擬(例如,在使用模擬分散數據的筆記本中)支持執行。

由TFF的聯合學習API生成的聯合計算(例如使用聯合模型平均或聯合評估的訓練算法)包括許多元素,最值得注意的是:

  • 模型代碼的序列化形式以及由Federated Learning框架構建的其他TensorFlow代碼,以驅動模型的訓練/評估循環(例如,構建優化器,應用模型更新,遍歷tf.data.Dataset和計算指標,並在服務器上應用匯總更新(僅舉幾例)。

  • 客戶端服務器之間的通信的聲明性規範(通常是跨客戶端設備的各種形式的聚合 ,以及從服務器到所有客戶端的廣播 ),以及如何將這種分佈式通信與客戶端本地或服務器本地執行交錯TensorFlow代碼

以這種序列化形式表示的聯邦計算以不同於Python的與平台無關的內部語言表示,但是使用Federated Learning API,您無需擔心這種表示的細節。這些計算在您的Python代碼中表示為tff.Computation類型的對象,在大多數情況下,您可以將它們視為不透明的Python callable s。

在教程中,您將調用那些聯合計算,就像它們是常規的Python函數一樣,在本地執行。但是,TFF設計為以與執行環境的大多數方面無關的方式表示聯合計算,因此它們可以潛在地部署到(例如)運行Android的設備組或數據中心的群集中。同樣,這的主要結果是關於序列化的強大假設。特別是,當您調用以下所述的build_...方法之一時,計算將完全序列化。

建模狀態

TFF是一個函數式編程環境,但是聯邦學習中許多感興趣的過程都是有狀態的。例如,涉及多輪聯合模型平均的訓練循環就是我們可以歸類為有狀態過程的一個示例。在此過程中,不斷變化的狀態包括正在訓練的一組模型參數,以及可能與優化器關聯的其他狀態(例如,動量矢量)。

由於TFF是功能性的,因此在TFF中將有狀態過程建模為接受當前狀態作為輸入,然後提供更新狀態作為輸出的計算。為了完全定義一個有狀態的過程,還需要指定初始狀態的來源(否則我們將無法引導該過程)。這是在幫助器類tff.templates.IterativeProcess的定義中捕獲的,其中兩個屬性initializenext對應於初始化和迭代。

可用的構建器

目前,TFF提供了兩個生成器函數,這些函數生成用於聯合訓練和評估的聯合計算:

數據集

體系結構假設

客戶選擇

在典型的聯合學習的情況下,我們有一個人口眾多潛在的數億客戶端設備,其中只有一小部分可以是主動的和可用的訓練在任何特定時刻(例如,這可能僅限於那些客戶插入電源(不在計量網絡上,否則處於空閒狀態)。通常,可用於培訓或評估的一組客戶不在開發人員的控制範圍內。此外,由於協調數百萬客戶是不切實際的,因此典型的一輪培訓或評估將只包括一小部分可用客戶,這些客戶可以隨機抽樣

這樣做的主要結果是,按照設計,聯合計算的表達方式不了解參與者的確切集合。所有處理都表示為對抽象的匿名客戶端組的聚合操作,並且該組可能從一輪培訓到另一輪培訓有所不同。因此,將計算實際綁定到具體參與者,進而綁定到他們輸入到計算中的具體數據,就在計算本身之外進行建模。

為了模擬聯邦學習代碼的實際部署,通常將編寫一個訓練循環,如下所示:

trainer = tff.learning.build_federated_averaging_process(...)
state = trainer.initialize()
federated_training_data = ...

def sample(federate_data):
  return ...

while True:
  data_for_this_round = sample(federated_training_data)
  state, metrics = trainer.next(state, data_for_this_round)

為了簡化此操作,在模擬中使用TFF時,將聯合數據作為Python list接受,每個參與的客戶端設備使用一個元素表示該設備的本地tf.data.Dataset

抽象接口

為了標準化處理模擬的聯合數據集,TFF提供了一個抽象接口tff.simulation.ClientData ,該接口允許枚舉客戶端集合,並構造一個包含特定客戶端數據的tf.data.Dataset 。可以將那些tf.data.Dataset直接作為輸入以快速模式輸入到生成的聯合計算中。

應該注意的是,訪問客戶端身份的功能是僅由數據集提供的功能,用於模擬,在這種情況下,可能需要訓練來自特定客戶端子集的數據的能力(例如,模擬不同客戶端的晝夜可用性)。客戶類型)。編譯後的計算和底層運行時涉及任何客戶端身份的概念。例如,在調用tff.templates.IterativeProcess.next ,一旦選擇了來自特定客戶端子集的數據作為輸入,客戶端身份便不再出現在其中。

可用數據集

我們為實現tff.simulation.ClientData接口的數據集專用了名稱空間tff.simulation.datasets ,以用於仿真,並為它添加了2個數據集以支持圖像分類文本生成教程。我們希望鼓勵您為平台貢獻自己的數據集。