Quickstart with Docker¶
Ce démarrage rapide vise à vous guider dans le processus de conteneurisation d’un projet Flower et de l’exécution de bout en bout à l’aide de Docker sur votre machine locale.
Ce tutoriel ne utilise pas les paramètres prêts pour la production, afin que vous puissiez vous concentrer sur la compréhension du flux de travail de base qui utilise les configurations minimales.
Prérequis¶
Avant de commencer, assurez-vous que :
Le
flwrCLI est installed localement.Le daemon Docker est en cours d’exécution.
Étape 1 : Configuration¶
Créez un nouveau projet Flower (PyTorch) :
$ flwr new @flwrlabs/quickstart-pytorch 🔗 Requesting download link for @flwrlabs/quickstart-pytorch... 🔽 Downloading ZIP into memory... 📦 Unpacking into /Users/alice/quickstart-pytorch... 🎊 Flower App creation successful. To run your Flower App, first install its dependencies: cd quickstart-pytorch && pip install -e . then, run the app: flwr run . 💡 Check the README in your app directory to learn how to customize it and how to run it using the Deployment Runtime. $ cd quickstart-pytorch
Créez un nouveau réseau de pont appelé
flwr-network:$ docker network create --driver bridge flwr-network
Les réseaux définis par l’utilisateur, tels que
flwr-network, permettent la résolution IP des noms de conteneur, une fonctionnalité absente dans le réseau de pont par défaut. Cela simplifie l’exemple rapide en évitant la nécessité de déterminer d’abord l’adresse IP hôte.
Étape 2 : Démarrer SuperLink¶
Ouvrez votre terminal et exécutez :
$ docker run --rm \
-p 9091:9091 -p 9092:9092 -p 9093:9093 \
--network flwr-network \
--name superlink \
--detach \
flwr/superlink:1.31.0 \
--insecure \
--isolation \
process
Comprendre la commande
docker run: Cela dit à Docker de lancer un conteneur à partir d’une image.--rm: Supprimez le conteneur une fois qu’il est arrêté ou que la commande s’est terminée.-p 9091:9091 -p 9092:9092 -p 9093:9093: Cartographiez les ports9091,9092et9093du conteneur vers le même port de la machine hôte, permettant à d’autres services d’accéder au SuperAppIO API surhttp://localhost:9091, la flotte API surhttp://localhost:9092et le Contrôle API surhttp://localhost:9093:--network flwr-network: Faites en sorte que le conteneur rejoigne le réseau nomméflwr-network:--name superlink: Attribuez au conteneur le nomsuperlink:--detach: Exécutez le conteneur en arrière-plan, libérant la console.flwr/superlink:|stable_flwr_version|: nom de l’image à exécuter et tag spécifique de l’image. Le tag|stable_flwr_version|représente une version spécifique de l’image.--insecure: Ce drapeau indique au conteneur qu’il doit fonctionner dans un mode non sécurisé, permettant une communication non chiffrée.--isolation process: Indique à SuperLink que ServerApp est exécuté par un processus indépendant. Le SuperLink ne tente pas d’exécuter cela. Vous pouvez en savoir plus sur les différents modes de processus ici : Exécuter ServerApp ou ClientApp en tant que Sous-Processus:
Étape 3 : Démarrer les SuperNodes¶
Démarrer deux conteneurs SuperNode.
Démarrer le premier conteneur :
$ docker run --rm \ -p 9094:9094 \ --network flwr-network \ --name supernode-1 \ --detach \ flwr/supernode:1.31.0 \ --insecure \ --superlink superlink:9092 \ --node-config "partition-id=0 num-partitions=2" \ --clientappio-api-address 0.0.0.0:9094 \ --isolation process
Comprendre la commande
docker run: Cela dit à Docker de lancer un conteneur à partir d’une image.--rm: Supprimez le conteneur une fois qu’il est arrêté ou que la commande s’est terminée.-p 9094:9094: Cartographiez le port9094du conteneur vers le même port de la machine hôte, permettant à d’autres services d’accéder au SuperNode API surhttp://localhost:9094:--network flwr-network: Faites en sorte que le conteneur rejoigne le réseau nomméflwr-network:--name supernode-1: Attribuez au conteneur le nomsupernode-1:--detach: Exécutez le conteneur en arrière-plan, libérant la console.flwr/supernode:|stable_flwr_version|: nom de l’image à exécuter et tag spécifique de l’image.--insecure: Ce drapeau indique au conteneur qu’il doit fonctionner dans un mode non sécurisé, permettant une communication non chiffrée.--superlink superlink:9092: Connectez-vous à l’API Fleet de SuperLink à l’adressesuperlink:9092.--node-config "partition-id=0 num-partitions=2": Fixez l’ID de partition à0et le nombre de partitions à2pour la configuration du SuperNode.--clientappio-api-address 0.0.0.0:9094: Définissez l’adresse et le numéro de port que SuperNode écoute pour communiquer avec le processus ClientApp. Si plusieurs SuperNodes sont démarrés sur la même machine, utilisez un numéro de port différent pour chaque SuperNode. (Par exemple, dans l’étape suivante, nous définissons le deuxième conteneur SuperNode pour écouter sur le port 9095)--isolation process: Indique à SuperNode que ClientApp est exécuté par un processus indépendant. Le SuperNode ne tente pas d’exécuter cela.
Démarrer le deuxième conteneur :
$ docker run --rm \ -p 9095:9095 \ --network flwr-network \ --name supernode-2 \ --detach \ flwr/supernode:1.31.0 \ --insecure \ --superlink superlink:9092 \ --node-config "partition-id=1 num-partitions=2" \ --clientappio-api-address 0.0.0.0:9095 \ --isolation process
Étape 4 : Démarrer SuperExec pour exécuter les ServerApps¶
Le image SuperExec de conteneur vient avec une version pré-installée de Flower et sert de base pour construire votre propre image. Utilisez une seule image et sélectionnez le comportement souhaité (ServerApps vs ClientApps) au moment de l’exécution via le drapeau --plugin-type. SuperExec démarre les processus correspondants à la demande.
Lorsque vous utilisez SuperExec avec le plugin serverapp, passez --appio-api-address pointant vers l’API ServerAppIO de SuperLink.
Créez un fichier Docker appelé
superexec.Dockerfileet collez-y le suivant :superexec.Dockerfile¶FROM flwr/superexec:1.31.0 WORKDIR /app COPY pyproject.toml . RUN sed -i 's/.*flwr\[simulation\].*//' pyproject.toml \ && python -m pip install -U --no-cache-dir . ENTRYPOINT ["flower-superexec"]
Comprenez le fichier Dockerfile
FROM flwr/superexec:|stable_flwr_version|: cette ligne indique que l’image Docker utilisée comme base est l’imageflwr/superexec, version|stable_flwr_version|.WORKDIR /app: Définissez le répertoire de travail pour le conteneur sur/app. Toute commande ultérieure qui référence un répertoire sera relative à ce répertoire.COPY pyproject.toml .: Copiez le fichierpyproject.toml. from le répertoire courant dans le répertoire/appdu conteneur.RUN sed -i 's/.*flwr\[simulation\].*//' pyproject.toml: Supprimez la dépendanceflwrdupyproject.toml.python -m pip install -U --no-cache-dir .: Exécutez la commande d’installationpippour installer les dépendances définies dans le fichierpyproject.toml.Le drapeau
-Uindique que tout paquet existant doit être mis à jour, et--no-cache-dirempêche pip d’utiliser la cache pour accélérer l’installation.ENTRYPOINT ["flower-superexec"]: Fixez la commandeflower-superexeccomme commande par défaut à exécuter lorsqu’on démarrage le conteneur.
Important
Notez que flwr est déjà installé dans l’image de base
flwr/superexec, donc seuls les autres dépendances de paquets telles queflwr-datasets,torch, etc. doivent être installées. En conséquence, la dépendanceflwrdu paquet est supprimée de l’imagepyproject.tomlaprès qu’elle a été copiée dans l’image Docker (voir ligne 5).Après cela, dans le répertoire qui contient le fichier Dockerfile, exécutez cette commande Docker pour construire l’image SuperExec :
$ docker build -f superexec.Dockerfile -t flwr_superexec:0.0.1 .
Démarrer le SuperExec pour les ServerApps conteneur :
$ docker run --rm \ --network flwr-network \ --name superexec-serverapp \ --detach \ flwr_superexec:0.0.1 \ --insecure \ --plugin-type serverapp \ --appio-api-address superlink:9091
Comprendre la commande
docker run: Cela dit à Docker de lancer un conteneur à partir d’une image.--rm: Supprimez le conteneur une fois qu’il est arrêté ou que la commande s’est terminée.--network flwr-network: Faites en sorte que le conteneur rejoigne le réseau nomméflwr-network:--name superexec-serverapp: Attribuez au conteneur un nom descriptif.--detach: Exécutez le conteneur en arrière-plan, libérant la console.flwr_superexec:0.0.1: C’est le nom de l’image à exécuter et la balise spécifique de l’image.--insecure: Cette étiquette indique au conteneur de fonctionner en mode non sécurisé, permettant la communication non chiffrée. Les connexions sécurisées seront ajoutées dans les futures versions.--plugin-type serverapp: Chargez le plugin serverapp. SuperExec lancera ServerApp processus à mesure que nécessaire.--appio-api-address superlink:9091: Connectez-vous à l’API ServerAppIO de SuperLink à l’adressesuperlink:9091.
Étape 5 : Démarrer SuperExec pour exécuter les ClientApps¶
Pour les ClientApps, réutilisez l’image même et modifiez le plugin et l’adresse API. Lorsque vous utilisez le plugin clientapp, passez --appio-api-address pointant vers l’API ClientAppIO de SuperNode.
(Aucun nouveau fichier Dockerfile n’est nécessaire ; réutilisez
flwr_superexec:0.0.1)Démarrer le premier SuperExec pour les ClientApps conteneur :
$ docker run --rm \ --network flwr-network \ --name superexec-clientapp-1 \ --detach \ flwr_superexec:0.0.1 \ --insecure \ --plugin-type clientapp \ --appio-api-address supernode-1:9094
Comprendre la commande
docker run: Cela dit à Docker de lancer un conteneur à partir d’une image.--rm: Supprimez le conteneur une fois qu’il est arrêté ou que la commande s’est terminée.--network flwr-network: Faites en sorte que le conteneur rejoigne le réseau nomméflwr-network:--name superexec-clientapp-1: Donnez au conteneur un nom descriptif.--detach: Exécutez le conteneur en arrière-plan, libérant la console.flwr_superexec:0.0.1: C’est le nom de l’image à exécuter et la balise spécifique de l’image.--insecure: Cette étiquette indique au conteneur de fonctionner en mode non sécurisé, permettant la communication non chiffrée. Les connexions sécurisées seront ajoutées dans les futures versions.--plugin-type clientapp: Chargez le plugin clientapp. SuperExec lancera ClientApp processus à mesure que nécessaire.--appio-api-address supernode-1:9094: Connectez-vous à l’API ClientAppIO de SuperNode à l’adressesupernode-1:9094.
Démarrer le deuxième SuperExec pour les ClientApps conteneur :
$ docker run --rm \ --network flwr-network \ --name superexec-clientapp-2 \ --detach \ flwr_superexec:0.0.1 \ --insecure \ --plugin-type clientapp \ --appio-api-address supernode-2:9095
Étape 6 : Exécuter le Projet Quickstart¶
Trouvez le fichier de configuration TOML Flower sur votre machine. Ce fichier est automatiquement créé pour vous lorsque vous utilisez pour la première fois un Flower CLI commande. Utilisez
flwr config listpour voir les connexions SuperLink disponibles ainsi que le chemin du fichier de configuration.$ flwr config list Flower Config file: /path/to/.flwr/config.toml SuperLink connections: supergrid local (default)
Ajoutez les lignes suivantes au
config.tomlpour ajouter une nouvelle connexion SuperLink:config.toml¶[superlink.local-deployment] address = "127.0.0.1:9093" insecure = true
Exécutez le projet
quickstart-pytorchet suivez les journaux ServerApp pour suivre l’exécution de l’exécution:$ flwr run . local-deployment --stream
Étape 7 : Mettre à jour l’Application¶
Modifiez le code de l’application. Par exemple, changez la valeur
seeddanspytorchexample/task.pyen43et sauvegardez-le:pytorchexample/task.py¶# ... partition_train_test = partition.train_test_split(test_size=0.2, seed=43) # ...
Arrêter les conteneurs en cours :
Note
Si vous avez modifié les dépendances listées dans votre fichier
pyproject.toml, il est essentiel de reconstruire les images.Si vous n’avez pas apporté de modifications, vous pouvez sauter les étapes 2 à 4.
$ docker stop $(docker ps -a -q --filter ancestor=flwr_superexec:0.0.1)
Reconstruire l’image SuperExec :
$ docker build -f superexec.Dockerfile -t flwr_superexec:0.0.1 .
Lancer un conteneur SuperExec pour la nouvelle ServerApp et deux conteneurs SuperExec pour les nouvelles ClientApps :
$ docker run --rm \ --network flwr-network \ --name superexec-serverapp \ --detach \ flwr_superexec:0.0.1 \ --insecure \ --plugin-type serverapp \ --appio-api-address superlink:9091 $ docker run --rm \ --network flwr-network \ --name superexec-clientapp-1 \ --detach \ flwr_superexec:0.0.1 \ --insecure \ --plugin-type clientapp \ --appio-api-address supernode-1:9094 $ docker run --rm \ --network flwr-network \ --name superexec-clientapp-2 \ --detach \ flwr_superexec:0.0.1 \ --insecure \ --plugin-type clientapp \ --appio-api-address supernode-2:9095
Lancer le projet mis à jour :
$ flwr run . local-deployment --stream
Étape 8 : Nettoyage¶
Supprimer les conteneurs et le réseau de pont :
$ docker stop $(docker ps -a -q --filter ancestor=flwr_superexec:0.0.1) \
supernode-1 \
supernode-2 \
superlink
$ docker network rm flwr-network