#机器学习 #人工智能 #联邦学习 #人工智能 #fl

xaynet-sdk

Xayn 网络项目正在构建机器学习的隐私层,以便人工智能项目可以符合 GDPR 和 CCPA 等合规性。这种方法依赖于联邦学习作为使能技术,它允许生产级人工智能应用完全符合隐私要求。

1 个不稳定版本

0.1.0 2021 年 1 月 18 日

#5#联邦学习


2 crates 中使用

自定义许可

415KB
7.5K SLoC

crates.io badge docs.rs badge rustc badge Coverage Status Maintenance roadmap badge

Xaynet banner

xaynet

Xaynet:使用联邦学习在边缘进行训练

想要一个支持边缘、桌面浏览器中的联邦学习,与移动应用集成良好,性能出色且保护隐私的框架吗?欢迎使用 XayNet,它完全用 Rust 编写!

让联邦学习对开发者来说更简单

已经存在机器学习框架 - 包括专门用于联邦学习的框架。这些框架通常促进跨不同领域使用案例的联邦学习 - 例如在有限数量的医院之间进行协作学习,或者在多个银行之间合作处理共同使用案例,而无需共享有价值且敏感的数据。

此存储库专注于带掩码的跨设备联邦学习,以实现数百万低功耗边缘设备(如智能手机或汽车)上机器学习的编排。通过这样做,我们希望还能加快和扩大联邦学习的实际应用速度和范围,特别是允许保护最终用户数据。所有数据都保留在私有本地环境中,只有加密的 AI 模型会自动异步汇总。因此,我们提供了一种解决 AI 隐私困境的解决方案,弥合了隐私与便利性之间通常存在的差距。例如,想象一下,一个语音助手可以在设备级别直接学习新单词,并与其他所有实例共享这些知识,而无需在中心记录和收集您的语音输入。或者,想想一个搜索引擎如何学习个性化搜索结果,而无需在中心收集您经常敏感的搜索查询……今天,还有数以千计的此类用例仍然以便利性换取隐私。我们认为这不应该成为现实,我们希望提供一个替代方案来解决这一困境。

具体来说,我们为开发者提供

  • 应用开发工具:一个 SDK,可以将联邦学习集成到用 Dart 或其他移动开发首选语言编写的应用程序中,以及像 Flutter 这样的框架。
  • 通过跨设备联邦学习实现隐私:在边缘设备上本地训练AI模型,如手机、浏览器甚至汽车。联邦学习自动将本地模型聚合为全局模型。因此,所有本地模型内在的见解都被捕获,同时用户数据保持端设备上的隐私。
  • 通过同态加密实现安全隐私:聚合具有最高安全性和信任度的模型。Xayn的掩码协议以同态方式加密所有模型。这使您能够将加密的本地模型聚合为全局模型,而无需解密本地模型。这保护了私人数据,甚至是最敏感的数据。

编写此框架的Rust的理由

我们的联邦学习框架不仅是一个机器学习框架,它还支持在可能异构设备上进行的机器学习联邦,并且涉及许多此类设备的用例。

编写此框架的编程语言应为我们提供以下方面的强大支持

  • “无处不在”运行:该语言不应需要自己的运行时,代码应能在广泛的设备上编译。
  • 内存和并发安全性:编译后的代码应既内存安全又无数据竞争。
  • 安全通信:应提供经过验证的实现中的最先进加密技术。
  • 异步通信:应存在用于异步通信的抽象,使联邦学习可扩展。
  • 快速和函数式:该语言应提供功能抽象,同时将代码编译为快速可执行文件。

Rust是少数几种满足这些要求的现代编程语言之一

  • 其所有权和借用概念使其既内存安全又线程安全(从而避免了许多常见的并发问题)。
  • 它具有强大的静态类型纪律和特质,特质描述了类型的可共享功能。
  • 它是一种现代系统编程语言,具有一些功能式风格功能,如模式匹配、闭包和迭代器。
  • 其惯用代码在性能上优于惯用C代码。
  • 它编译为WASM,因此可以在浏览器设置中本地应用。
  • 它具有广泛的应用能力,不依赖于运行时,与Java等语言及其代码运行所需的虚拟机不同。外函数接口支持从其他语言/框架(包括Dart、Python和Flutter)调用。
  • 它编译为LLVM,因此可以利用丰富的LLVM工具集。

入门

最低支持的Rust版本

rustc 1.48.0

运行平台

运行后端有几种不同的方法:通过Docker,或将它部署到Kubernetes集群,或者通过编译代码并手动运行二进制文件。

  1. 以下所有说明都假定您的shell工作目录为存储库的根目录。
  2. 以下说明假定您对所引用的一些软件(如dockerdocker-compose)有先验知识,或者有一个正在运行的设置(如果您决定编译Rust代码并手动运行二进制文件)。
  3. 如果您需要帮助设置系统,我们建议您参考每个工具的官方文档,因为在这里支持它们超出了本项目范围

注意

在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起,kustomizekubectl官方支持)。我们建议您仔细查看这些清单,并根据您自己的设置(命名空间、入口等)进行修改。

请记住,还要检查(并根据需要调整)协调器的默认配置,可在k8s/coordinator/development/config.toml中找到。

请调整k8s/coordinator/development/ingress.yaml文件中使用的域,使其与您的需求匹配(您也可以完全跳过ingress,只需确保从k8s/coordinator/development/kustomization.yaml中删除其引用即可)。

请注意,ingress配置显示在k8s/coordinator/development/ingress.yaml中,依赖于由于敏感性质(例如TLS密钥和证书)而不在此存储库中可用的资源。

要验证生成的清单,请运行

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/下找到。它使用一个模拟模型,但具有网络功能,因此是检查与协调器连接性的好起点。

试驾

请确保您有一个正在运行的协调器实例,并且您将通过以下命令生成的客户端能够通过网络访问它。

以下是一个如何启动将连接到运行在 127.0.0.1:8081 的协调器的 20 个参与者的示例。

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 下的配套入门指南。

故障排除

如果您在运行项目时遇到任何困难,请通过 提交问题 并描述您的设置和遇到的问题来联系我们。

依赖项

~29MB
~314K SLoC