¿Quiere un marco que admita el aprendizaje federado en el borde, en navegadores de escritorio, se integre bien con aplicaciones móviles, sea eficaz y preserve la privacidad? ¡Bienvenido a XayNet, escrito íntegramente en Rust!
Ya existen marcos para el aprendizaje automático, incluidos aquellos expresamente para el aprendizaje federado. Estos marcos generalmente facilitan el aprendizaje federado de casos de uso entre silos, por ejemplo, en el aprendizaje colaborativo en un número limitado de hospitales o, por ejemplo, en varios bancos que trabajan en un caso de uso común sin la necesidad de compartir datos valiosos y confidenciales.
Este repositorio se centra en el aprendizaje federado enmascarado entre dispositivos para permitir la orquestación del aprendizaje automático en millones de dispositivos de bajo consumo, como teléfonos inteligentes o incluso automóviles. Al hacer esto, esperamos también aumentar el ritmo y el alcance de la adopción del aprendizaje federado en la práctica y, especialmente, permitir la protección de los datos del usuario final. Todos los datos permanecen en instalaciones locales privadas, por lo que solo los modelos de IA cifrados se agregan de forma automática y asincrónica. Por lo tanto, brindamos una solución al dilema de la privacidad de la IA y cerramos la brecha que a menudo existe entre privacidad y conveniencia. Imagine, por ejemplo, un asistente de voz que aprenda nuevas palabras directamente a nivel del dispositivo y comparta este conocimiento con todas las demás instancias, sin grabar ni recopilar su entrada de voz de forma centralizada. O piense en un motor de búsqueda que aprende a personalizar los resultados de búsqueda sin recopilar de forma centralizada sus consultas de búsqueda, a menudo sensibles... Hay miles de casos de uso de este tipo que hoy en día todavía intercambian privacidad por conveniencia. Creemos que este no debería ser el caso y queremos brindar una alternativa para superar este dilema.
En concreto, proporcionamos a los desarrolladores:
Nuestro marco para el aprendizaje federado no es solo un marco para el aprendizaje automático como tal. Más bien, apoya la federación del aprendizaje automático que tiene lugar en dispositivos posiblemente heterogéneos y donde los casos de uso involucran muchos de esos dispositivos.
Por lo tanto, el lenguaje de programación en el que está escrito este marco debería brindarnos un fuerte soporte para lo siguiente:
Rust es una de las pocas opciones de lenguajes de programación modernos que cumple con estos requisitos:
oxidado 1.51.0
Hay algunas formas diferentes de ejecutar el backend: a través de Docker, implementándolo en un clúster de Kubernetes o compilando el código y ejecutando el binario manualmente.
docker
y docker-compose
) y/o una configuración funcional (si decide compilar el código Rust y ejecutar el binario manualmente).Nota:
Con Xaynet v0.11
el coordinador necesita una conexión a una instancia de redis para poder guardar su estado.
¡No conecte el coordinador a una instancia de Redis que se utilice en producción!
Recomendamos conectar el coordinador a su propia instancia de Redis. Hemos invertido mucho tiempo para asegurarnos de que el coordinador solo elimine sus propios datos, pero en el estado actual de desarrollo, no podemos garantizar que este será siempre el caso.
La conveniencia de usar la configuración de la ventana acoplable es que no es necesario configurar un entorno Rust que funcione en su sistema, ya que todo se hace dentro del contenedor.
Las imágenes de Docker de las últimas versiones se proporcionan en Docker Hub.
Puedes probarlos con las configs/docker-dev.toml
ejecutando:
Xaynet por debajo 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
La imagen de la ventana acoplable contiene una versión de lanzamiento del coordinador sin funciones opcionales.
Inicie el coordinador apuntando al archivo docker/docker-compose.yml
. Activa toda la infraestructura que es esencial para ejecutar el coordinador con funciones predeterminadas u opcionales. Tenga en cuenta que este archivo se utiliza únicamente para desarrollo.
docker-compose -f docker/docker-compose.yml up --build
Si lo desea, puede crear una versión optimizada del coordinador, pero tenga en cuenta que la compilación será más lenta.
docker build --build-arg RELEASE_BUILD=1 -f ./docker/Dockerfile .
Las características opcionales se pueden especificar mediante el argumento de compilación COORDINATOR_FEATURES
.
docker build --build-arg COORDINATOR_FEATURES=tls,metrics -f ./docker/Dockerfile .
Para implementar una instancia del coordinador en su clúster de Kubernetes, utilice los manifiestos que se encuentran dentro de la carpeta k8s/coordinator
. Los manifiestos dependen de kustomize
para ser generados ( kustomize
es oficialmente compatible con kubectl
desde v1.14). Le recomendamos que revise detenidamente los manifiestos y los ajuste según su propia configuración (espacio de nombres, ingreso, etc.).
Recuerde verificar también (y ajustar si es necesario) la configuración predeterminada para el coordinador, disponible en k8s/coordinator/development/config.toml
.
Ajuste el dominio utilizado en el archivo k8s/coordinator/development/ingress.yaml
para que se ajuste a sus necesidades (también puede omitir ingress
por completo, solo asegúrese de eliminar su referencia de k8s/coordinator/development/kustomization.yaml
).
Tenga en cuenta que la configuración ingress
que se muestra en k8s/coordinator/development/ingress.yaml
depende de recursos que no están disponibles en este repositorio, debido a su naturaleza confidencial (clave TLS y certificado, por ejemplo).
Para verificar los manifiestos generados, ejecute:
kubectl kustomize k8s/coordinator/development
Para aplicarlos:
kubectl apply -k k8s/coordinator/development
En caso de que no esté exponiendo a su coordinador a través de ingress
, aún puede comunicarse con él mediante un reenvío de puerto. El siguiente ejemplo crea un reenvío de puerto en el puerto 8081
suponiendo que el pod coordinador todavía usa la etiqueta app=coordinator
:
kubectl port-forward $( kubectl get pods -l " app=coordinator " -o jsonpath= " {.items[0].metadata.name} " ) 8081
El coordinador sin funciones opcionales se puede crear e iniciar con:
cd rust
cargo run --bin coordinator -- -c ../configs/config.toml
El ejemplo se puede encontrar en Rust/examples/. Utiliza un modelo ficticio pero tiene capacidad de red, por lo que es un buen punto de partida para comprobar la conectividad con el coordinador.
test-drive
Asegúrese de tener una instancia en ejecución del coordinador y que los clientes que generará con el siguiente comando puedan acceder a ella a través de la red.
A continuación se muestra un ejemplo de cómo iniciar 20
participantes que se conectarán a un coordinador que se ejecuta en 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 obtener detalles más detallados sobre cómo ejecutar ejemplos, consulte la guía de introducción adjunta en rust/xaynet-server/src/examples.rs.
Si tiene alguna dificultad para ejecutar el proyecto, comuníquese con nosotros abriendo un problema y describiendo su configuración y los problemas que enfrenta.