导语:近10年,机器学习在人工智能领域迅猛发展,其中一个关键的推动燃料就是人类社会积累的大量数据。然而,尽管数据规模在总体上快速增长,绝大部分数据却分散在各个公司或部门内,导致数据被严重隔离和碎片化;也正因为此,各个组织间有很强的数据合作意愿,可是基于数据隐私和安全的考量,要在合规的情况下实现数据合作面临着诸多挑战。
基于上述原因形成的数据孤岛正严重阻碍着各方协同数据共同构建人工智能模型,也因此迫切需要一种新的机制来解决上述问题。联邦学习应运而生,通过这一新兴技术,可以在确保用户隐私和数据安全的前提下,各组织间交换模型信息的过程被精心地设计和全程加密,使得没有组织能够猜测到其他任何组织的隐私数据内容,但却实现联合建模的目的。
PowerFL是腾讯TEG自研的联邦学习平台,已经在金融云、广告联合建模等业务场景中开始落地,并取得了初步效果。PowerFL以技术赋能的方式,为分布在不同部门和团队的数据搭建互通的桥梁,在保护数据隐私的前提下,使数据合力成为可能。本文将首先从平台框架、部署视图和网络拓扑结构等三个方面来介绍PowerFL的整体技术架构,并在此基础上介绍如何一键部署PowerFL以及如何定义联邦任务流来提交联邦任务。
从平台框架的角度,PowerFL从以下五个层次来构建整个联邦学习的技术和生态,从最底层依次往上:
从部署视图的角度来看,PowerFL包括了服务层和计算层:
站在内网用户的角度,PowerFL通过k8s的ingress对内网用户暴露服务路径:
计算任务(如spark任务的driver和executor)和服务层组件之间,则通过消息中间件来提供通信;
计算任务执行过程中得到的中间加密结果和需要同步的任务状态信息,则通过各自消息中间件实现跨外网同步。
在整体了解完PowerFL的平台框架、部署视图以及网络拓扑结构后,以下将介绍如何快速部署PowerFL,正如上述提到的,PowerFL分成服务层组件和计算层,分别构建在k8s集群和YARN集群之上。在部署PowerFL之前,需要先准备好这两种集群环境(如果计算任务不需要分布式环境,也可以不需要准备YARN集群环境)。
在进行以下操作之前,获取最新版本的安装包并解压。
机器配置要求:
如果是在测试环境的话,可参考文档安装Minikube,VM driver可选kvm2(linux)或者hyperkit,或者VirtualBox (macOS),通过Minikube创建k8s:
minikube start --memory=8192 --cpus=4
如果是在生产环境中安装k8s ,可以参考k8s的官方文档,在生产环境部署k8s集群,可选方案包括:
如果需要离线安装k8s,可参考安装包目录下的offline-k8s-deploy里的文档进行安装。
可以参考Apache Ambari的文档来安装YARN集群,安装完成后准备好hadoop的配置文件,放在hadoop-config目录下:
core-site.xml hdfs-site.xml mapred-site.xml yarn-site.xml
并往k8s集群中导入上述配置文件,这里导入的配置名为hadoop:
kubectl -n power-fl-[partyId] create configmap hadoop --from-file=./hadoop-config
以下操作均在客户端机器上进行操作,且执行目录为Fl-deploy的根目录下:
cd FL-deploy
如果需要在同一个k8s集群上安装多个参与方,则可拷贝多份 _powerfl_env.sh作为不同参与方的环境配置文件,并在执行部署脚本时指定(如果未指定,则默认使用当前目录下的powerfl_env.sh作为环境配置文件,如上所示):
cp _powerfl_env.sh ./powerfl-10000.sh
vim ./powerfl-10000.sh # 修改PARTY_ID等配置
cp _powerfl_env.sh ./powerfl-20000.sh
vim ./powerfl-20000.sh # 修改PARTY_ID等配置
# 部署参与方10000,指定配置文件powerfl-10000.sh
./deploy.sh setup ./powerfl-10000.sh
# 部署参与方20000, 指定配置文件powerfl-20000.sh
./deploy.sh setup ./powerfl-20000.sh
如果需要修改系统相关的配置,则可修改对应环境配置文件和组件配置文件,并执行:
./deploy.sh upgrade
# 如果指定配置文件./deploy.sh upgrade ./powerfl-10000.sh
注意:执行此操作为删除powerfl的所有数据,不可恢复:
./deploy.sh cleanup
# 如果指定配置文件./deploy.sh cleanup ./powerfl-10000.sh
在安装完PowerFL之后,可通过指定的DSL编写任务流和任务参数配置文件向flow-server提交联邦任务,在介绍具体使用方法之前,首先了解一下PowerFL的联邦任务编排和调度流程。
1)编写任务流文件pipeline.yaml,向flow-server导入pipeline:
curl --request POST 'http://{domain}/flow-server/pipelines' --form 'file=@pipeline.yaml'
如果成功会返回pipeline的id;针对刚才导入的pipeline,编写任务配置参数文件job.yaml(稍后会介绍DSL),向flow-server提交任务:
curl -request POST 'http://{domain}/flow-server/pipelines/{pipeline_id}/jobs' --form 'parameters=@job_parameters.yaml'
2)flow-server在收到任务请求提交之后,会随机生成本次任务的id、注入全局的相关配置构建出最终供任务流引擎调度用的DSL并向其提交任务流。
3)任务流引擎根据上述DSL文件,按任务流定义的节点顺序依次向K8S集群申请资源,调起对应节点的运行时容器;
4和5)运行时容器启动后,会根据注入的环境变量信息,向YARN集群申请资源,启动driver和executor,调起具体的算法流程,执行并行计算任务,至此,本侧的算法任务启动完成。
6)另一边,flow-server在收到任务请求提交之后,会将该任务的配置文件信息传给本地的消息中间件;
7)本地消息中间件通过跨网同步,将上述任务配置文件同步给其它参与方的消息中间件;
8)其它参与方的flow-server监听消息中间件任务提交的topic,收到新的联邦任务的启动请求;
9)之后的过程同3)4)5)
任务配置参数文件的格式如下:
parties: [ "10000=guest", "20000=host" ]
common-args:
spark-master-name: local[*]
runtime-image: power_fl/runtime:develop
parties-args:
10000:
hadoop-config: hadoop
hadoop-user-name: root
hdfs-libs-path: hdfs:///fl-runtime-libs
spark-submit-args: ""
input: /opt/spark-app/fl-runtime/data/a9a.guest.head
output: /tmp/a9a.guest.output
20000:
hadoop-config: hadoop
hadoop-user-name: root
hdfs-libs-path: hdfs:///fl-runtime-libs
spark-submit-args: ""
input: /opt/spark-app/fl-runtime/data/a9a.host.head
output: /data/a9a.host.output
上述文件共由三个主要部分构成:
PowerFL从计算与数据资源、计算框架、算法协议、产品交互和应用场景五个层次从底向上夯实整个联邦学习的技术和生态,将整个系统以云原生的方式架构于k8s集群之上,并充分利用YARN集群的大数据生态,基于Spark on Angel来实现联邦任务的高性能分布式计算。本文首先介绍了PowerFL的整体架构,包括技术栈、关键组件和网络拓扑结构,并在此基础上介绍如何一键部署PowerFL以及如何定义联邦任务流来提交联邦任务。希望本文能帮助大家快速上手联邦学习,深入了解这一新的基于隐私保护的机器学习建模机制,并将其应用于电子商务、金融、医疗、教育、城市计算等更多的领域。
扫码关注 | 即刻了解腾讯大数据技术动态