近 10 年,机器学习在人工智能领域发展迅猛。其中一个关键的推动因素是人类社会积累了大量数据。然而,数据规模总体上在快速增长。绝大部分数据分散在各个公司或部门内,这使得数据被严重隔离且碎片化。也正因为数据处于这种分散状态,各个组织之间有很强的数据合作意愿。但是,基于数据隐私和安全的考量,在合规的情况下实现数据合作面临着诸多挑战。
上述原因导致了数据孤岛的形成,这正严重阻碍着各方协同数据共同构建人工智能模型。正因如此,迫切需要一种新的机制来解决这些问题。联邦学习出现了。通过这一新兴技术,在确保用户隐私和数据安全的情况下,各组织间交换模型信息的过程被精心设计并且全程加密。这样一来,没有组织能够猜到其他任何组织的隐私数据内容,却能够实现联合建模的目的。
腾讯 TEG 自研了联邦学习平台,此平台已在金融云、广告联合建模等业务场景中开始落地,且取得了初步成效。通过技术赋能,为分布于不同部门和团队的数据搭建起互通的桥梁,在保护数据隐私的前提下,让数据合力成为了可能。本文首先会从平台框架、部署视图以及网络拓扑结构这三个方面,对整体技术架构进行介绍。接着,会在此基础之上,介绍怎样进行一键部署,以及怎样定义联邦任务流,以提交联邦任务。
通过flow-提交联邦任务总结的平台框架介绍
从平台框架的视角出发,通过以下五个层次来构建整个联邦学习的技术与生态,其顺序从最底层开始依次向上:
- 同时,所有计算组件通过 YARN 集群进行调度,这样在保障大规模机器学习任务并行加速的同时,也能保证计算的稳定性与容错性。此外,它能够从多种数据源中拉取数据。这些数据源包括 TDW。同时,也能从 Ceph 中拉取数据。还可以从 COS 中拉取数据。并且能够从 HDFS 等数据源中拉取数据。在计算和数据资源之上,构建了一套针对联邦学习算法的计算框架。与传统机器学习框架不同,此框架着重解决了联邦学习算法和应用在实践中最常见的几个难题:其一,安全加密方面,实现了多种常见的同态加密以及对称和非对称加密算法,其中包括 RSA 非对称加密等算法;其二,分布式计算方面,基于 on 的高性能分布式机器学习框架,能够轻松实现各种高效的分布式联邦学习算法;其三,跨网络通信方面,提供了一套多方跨网络传输接口,底层运用消息队列组件,在确保数据安全的前提下,实现了稳定可靠且高性能的跨网传输;其四,TEE/SGX 支持方面,除了借助软件保障数据安全外,还支持通过 TEE/SGX 在特定环境中对数据进行加密和计算,以此以硬件方式大幅提升算法性能。算法协议:以上述计算框架为基础,针对不同场景达成了常见的联邦算法协议。其一,在分析场景中,能够支持联合查询以及两方或多方的样本对齐;其二,针对建模场景,可支持联邦特征工程,涵盖特征选择、特征过滤以及特征转换等方面,同时也能支持联邦训练,包含逻辑回归、GBDT、DNN 等,并且还可以进行联合预测。从终端用户的角度来看,此产品作为联邦学习的应用产品。它一方面支持以 REST API 的形式调起联邦任务,另一方面支持各模型参与方在联合工作区上协同工作,通过拖拽算法组件的方式构建和配置联邦任务流,同时还能进行用户、资源、配置以及任务的管理。在上述联邦学习的基础设施得以完善之后,能够在安全合规的条件下,应对金融风控、广告推荐、人群画像、联合查询等诸多应用场景中因数据隔离与碎片化而产生的“数据孤岛”问题,从而切实为遵守隐私规范的人工智能和大数据应用赋予力量,同时展现其部署视图及关键组件。
从部署视图的角度来看,包括了服务层和计算层:
计算层构建于 YARN 集群之上,它充分运用了大数据生态套件,承担着运行时各个算法组件的分布式计算任务。服务层的任务节点发起计算任务,并且向 YARN 集群申请资源来运行联邦算子,该联邦算子基于特定的计算框架,从而确保了算法的高度并行性和优异性能。同时,这也涉及到网络拓扑的相关内容。
站在内网用户的角度,通过k8s的对内网用户暴露服务路径:
计算任务与服务层组件之间通过消息中间件来进行通信,例如任务的相关事宜等。
计算任务执行过程中所得到的中间加密结果,会通过各自的消息中间件来实现跨外网同步;同时,需要同步的任务状态信息,也会通过各自的消息中间件来实现跨外网同步。
快速部署
在整体了解完平台框架、部署视图以及网络拓扑结构之后,接下来将介绍快速部署的方法。如前文所述,部署可分为服务层组件和计算层,服务层组件构建在 k8s 集群之上,计算层构建在 YARN 集群之上。在进行部署之前,需要先准备好这两种集群环境。如果计算任务不需要分布式环境,那么也可以不需要准备 YARN 集群环境。
在进行以下操作之前,获取最新版本的安装包并解压。
准备k8s集群
机器配置要求:
如果是处于测试环境,那么可以参考文档来进行安装。对于 VM 来说,可选择 kvm2 ,或者其他的方式,通过创建 k8s 。
代码语言:
代码运行次数:0
运行
复制
启动 minikube ,设置内存为 8192 ,设置 CPU 为 4 。
在生产环境安装 k8s 时,能够参考 k8s 的官方文档。在生产环境部署 k8s 集群,其可选方案包含:
如果需要进行离线安装 k8s,那么可以参考安装包目录下“-k8s-”里的文档来进行安装。
准备Yarn集群(可选)
可以依据相关的文档去安装 YARN 集群,在安装完毕之后,将准备好的配置文件放置在相应的目录下。
代码语言:
代码运行次数:0
运行
复制
并往k8s集群中导入上述配置文件,这里导入的配置名为:
代码语言:
代码运行次数:0
运行
复制
从./hadoop-config 文件创建配置映射 hadoop
准备安装客户端,需要安装 jq。如果是 ubst,要安装 helm 3.0+ 可参考 Helm 的官方文档进行安装。简单来说,可以进行如下操作:一键部署。
以下操作都在客户端机器上进行,并且执行目录处于 Fl-的根目录之下。
代码语言:
代码运行次数:0
运行
复制
cd FL-deploy
同时安装多个参与方。
如果要在同一个 k8s 集群上安装多个参与方,那么可以拷贝多份.sh 作为不同参与方的环境配置文件,并且在执行部署脚本时进行指定。如果没有指定,那么就会默认使用当前目录下的.sh 作为环境配置文件,就如同上面所展示的那样。
代码语言:
代码运行次数:0
运行
复制
将 cp_powerfl_env.sh 与./powerfl-10000.sh 进行 cp 操作。
vim 用于打开./powerfl-10000.sh 文件,其目的是修改 PARTY_ID 等配置。
将 cp_powerfl_env.sh 与./powerfl-20000.sh 进行 cp 操作。
vim 用于修改./powerfl-20000.sh 中的配置,具体是修改 PARTY_ID 等配置。
部署了参与方 10000 ,并且指定了配置文件 powerfl-10000.sh 。
./deploy.sh 用于进行设置操作,其操作对象是./powerfl-10000.sh 。
部署参与方 20000 ,并且指定了配置文件 powerfl-20000.sh 。
./deploy.sh 执行 setup 操作,同时执行./powerfl-20000.sh
更新系统
如果需要对系统的配置进行修改,那么就可以修改与之对应的环境配置文件以及组件配置文件,并且执行以下操作:
代码语言:
代码运行次数:0
运行
复制
./deploy.sh upgrade
如果指定了配置文件为./deploy.sh 并且要进行 upgrade 操作,同时涉及到./powerfl-10000.sh
卸载系统
注意:执行此操作为删除的所有数据,不可恢复:
代码语言:
代码运行次数:0
运行
复制
./deploy.sh cleanup
如果指定了配置文件为./deploy.sh 并且要进行 cleanup 操作,同时还有./powerfl-10000.sh 。
通过flow-提交联邦任务
安装完成之后,能够通过指定的 DSL 来编写任务流以及任务参数配置文件,然后向 flow-提交联邦任务。在开始介绍具体的使用方法之前,首先需要对联邦任务的编排和调度流程进行了解。
联邦任务编排和调度的流程
1)编写任务流文件.yaml,向flow-导入:
代码语言:
代码运行次数:0
运行
复制
使用 POST 请求方式向 'http://{domain}/flow-server/pipelines' 发送请求,并且携带名为 'file' 的表单数据,其值为 '@pipeline.yaml'
如果成功就会返回 id;针对刚才导入的内容,编写任务配置参数文件 job.yaml(之后会介绍 DSL),然后向 flow 提交任务:
代码语言:
代码运行次数:0
运行
复制
使用 curl 发起 POST 请求,请求的地址是 'http://{domain}/flow-server/pipelines/{pipeline_id}/jobs' ,并且携带一个名为 'parameters' 的表单数据,其值为 '@job_parameters.yaml' 。
在收到任务请求提交后,flow 会随机生成本次任务的 id。它会注入全局的相关配置,构建出最终供任务流引擎调度用的 DSL,并向任务流引擎提交任务流。
任务流引擎依据上述的 DSL 文件,按照任务流所定义的节点顺序,逐步向 K8S 集群去申请资源,同时调起与对应节点相关的运行时容器。
运行时容器启动后,会依据注入的环境变量信息,向 YARN 集群提出资源申请。接着启动并调起具体的算法流程,从而执行并行计算任务。到这一步,本侧的算法任务启动工作就完成了。
一边,flow-在接收到任务请求提交之后,会把该任务的配置文件信息传递给本地的消息中间件。
本地消息中间件利用跨网同步的方式,把上述任务配置文件同步给其他参与方的消息中间件。
它们收到了新的联邦任务的启动请求;
9)之后的过程同3)4)5)
任务配置参数文件的格式如下:
代码语言:
代码运行次数:0
运行
复制
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: ""
/opt/spark-app/fl-runtime 路径下的数据文件名为 a9a.guest.head
请明确具体的横线下的句子呀,没有看到相关内容呢,无法进行改写呢。
20000:
hadoop-config: hadoop
hadoop-user-name: root
hdfs-libs-path: hdfs:///fl-runtime-libs
spark-submit-args: ""
/opt/spark-app/fl-runtime 路径下有 data 文件夹,其中包含 a9a.host.head 文件
/data/a9a.host.output 这个输出内容。它位于 /data 路径下,文件名是 a9a.host.output 。
上述文件共由三个主要部分构成:
以数组格式指定联邦任务的各参与方,以=role 格式指定各参与方的 id 及在本次任务中的角色;指定所有参与方共同使用的参数,可配置参数需与.yaml 中指定的 spec 一致;指定各个参与方各自的参数,包含配置信息、任务算法参数配置信息等。
从五个层次夯实联邦学习的技术和生态,这五个层次分别是计算与数据资源、计算框架、算法协议、产品交互和应用场景,且是从底向上进行夯实的。将整个系统以云原生的方式架构在 k8s 集群之上,同时充分利用 YARN 集群的大数据生态,基于 on 来实现联邦任务的高性能分布式计算。本文先介绍了整体架构,其中包含技术栈、关键组件以及网络拓扑结构。接着在此基础上,阐述了如何进行一键部署,还有如何定义联邦任务流以提交联邦任务。希望本文能助力大家快速掌握联邦学习,对这一基于隐私保护的新机器学习建模机制有更深入的了解,并能将其应用到电子商务、金融、医疗、教育、城市计算等更多领域。
扫码关注 | 即刻了解腾讯大数据技术动态
工作时间:8:00-18:00
电子邮件
扫码二维码
获取最新动态