Quer uma estrutura que ofereça suporte ao aprendizado federado no limite, em navegadores de desktop, que se integre bem a aplicativos móveis, tenha bom desempenho e preserve a privacidade? Bem-vindo ao XayNet, escrito inteiramente em Rust!
Já existem estruturas para aprendizado de máquina – incluindo aquelas expressamente para aprendizado federado. Estas estruturas normalmente facilitam a aprendizagem federada de casos de utilização entre silos - por exemplo, na aprendizagem colaborativa num número limitado de hospitais ou, por exemplo, em vários bancos que trabalham num caso de utilização comum, sem a necessidade de partilhar dados valiosos e sensíveis.
Este repositório se concentra no aprendizado federado mascarado entre dispositivos para permitir a orquestração do aprendizado de máquina em milhões de dispositivos de ponta de baixo consumo de energia, como smartphones ou até carros. Ao fazer isto, esperamos também aumentar o ritmo e o alcance da adoção da aprendizagem federada na prática e, especialmente, permitir a proteção dos dados do utilizador final. Todos os dados permanecem em instalações locais privadas, onde apenas modelos de IA criptografados são agregados de forma automática e assíncrona. Assim, fornecemos uma solução para o dilema da privacidade da IA e preenchemos a lacuna frequentemente existente entre privacidade e conveniência. Imagine, por exemplo, um assistente de voz para aprender novas palavras diretamente no dispositivo e compartilhar esse conhecimento com todas as outras instâncias, sem gravar e coletar centralmente sua entrada de voz. Ou pense em um mecanismo de pesquisa que aprende a personalizar os resultados da pesquisa sem coletar centralmente suas consultas de pesquisa, muitas vezes confidenciais... Existem milhares de casos de uso que ainda hoje trocam privacidade por conveniência. Achamos que não deveria ser assim e queremos oferecer uma alternativa para superar esse dilema.
Concretamente, oferecemos aos desenvolvedores:
Nossa estrutura para aprendizado federado não é apenas uma estrutura para aprendizado de máquina como tal. Em vez disso, apoia a federação de aprendizagem automática que ocorre em dispositivos possivelmente heterogéneos e onde os casos de utilização envolvem muitos desses dispositivos.
A linguagem de programação na qual esta estrutura está escrita deve, portanto, dar-nos um forte apoio para o seguinte:
Rust é uma das poucas opções de linguagens de programação modernas que atende a estes requisitos:
ferrugem 1.51.0
Existem algumas maneiras diferentes de executar o back-end: via docker, implantando-o em um cluster Kubernetes ou compilando o código e executando o binário manualmente.
docker
e docker-compose
) e/ou uma configuração funcional (se você decidir compilar o código Rust e executar o binário manualmente).Observação:
Com o Xaynet v0.11
o coordenador precisa de uma conexão com uma instância redis para salvar seu estado.
Não conecte o coordenador a uma instância do Redis usada na produção!
Recomendamos conectar o coordenador à sua própria instância do Redis. Investimos muito tempo para garantir que o coordenador exclua apenas os seus próprios dados, mas no atual estado de desenvolvimento, não podemos garantir que será sempre assim.
A conveniência de usar a configuração do docker é que não há necessidade de configurar um ambiente Rust funcional em seu sistema, pois tudo é feito dentro do contêiner.
Imagens Docker dos lançamentos mais recentes são fornecidas no Docker Hub.
Você pode testá-los com o padrão configs/docker-dev.toml
executando:
Xaynet abaixo de 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
A imagem docker contém uma versão do coordenador sem recursos opcionais.
Inicie o coordenador apontando para o arquivo docker/docker-compose.yml
. Ele ativa toda a infraestrutura essencial para operar o coordenador com recursos padrão ou opcionais. Lembre-se de que este arquivo é usado apenas para desenvolvimento.
docker-compose -f docker/docker-compose.yml up --build
Se desejar, você pode criar uma versão otimizada do coordenador, mas lembre-se de que a compilação será mais lenta.
docker build --build-arg RELEASE_BUILD=1 -f ./docker/Dockerfile .
Recursos opcionais podem ser especificados por meio do argumento de construção COORDINATOR_FEATURES
.
docker build --build-arg COORDINATOR_FEATURES=tls,metrics -f ./docker/Dockerfile .
Para implementar uma instância do coordenador em seu cluster Kubernetes, use os manifestos localizados dentro da pasta k8s/coordinator
. Os manifestos dependem do kustomize
para serem gerados ( kustomize
é oficialmente suportado pelo kubectl
desde a v1.14). Recomendamos que você analise minuciosamente os manifestos e os ajuste de acordo com sua própria configuração (namespace, entrada, etc.).
Lembre-se também de verificar (e ajustar se necessário) a configuração padrão do coordenador, disponível em k8s/coordinator/development/config.toml
.
Ajuste o domínio usado no arquivo k8s/coordinator/development/ingress.yaml
para que corresponda às suas necessidades (você também pode ignorar completamente ingress
, apenas certifique-se de remover sua referência de k8s/coordinator/development/kustomization.yaml
).
Tenha em mente que a configuração ingress
mostrada em k8s/coordinator/development/ingress.yaml
depende de recursos que não estão disponíveis neste repositório, devido à sua natureza sensível (chave TLS e certificado, por exemplo).
Para verificar os manifestos gerados, execute:
kubectl kustomize k8s/coordinator/development
Para aplicá-los:
kubectl apply -k k8s/coordinator/development
Caso você não esteja expondo seu coordenador via ingress
, você ainda pode acessá-lo usando um port-forward. O exemplo abaixo cria um encaminhamento de porta na porta 8081
assumindo que o pod coordenador ainda está usando o rótulo app=coordinator
:
kubectl port-forward $( kubectl get pods -l " app=coordinator " -o jsonpath= " {.items[0].metadata.name} " ) 8081
O coordenador sem recursos opcionais pode ser construído e iniciado com:
cd rust
cargo run --bin coordinator -- -c ../configs/config.toml
O exemplo pode ser encontrado em ferrugem/exemplos/. Ele usa um modelo fictício, mas é compatível com rede, portanto é um bom ponto de partida para verificar a conectividade com o coordenador.
test-drive
Certifique-se de ter uma instância do coordenador em execução e de que os clientes que você irá gerar com o comando abaixo sejam capazes de acessá-lo através da rede.
Aqui está um exemplo de como iniciar 20
participantes que se conectarão a um coordenador rodando em 127.0.0.1:8081
:
cd rust
RUST_LOG=info cargo run --example test-drive -- -n 20 -u http://127.0.0.1:8081
Para obter detalhes mais detalhados sobre como executar exemplos, consulte o guia de primeiros passos em ferrugem/xaynet-server/src/examples.rs.
Se você tiver alguma dificuldade para executar o projeto, entre em contato conosco abrindo um problema e descrevendo sua configuração e os problemas que você está enfrentando.