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 flwr CLI est installed localement.

  • Le daemon Docker est en cours d’exécution.

Étape 1 : Configuration

  1. 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
    
  2. 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 3 : Démarrer les SuperNodes

Démarrer deux conteneurs SuperNode.

  1. 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 port 9094 du conteneur vers le même port de la machine hôte, permettant à d’autres services d’accéder au SuperNode API sur http://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 nom supernode-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’adresse superlink:9092.

    • --node-config "partition-id=0 num-partitions=2": Fixez l’ID de partition à 0 et le nombre de partitions à 2 pour 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.

  2. 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.

  1. Créez un fichier Docker appelé superexec.Dockerfile et 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’image flwr/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 fichier pyproject.toml. from le répertoire courant dans le répertoire /app du conteneur.

    • RUN sed -i 's/.*flwr\[simulation\].*//' pyproject.toml: Supprimez la dépendance flwr du pyproject.toml.

    • python -m pip install -U --no-cache-dir .: Exécutez la commande d’installation pip pour installer les dépendances définies dans le fichier pyproject.toml.

      Le drapeau -U indique que tout paquet existant doit être mis à jour, et --no-cache-dir empêche pip d’utiliser la cache pour accélérer l’installation.

    • ENTRYPOINT ["flower-superexec"]: Fixez la commande flower-superexec comme 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 que flwr-datasets, torch, etc. doivent être installées. En conséquence, la dépendance flwr du paquet est supprimée de l’image pyproject.toml après qu’elle a été copiée dans l’image Docker (voir ligne 5).

  2. 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 .
    
  3. 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’adresse superlink: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.

  1. (Aucun nouveau fichier Dockerfile n’est nécessaire ; réutilisez flwr_superexec:0.0.1)

  2. 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’adresse supernode-1:9094.

  3. 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

  1. 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 list pour 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)
    
  2. Ajoutez les lignes suivantes au config.toml pour ajouter une nouvelle connexion SuperLink:

    config.toml
    [superlink.local-deployment]
    address = "127.0.0.1:9093"
    insecure = true
    
  1. Exécutez le projet quickstart-pytorch et suivez les journaux ServerApp pour suivre l’exécution de l’exécution:

    $ flwr run . local-deployment --stream
    

Étape 7 : Mettre à jour l’Application

  1. Modifiez le code de l’application. Par exemple, changez la valeur seed dans pytorchexample/task.py en 43 et sauvegardez-le:

    pytorchexample/task.py
    # ...
    partition_train_test = partition.train_test_split(test_size=0.2, seed=43)
    # ...
    
  2. 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)
    
  3. Reconstruire l’image SuperExec :

    $ docker build -f superexec.Dockerfile -t flwr_superexec:0.0.1 .
    
  4. 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
    
  5. 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

Où aller ensuite ?