Mettez à niveau vers Flower 1.13¶
Bienvenue dans le guide de migration pour mettre à jour Flower en Flower 1.13 ! Que vous soyez un utilisateur expérimenté ou juste en train de commencer, ce guide vous aidera à passer doucement votre installation existante pour profiter des dernières fonctionnalités et améliorations de Flower 1.13.
Note
Ce guide montre comment rendre le code pré-1.13 compatible avec Flower 1.13 (et ultérieurement) avec des modifications minimales de code.
Diveons-y !
Installer la mise à jour¶
Voici comment mettre à jour une installation existante de Flower en Flower 1.13 avec pip:
$ python -m pip install -U flwr
ou si vous avez besoin de Flower 1.13 avec simulation :
$ python -m pip install -U "flwr[simulation]"
Assurez-vous d’avoir défini la contrainte de version suivante dans votre requirements.txt
# Without simulation support
flwr>=1.13,<2.0
# With simulation support
flwr[simulation]>=1.13, <2.0
ou pyproject.toml:
# Without simulation support
dependencies = [
"flwr>=1.13,2.0",
]
# With simulation support
dependencies = [
"flwr[simulation]>=1.13,2.0",
]
Changements nécessaires¶
Depuis Flower 1.8, les couches d’infrastructure et d’application ont été découpées. Flower 1.13 impose cette séparation plus loin. Parmi d’autres choses, cela permet de lancer le même code dans une simulation que dans un déploiement réel.
Au lieu de démarrer un client en code via start_client(), vous créez un ClientApp. Au lieu de démarrer un serveur en code via start_server(), vous créez un ServerApp. Les deux ClientApp et ServerApp sont démarrés par les composants longue durée du serveur et du client : le SuperLink et le SuperNode, respectivement.
Astuce
Pour plus de détails sur SuperLink et SuperNode, veuillez consulter la Flower Architecture .
Les changements non-brisants suivants nécessitent des mises à jour manuelles et vous permettent de lancer votre projet à la fois dans le mode traditionnel (maintenant obsolète) et dans le nouveau (recommandé) Flower 1.13 :
ClientApp¶
Enveloppez votre client existant avec
ClientAppau lieu de le lancer viastart_client(). Voici un exemple :
from flwr.app import Context
from flwr.client import start_client
from flwr.clientapp import ClientApp
# Flower 1.10 and later (recommended)
def client_fn(context: Context):
return FlowerClient().to_client()
app = ClientApp(client_fn=client_fn)
# # Flower 1.8 - 1.9 (deprecated, no longer supported)
# def client_fn(cid: str):
# return FlowerClient().to_client()
#
#
# app = ClientApp(client_fn=client_fn)
# Flower 1.7 (deprecated, only for backwards-compatibility)
if __name__ == "__main__":
start_client(
server_address="127.0.0.1:8080",
client=FlowerClient().to_client(),
)
ServerApp¶
Enveloppez votre stratégie existante avec
ServerAppau lieu de démarrer le serveur viastart_server(). Voici un exemple :
from flwr.app import Context
from flwr.server import ServerAppComponents, ServerConfig, start_server
from flwr.server.strategy import FedAvg
from flwr.serverapp import ServerApp
# Flower 1.10 and later (recommended)
def server_fn(context: Context):
strategy = FedAvg()
config = ServerConfig()
return ServerAppComponents(config=config, strategy=strategy)
app = ServerApp(server_fn=server_fn)
# # Flower 1.8 - 1.9 (deprecated, no longer supported)
# app = flwr.server.ServerApp(
# config=config,
# strategy=strategy,
# )
# Flower 1.7 (deprecated, only for backwards-compatibility)
if __name__ == "__main__":
start_server(
server_address="0.0.0.0:8080",
config=config,
strategy=strategy,
)
Deployment¶
Dans une fenêtre de terminal, démarrez le SuperLink en utilisant
flower-superlink. Ensuite, dans deux fenêtres de terminal supplémentaires, démarrez deux SuperNodes en utilisantflower-supernode(2x). Il n’est pas nécessaire de démarrer directementclient.pyetserver.pycomme scripts Python.Voici un exemple pour démarrer le serveur sans HTTPS (mode non sécurisé, uniquement pour la prototypage) :
Astuce
Pour une passerelle complète sur comment déployer Flower à l’aide de Docker, veuillez vous référer au guide Exécuter Flower à l’aide de Docker .
# Start a SuperLink
$ flower-superlink --insecure
# In a new terminal window, start a long-running SuperNode
$ flower-supernode \
--insecure \
--superlink 127.0.0.1:9092 \
--clientappio-api-address 127.0.0.1:9094 \
<other-args>
# In another terminal window, start another long-running SuperNode (at least 2 SuperNodes are required)
$ flower-supernode \
--insecure \
--superlink 127.0.0.1:9092 \
--clientappio-api-address 127.0.0.1:9095 \
<other-args>
Voici un autre exemple pour démarrer les SuperLink et SuperNodes avec HTTPS. Utilisez les options de ligne de commande
--ssl-ca-certfile,--ssl-certfile, et--ssl-keyfilepour passer des chemins à (certificat CA, certificat serveur, et clé privée serveur).
# Start a secure SuperLink
$ flower-superlink \
--ssl-ca-certfile <your-ca-cert-filepath> \
--ssl-certfile <your-server-cert-filepath> \
--ssl-keyfile <your-privatekey-filepath>
# In a new terminal window, start a long-running SuperNode
$ flower-supernode \
--superlink 127.0.0.1:9092 \
--clientappio-api-address 127.0.0.1:9094 \
--root-certificates <your-ca-cert-filepath> \
<other-args>
# In another terminal window, start another long-running SuperNode (at least 2 SuperNodes are required)
$ flower-supernode \
--superlink 127.0.0.1:9092 \
--clientappio-api-address 127.0.0.1:9095 \
--root-certificates <your-ca-cert-filepath> \
<other-args>
Simulation (CLI)¶
Enveloppez votre client existant et stratégie avec ClientApp et ServerApp, respectivement. Il n’est plus nécessaire d’utiliser start_simulation(). Voici un exemple :
Astuce
Pour une passerelle complète sur comment configurer et lancer les simulations Flower, veuillez lire le guide How-to Run Simulations .
from flwr.app import Context
from flwr.clientapp import ClientApp
from flwr.server import ServerAppComponents, ServerConfig
from flwr.server.strategy import FedAvg
from flwr.serverapp import ServerApp
from flwr.simulation import start_simulation
# Regular Flower client implementation
class FlowerClient(NumPyClient):
# ...
pass
# Flower 1.10 and later (recommended)
def client_fn(context: Context):
return FlowerClient().to_client()
app = ClientApp(client_fn=client_fn)
def server_fn(context: Context):
strategy = FedAvg(...)
config = ServerConfig(...)
return ServerAppComponents(strategy=strategy, config=config)
server_app = ServerApp(server_fn=server_fn)
# # Flower 1.8 - 1.9 (deprecated, no longer supported)
# def client_fn(cid: str):
# return FlowerClient().to_client()
#
#
# client_app = ClientApp(client_fn=client_fn)
#
#
# server_app = ServerApp(
# config=config,
# strategy=strategy,
# )
# Flower 1.7 (deprecated, only for backwards-compatibility)
if __name__ == "__main__":
hist = start_simulation(
num_clients=10,
# ...
)
En fonction de votre version de Flower, vous pouvez lancer votre simulation comme suit :
Pour Flower 1.11 et ultérieurement, exécutez
flwr rundans la fenêtre de terminal. C’est la méthode recommandée pour lancer les simulations, les autres méthodes sont obsolètes et plus recommandées.OBSPLET Pour les versions Flower comprises entre 1.8 et 1.10, exécutez
flower-simulationdans la fenêtre de terminal et pointez vers leserver_app/client_appobjet dans le code au lieu d’exécuter le script Python. Dans l’exemple de code ci-dessous, il y a un exemple (en supposant que les objetsserver_appetclient_appsont dans un modulesim.py).DEPRECATED Pour les versions de Flower avant 1.8, exécutez directement le script Python.
# Flower 1.11 and later (recommended)
$ flwr run
# # Flower 1.8 - 1.10 (deprecated, no longer supported)
# $ flower-simulation \
# --server-app=sim:server_app \
# --client-app=sim:client_app \
# --num-supernodes=10
# Flower 1.7 (deprecated)
$ python sim.py
En fonction de votre version de Flower, vous pouvez également définir les ressources par défaut comme suit :
Pour Flower 1.11 et ultérieurement, vous pouvez éditer votre fichier
pyproject.tomlpuis exécuterflwr rundans la fenêtre de terminal comme montré dans l’exemple ci-dessous.OBSPLET Pour les versions Flower comprises entre 1.8 et 1.10, vous pouvez ajuster les ressources pour chaque
ClientAppen utilisant l’argument de ligne de commande--backend-configau lieu de définir l’argumentclient_resourcesdansstart_simulation().OBSPLET Pour les versions Flower antérieures à 1.8, vous devez exécuter
start_simulation()et passer un dictionnaire des ressources requises comme argument àclient_resources.
# Flower 1.11 and later (recommended)
# [file: pyproject.toml]
[tool.flwr.federations.local-sim-gpu]
options.num-supernodes = 10
options.backend.client-resources.num-cpus = 2
options.backend.client-resources.num-gpus = 0.25
$ flwr run
# # Flower 1.8 - 1.10 (deprecated, no longer supported)
# $ flower-simulation \
# --client-app=sim:client_app \
# --server-app=sim:server_app \
# --num-supernodes=10 \
# --backend-config='{"client_resources": {"num_cpus": 2, "num_gpus": 0.25}}'
# Flower 1.7 (in `sim.py`, deprecated)
if __name__ == "__main__":
hist = start_simulation(
num_clients=10, client_resources={"num_cpus": 2, "num_gpus": 0.25}, ...
)
Simulation (Notebook)¶
Pour lancer votre simulation à partir d’un notebook, veuillez considérer les exemples suivants en fonction de votre version de Flower :
Pour Flower 1.11 et ultérieurement, vous devez exécuter
run_simulation()dans votre bloc-notes au lieu destart_simulation().OBSPLET Pour les versions Flower comprises entre 1.8 et 1.10, vous devez exécuter
run_simulation()dans votre bloc-notes au lieu destart_simulation()et configurer les ressources.OBSPLET Pour les versions Flower antérieures à 1.8, vous devez exécuter
start_simulation()et passer un dictionnaire des ressources requises comme argument àclient_resources.
Astuce
Pour une passerelle complète sur comment configurer et lancer les simulations Flower, veuillez lire le guide How-to Run Simulations .
from flwr.app import Context
from flwr.clientapp import ClientApp
from flwr.serverapp import ServerApp
from flwr.simulation import run_simulation, start_simulation
# Flower 1.10 and later (recommended)
# Omitted: client_fn and server_fn
client_app = ClientApp(client_fn=client_fn)
server_app = ServerApp(server_fn=server_fn)
run_simulation(
server_app=server_app,
client_app=client_app,
)
# # Flower v1.8 - v1.10 (deprecated, no longer supported)
# NUM_CLIENTS = 10 # Replace by any integer greater than zero
# backend_config = {"client_resources": {"num_cpus": 2, "num_gpus": 0.25}}
#
#
# def client_fn(cid: str):
# # ...
# return FlowerClient().to_client()
#
#
# client_app = ClientApp(client_fn=client_fn)
#
# server_app = ServerApp(
# config=config,
# strategy=strategy,
# )
#
# run_simulation(
# server_app=server_app,
# client_app=client_app,
# num_supernodes=NUM_CLIENTS,
# backend_config=backend_config,
# )
# Flower v1.7 (deprecated)
NUM_CLIENTS = 10 # Replace by any integer greater than zero
backend_config = {"client_resources": {"num_cpus": 2, "num_gpus": 0.25}}
start_simulation(
client_fn=client_fn,
num_clients=NUM_CLIENTS,
config=config,
strategy=strategy,
client_resources=backend_config["client_resources"],
)
Aide supplémentaire¶
La plupart des applications officielles Flower code examples sont déjà mises à jour pour Flower 1.13 afin qu’elles puissent servir de référence pour l’utilisation de l’API Flower 1.13. Si vous avez d’autres questions, consultez la join the Flower Slack (et utilisez le canal #questions) ou postulez-les sur Flower Discuss où vous pouvez trouver la communauté qui répond et pose des questions.
Important
Puisque nous améliorons constamment Flower à un rythme rapide, nous mettrons régulièrement à jour ce guide. N’hésitez pas à partager vos commentaires avec nous !
Joyeux migrateur ! 🚀