用于Android、iOS和浏览器上的静态联合学习的新库

2020-07-15 02:24:02

作为我们去年12月宣布的PyTorch/OpenMines赠款的一部分,Web&;Mobile团队一直在努力开发4个用于静态联合学习的新库:

作为额外的好处:我们还发布了PySyft项目中的第四个Worker库,即PySyft FL Worker,它允许在任何Python环境中进行联合学习。

联合学习的核心是将模型引入数据而不是将数据引入模型时发生的任何类型的机器学习。联邦学习有两种:静态学习和动态学习。

在静态的、以模型为中心的联合学习中,模型的API是预先配置的(在权重、层等中)。并托管在云中。然后,短暂的员工会出现,下载模型,对其进行改进,然后上传新版本。这通常发生在很长的一段时间内(几天、几周,甚至几个月)。当使用智能手机等边缘设备随着时间的推移被动地改进AI模型时,例如应用程序中的模型,这是最常见的。

静态联合学习的一个很好的例子是谷歌的Gboard移动应用如何随着时间的推移学习你的打字偏好和风格。当然,如果用户将他们的短信发送到谷歌的中央服务器,这将是对隐私的严重侵犯,也会带来巨大的网络成本。对谷歌来说,使用手机的计算能力也比每次有人发送短信时在他们的一个数据中心训练一个同等的模型要便宜得多。出于这些原因,谷歌选择在设备上留下用户的短信,在那里训练模型,并将结果报告回谷歌的服务器,以更新全球模型-所有这些都不会损害用户的隐私。

在动态的、以数据为中心的联合学习中,数据集的API是预先配置的(其模式、属性和安全参数),并托管在云中。然后,短暂的模型会出现,并以一种特别的、实验性的方式在当地进行培训。虽然这种形式的联邦学习不太常见,但它比静态联邦学习更适合科学探索,因为它更贴近地反映了标准的数据科学工作流程。

举个例子,假设你想训练一个模型来检测CT扫描中的癌性结节。如果你不在大医院工作,可能很难或者根本不可能获得足以训练你的模型的数据集。幸运的是,使用动态联邦学习,数据所有者可以在PyGrid中托管他们的数据集,而您(数据科学家)可以提交针对该数据的培训和推理请求。更好的是,可以将全局差异隐私应用于生成的模型,以保护数据不被从经过训练的模型中窃取-这是多么酷啊!?

所以,今天是我们首次发布syft.js、KotlinSyft和SwiftSyft的日子。SwiftSyft将从测试版开始,而其他两个被认为是0.1.0的稳定版本。目前,这些库锁定在PySyft 0.2.7中,具有最新的PyGrid主分支。我们已经在努力开发0.2.0版本,以确保在PyGrid中提供更稳定的支持,并提供对许多其他特性的支持。

我们希望在不久的将来增加对使用WebRTC的安全多方计算和安全聚合协议的支持,但目前PySyft还不支持这一点。

KotlinSyft和SwiftSyft都支持前台或后台培训。但是,由于iOS中后台任务调度器的限制,不能保证您在一定时间内保持后台进程。这是可变的,由操作系统决定。

KotlinSyft和SwiftSyft具有充电检测、WiFi网络检测和睡眠/唤醒检测功能。这些是我们包含的智能默认设置,以确保培训过程不会干扰用户体验或运行他们的手机数据计划。这些选项都可以根据您的需要进行配置。

在我们开始演示之前,请注意:syft.js、KotlinSyft和SwiftSyft的所有演示都需要相同的设置过程。您必须在PySyft中运行一台Jupyter笔记本。这包括在本地计算机上安装PySyft,以及在本地计算机上安装PyGrid。正确设置这些设置,然后运行以下笔记本,然后再继续。

syft.js库支持在Web浏览器内训练和推断机器学习模型。让我们尝试一些示例代码,看看我们的API是什么样子:

将*作为TF从';@TensorFlow/tfjs-core';;从';@openmine/syft.js';导入{Syft};const gridUrl=';ws://pygrid.myserver.com:5000';;const model Name=';my-model&39;const model Version=';1.0.0';;//如果模型是。常量Worker=new Syft({gridUrl,authToken,Verbose:true});常量作业=等待worker.newJob({model Name,model Version});job.start();job.on(';Accept';,Async({model,clientConfig})=>;{Const batchSize=clientConfig.Batch_Size;Const LR=clientConfig.lr;//加载数据。const Batches=load_data(BatchSize);//加载模型参数。let model Params=model.params.map(p=>;p.clone());//主训练循环。for(let[data,labels]of Batches){//注意:这只是一个可能的例子。//计划名称(如';Training_plan';),其输入参数和输出取决于FL配置和实际计划执行。let updatedModelParams=等待job.plan[';Training_plan';].Execute(job.worker,data,labels,batchSize,LR,.model Params);//在下一次迭代中使用更新后的模型参数。for(设i=0;i<;model Params.length;i++){model Params[i].dispose();model Params[i]=updatedModelParams[i];}}//计算&;发送模型差异。const model Diff=等待Model.createSerializedDiff(ModelParams);等待job.report(modelDiff);});job.on(';rejected';,({TimeOut})=>;{//处理作业拒绝,例如超时后重试。});作业打开(';Error';,Err=>;{//处理错误。});

是的,就是这样。最棒的是,您可以用普通的PyTorch和PySyft编写您的模型和训练计划,而syft.js会处理剩下的事情。它是真正的黑魔法(实际上,它不是--但请稍等,还有更多……更多的细节可看)。

和它的兄弟syft.js一样,KotlinSyft也是一个在Android设备上执行联合学习的库。下面是我们上面展示的相同MNIST示例的代码片段:

val userid=";my ID";//可选:向您的服务器发起Http请求获取鉴权令牌authToken=apiClient.requestToken(";https://www.mywebsite.com/request-token/$userId";)//配置定义了syft worker的所有可调整属性//此处输入的url不能定义https/wss这样的连接协议,因为worker自己分配//`this`提供上下文。它可以是活动上下文、服务上下文或应用程序上下文。val config=SyftConfiguration.builder(this,";www.mypygrid-url.com";).build()//启动Syft Worker来处理您的所有作业syftWorker=Syft.getInstance(authToken,configuration)//创建新作业newJob=syftWorker.newJob(";mnist";,"。)//定义jobval jobStatusSubscriber=Object:JobStatusSubscriber(){Override Fun onReady(model:SyftModel,Plans:ConcurrentHashMap<;String,Plan>;,clientConfig:ClientConfig){//当KotlinSyft从PyGrid下载计划和协议时调用此函数//您已准备好对模型进行数据培训//param model存储PyGrid给出的模型权重。//ClientConfig有Batchsize、学习率、步数等超级参数//计划可以通过其在PyGrid上托管时使用的计划ID进行访问。//最终,您将能够在此处使用计划名称val plan=plans[";plan id";]repeat(clientConfig.properties";){step-&>;//从ClientConfig.planArgs获取相关的超参数//所有planArgs都将是字符串,并由用户将它们反序列化为正确的Val batchSize=(clientConfig.planArgs[";Batch_Size";]]?)).toInt()val batchIValue=IValue.from(Tensor.fromBlob(longArrayOf(batchSize.toLong()),long ArrayOf(1))val LR=IValue.from(Tensor.fromBlob(FloatArrayOf((clientConfig.planArgs[";LR";]?):Error(";LR不存在";t Exist";)).toFloat(),long ArrayOf(1)//从数据Val批读取数据库的自定义实现Data=dataRepository.loadDataBatch(clientConfig.batchSize)//获取模型权重,如果尚未设置则返回已设置的Val模型参数=Model.getParamsIValueArray()?:Return//plan.ecute运行单个渐变步骤,并将输出返回为PyTorch IValue Value Output=plan.Execute(batchData.first,batchData.Second,batchIVal.Execute。*model Params)?.toTuple()//输出是由pysyft计划定义的输出和所有模型参数输出的元组。让{outputResult->;val paramSize=mod.model State!!.syftTensors.size//模型参数始终附加在输出元组的末尾Val BeginIndex=outputResult.size-paramSize Val updatedParams=outputResult.Slice(eginIndex直到outputResult.size-1)//更新模型。您可以使用这些模型权重model执行任意计算和检查点创建。updateModel(updatedParams.map{it.to张力()})//获得所需的损失、精度等值,就像在Pytorch Android val Accuracy=outputResult[1].toTensor().dataAsFloatArray.last()}?:Return//当计划执行失败时会发生这种情况。//很可能是由于设备状态未满足syft配置约束//您不应在此处理任何错误,只需返回以关闭订阅服务器。//无法从onReady返回会导致应用程序崩溃。//所有错误处理都必须使用`onError`listener}完成//一旦培训结束,生成模型diff val diff=mnistJob.createDiff()//将diff报告给PyGrid并完成循环mnistJob.report(Diff)}Override Fun onRejected(timeout:string){//实现此函数以定义当您的工人被拒绝出周期时将执行的操作//timeout会告诉您应该在周期中重试多少次。作业执行}}//启动jobnewJob.start(JobStatusSubscriber)//瞧!你就完蛋了。

当然,我们通过SwiftSyft支持iOS。让我们看看最后一个MNIST演示的一些代码示例是什么样子:

//身份验证Tokenlet authToken=/*从某个地方获取身份验证令牌(如果需要身份验证):*/使用PyGrid服务器URLif let syftClient=SyftClient(url:url(string:";ws://127.0.0.1:5000";)!,authToken:authToken){//将客户端存储为属性,以便在培训期间不会被释放。self.syftClient=syftClient//使用型号名称和版本self.syftJob=syftClient.newJob(model Name:";mnist";,version:";1.0.0";)//当SwiftSyft从PyGrid下载了计划和模型参数时,将调用此函数//您已准备好根据您的数据对您的模型进行培训//计划-使用此函数可以使用我们的培训数据生成差异//

有趣的是,你应该提到这一点-当谈到动态联合学习时,我们也在进行一些真正重大的开发。我们已经与加州大学旧金山分校合作,致力于在PyGrid中构建OpenMines的动态联合学习能力。请继续关注我们的路线图,了解该项目中发生的更多最新情况。

天高任鸟飞!。简而言之,以下是静态联合学习的近期路线图:

能够在培训过程中启动、停止和暂停联合学习过程。

在训练失败或被用户中断的情况下,将训练数据保存到设备或浏览器的本地存储的能力。

PyGrid中更易于理解、更智能的server_config,它允许更轻松地定义周期、周期长度、允许的工作进程数和选择算法。

在Threepio中添加兼容性表,包括添加对命令的版本控制和模糊查找的支持。

当然,关于我们下一步该做什么,我相信你能想出很多其他的建议。实事求是地说--给我们写信,告诉我们你的想法!您可以在#lib_syft_js、#lib_kotlinsyft、#lib_swftsyft、#lib_Threepio和#lib_syft_mobile频道中找到我们。

我们非常感谢您的支持,并为社区的初学者和新手准备了100多个公开问题。在塑造未来的版本和稳定性方面,我们真的需要您的帮助。以下是几个你可以找到可以着手解决的问题的地方: