2个不稳定版本
0.2.0 | 2021年1月18日 |
---|---|
0.1.0 | 2020年9月22日 |
#3 在 #联邦学习
用于 xaynet
675KB
13K SLoC
xaynet
Xaynet:使用联邦学习在边缘训练
想要一个支持边缘、桌面浏览器上的联邦学习,与移动应用集成良好,性能出色且保护隐私的框架?欢迎来到XayNet,它完全用Rust编写!
让联邦学习对开发者来说变得简单
机器学习框架已经存在,包括专门用于联邦学习的框架。这些框架通常促进跨领域用例的联邦学习 - 例如在有限数量的医院之间的协作学习,或者例如在多个银行共同处理一个用例而无需共享有价值且敏感的数据。
这个仓库专注于设备间掩码联邦学习,以实现数百万低功耗边缘设备(如智能手机甚至汽车)中机器学习的编排。通过这样做,我们希望也能加快联邦学习在实际中的应用速度和范围,特别是允许保护最终用户数据。所有数据都保留在私有本地场所,其中只有加密的AI模型会自动和异步地聚合。因此,我们提供了一种解决方案来解决AI隐私困境,弥合隐私和便利性之间经常存在的差距。例如,想象一个语音助手可以在设备级别直接学习新单词,并与其他实例共享这些知识,而不需要记录和收集您的语音输入。或者,考虑一个搜索引擎,它可以学习个性化搜索结果,而无需集中收集您的通常敏感的搜索查询……今天仍然有数千种这样的用例,它们为了便利性而牺牲了隐私。我们认为这不应该发生,我们希望提供一个替代方案来解决这个困境。
具体来说,我们为开发者提供
- 应用开发工具:一个SDK,可以将其集成到用Dart或其他移动开发首选语言编写的应用程序中,以及像Flutter这样的框架。
- 通过跨设备联邦学习实现隐私:在边缘设备(如手机、浏览器甚至汽车)上本地训练您的AI模型。联邦学习会自动将本地模型聚合为全局模型。因此,可以捕获本地模型中固有的所有见解,同时用户数据保持在终端设备上保持私有。
- 同态加密实现的安全隐私:聚合最高安全和信任度的模型。Xayn的掩码协议对所有模型进行同态加密。这使您能够将加密的本地模型聚合为全局模型,而无需解密本地模型。这可以保护私有数据,甚至是最敏感的数据。
编写此框架的理由
我们的联邦学习框架不仅是一个机器学习框架,而是支持在可能异构设备上发生的机器学习联邦,其中用例涉及许多此类设备。
此框架所使用的编程语言应该为我们提供以下方面的强大支持
- 在任何地方运行:该语言不应需要其自己的运行时,并且代码应在广泛的各种设备上编译。
- 内存和并发安全性:编译后的代码应既内存安全又无数据竞争。
- 安全通信:应提供经过审查的加密实现,其中包含最先进的技术。
- 异步通信:应存在抽象,以实现异步通信,使联邦学习可扩展。
- 快速且函数式:该语言应提供函数式抽象,同时将代码编译成快速的执行文件。
Rust是极少数满足这些要求的现代编程语言之一
- 其所有权和借用概念使其既内存安全又线程安全(从而避免了许多常见的并发问题)。
- 它具有强大且静态的类型纪律和特质,这些特质描述了类型的可共享功能。
- 它是一种现代系统编程语言,具有一些函数式风格特性,如模式匹配、闭包和迭代器。
- 其惯用代码在性能上与惯用的C代码有可比性。
- 它编译成WASM,因此可以在浏览器设置中本地应用。
- 它广泛适用,不一定依赖于运行时,与Java等语言及其运行虚拟机的需求不同。Foreign Function Interfaces支持从其他语言/框架(包括Dart、Python和Flutter)调用。
- 它编译成LLVM,因此可以利用LLVM的丰富工具套件。
入门指南
最低支持的Rust版本
rustc 1.48.0
运行平台
后端有多种运行方式:通过Docker运行,或者将其部署到Kubernetes集群,或者手动编译代码并运行二进制文件。
- 以下说明假定您的shell工作目录为存储库的根目录。
- 以下说明假定您对一些引用的软件(如
docker
和docker-compose
)有先验知识,或者有一个可用的设置(如果您决定编译Rust代码并手动运行二进制文件)。 - 如果您需要帮助设置系统,我们建议您参考每个工具的官方文档,因为在此处支持它们超出了本项目的范围
注意
在Xaynet v0.11
中,协调器需要一个连接到Redis实例的连接来保存其状态。
不要将协调器连接到用于生产的Redis实例!
我们建议将协调器连接到其自己的Redis实例。我们投入了大量时间确保协调器只删除自己的数据,但在当前的开发状态下,我们无法保证这始终是这种情况。
使用Docker
使用Docker设置的优势在于,您不需要在系统上设置一个工作的Rust环境,因为所有操作都在容器内完成。
运行Docker Hub上的镜像
最新版本的Docker镜像提供在 Docker Hub 上。
您可以通过运行以下命令使用默认的 configs/docker-dev.toml
进行尝试:
Xaynet版本低于v0.11
docker run -v ${PWD}/configs/docker-dev.toml:/app/config.toml -p 8081:8081 xaynetwork/xaynet:v0.10.0 /app/coordinator -c /app/config.toml
Xaynet版本v0.11+
# don't forget to adjust the Redis url in configs/docker-dev.toml
docker run -v ${PWD}/configs/docker-dev.toml:/app/config.toml -p 8081:8081 xaynetwork/xaynet:v0.11.0
Docker镜像包含没有可选功能的协调器的发布版本。
运行带额外基础设施的协调器
通过指向 docker/docker-compose.yml
文件启动协调器。它会启动所有运行协调器所需的基本基础设施。请注意,此文件仅用于开发。
docker-compose -f docker/docker-compose.yml up --build
创建发布版本
如果您愿意,可以创建协调器的优化发布版本,但请注意,编译将更慢。
docker build --build-arg RELEASE_BUILD=1 -f ./docker/Dockerfile .
构建带有可选功能的协调器
可以通过构建参数 COORDINATOR_FEATURES
指定可选功能。
docker build --build-arg COORDINATOR_FEATURES=tls,metrics -f ./docker/Dockerfile .
使用Kubernetes
要将协调器实例部署到您的Kubernetes集群,请使用位于 k8s/coordinator
文件夹内的清单。这些清单依赖于 kustomize
生成(自v1.14起,kustomize
由 kubectl
官方支持)。我们建议您仔细查看这些清单,并根据您的配置(命名空间、入口等)进行调整。
请记住,还要检查(如有必要,请调整)位于 k8s/coordinator/development/config.toml
的协调器默认配置。
请调整 k8s/coordinator/development/ingress.yaml
文件中使用的域名,使其与您的需求匹配(您也可以完全跳过 ingress
,只需确保您从 k8s/coordinator/development/kustomization.yaml
中删除其引用即可)。
请注意,由于资源的敏感性(例如TLS密钥和证书),ingress
配置依赖于此存储库中不可用的资源,因此在 k8s/coordinator/development/ingress.yaml
中显示的 ingress
配置。
要验证生成的清单,请运行
kubectl kustomize k8s/coordinator/development
要应用它们
kubectl apply -k k8s/coordinator/development
如果您没有通过 ingress
公开您的协调器,您仍然可以通过端口转发来访问它。下面的示例在端口 8081
上创建端口转发,假设协调器pod仍在使用 app=coordinator
标签
kubectl port-forward $(kubectl get pods -l "app=coordinator" -o jsonpath="{.items[0].metadata.name}") 8081
手动构建项目
可以使用以下命令构建和启动没有可选功能的协调器:
cd rust
cargo run --bin coordinator -- -c ../configs/config.toml
运行示例
示例可以在 rust/examples/ 下找到。它使用一个虚拟模型,但具有网络功能,因此是检查与协调器连接性的好起点。
试驾
请确保您有一个运行的协调器实例,并且您将使用以下命令生成的客户端能够通过网络访问它。
以下是一个示例,展示如何启动连接到运行在 20
的协调器的 127.0.0.1:8081
的参与者。
cd rust
RUST_LOG=info cargo run --example test-drive -- -n 20 -u http://127.0.0.1:8081
有关如何运行示例的更详细信息,请参阅位于 rust/xaynet-server/src/examples.rs 下的配套入门指南。
故障排除
如果您在运行项目时遇到任何困难,请通过 提交问题 并描述您的设置和遇到的问题来联系我们。
依赖项
~44–60MB
~789K SLoC