想要一个在桌面浏览器中支持边缘联合学习、与移动应用程序良好集成、高性能且保护隐私的框架吗?欢迎来到完全用 Rust 编写的 XayNet!
机器学习框架——包括专门用于联邦学习的框架——已经存在。这些框架通常有助于跨孤岛用例的联合学习 - 例如,在有限数量的医院之间进行协作学习,或者在多个银行之间处理常见用例,而无需共享有价值的敏感数据。
该存储库专注于屏蔽跨设备联合学习,以实现在数百万个低功耗边缘设备(例如智能手机甚至汽车)中编排机器学习。通过这样做,我们还希望在实践中加快联邦学习的采用速度和范围,特别是保护最终用户数据。所有数据都保留在私有本地场所,只有加密的人工智能模型才会自动异步聚合。因此,我们为人工智能隐私困境提供了解决方案,并弥合了隐私与便利之间经常存在的差距。例如,想象一下,语音助手可以直接在设备级别学习新单词,并与所有其他实例共享这些知识,而无需集中记录和收集您的语音输入。或者,考虑一下搜索引擎,它学会了个性化搜索结果,而不集中收集您通常敏感的搜索查询……今天有成千上万的此类用例仍然以隐私为代价。我们认为情况不应该如此,我们希望提供一种替代方案来克服这种困境。
具体来说,我们为开发者提供:
我们的联邦学习框架不仅仅是机器学习框架。相反,它支持可能发生在异构设备上并且用例涉及许多此类设备的机器学习联合。
因此,编写该框架的编程语言应该为我们提供以下方面的强有力支持:
Rust 是满足这些要求的现代编程语言中极少数的选择之一:
生锈 1.51.0
有几种不同的方式来运行后端:通过 docker,或者将其部署到 Kubernetes 集群,或者手动编译代码并运行二进制文件。
docker
和docker-compose
)和/或工作设置(如果您决定编译 Rust 代码并手动运行二进制文件)已有了解。笔记:
在 Xaynet v0.11
中,协调器需要连接到 Redis 实例才能保存其状态。
不要将协调器连接到生产中使用的 Redis 实例!
我们建议将协调器连接到其自己的 Redis 实例。我们投入了大量的时间来确保协调器只删除自己的数据,但在当前的开发状态下,我们不能保证情况永远如此。
使用 docker 设置的便利之处在于,无需在系统上设置工作 Rust 环境,因为一切都在容器内完成。
Docker Hub 上提供了最新版本的 Docker 映像。
您可以通过运行以下命令使用默认的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 集群,请使用位于k8s/coordinator
文件夹内的清单。清单依赖于kustomize
生成( kustomize
自 v1.14 起正式受kubectl
支持)。我们建议您彻底检查清单并根据您自己的设置(命名空间、入口等)进行调整。
请记住还要检查(并在必要时调整)协调器的默认配置,可在k8s/coordinator/development/config.toml
中找到。
请调整k8s/coordinator/development/ingress.yaml
文件中使用的域,使其符合您的需求(您也可以完全跳过ingress
,只需确保从k8s/coordinator/development/kustomization.yaml
中删除其引用即可)。
请记住, k8s/coordinator/development/ingress.yaml
上显示的ingress
配置依赖于此存储库中不可用的资源,因为它们具有敏感性(例如 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/ 下找到。它使用虚拟模型,但具有网络功能,因此它是检查与协调器的连接性的良好起点。
test-drive
确保您有一个正在运行的协调器实例,并且您将使用以下命令生成的客户端能够通过网络访问它。
以下是如何启动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 下随附的入门指南。
如果您在运行该项目时遇到任何困难,请通过提出问题并描述您的设置和您面临的问题来与我们联系。