flwr-nightly 1.9.0.dev20240507__tar.gz → 1.9.0.dev20240520__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of flwr-nightly might be problematic. Click here for more details.

Files changed (231) hide show
  1. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/PKG-INFO +2 -1
  2. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/README.md +1 -0
  3. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/pyproject.toml +1 -1
  4. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/new.py +4 -0
  5. flwr_nightly-1.9.0.dev20240520/src/py/flwr/cli/new/templates/app/code/client.hf.py.tpl +55 -0
  6. flwr_nightly-1.9.0.dev20240520/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +55 -0
  7. flwr_nightly-1.9.0.dev20240520/src/py/flwr/cli/new/templates/app/code/server.hf.py.tpl +17 -0
  8. flwr_nightly-1.9.0.dev20240520/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +12 -0
  9. flwr_nightly-1.9.0.dev20240520/src/py/flwr/cli/new/templates/app/code/task.hf.py.tpl +87 -0
  10. flwr_nightly-1.9.0.dev20240520/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +57 -0
  11. flwr_nightly-1.9.0.dev20240520/src/py/flwr/cli/new/templates/app/pyproject.hf.toml.tpl +31 -0
  12. flwr_nightly-1.9.0.dev20240520/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +28 -0
  13. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/mod/comms_mods.py +4 -4
  14. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/mod/localdp_mod.py +1 -2
  15. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/__init__.py +0 -2
  16. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/app.py +7 -1
  17. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/compat/app.py +6 -57
  18. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/driver/__init__.py +3 -2
  19. flwr_nightly-1.9.0.dev20240520/src/py/flwr/server/driver/inmemory_driver.py +181 -0
  20. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/history.py +20 -20
  21. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/server.py +11 -7
  22. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +2 -4
  23. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/dp_fixed_clipping.py +2 -4
  24. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/driver/driver_servicer.py +2 -2
  25. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +11 -3
  26. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +1 -1
  27. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/workflow/default_workflows.py +67 -22
  28. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/simulation/run_simulation.py +7 -34
  29. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/LICENSE +0 -0
  30. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/__init__.py +0 -0
  31. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/__init__.py +0 -0
  32. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/app.py +0 -0
  33. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/build.py +0 -0
  34. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/config_utils.py +0 -0
  35. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/example.py +0 -0
  36. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/__init__.py +0 -0
  37. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/__init__.py +0 -0
  38. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  39. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  40. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
  41. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  42. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  43. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  44. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  45. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  46. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  47. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  48. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  49. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  50. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  51. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  52. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  53. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  54. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  55. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  56. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  57. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  58. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  59. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  60. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  61. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/run/__init__.py +0 -0
  62. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/run/run.py +0 -0
  63. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/utils.py +0 -0
  64. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/__init__.py +0 -0
  65. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/app.py +0 -0
  66. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/client.py +0 -0
  67. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/client_app.py +0 -0
  68. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  69. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/grpc_client/__init__.py +0 -0
  70. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/grpc_client/connection.py +0 -0
  71. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  72. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  73. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
  74. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/heartbeat.py +0 -0
  75. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/message_handler/__init__.py +0 -0
  76. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/message_handler/message_handler.py +0 -0
  77. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/message_handler/task_handler.py +0 -0
  78. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/mod/__init__.py +0 -0
  79. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
  80. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  81. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  82. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  83. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/mod/utils.py +0 -0
  84. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/node_state.py +0 -0
  85. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/node_state_tests.py +0 -0
  86. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/numpy_client.py +0 -0
  87. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/rest_client/__init__.py +0 -0
  88. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/rest_client/connection.py +0 -0
  89. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/supernode/__init__.py +0 -0
  90. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/supernode/app.py +0 -0
  91. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/typing.py +0 -0
  92. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/__init__.py +0 -0
  93. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/address.py +0 -0
  94. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/constant.py +0 -0
  95. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/context.py +0 -0
  96. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/date.py +0 -0
  97. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/differential_privacy.py +0 -0
  98. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/differential_privacy_constants.py +0 -0
  99. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/dp.py +0 -0
  100. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/exit_handlers.py +0 -0
  101. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/grpc.py +0 -0
  102. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/logger.py +0 -0
  103. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/message.py +0 -0
  104. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/object_ref.py +0 -0
  105. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/parameter.py +0 -0
  106. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/pyproject.py +0 -0
  107. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/record/__init__.py +0 -0
  108. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/record/configsrecord.py +0 -0
  109. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/record/conversion_utils.py +0 -0
  110. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/record/metricsrecord.py +0 -0
  111. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/record/parametersrecord.py +0 -0
  112. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/record/recordset.py +0 -0
  113. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/record/typeddict.py +0 -0
  114. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/recordset_compat.py +0 -0
  115. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/retry_invoker.py +0 -0
  116. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
  117. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  118. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  119. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  120. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  121. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
  122. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  123. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  124. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/serde.py +0 -0
  125. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/telemetry.py +0 -0
  126. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/typing.py +0 -0
  127. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/version.py +0 -0
  128. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/__init__.py +0 -0
  129. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/driver_pb2.py +0 -0
  130. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/driver_pb2.pyi +0 -0
  131. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/driver_pb2_grpc.py +0 -0
  132. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/driver_pb2_grpc.pyi +0 -0
  133. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/error_pb2.py +0 -0
  134. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/error_pb2.pyi +0 -0
  135. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
  136. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  137. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/fleet_pb2.py +0 -0
  138. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
  139. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  140. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  141. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/node_pb2.py +0 -0
  142. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/node_pb2.pyi +0 -0
  143. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
  144. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  145. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/recordset_pb2.py +0 -0
  146. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
  147. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
  148. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
  149. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/task_pb2.py +0 -0
  150. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/task_pb2.pyi +0 -0
  151. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
  152. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
  153. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/transport_pb2.py +0 -0
  154. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/transport_pb2.pyi +0 -0
  155. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
  156. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  157. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/py.typed +0 -0
  158. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/client_manager.py +0 -0
  159. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/client_proxy.py +0 -0
  160. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/compat/__init__.py +0 -0
  161. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/compat/app_utils.py +0 -0
  162. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
  163. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/compat/legacy_context.py +0 -0
  164. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/criterion.py +0 -0
  165. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/driver/driver.py +0 -0
  166. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/driver/grpc_driver.py +0 -0
  167. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/run_serverapp.py +0 -0
  168. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/server_app.py +0 -0
  169. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/server_config.py +0 -0
  170. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/__init__.py +0 -0
  171. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/aggregate.py +0 -0
  172. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/bulyan.py +0 -0
  173. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  174. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  175. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  176. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
  177. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/fedadam.py +0 -0
  178. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/fedavg.py +0 -0
  179. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
  180. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/fedavgm.py +0 -0
  181. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/fedmedian.py +0 -0
  182. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/fedopt.py +0 -0
  183. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/fedprox.py +0 -0
  184. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  185. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  186. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  187. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  188. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/fedyogi.py +0 -0
  189. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/krum.py +0 -0
  190. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/qfedavg.py +0 -0
  191. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/strategy.py +0 -0
  192. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/__init__.py +0 -0
  193. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
  194. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/driver/driver_grpc.py +0 -0
  195. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
  196. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  197. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  198. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  199. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  200. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  201. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  202. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  203. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
  204. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  205. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  206. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  207. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  208. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  209. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  210. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  211. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/state/__init__.py +0 -0
  212. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/state/in_memory_state.py +0 -0
  213. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/state/sqlite_state.py +0 -0
  214. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/state/state.py +0 -0
  215. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/state/state_factory.py +0 -0
  216. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/state/utils.py +0 -0
  217. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/typing.py +0 -0
  218. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/utils/__init__.py +0 -0
  219. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/utils/tensorboard.py +0 -0
  220. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/utils/validator.py +0 -0
  221. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/workflow/__init__.py +0 -0
  222. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/workflow/constant.py +0 -0
  223. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  224. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  225. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  226. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/simulation/__init__.py +0 -0
  227. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/simulation/app.py +0 -0
  228. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
  229. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  230. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  231. {flwr_nightly-1.9.0.dev20240507 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.9.0.dev20240507
3
+ Version: 1.9.0.dev20240520
4
4
  Summary: Flower: A Friendly Federated Learning Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -202,6 +202,7 @@ Other [examples](https://github.com/adap/flower/tree/main/examples):
202
202
  - [Comprehensive Flower+XGBoost](https://github.com/adap/flower/tree/main/examples/xgboost-comprehensive)
203
203
  - [Flower through Docker Compose and with Grafana dashboard](https://github.com/adap/flower/tree/main/examples/flower-via-docker-compose)
204
204
  - [Flower with KaplanMeierFitter from the lifelines library](https://github.com/adap/flower/tree/main/examples/federated-kaplna-meier-fitter)
205
+ - [Sample Level Privacy with Opacus](https://github.com/adap/flower/tree/main/examples/opacus)
205
206
 
206
207
  ## Community
207
208
 
@@ -151,6 +151,7 @@ Other [examples](https://github.com/adap/flower/tree/main/examples):
151
151
  - [Comprehensive Flower+XGBoost](https://github.com/adap/flower/tree/main/examples/xgboost-comprehensive)
152
152
  - [Flower through Docker Compose and with Grafana dashboard](https://github.com/adap/flower/tree/main/examples/flower-via-docker-compose)
153
153
  - [Flower with KaplanMeierFitter from the lifelines library](https://github.com/adap/flower/tree/main/examples/federated-kaplna-meier-fitter)
154
+ - [Sample Level Privacy with Opacus](https://github.com/adap/flower/tree/main/examples/opacus)
154
155
 
155
156
  ## Community
156
157
 
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [tool.poetry]
6
6
  name = "flwr-nightly"
7
- version = "1.9.0.dev20240507"
7
+ version = "1.9.0.dev20240520"
8
8
  description = "Flower: A Friendly Federated Learning Framework"
9
9
  license = "Apache-2.0"
10
10
  authors = ["The Flower Authors <hello@flower.ai>"]
@@ -37,6 +37,8 @@ class MlFramework(str, Enum):
37
37
  NUMPY = "NumPy"
38
38
  PYTORCH = "PyTorch"
39
39
  TENSORFLOW = "TensorFlow"
40
+ JAX = "JAX"
41
+ HUGGINGFACE = "HF"
40
42
  MLX = "MLX"
41
43
  SKLEARN = "sklearn"
42
44
 
@@ -154,6 +156,8 @@ def new(
154
156
  # Depending on the framework, generate task.py file
155
157
  frameworks_with_tasks = [
156
158
  MlFramework.PYTORCH.value.lower(),
159
+ MlFramework.JAX.value.lower(),
160
+ MlFramework.HUGGINGFACE.value.lower(),
157
161
  MlFramework.MLX.value.lower(),
158
162
  MlFramework.TENSORFLOW.value.lower(),
159
163
  ]
@@ -0,0 +1,55 @@
1
+ """$project_name: A Flower / HuggingFace Transformers app."""
2
+
3
+ from flwr.client import ClientApp, NumPyClient
4
+ from transformers import AutoModelForSequenceClassification
5
+
6
+ from $import_name.task import (
7
+ get_weights,
8
+ load_data,
9
+ set_weights,
10
+ train,
11
+ test,
12
+ CHECKPOINT,
13
+ DEVICE,
14
+ )
15
+
16
+
17
+ # Flower client
18
+ class FlowerClient(NumPyClient):
19
+ def __init__(self, net, trainloader, testloader):
20
+ self.net = net
21
+ self.trainloader = trainloader
22
+ self.testloader = testloader
23
+
24
+ def get_parameters(self, config):
25
+ return get_weights(self.net)
26
+
27
+ def set_parameters(self, parameters):
28
+ set_weights(self.net, parameters)
29
+
30
+ def fit(self, parameters, config):
31
+ self.set_parameters(parameters)
32
+ train(self.net, self.trainloader, epochs=1)
33
+ return self.get_parameters(config={}), len(self.trainloader), {}
34
+
35
+ def evaluate(self, parameters, config):
36
+ self.set_parameters(parameters)
37
+ loss, accuracy = test(self.net, self.testloader)
38
+ return float(loss), len(self.testloader), {"accuracy": accuracy}
39
+
40
+
41
+ def client_fn(cid):
42
+ # Load model and data
43
+ net = AutoModelForSequenceClassification.from_pretrained(
44
+ CHECKPOINT, num_labels=2
45
+ ).to(DEVICE)
46
+ trainloader, valloader = load_data(int(cid), 2)
47
+
48
+ # Return Client instance
49
+ return FlowerClient(net, trainloader, valloader).to_client()
50
+
51
+
52
+ # Flower ClientApp
53
+ app = ClientApp(
54
+ client_fn,
55
+ )
@@ -0,0 +1,55 @@
1
+ """$project_name: A Flower / JAX app."""
2
+
3
+ import jax
4
+ from flwr.client import NumPyClient, ClientApp
5
+
6
+ from $import_name.task import (
7
+ evaluation,
8
+ get_params,
9
+ load_data,
10
+ load_model,
11
+ loss_fn,
12
+ set_params,
13
+ train,
14
+ )
15
+
16
+
17
+ # Define Flower Client and client_fn
18
+ class FlowerClient(NumPyClient):
19
+ def __init__(self):
20
+ self.train_x, self.train_y, self.test_x, self.test_y = load_data()
21
+ self.grad_fn = jax.grad(loss_fn)
22
+ model_shape = self.train_x.shape[1:]
23
+
24
+ self.params = load_model(model_shape)
25
+
26
+ def get_parameters(self, config):
27
+ return get_params(self.params)
28
+
29
+ def set_parameters(self, parameters):
30
+ set_params(self.params, parameters)
31
+
32
+ def fit(self, parameters, config):
33
+ self.set_parameters(parameters)
34
+ self.params, loss, num_examples = train(
35
+ self.params, self.grad_fn, self.train_x, self.train_y
36
+ )
37
+ parameters = self.get_parameters(config={})
38
+ return parameters, num_examples, {"loss": float(loss)}
39
+
40
+ def evaluate(self, parameters, config):
41
+ self.set_parameters(parameters)
42
+ loss, num_examples = evaluation(
43
+ self.params, self.grad_fn, self.test_x, self.test_y
44
+ )
45
+ return float(loss), num_examples, {"loss": float(loss)}
46
+
47
+ def client_fn(cid):
48
+ # Return Client instance
49
+ return FlowerClient().to_client()
50
+
51
+
52
+ # Flower ClientApp
53
+ app = ClientApp(
54
+ client_fn,
55
+ )
@@ -0,0 +1,17 @@
1
+ """$project_name: A Flower / HuggingFace Transformers app."""
2
+
3
+ from flwr.server.strategy import FedAvg
4
+ from flwr.server import ServerApp, ServerConfig
5
+
6
+
7
+ # Define strategy
8
+ strategy = FedAvg(
9
+ fraction_fit=1.0,
10
+ fraction_evaluate=1.0,
11
+ )
12
+
13
+ # Start server
14
+ app = ServerApp(
15
+ config=ServerConfig(num_rounds=3),
16
+ strategy=strategy,
17
+ )
@@ -0,0 +1,12 @@
1
+ """$project_name: A Flower / JAX app."""
2
+
3
+ import flwr as fl
4
+
5
+ # Configure the strategy
6
+ strategy = fl.server.strategy.FedAvg()
7
+
8
+ # Flower ServerApp
9
+ app = fl.server.ServerApp(
10
+ config=fl.server.ServerConfig(num_rounds=3),
11
+ strategy=strategy,
12
+ )
@@ -0,0 +1,87 @@
1
+ """$project_name: A Flower / HuggingFace Transformers app."""
2
+
3
+ import warnings
4
+ from collections import OrderedDict
5
+
6
+ import torch
7
+ from evaluate import load as load_metric
8
+ from torch.optim import AdamW
9
+ from torch.utils.data import DataLoader
10
+ from transformers import AutoTokenizer, DataCollatorWithPadding
11
+
12
+ from flwr_datasets import FederatedDataset
13
+
14
+ warnings.filterwarnings("ignore", category=UserWarning)
15
+ DEVICE = torch.device("cpu")
16
+ CHECKPOINT = "distilbert-base-uncased" # transformer model checkpoint
17
+
18
+
19
+ def load_data(partition_id, num_clients):
20
+ """Load IMDB data (training and eval)"""
21
+ fds = FederatedDataset(dataset="imdb", partitioners={"train": num_clients})
22
+ partition = fds.load_partition(partition_id)
23
+ # Divide data: 80% train, 20% test
24
+ partition_train_test = partition.train_test_split(test_size=0.2, seed=42)
25
+
26
+ tokenizer = AutoTokenizer.from_pretrained(CHECKPOINT)
27
+
28
+ def tokenize_function(examples):
29
+ return tokenizer(examples["text"], truncation=True)
30
+
31
+ partition_train_test = partition_train_test.map(tokenize_function, batched=True)
32
+ partition_train_test = partition_train_test.remove_columns("text")
33
+ partition_train_test = partition_train_test.rename_column("label", "labels")
34
+
35
+ data_collator = DataCollatorWithPadding(tokenizer=tokenizer)
36
+ trainloader = DataLoader(
37
+ partition_train_test["train"],
38
+ shuffle=True,
39
+ batch_size=32,
40
+ collate_fn=data_collator,
41
+ )
42
+
43
+ testloader = DataLoader(
44
+ partition_train_test["test"], batch_size=32, collate_fn=data_collator
45
+ )
46
+
47
+ return trainloader, testloader
48
+
49
+
50
+ def train(net, trainloader, epochs):
51
+ optimizer = AdamW(net.parameters(), lr=5e-5)
52
+ net.train()
53
+ for _ in range(epochs):
54
+ for batch in trainloader:
55
+ batch = {k: v.to(DEVICE) for k, v in batch.items()}
56
+ outputs = net(**batch)
57
+ loss = outputs.loss
58
+ loss.backward()
59
+ optimizer.step()
60
+ optimizer.zero_grad()
61
+
62
+
63
+ def test(net, testloader):
64
+ metric = load_metric("accuracy")
65
+ loss = 0
66
+ net.eval()
67
+ for batch in testloader:
68
+ batch = {k: v.to(DEVICE) for k, v in batch.items()}
69
+ with torch.no_grad():
70
+ outputs = net(**batch)
71
+ logits = outputs.logits
72
+ loss += outputs.loss.item()
73
+ predictions = torch.argmax(logits, dim=-1)
74
+ metric.add_batch(predictions=predictions, references=batch["labels"])
75
+ loss /= len(testloader.dataset)
76
+ accuracy = metric.compute()["accuracy"]
77
+ return loss, accuracy
78
+
79
+
80
+ def get_weights(net):
81
+ return [val.cpu().numpy() for _, val in net.state_dict().items()]
82
+
83
+
84
+ def set_weights(net, parameters):
85
+ params_dict = zip(net.state_dict().keys(), parameters)
86
+ state_dict = OrderedDict({k: torch.tensor(v) for k, v in params_dict})
87
+ net.load_state_dict(state_dict, strict=True)
@@ -0,0 +1,57 @@
1
+ """$project_name: A Flower / JAX app."""
2
+
3
+ import jax
4
+ import jax.numpy as jnp
5
+ from sklearn.datasets import make_regression
6
+ from sklearn.model_selection import train_test_split
7
+ import numpy as np
8
+
9
+ key = jax.random.PRNGKey(0)
10
+
11
+
12
+ def load_data():
13
+ # Load dataset
14
+ X, y = make_regression(n_features=3, random_state=0)
15
+ X, X_test, y, y_test = train_test_split(X, y)
16
+ return X, y, X_test, y_test
17
+
18
+
19
+ def load_model(model_shape):
20
+ # Extract model parameters
21
+ params = {"b": jax.random.uniform(key), "w": jax.random.uniform(key, model_shape)}
22
+ return params
23
+
24
+
25
+ def loss_fn(params, X, y):
26
+ # Return MSE as loss
27
+ err = jnp.dot(X, params["w"]) + params["b"] - y
28
+ return jnp.mean(jnp.square(err))
29
+
30
+
31
+ def train(params, grad_fn, X, y):
32
+ loss = 1_000_000
33
+ num_examples = X.shape[0]
34
+ for epochs in range(50):
35
+ grads = grad_fn(params, X, y)
36
+ params = jax.tree.map(lambda p, g: p - 0.05 * g, params, grads)
37
+ loss = loss_fn(params, X, y)
38
+ return params, loss, num_examples
39
+
40
+
41
+ def evaluation(params, grad_fn, X_test, y_test):
42
+ num_examples = X_test.shape[0]
43
+ err_test = loss_fn(params, X_test, y_test)
44
+ loss_test = jnp.mean(jnp.square(err_test))
45
+ return loss_test, num_examples
46
+
47
+
48
+ def get_params(params):
49
+ parameters = []
50
+ for _, val in params.items():
51
+ parameters.append(np.array(val))
52
+ return parameters
53
+
54
+
55
+ def set_params(local_params, global_params):
56
+ for key, value in list(zip(local_params.keys(), global_params)):
57
+ local_params[key] = value
@@ -0,0 +1,31 @@
1
+ [build-system]
2
+ requires = ["hatchling"]
3
+ build-backend = "hatchling.build"
4
+
5
+ [project]
6
+ name = "$package_name"
7
+ version = "1.0.0"
8
+ description = ""
9
+ authors = [
10
+ { name = "The Flower Authors", email = "hello@flower.ai" },
11
+ ]
12
+ license = { text = "Apache License (2.0)" }
13
+ dependencies = [
14
+ "flwr[simulation]>=1.8.0,<2.0",
15
+ "flwr-datasets>=0.0.2,<1.0.0",
16
+ "torch==2.2.1",
17
+ "transformers>=4.30.0,<5.0"
18
+ "evaluate>=0.4.0,<1.0"
19
+ "datasets>=2.0.0, <3.0"
20
+ "scikit-learn>=1.3.1, <2.0"
21
+ ]
22
+
23
+ [tool.hatch.build.targets.wheel]
24
+ packages = ["."]
25
+
26
+ [flower]
27
+ publisher = "$username"
28
+
29
+ [flower.components]
30
+ serverapp = "$import_name.server:app"
31
+ clientapp = "$import_name.client:app"
@@ -0,0 +1,28 @@
1
+ [build-system]
2
+ requires = ["hatchling"]
3
+ build-backend = "hatchling.build"
4
+
5
+ [project]
6
+ name = "$package_name"
7
+ version = "1.0.0"
8
+ description = ""
9
+ authors = [
10
+ { name = "The Flower Authors", email = "hello@flower.ai" },
11
+ ]
12
+ license = {text = "Apache License (2.0)"}
13
+ dependencies = [
14
+ "flwr[simulation]>=1.8.0,<2.0",
15
+ "jax==0.4.26",
16
+ "jaxlib==0.4.26",
17
+ "scikit-learn==1.4.2",
18
+ ]
19
+
20
+ [tool.hatch.build.targets.wheel]
21
+ packages = ["."]
22
+
23
+ [flower]
24
+ publisher = "$username"
25
+
26
+ [flower.components]
27
+ serverapp = "$import_name.server:app"
28
+ clientapp = "$import_name.client:app"
@@ -29,7 +29,7 @@ def message_size_mod(
29
29
  ) -> Message:
30
30
  """Message size mod.
31
31
 
32
- This mod logs the size in Bytes of the message being transmited.
32
+ This mod logs the size in bytes of the message being transmited.
33
33
  """
34
34
  message_size_in_bytes = 0
35
35
 
@@ -42,7 +42,7 @@ def message_size_mod(
42
42
  for m_record in msg.content.metrics_records.values():
43
43
  message_size_in_bytes += m_record.count_bytes()
44
44
 
45
- log(INFO, "Message size: %i Bytes", message_size_in_bytes)
45
+ log(INFO, "Message size: %i bytes", message_size_in_bytes)
46
46
 
47
47
  return call_next(msg, ctxt)
48
48
 
@@ -53,7 +53,7 @@ def parameters_size_mod(
53
53
  """Parameters size mod.
54
54
 
55
55
  This mod logs the number of parameters transmitted in the message as well as their
56
- size in Bytes.
56
+ size in bytes.
57
57
  """
58
58
  model_size_stats = {}
59
59
  parameters_size_in_bytes = 0
@@ -74,6 +74,6 @@ def parameters_size_mod(
74
74
  if model_size_stats:
75
75
  log(INFO, model_size_stats)
76
76
 
77
- log(INFO, "Total parameters transmited: %i Bytes", parameters_size_in_bytes)
77
+ log(INFO, "Total parameters transmitted: %i bytes", parameters_size_in_bytes)
78
78
 
79
79
  return call_next(msg, ctxt)
@@ -145,8 +145,7 @@ class LocalDpMod:
145
145
  )
146
146
  log(
147
147
  INFO,
148
- "LocalDpMod: local DP noise with "
149
- "standard deviation: %.4f added to parameters.",
148
+ "LocalDpMod: local DP noise with %.4f stedv added to parameters",
150
149
  noise_value_sd,
151
150
  )
152
151
 
@@ -24,7 +24,6 @@ from .app import start_server as start_server
24
24
  from .client_manager import ClientManager as ClientManager
25
25
  from .client_manager import SimpleClientManager as SimpleClientManager
26
26
  from .compat import LegacyContext as LegacyContext
27
- from .compat import start_driver as start_driver
28
27
  from .driver import Driver as Driver
29
28
  from .history import History as History
30
29
  from .run_serverapp import run_server_app as run_server_app
@@ -45,7 +44,6 @@ __all__ = [
45
44
  "ServerApp",
46
45
  "ServerConfig",
47
46
  "SimpleClientManager",
48
- "start_driver",
49
47
  "start_server",
50
48
  "strategy",
51
49
  "workflow",
@@ -41,7 +41,7 @@ from flwr.common.constant import (
41
41
  TRANSPORT_TYPE_VCE,
42
42
  )
43
43
  from flwr.common.exit_handlers import register_exit_handlers
44
- from flwr.common.logger import log
44
+ from flwr.common.logger import log, warn_deprecated_feature
45
45
  from flwr.common.secure_aggregation.crypto.symmetric_encryption import (
46
46
  private_key_to_bytes,
47
47
  public_key_to_bytes,
@@ -196,6 +196,9 @@ def start_server( # pylint: disable=too-many-arguments,too-many-locals
196
196
  def run_driver_api() -> None:
197
197
  """Run Flower server (Driver API)."""
198
198
  log(INFO, "Starting Flower server (Driver API)")
199
+ # Running `flower-driver-api` is deprecated
200
+ warn_deprecated_feature("flower-driver-api")
201
+ log(WARN, "Use `flower-superlink` instead")
199
202
  event(EventType.RUN_DRIVER_API_ENTER)
200
203
  args = _parse_args_run_driver_api().parse_args()
201
204
 
@@ -233,6 +236,9 @@ def run_driver_api() -> None:
233
236
  def run_fleet_api() -> None:
234
237
  """Run Flower server (Fleet API)."""
235
238
  log(INFO, "Starting Flower server (Fleet API)")
239
+ # Running `flower-fleet-api` is deprecated
240
+ warn_deprecated_feature("flower-fleet-api")
241
+ log(WARN, "Use `flower-superlink` instead")
236
242
  event(EventType.RUN_FLEET_API_ENTER)
237
243
  args = _parse_args_run_fleet_api().parse_args()
238
244
 
@@ -15,50 +15,35 @@
15
15
  """Flower driver app."""
16
16
 
17
17
 
18
- import sys
19
18
  from logging import INFO
20
- from pathlib import Path
21
- from typing import Optional, Union
19
+ from typing import Optional
22
20
 
23
21
  from flwr.common import EventType, event
24
- from flwr.common.address import parse_address
25
- from flwr.common.logger import log, warn_deprecated_feature
22
+ from flwr.common.logger import log
26
23
  from flwr.server.client_manager import ClientManager
27
24
  from flwr.server.history import History
28
25
  from flwr.server.server import Server, init_defaults, run_fl
29
26
  from flwr.server.server_config import ServerConfig
30
27
  from flwr.server.strategy import Strategy
31
28
 
32
- from ..driver import Driver, GrpcDriver
29
+ from ..driver import Driver
33
30
  from .app_utils import start_update_client_manager_thread
34
31
 
35
- DEFAULT_SERVER_ADDRESS_DRIVER = "[::]:9091"
36
-
37
- ERROR_MESSAGE_DRIVER_NOT_CONNECTED = """
38
- [Driver] Error: Not connected.
39
-
40
- Call `connect()` on the `Driver` instance before calling any of the other `Driver`
41
- methods.
42
- """
43
-
44
32
 
45
33
  def start_driver( # pylint: disable=too-many-arguments, too-many-locals
46
34
  *,
47
- server_address: str = DEFAULT_SERVER_ADDRESS_DRIVER,
35
+ driver: Driver,
48
36
  server: Optional[Server] = None,
49
37
  config: Optional[ServerConfig] = None,
50
38
  strategy: Optional[Strategy] = None,
51
39
  client_manager: Optional[ClientManager] = None,
52
- root_certificates: Optional[Union[bytes, str]] = None,
53
- driver: Optional[Driver] = None,
54
40
  ) -> History:
55
41
  """Start a Flower Driver API server.
56
42
 
57
43
  Parameters
58
44
  ----------
59
- server_address : Optional[str]
60
- The IPv4 or IPv6 address of the Driver API server.
61
- Defaults to `"[::]:8080"`.
45
+ driver : Driver
46
+ The Driver object to use.
62
47
  server : Optional[flwr.server.Server] (default: None)
63
48
  A server implementation, either `flwr.server.Server` or a subclass
64
49
  thereof. If no instance is provided, then `start_driver` will create
@@ -74,50 +59,14 @@ def start_driver( # pylint: disable=too-many-arguments, too-many-locals
74
59
  An implementation of the class `flwr.server.ClientManager`. If no
75
60
  implementation is provided, then `start_driver` will use
76
61
  `flwr.server.SimpleClientManager`.
77
- root_certificates : Optional[Union[bytes, str]] (default: None)
78
- The PEM-encoded root certificates as a byte string or a path string.
79
- If provided, a secure connection using the certificates will be
80
- established to an SSL-enabled Flower server.
81
- driver : Optional[Driver] (default: None)
82
- The Driver object to use.
83
62
 
84
63
  Returns
85
64
  -------
86
65
  hist : flwr.server.history.History
87
66
  Object containing training and evaluation metrics.
88
-
89
- Examples
90
- --------
91
- Starting a driver that connects to an insecure server:
92
-
93
- >>> start_driver()
94
-
95
- Starting a driver that connects to an SSL-enabled server:
96
-
97
- >>> start_driver(
98
- >>> root_certificates=Path("/crts/root.pem").read_bytes()
99
- >>> )
100
67
  """
101
68
  event(EventType.START_DRIVER_ENTER)
102
69
 
103
- if driver is None:
104
- # Not passing a `Driver` object is deprecated
105
- warn_deprecated_feature("start_driver")
106
-
107
- # Parse IP address
108
- parsed_address = parse_address(server_address)
109
- if not parsed_address:
110
- sys.exit(f"Server IP address ({server_address}) cannot be parsed.")
111
- host, port, is_v6 = parsed_address
112
- address = f"[{host}]:{port}" if is_v6 else f"{host}:{port}"
113
-
114
- # Create the Driver
115
- if isinstance(root_certificates, str):
116
- root_certificates = Path(root_certificates).read_bytes()
117
- driver = GrpcDriver(
118
- driver_service_address=address, root_certificates=root_certificates
119
- )
120
-
121
70
  # Initialize the Driver API server and config
122
71
  initialized_server, initialized_config = init_defaults(
123
72
  server=server,
@@ -16,10 +16,11 @@
16
16
 
17
17
 
18
18
  from .driver import Driver
19
- from .grpc_driver import GrpcDriver, GrpcDriverHelper
19
+ from .grpc_driver import GrpcDriver
20
+ from .inmemory_driver import InMemoryDriver
20
21
 
21
22
  __all__ = [
22
23
  "Driver",
23
24
  "GrpcDriver",
24
- "GrpcDriverHelper",
25
+ "InMemoryDriver",
25
26
  ]