Möchten Sie ein Framework, das föderiertes Lernen am Edge in Desktop-Browsern unterstützt, sich gut in mobile Apps integrieren lässt, leistungsstark ist und die Privatsphäre schützt? Willkommen bei XayNet, komplett in Rust geschrieben!
Es gibt bereits Frameworks für maschinelles Lernen – einschließlich solcher, die ausdrücklich für föderiertes Lernen vorgesehen sind. Diese Frameworks erleichtern in der Regel das gemeinsame Lernen siloübergreifender Anwendungsfälle – beispielsweise beim kollaborativen Lernen in einer begrenzten Anzahl von Krankenhäusern oder beispielsweise in mehreren Banken, die an einem gemeinsamen Anwendungsfall arbeiten, ohne dass wertvolle und sensible Daten ausgetauscht werden müssen.
Dieses Repository konzentriert sich auf maskiertes geräteübergreifendes Verbundlernen, um die Orchestrierung von maschinellem Lernen in Millionen von Edge-Geräten mit geringem Stromverbrauch wie Smartphones oder sogar Autos zu ermöglichen. Dadurch hoffen wir, auch das Tempo und den Umfang der Einführung des föderierten Lernens in der Praxis zu erhöhen und insbesondere den Schutz der Endbenutzerdaten zu ermöglichen. Alle Daten verbleiben in privaten lokalen Räumlichkeiten, wobei nur verschlüsselte KI-Modelle automatisch und asynchron aggregiert werden. Damit bieten wir eine Lösung für das KI-Datenschutzdilemma und schließen die oft bestehende Lücke zwischen Datenschutz und Komfort. Stellen Sie sich zum Beispiel einen Sprachassistenten vor, der neue Wörter direkt auf Geräteebene lernt und dieses Wissen mit allen anderen Instanzen teilt, ohne Ihre Spracheingaben zentral aufzuzeichnen und zu sammeln. Oder denken Sie an eine Suchmaschine, die lernt, Suchergebnisse zu personalisieren, ohne Ihre oft sensiblen Suchanfragen zentral zu sammeln … Es gibt Tausende solcher Anwendungsfälle, bei denen auch heute noch Datenschutz gegen Komfort eingetauscht wird. Wir sind der Meinung, dass dies nicht der Fall sein sollte und möchten eine Alternative zur Überwindung dieses Dilemmas bieten.
Konkret bieten wir Entwicklern:
Unser Framework für föderiertes Lernen ist nicht nur ein Framework für maschinelles Lernen als solches. Vielmehr unterstützt es die Föderation des maschinellen Lernens, das auf möglicherweise heterogenen Geräten stattfindet und bei denen Anwendungsfälle viele solcher Geräte umfassen.
Die Programmiersprache, in der dieses Framework geschrieben ist, sollte uns daher Folgendes stark unterstützen:
Rust ist eine der wenigen modernen Programmiersprachen, die diese Anforderungen erfüllt:
rustc 1.51.0
Es gibt verschiedene Möglichkeiten, das Backend auszuführen: über Docker oder durch Bereitstellung in einem Kubernetes-Cluster oder durch manuelles Kompilieren des Codes und Ausführen der Binärdatei.
docker
und docker-compose
) und/oder über ein funktionierendes Setup verfügen (wenn Sie sich entscheiden, den Rust-Code zu kompilieren und die Binärdatei manuell auszuführen).Notiz:
Mit Xaynet v0.11
benötigt der Koordinator eine Verbindung zu einer Redis-Instanz, um seinen Status zu speichern.
Verbinden Sie den Koordinator nicht mit einer Redis-Instanz, die in der Produktion verwendet wird!
Wir empfehlen, den Koordinator mit seiner eigenen Redis-Instanz zu verbinden. Wir haben viel Zeit investiert, um sicherzustellen, dass der Koordinator nur seine eigenen Daten löscht. Beim aktuellen Stand der Entwicklung können wir jedoch nicht garantieren, dass dies immer der Fall sein wird.
Der Vorteil der Verwendung des Docker-Setups besteht darin, dass Sie keine funktionierende Rust-Umgebung auf Ihrem System einrichten müssen, da alles innerhalb des Containers erledigt wird.
Docker-Images der neuesten Versionen werden auf Docker Hub bereitgestellt.
Sie können sie mit der Standardkonfiguration configs/docker-dev.toml
ausprobieren, indem Sie Folgendes ausführen:
Xaynet unter 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
Das Docker-Image enthält einen Release-Build des Koordinators ohne optionale Funktionen.
Starten Sie den Koordinator, indem Sie auf die Datei docker/docker-compose.yml
verweisen. Es baut die gesamte Infrastruktur auf, die für den Betrieb des Koordinators mit Standard- oder optionalen Funktionen erforderlich ist. Beachten Sie, dass diese Datei nur für die Entwicklung verwendet wird.
docker-compose -f docker/docker-compose.yml up --build
Wenn Sie möchten, können Sie einen optimierten Release-Build des Koordinators erstellen. Beachten Sie jedoch, dass die Kompilierung langsamer ist.
docker build --build-arg RELEASE_BUILD=1 -f ./docker/Dockerfile .
Optionale Features können über das Build-Argument COORDINATOR_FEATURES
angegeben werden.
docker build --build-arg COORDINATOR_FEATURES=tls,metrics -f ./docker/Dockerfile .
Um eine Instanz des Koordinators in Ihrem Kubernetes-Cluster bereitzustellen, verwenden Sie die Manifeste, die sich im Ordner k8s/coordinator
befinden. Die Manifeste basieren auf der Generierung von kustomize
( kustomize
wird seit Version 1.14 offiziell von kubectl
unterstützt). Wir empfehlen Ihnen, die Manifeste gründlich durchzugehen und sie entsprechend Ihrem eigenen Setup (Namespace, Ingress usw.) anzupassen.
Denken Sie daran, auch die Standardkonfiguration für den Koordinator zu überprüfen (und gegebenenfalls anzupassen), verfügbar unter k8s/coordinator/development/config.toml
.
Bitte passen Sie die in der Datei k8s/coordinator/development/ingress.yaml
verwendete Domäne an, damit sie Ihren Anforderungen entspricht (Sie können ingress
auch ganz überspringen, stellen Sie jedoch sicher, dass Sie den Verweis aus k8s/coordinator/development/kustomization.yaml
entfernen).
Beachten Sie, dass die in k8s/coordinator/development/ingress.yaml
angezeigte ingress
Konfiguration aufgrund ihrer sensiblen Natur (z. B. TLS-Schlüssel und -Zertifikat) auf Ressourcen basiert, die in diesem Repository nicht verfügbar sind.
Führen Sie Folgendes aus, um die generierten Manifeste zu überprüfen:
kubectl kustomize k8s/coordinator/development
Um sie anzuwenden:
kubectl apply -k k8s/coordinator/development
Falls Sie Ihren Koordinator nicht über ingress
verfügbar machen, können Sie ihn dennoch über eine Portweiterleitung erreichen. Das folgende Beispiel erstellt eine Portweiterleitung an Port 8081
unter der Annahme, dass der Koordinator-Pod immer noch die Bezeichnung app=coordinator
verwendet:
kubectl port-forward $( kubectl get pods -l " app=coordinator " -o jsonpath= " {.items[0].metadata.name} " ) 8081
Der Koordinator ohne optionale Funktionen kann erstellt und gestartet werden mit:
cd rust
cargo run --bin coordinator -- -c ../configs/config.toml
Das Beispiel finden Sie unter rust/examples/. Es verwendet ein Dummy-Modell, ist aber netzwerkfähig und daher ein guter Ausgangspunkt für die Überprüfung der Konnektivität mit dem Koordinator.
test-drive
Stellen Sie sicher, dass Sie über eine laufende Instanz des Koordinators verfügen und dass die Clients, die Sie mit dem folgenden Befehl erzeugen, ihn über das Netzwerk erreichen können.
Hier ist ein Beispiel, wie man 20
Teilnehmer startet, die sich mit einem Koordinator verbinden, der unter 127.0.0.1:8081
läuft:
cd rust
RUST_LOG=info cargo run --example test-drive -- -n 20 -u http://127.0.0.1:8081
Ausführlichere Informationen zum Ausführen von Beispielen finden Sie im begleitenden Leitfaden „Erste Schritte“ unter rust/xaynet-server/src/examples.rs.
Wenn Sie Schwierigkeiten bei der Ausführung des Projekts haben, wenden Sie sich bitte an uns, indem Sie ein Problem eröffnen und Ihr Setup und die Probleme, mit denen Sie konfrontiert sind, beschreiben.