聯邦學習( FL )已成為許多實際應用的現實。它使全球范圍內的跨國合作能夠構建更健壯、更通用的機器學習和人工智能模型。
NVIDIA FLARE v2.0 是一款開源的 FL SDK ,通過共享模型權重而非私有數據,數據科學家可以更輕松地協作開發更具通用性的健壯人工智能模型。
對于醫療保健應用程序,這在數據受患者保護、某些患者類型和疾病的數據可能稀少,或者數據在儀器類型、性別和地理位置上缺乏多樣性的情況下尤其有益。
查看標志
NVIDIA FLARE 代表 聯合學習應用程序運行時環境 。它是引擎的基礎NVIDIA Clara Train FL 軟件,它已經被用于醫學成像、遺傳分析、腫瘤學和 COVID-19 研究中的人工智能應用。 SDK 使研究人員和數據科學家能夠將其現有的機器學習和深度學習工作流調整為分布式范例,并使平臺開發人員能夠為分布式多方協作構建安全、隱私保護的產品。
NVIDIA FLARE 是一個輕量級、靈活且可擴展的分布式學習框架,在 Python 中實現,與您的基礎培訓庫無關。您可以在 PyTorch , TensorFlow ,甚至只是 NumPy 中實現自己的數據科學工作流,并在聯邦設置中應用它們。
也許您希望實現流行的 聯邦平均( FedAvg )算法 。從初始全局模型開始,每個 FL 客戶機在其本地數據上訓練模型一段時間,并將模型更新發送到服務器進行聚合。然后,服務器使用聚合更新來更新下一輪培訓的全局模型。此過程將反復多次,直到模型收斂。
NVIDIA FLARE 提供可定制的控制器工作流,以幫助您實施 FedAvg 和其他 FL 算法,例如, 循環重量轉移 。它安排不同的任務,例如深度學習培訓,在參與的 FL 客戶機上執行。工作流使您能夠從每個客戶端收集結果(例如模型更新),并將其聚合以更新全局模型,并將更新的全局模型發回以供繼續培訓。圖 1 顯示了原理。
每個 FL 客戶機充當工人,請求執行下一個任務,例如模型培訓。控制器提供任務后,工作人員執行任務并將結果返回給控制器。在每次通信中,可以有可選的過濾器來處理任務數據或結果,例如, homomorphic encryption 和解密或差異隱私。
圖 1 。 NVIDIA FLARE 工作流
實現 FedAvg 的任務可以是一個簡單的 PyTorch 程序,它為 CIFAR-10 訓練一個分類模型。您當地的培訓師可能看起來像下面的代碼示例。為了簡單起見,我跳過了整個培訓循環。
import torch import torch.nn as nn import torch.nn.functional as F from nvflare.apis.dxo import DXO, DataKind, MetaKey, from_shareable from nvflare.apis.executor import Executor from nvflare.apis.fl_constant import ReturnCode from nvflare.apis.fl_context import FLContext from nvflare.apis.shareable import Shareable, make_reply from nvflare.apis.signal import Signal from nvflare.app_common.app_constant import AppConstants class SimpleNetwork(nn.Module): def __init__(self): super(SimpleNetwork, self).__init__() self.conv1 = nn.Conv2d(3, 6, 5) self.pool = nn.MaxPool2d(2, 2) self.conv2 = nn.Conv2d(6, 16, 5) self.fc1 = nn.Linear(16 * 5 * 5, 120) self.fc2 = nn.Linear(120, 84) self.fc3 = nn.Linear(84, 10) def forward(self, x): x = self.pool(F.relu(self.conv1(x))) x = self.pool(F.relu(self.conv2(x))) x = torch.flatten(x, 1) # flatten all dimensions except batch x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) x = self.fc3(x) return x class SimpleTrainer(Executor): def __init__(self, train_task_name: str = AppConstants.TASK_TRAIN): super().__init__() self._train_task_name = train_task_name self.device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") self.model = SimpleNetwork() self.model.to(self.device) self.optimizer = torch.optim.SGD(self.model.parameters(), lr=0.001, momentum=0.9) self.criterion = nn.CrossEntropyLoss() def execute(self, task_name: str, shareable: Shareable, fl_ctx: FLContext, abort_signal: Signal) -> Shareable: """ This function is an extended function from the superclass. As a supervised learning-based trainer, the train function will run training based on model weights from `shareable`. After finishing training, a new `Shareable` object will be submitted to server for aggregation.""" if task_name == self._train_task_name: epoch_len = 1 # Get current global model weights dxo = from_shareable(shareable) # Ensure data kind is weights. if not dxo.data_kind == DataKind.WEIGHTS: self.log_exception(fl_ctx, f"data_kind expected WEIGHTS but got {dxo.data_kind} instead.") return make_reply(ReturnCode.EXECUTION_EXCEPTION) # creates an empty Shareable with the return code # Convert weights to tensor and run training torch_weights = {k: torch.as_tensor(v) for k, v in dxo.data.items()} self.local_train(fl_ctx, torch_weights, epoch_len, abort_signal) # compute the differences between torch_weights and the now locally trained model model_diff = ... # build the shareable using a Data Exchange Object (DXO) dxo = DXO(data_kind=DataKind.WEIGHT_DIFF, data=model_diff) dxo.set_meta_prop(MetaKey.NUM_STEPS_CURRENT_ROUND, epoch_len) self.log_info(fl_ctx, "Local training finished. Returning shareable") return dxo.to_shareable() else: return make_reply(ReturnCode.TASK_UNKNOWN) def local_train(self, fl_ctx, weights, epoch_len, abort_signal): # Your training routine should respect the abort_signal. ... # Your local training loop ... for e in range(epoch_len): ... if abort_signal.triggered: self._abort_execution() ... def _abort_execution(self, return_code=ReturnCode.ERROR) -> Shareable: return make_reply(return_code)
您可以看到您的任務實現可以執行許多不同的任務。您可以計算每個客戶機上的摘要統計信息,并與服務器共享(記住隱私限制),執行本地數據的預處理,或者評估已經訓練過的模型。
在 FL 培訓期間,您可以在每輪培訓開始時繪制全局模型的性能。對于本例,我們在 CIFAR-10 的異構數據拆分上運行了八個客戶端。在下圖(圖 2 )中,我顯示了默認情況下 NVIDIA FLARE 2.0 中可用的不同配置:
FedAvg
FedProx
FedOpt
使用同態加密進行安全聚合的 FedAvg ( FedAvg HE )
圖 2 。訓練期間不同 FL 算法全局模型的驗證精度
雖然 FedAvg 、 FedAvg HE 和 FedProx 在這項任務中的性能相當,但您可以使用 FedOpt 設置觀察到改進的收斂性,該設置使用 SGD with momentum 來更新服務器上的全局模型。
整個 FL 系統可以使用管理 API 進行控制,以自動啟動和操作不同配置的任務和工作流。 NVIDIA 還提供了一個全面的資源調配系統,可在現實世界中輕松安全地部署 FL 應用程序,同時還提供了運行本地 FL 模擬的概念驗證研究。
圖 3 。 NVIDIA FLARE 供應、啟動、操作( PSO )組件及其 API
開始
NVIDIA FLARE 使 FL 可用于更廣泛的應用。潛在使用案例包括幫助能源公司分析地震和井筒數據、制造商優化工廠運營以及金融公司改進欺詐檢測模型。
關于作者
Holger Roth 是 NVIDIA 的高級應用研究科學家,專注于醫學成像的深度學習。在過去幾年中,他一直與臨床醫生和學者密切合作,為放射應用開發基于深度學習的醫學圖像計算和計算機輔助檢測模型。他擁有博士學位。來自英國倫敦大學學院。
審核編輯:郭婷
-
NVIDIA
+關注
關注
14文章
5039瀏覽量
103311 -
計算機
+關注
關注
19文章
7522瀏覽量
88279 -
深度學習
+關注
關注
73文章
5508瀏覽量
121317
發布評論請先 登錄
相關推薦
評論