最近被字节跳动开源 FedLearner 的新闻小小地刷屏了一下。联邦学习最近一年在机器学习领域是非常火的一个话题,最近终于有时间能够有比较大段的时间可以写一篇博客,趁这个机会学习与了解一下联邦学习。
2018 年 5 月,欧盟通过 General Data Protection Regulation(GDPR)法案,法案指出:所有与个人相关的信息都是个人数据,对数据的使用行为必须要有用户的明确授权。把对隐私保护的要求提到了一个新的高度。
随着对数据安全的重视和隐私保护法案的出台,数据孤岛的问题不仅不会消失,反而会成为新的常态,甚至它不仅存在于不同公司和组织之间,在大型集团内部也存在。未来,我们必须面对这样的现状:如果我们想更好的利用数据,用大数据和 AI 做更多有意义的事情,就必须在不同组织之间、公司与用户之间进行数据共享,但这个共享需要满足隐私保护和数据安全的前提。
当前,业界解决隐私泄露和数据滥用的数据共享技术路线主要有两条。一条是基于硬件可信执行环境(TEE: Trusted Execution Environment)技术的可信计算,另一条是基于密码学的多方安全计算(MPC:Multi-party Computation)。
TEE(可信执行环境)核心概念是以第三方硬件为载体,数据在由硬件创建的可信执行环境中进行共享。这方面以 Intel 的 SGX 技术,AMD 的 SEV 技术,ARM 的 Trust Zone 技术等为代表。其中 Intel SGX 应用最为广泛。
SGX(Software Guard Extensions )是 Intel 提供的一套软件保护方案。SGX 通过提供一系列 CPU 指令码,允许用户代码创建具有高访问权限的私有内存区域(Enclave - 飞地),包括 OS,VMM,BIOS,SMM 均无法私自访问 Enclave,Enclave 中的数据只有在 CPU 计算时,通过 CPU 上的硬件进行解密。同时,Intel 还提供了一套远程认证机制(Remote Attestation),通过这套机制,用户可以在远程确认跑在 Enclave 中的代码是否符合预期。
SGX 技术目前具有诸多限制,其中最大的当属 128M 内存限制问题(超过 128M 会触发换页操作,导致性能大幅下降)。根据一些消息来源,下一代 SGX 技术可以将其从 128M 限制扩展到 4G 限制,很大程度缓解问题。
安全多方计算最早是由华裔计算机科学家、图灵奖获得者姚启智教授(有家相关公司:华控清交)通过百万富翁问题提出的。该问题表述为:两个百万富翁Alice和Bob想知道他们两个谁更富有,但他们都不想让对方知道自己财富的任何信息。在双方都不提供真实财富信息的情况下,如果比较两个人的财富多少,并给出可信证明。这一方向的研究,主要是针对无可信第三方的情况下,如何安全地计算一个约定函数的问题。
这里还有两个例子:
- Alice认为她的了某种遗传疾病,想验证自己的想法。正好她知道Bob有一个关于疾病的DNA模型的数据库。如果她把自己的DNA样品寄给Bob,那么Bob可以给出她的DNA的诊断结果。但是Alice又不想别人知道,这是她的隐私。所以,她请求Bob帮忙诊断自己DNA的方式是不可行的。因为这样Bob就知道了她的DNA及相关私人信息。
- 两个金融组织计划为了共同的利益决定互相合作一个项目。每个组织都想自己的需求获得满足。然而,他们的需求都是他们自己专有的数据,没人愿意透露给其他方,甚至是“信任”的第三方。那么他们如何在保护数据私密性的前提下合作项目呢?
目前在 MPC 领域,主要用到的技术包括混淆电路(Garbled Circuit)、秘密分享(Secret Sharing)和同态加密(Homomorphic Encryption)。
混淆电路是图灵奖得主姚期智教授在 80 年代提出的一个方法。其原理是,任意函数最后在计算机语言内部都是由加法器、乘法器、移位器、选择器等电路表示,而这些电路最后都可以仅由 AND 和 XOR 两种逻辑门组成。一个门电路其实就是一个真值表,假设我们把门电路的输入输出都使用不同的密钥加密,设计一个加密后的真值表,这个门从控制流的角度来看还是一样的,但是输入输出信息都获得了保护。
秘密分享的基本原理是将每个数字随机拆散成多个数并分发到多个参与方那里。然后每个参与方拿到的都是原始数据的一部分,一个或少数几个参与方无法还原出原始数据,只有大家把各自的数据凑在一起时才能还原真实数据。
同态加密是一种特殊的加密方法,允许对密文进行处理得到仍然是加密的结果,即对密文直接进行处理,跟对明文进行处理后再对处理结果加密,得到的结果相同。同态性来自抽象代数领域的概念,同态加密则是它的一个应用。
基于上述的两种解决数据共享问题的技术路线,工业界提出了利用共享数据进行机器学习的方案。目前,蚂蚁金服,微众银行,谷歌等都有自己的探索和实现。
2017 年谷歌第一次将安全多方计算引入了机器学习领域,提出了联邦学习的概念。谷歌的手机用户将模型下载到本地,用用户手机本地的数据训练模型随后将梯度更新到公共模型上。
2019 年,微众银行和蚂蚁金服也推出了自己的解决方案。蚂蚁金服的方案被称作共享学习。微众银行的方案被称作联邦学习,也同时开源了联邦学习框架 FATE 和分布式计算存储的中间件 Eggroll,总体而言与谷歌的技术路线较为类似。
在联邦学习中,一共有三个使用场景上的分类:
- 纵向联邦学习,两个数据集的用户 ( U1, U2, … ) 重叠部分较大,而用户特征 ( X1, X2, … ) 重叠部分较小;
- 横向联邦学习,两个数据集的用户特征 ( X1, X2, … ) 重叠部分较大,而用户 ( U1, U2, … ) 重叠部分较小;
- 联邦迁移学习,通过联邦学习和迁移学习,解决两个数据集的用户 ( U1, U2, … ) 与用户特征重叠 ( X1, X2, … ) 部分都比较小的问题。
而蚂蚁金服提出的共享学习可以被理解为是联邦学习的超集,不仅支持联邦学习的场景,还支持:
- 数据出域的集中式学习
- 联邦学习讲究的是参与各方的“身份和地位”的相同,所以叫联邦;而共享学习则不强调各共享方的地位对等,在很多场景下,不同的参与方是拥有不同的角色的。(此处来自蚂蚁的宣传文章,理论上在纵向联邦学习中也存在不同地位的参与方)
FATE
FATE 的架构如下所示:
- EggRoll:分布式计算和存储的抽象;
- Federated Network:跨域跨站点通信的抽象;
- FATE FederatedML:联邦学习算法模块,包含了目前联邦学习所有的算法功能;
- FATE-Flow,FATE-Board:完成一站式联邦建模的管理和调度以及整个过程的可视化;
- FATE-Serving:联邦学习在线推理模块。
FATE Federated ML 是 FATE 技术架构的机器学习组件库。其中包括:
- EggRoll & Federation API:底层是 EggRoll 的算子,比如 Map 和 MapValues,Remote 和 Get 可以完成整个分布式计算的抽象;
- MPC Protocol:包括同态加密、秘密共享等多种多方安全协议,
- Numeric Operator:会抽象出数学算子,比如加法或者乘法;
- ML Operator:用建好的数学算子构建机器学习算子,而不用管底层的安全协议是什么;
- Algorithms:有了 ML 算子之后就构建各种算法模型。
也是 FATE 最核心的框架实现。其中包含了与安全多方计算有关的实现,和与联邦机器学习有关的算子实现。底层与分布式计算中间件 EggRoll 交互,执行真正的计算。
EggRoll 是一个分布式计算和存储的中间件,负责维护联邦学习中一方的存储和计算。它会负责运行真正的进程,进行计算。主要使用 Scala 实现,提供了 Map,Reduce,Join 等算子。
除了微众银行之外,VMware 也在深度参与 FATE 社区,他们主要关注在 FATE on Kubernetes 方面。VMware 开源了 KubeFATE,FATE-operator 等组件。
KubeFATE 是一个支持在 Kubernetes 上部署多个 FATE 集群的工具。它本身依赖一个 MongoDB 作为数据库。
apiVersion: app.kubefate.net/v1beta1
kind: Kubefate
metadata:
name: kubefate-sample
namespace: kube-fate
spec:
imageVersion: v1.0.3
host: kubefate.net
# kubefate config
config:
- name: FATECLOUD_MONGO_URL
value: "mongo:27017"
- name: FATECLOUD_MONGO_USERNAME
valueFrom:
secretKeyRef:
name: kubefate-secret
key: mongoUsername
- name: FATECLOUD_MONGO_PASSWORD
valueFrom:
secretKeyRef:
name: kubefate-secret
key: mongoPassword
- name: FATECLOUD_MONGO_DATABASE
value: "KubeFate"
- name: FATECLOUD_USER_USERNAME
valueFrom:
secretKeyRef:
name: kubefate-secret
key: kubefateUsername
- name: FATECLOUD_USER_PASSWORD
valueFrom:
secretKeyRef:
name: kubefate-secret
key: kubefatePassword
可以将 KubeFATE 理解为部署 FATE clusters 的平台。
除了 KubeFATE 之外,FATECluster 也是一个 CRD,对应一个 FATE 集群:
apiVersion: app.kubefate.net/v1beta1
kind: FateCluster
metadata:
name: fatecluster-sample
namespace: fate-9999
spec:
version: v1.4.0
partyId: "9999"
proxyPort: "30009"
partyList:
- partyId: "10000"
partyIp: "192.168.1.10"
partyPort: "30010"
egg:
replica: 1
# KubeFATE service deployed in Org.
kubefate:
name: kubefate-sample
namespace: kube-fate
最后可以在集群间发起联邦学习任务:
apiVersion: app.kubefate.net/v1beta1
kind: FateJob
metadata:
name: fatejob-sample
namespace: fate-9999
spec:
# FATE cluster deployed in the Org.
fateClusterRef: fatecluster-sample
jobConf:
pipeline: |-
{
"components": {
"secure_add_example_0": {
"module": "SecureAddExample"
}
}
}
modulesConfig: |-
{
"initiator": {
"role": "guest",
"party_id": 9999
},
"job_parameters": {
"work_mode": 1
},
"role": {
"guest": [
9999
],
"host": [
9999
]
},
"role_parameters": {
"guest": {
"secure_add_example_0": {
"seed": [
123
]
}
},
"host": {
"secure_add_example_0": {
"seed": [
321
]
}
}
},
"algorithm_parameters": {
"secure_add_example_0": {
"partition": 10,
"data_num": 1000
}
}
}
介绍完 FATE,接下来看看蚂蚁的共享学习。蚂蚁的共享学习一共有两个技术路线,一个是 SGX 路线,一个是 MPC 路线。其中 SGX 路线 SOFAEnclave 基于阿里云的机密计算产品 KubeTEE(ACK-TEE)(开源在 SOFAEnclave/KubeTEE),MPC 路线已经产品化为蚂蚁摩斯(ANT MORSE)安全计算。
SGX 路线中,产品架构如图所示:
其中 KubeTEE 和阿里云机密计算在产品上体现为 ACK-TEE。而 Occlum LibOS 是一个支持单 Enclave 内多进程的 SGX LibOS,具体可见论文 [2001.07450] Occlum: Secure and Efficient Multitasking Inside a Single Enclave of Intel SGX 和开源实现 occlum/occlum。
类比操作系统内核,Occlum LibOS 向 Enclave 内的可信应用提供完整的系统服务,应用不需要分割和修改即可得到 Enclave 保护。Occlum 兼容 POSIX 编程接口,并支持多线程、OpenMP、和多进程;同时,Occlum 实现了多进程隔离机制,使得多个可信应用之间可以相互隔离。Occlum 使得开发者方便利用 Enclave 的 CIA 能力,达到可用不可见、可用不可攻的效果,使数据保护能真正得到落实。目前,Occlum 可轻松支持大型人工智能框架,例如 XGBoost、TensorFlow 等,也可支持大型服务器应用例如 Shell, GCC,Web Server 等。
KubeTEE 现在也开源了,架构如下:
ACK-TEE 机密计算是阿里云容器服务Kubernetes版ACK(Container Service for Kubernetes)基于 Intel SGX 提供的可信应用或机密计算应用交付和管理的云原生一站式机密计算平台,目的是帮助您保护数据使用中的安全性、完整性和机密性。机密计算可以让您把重要的数据和代码放在一个特殊的可信执行加密环境中,而不会暴露给系统其他部分。其他应用、BIOS、OS、Kernel、管理员、运维人员、云厂商、甚至除了CPU以外的其他硬件均无法访问机密计算平台数据,极大减少敏感数据的泄露风险,为您提供了更好的控制、透明度和隐秘性。
先介绍到这里吧,后续学习一段时间再补充。
License
- This article is licensed under CC BY-NC-SA 3.0.
- Please contact me for commercial use.