flwr-nightly 1.12.0.dev20240906__tar.gz → 1.12.0.dev20240913__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 (301) hide show
  1. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/PKG-INFO +4 -6
  2. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/README.md +0 -1
  3. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/pyproject.toml +7 -7
  4. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/build.py +1 -2
  5. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/config_utils.py +10 -10
  6. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/install.py +1 -2
  7. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/new.py +26 -40
  8. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +19 -29
  9. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -3
  10. flwr_nightly-1.12.0.dev20240913/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +38 -0
  11. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +16 -13
  12. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +9 -1
  13. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/run/run.py +6 -7
  14. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/utils.py +2 -2
  15. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/client/app.py +14 -14
  16. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/client/client_app.py +5 -5
  17. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/client/clientapp/app.py +2 -2
  18. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/client/dpfedavg_numpy_client.py +6 -7
  19. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/client/grpc_adapter_client/connection.py +4 -3
  20. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/client/grpc_client/connection.py +4 -3
  21. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +5 -5
  22. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/client/grpc_rere_client/connection.py +5 -4
  23. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +2 -2
  24. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/client/message_handler/message_handler.py +3 -3
  25. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +25 -25
  26. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/client/mod/utils.py +1 -3
  27. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/client/node_state.py +2 -2
  28. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/client/numpy_client.py +8 -8
  29. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/client/rest_client/connection.py +5 -4
  30. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/client/supernode/app.py +7 -8
  31. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/common/address.py +2 -2
  32. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/common/config.py +8 -8
  33. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/common/constant.py +12 -1
  34. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/common/differential_privacy.py +2 -2
  35. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/common/dp.py +1 -3
  36. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/common/exit_handlers.py +3 -3
  37. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/common/grpc.py +2 -1
  38. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/common/logger.py +3 -3
  39. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/common/object_ref.py +3 -3
  40. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/common/record/configsrecord.py +3 -3
  41. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/common/record/metricsrecord.py +3 -3
  42. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/common/record/parametersrecord.py +3 -2
  43. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/common/record/recordset.py +1 -1
  44. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/common/record/typeddict.py +23 -10
  45. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/common/recordset_compat.py +7 -5
  46. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/common/retry_invoker.py +6 -17
  47. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +10 -10
  48. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +2 -2
  49. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +16 -16
  50. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/common/secure_aggregation/quantization.py +7 -7
  51. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +3 -5
  52. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/common/serde.py +11 -9
  53. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/common/telemetry.py +5 -5
  54. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/common/typing.py +19 -19
  55. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/common/version.py +2 -3
  56. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/app.py +18 -18
  57. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/client_manager.py +6 -6
  58. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/compat/app_utils.py +2 -3
  59. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/driver/driver.py +3 -2
  60. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/driver/grpc_driver.py +7 -7
  61. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/driver/inmemory_driver.py +5 -4
  62. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/history.py +8 -9
  63. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/run_serverapp.py +5 -6
  64. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/server.py +36 -36
  65. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/strategy/aggregate.py +13 -13
  66. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/strategy/bulyan.py +8 -8
  67. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +20 -20
  68. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/strategy/dp_fixed_clipping.py +19 -19
  69. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +6 -6
  70. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/strategy/dpfedavg_fixed.py +10 -10
  71. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +11 -11
  72. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/strategy/fedadagrad.py +8 -8
  73. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/strategy/fedadam.py +8 -8
  74. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/strategy/fedavg.py +16 -16
  75. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/strategy/fedavg_android.py +16 -16
  76. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/strategy/fedavgm.py +8 -8
  77. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/strategy/fedmedian.py +4 -4
  78. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/strategy/fedopt.py +5 -5
  79. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/strategy/fedprox.py +6 -6
  80. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/strategy/fedtrimmedavg.py +8 -8
  81. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/strategy/fedxgb_bagging.py +11 -11
  82. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/strategy/fedxgb_cyclic.py +9 -9
  83. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +5 -5
  84. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/strategy/fedyogi.py +8 -8
  85. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/strategy/krum.py +8 -8
  86. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/strategy/qfedavg.py +15 -15
  87. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/strategy/strategy.py +10 -10
  88. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/superlink/driver/driver_grpc.py +2 -2
  89. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/superlink/driver/driver_servicer.py +6 -6
  90. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/superlink/ffs/disk_ffs.py +4 -4
  91. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/superlink/ffs/ffs.py +4 -4
  92. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +2 -2
  93. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +2 -1
  94. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +2 -1
  95. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +9 -8
  96. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +5 -3
  97. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +2 -2
  98. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +2 -1
  99. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +2 -3
  100. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +3 -3
  101. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +26 -17
  102. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +6 -6
  103. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/superlink/state/in_memory_state.py +18 -18
  104. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/superlink/state/sqlite_state.py +22 -21
  105. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/superlink/state/state.py +7 -7
  106. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/utils/tensorboard.py +4 -4
  107. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/utils/validator.py +2 -2
  108. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/workflow/default_workflows.py +5 -5
  109. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +22 -22
  110. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/simulation/app.py +8 -8
  111. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/simulation/ray_transport/ray_actor.py +23 -23
  112. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/simulation/run_simulation.py +16 -4
  113. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/superexec/app.py +4 -4
  114. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/superexec/deployment.py +2 -2
  115. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/superexec/exec_grpc.py +2 -2
  116. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/superexec/exec_servicer.py +3 -2
  117. flwr_nightly-1.12.0.dev20240906/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -23
  118. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/LICENSE +0 -0
  119. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/__init__.py +0 -0
  120. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/__init__.py +0 -0
  121. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/app.py +0 -0
  122. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/example.py +0 -0
  123. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/__init__.py +0 -0
  124. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/__init__.py +0 -0
  125. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  126. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  127. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  128. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  129. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  130. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
  131. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  132. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  133. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  134. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  135. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  136. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  137. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  138. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  139. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  140. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  141. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  142. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  143. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  144. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  145. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  146. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  147. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  148. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  149. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  150. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  151. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  152. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  153. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  154. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  155. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  156. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  157. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  158. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  159. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  160. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  161. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
  162. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  163. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  164. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  165. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  166. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  167. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  168. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  169. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/cli/run/__init__.py +0 -0
  170. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/client/__init__.py +0 -0
  171. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/client/client.py +0 -0
  172. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/client/clientapp/__init__.py +0 -0
  173. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/client/clientapp/clientappio_servicer.py +0 -0
  174. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/client/clientapp/utils.py +0 -0
  175. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  176. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/client/grpc_client/__init__.py +0 -0
  177. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  178. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/client/heartbeat.py +0 -0
  179. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/client/message_handler/__init__.py +0 -0
  180. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/client/message_handler/task_handler.py +0 -0
  181. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/client/mod/__init__.py +0 -0
  182. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
  183. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/client/mod/comms_mods.py +0 -0
  184. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/client/mod/localdp_mod.py +0 -0
  185. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  186. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  187. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/client/node_state_tests.py +0 -0
  188. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/client/rest_client/__init__.py +0 -0
  189. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/client/supernode/__init__.py +0 -0
  190. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/client/typing.py +0 -0
  191. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/common/__init__.py +0 -0
  192. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/common/context.py +0 -0
  193. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/common/date.py +0 -0
  194. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/common/differential_privacy_constants.py +0 -0
  195. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/common/message.py +0 -0
  196. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/common/parameter.py +0 -0
  197. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/common/pyproject.py +0 -0
  198. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/common/record/__init__.py +0 -0
  199. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/common/record/conversion_utils.py +0 -0
  200. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
  201. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  202. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  203. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/__init__.py +0 -0
  204. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/clientappio_pb2.py +0 -0
  205. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/clientappio_pb2.pyi +0 -0
  206. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  207. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  208. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/common_pb2.py +0 -0
  209. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/common_pb2.pyi +0 -0
  210. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/common_pb2_grpc.py +0 -0
  211. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/common_pb2_grpc.pyi +0 -0
  212. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/driver_pb2.py +0 -0
  213. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/driver_pb2.pyi +0 -0
  214. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/driver_pb2_grpc.py +0 -0
  215. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/driver_pb2_grpc.pyi +0 -0
  216. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/error_pb2.py +0 -0
  217. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/error_pb2.pyi +0 -0
  218. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
  219. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  220. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/exec_pb2.py +0 -0
  221. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/exec_pb2.pyi +0 -0
  222. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/exec_pb2_grpc.py +0 -0
  223. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
  224. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/fab_pb2.py +0 -0
  225. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/fab_pb2.pyi +0 -0
  226. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
  227. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  228. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/fleet_pb2.py +0 -0
  229. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
  230. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  231. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  232. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
  233. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  234. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  235. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  236. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/message_pb2.py +0 -0
  237. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/message_pb2.pyi +0 -0
  238. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/message_pb2_grpc.py +0 -0
  239. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  240. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/node_pb2.py +0 -0
  241. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/node_pb2.pyi +0 -0
  242. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
  243. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  244. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/recordset_pb2.py +0 -0
  245. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
  246. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
  247. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
  248. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/run_pb2.py +0 -0
  249. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/run_pb2.pyi +0 -0
  250. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/run_pb2_grpc.py +0 -0
  251. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  252. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/task_pb2.py +0 -0
  253. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/task_pb2.pyi +0 -0
  254. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
  255. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
  256. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/transport_pb2.py +0 -0
  257. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/transport_pb2.pyi +0 -0
  258. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
  259. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  260. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/py.typed +0 -0
  261. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/__init__.py +0 -0
  262. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/client_proxy.py +0 -0
  263. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/compat/__init__.py +0 -0
  264. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/compat/app.py +0 -0
  265. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
  266. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/compat/legacy_context.py +0 -0
  267. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/criterion.py +0 -0
  268. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/driver/__init__.py +0 -0
  269. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/server_app.py +0 -0
  270. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/server_config.py +0 -0
  271. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/serverapp_components.py +0 -0
  272. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/strategy/__init__.py +0 -0
  273. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/superlink/__init__.py +0 -0
  274. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
  275. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/superlink/ffs/__init__.py +0 -0
  276. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
  277. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
  278. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  279. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  280. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  281. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  282. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  283. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  284. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  285. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  286. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/superlink/state/__init__.py +0 -0
  287. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/superlink/state/state_factory.py +0 -0
  288. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/superlink/state/utils.py +0 -0
  289. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/typing.py +0 -0
  290. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/utils/__init__.py +0 -0
  291. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/workflow/__init__.py +0 -0
  292. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/workflow/constant.py +0 -0
  293. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  294. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  295. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/simulation/__init__.py +0 -0
  296. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
  297. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  298. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
  299. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/superexec/__init__.py +0 -0
  300. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/superexec/executor.py +0 -0
  301. {flwr_nightly-1.12.0.dev20240906 → flwr_nightly-1.12.0.dev20240913}/src/py/flwr/superexec/simulation.py +0 -0
@@ -1,13 +1,13 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.12.0.dev20240906
3
+ Version: 1.12.0.dev20240913
4
4
  Summary: Flower: A Friendly Federated Learning Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
7
7
  Keywords: flower,fl,federated learning,federated analytics,federated evaluation,machine learning
8
8
  Author: The Flower Authors
9
9
  Author-email: hello@flower.ai
10
- Requires-Python: >=3.8,<4.0
10
+ Requires-Python: >=3.9,<4.0
11
11
  Classifier: Development Status :: 5 - Production/Stable
12
12
  Classifier: Intended Audience :: Developers
13
13
  Classifier: Intended Audience :: Science/Research
@@ -16,7 +16,6 @@ Classifier: Operating System :: MacOS :: MacOS X
16
16
  Classifier: Operating System :: POSIX :: Linux
17
17
  Classifier: Programming Language :: Python
18
18
  Classifier: Programming Language :: Python :: 3
19
- Classifier: Programming Language :: Python :: 3.8
20
19
  Classifier: Programming Language :: Python :: 3.9
21
20
  Classifier: Programming Language :: Python :: 3.10
22
21
  Classifier: Programming Language :: Python :: 3.11
@@ -33,13 +32,13 @@ Classifier: Typing :: Typed
33
32
  Provides-Extra: rest
34
33
  Provides-Extra: simulation
35
34
  Requires-Dist: cryptography (>=42.0.4,<43.0.0)
36
- Requires-Dist: grpcio (>=1.60.0,<2.0.0,!=1.64.2,!=1.65.1,!=1.65.2,!=1.65.4)
35
+ Requires-Dist: grpcio (>=1.60.0,<2.0.0,!=1.64.2,!=1.65.1,!=1.65.2,!=1.65.4,!=1.65.5,!=1.66.0,!=1.66.1)
37
36
  Requires-Dist: iterators (>=0.0.2,<0.0.3)
38
37
  Requires-Dist: numpy (>=1.21.0,<2.0.0)
39
38
  Requires-Dist: pathspec (>=0.12.1,<0.13.0)
40
39
  Requires-Dist: protobuf (>=4.25.2,<5.0.0)
41
40
  Requires-Dist: pycryptodome (>=3.18.0,<4.0.0)
42
- Requires-Dist: ray (==2.10.0) ; (python_version >= "3.8" and python_version < "3.12") and (extra == "simulation")
41
+ Requires-Dist: ray (==2.10.0) ; (python_version >= "3.9" and python_version < "3.12") and (extra == "simulation")
43
42
  Requires-Dist: requests (>=2.31.0,<3.0.0) ; extra == "rest"
44
43
  Requires-Dist: starlette (>=0.31.0,<0.32.0) ; extra == "rest"
45
44
  Requires-Dist: tomli (>=2.0.1,<3.0.0)
@@ -199,7 +198,6 @@ Other [examples](https://github.com/adap/flower/tree/main/examples):
199
198
  - [Federated Finetuning of a Vision Transformer](https://github.com/adap/flower/tree/main/examples/flowertune-vit)
200
199
  - [Advanced Flower with TensorFlow/Keras](https://github.com/adap/flower/tree/main/examples/advanced-tensorflow)
201
200
  - [Advanced Flower with PyTorch](https://github.com/adap/flower/tree/main/examples/advanced-pytorch)
202
- - Single-Machine Simulation of Federated Learning Systems ([PyTorch](https://github.com/adap/flower/tree/main/examples/simulation-pytorch)) ([Tensorflow](https://github.com/adap/flower/tree/main/examples/simulation-tensorflow))
203
201
  - [Comprehensive Flower+XGBoost](https://github.com/adap/flower/tree/main/examples/xgboost-comprehensive)
204
202
  - [Flower through Docker Compose and with Grafana dashboard](https://github.com/adap/flower/tree/main/examples/flower-via-docker-compose)
205
203
  - [Flower with KaplanMeierFitter from the lifelines library](https://github.com/adap/flower/tree/main/examples/federated-kaplan-meier-fitter)
@@ -147,7 +147,6 @@ Other [examples](https://github.com/adap/flower/tree/main/examples):
147
147
  - [Federated Finetuning of a Vision Transformer](https://github.com/adap/flower/tree/main/examples/flowertune-vit)
148
148
  - [Advanced Flower with TensorFlow/Keras](https://github.com/adap/flower/tree/main/examples/advanced-tensorflow)
149
149
  - [Advanced Flower with PyTorch](https://github.com/adap/flower/tree/main/examples/advanced-pytorch)
150
- - Single-Machine Simulation of Federated Learning Systems ([PyTorch](https://github.com/adap/flower/tree/main/examples/simulation-pytorch)) ([Tensorflow](https://github.com/adap/flower/tree/main/examples/simulation-tensorflow))
151
150
  - [Comprehensive Flower+XGBoost](https://github.com/adap/flower/tree/main/examples/xgboost-comprehensive)
152
151
  - [Flower through Docker Compose and with Grafana dashboard](https://github.com/adap/flower/tree/main/examples/flower-via-docker-compose)
153
152
  - [Flower with KaplanMeierFitter from the lifelines library](https://github.com/adap/flower/tree/main/examples/federated-kaplan-meier-fitter)
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [tool.poetry]
6
6
  name = "flwr-nightly"
7
- version = "1.12.0.dev20240906"
7
+ version = "1.12.0.dev20240913"
8
8
  description = "Flower: A Friendly Federated Learning Framework"
9
9
  license = "Apache-2.0"
10
10
  authors = ["The Flower Authors <hello@flower.ai>"]
@@ -30,7 +30,6 @@ classifiers = [
30
30
  "Programming Language :: Python",
31
31
  "Programming Language :: Python :: 3",
32
32
  "Programming Language :: Python :: 3 :: Only",
33
- "Programming Language :: Python :: 3.8",
34
33
  "Programming Language :: Python :: 3.9",
35
34
  "Programming Language :: Python :: 3.10",
36
35
  "Programming Language :: Python :: 3.11",
@@ -66,10 +65,10 @@ flwr-clientapp = "flwr.client.clientapp:flwr_clientapp"
66
65
  flower-client-app = "flwr.client.supernode:run_client_app" # Deprecated
67
66
 
68
67
  [tool.poetry.dependencies]
69
- python = "^3.8"
68
+ python = "^3.9"
70
69
  # Mandatory dependencies
71
70
  numpy = "^1.21.0"
72
- grpcio = "^1.60.0,!=1.64.2,!=1.65.1,!=1.65.2,!=1.65.4"
71
+ grpcio = "^1.60.0,!=1.64.2,!=1.65.1,!=1.65.2,!=1.65.4,!=1.65.5,!=1.66.0,!=1.66.1"
73
72
  protobuf = "^4.25.2"
74
73
  cryptography = "^42.0.4"
75
74
  pycryptodome = "^3.18.0"
@@ -79,7 +78,7 @@ tomli = "^2.0.1"
79
78
  tomli-w = "^1.0.0"
80
79
  pathspec = "^0.12.1"
81
80
  # Optional dependencies (Simulation Engine)
82
- ray = { version = "==2.10.0", optional = true, python = ">=3.8,<3.12" }
81
+ ray = { version = "==2.10.0", optional = true, python = ">=3.9,<3.12" }
83
82
  # Optional dependencies (REST transport layer)
84
83
  requests = { version = "^2.31.0", optional = true }
85
84
  starlette = { version = "^0.31.0", optional = true }
@@ -101,6 +100,7 @@ docformatter = "==1.7.5"
101
100
  mypy = "==1.8.0"
102
101
  pylint = "==3.0.3"
103
102
  flake8 = "==5.0.4"
103
+ parameterized = "==0.9.0"
104
104
  pytest = "==7.4.4"
105
105
  pytest-cov = "==4.1.0"
106
106
  pytest-watcher = "==0.4.1"
@@ -143,7 +143,7 @@ known_first_party = ["flwr", "flwr_tool"]
143
143
 
144
144
  [tool.black]
145
145
  line-length = 88
146
- target-version = ["py38", "py39", "py310", "py311"]
146
+ target-version = ["py39", "py310", "py311"]
147
147
 
148
148
  [tool.pylint."MESSAGES CONTROL"]
149
149
  disable = "duplicate-code,too-few-public-methods,useless-import-alias"
@@ -192,7 +192,7 @@ wrap-summaries = 88
192
192
  wrap-descriptions = 88
193
193
 
194
194
  [tool.ruff]
195
- target-version = "py38"
195
+ target-version = "py39"
196
196
  line-length = 88
197
197
  select = ["D", "E", "F", "W", "B", "ISC", "C4", "UP"]
198
198
  fixable = ["D", "E", "F", "W", "B", "ISC", "C4", "UP"]
@@ -17,12 +17,11 @@
17
17
  import os
18
18
  import zipfile
19
19
  from pathlib import Path
20
- from typing import Optional
20
+ from typing import Annotated, Optional
21
21
 
22
22
  import pathspec
23
23
  import tomli_w
24
24
  import typer
25
- from typing_extensions import Annotated
26
25
 
27
26
  from .config_utils import load_and_validate
28
27
  from .utils import get_sha256_hash, is_valid_project_name
@@ -17,7 +17,7 @@
17
17
  import zipfile
18
18
  from io import BytesIO
19
19
  from pathlib import Path
20
- from typing import IO, Any, Dict, List, Optional, Tuple, Union, get_args
20
+ from typing import IO, Any, Optional, Union, get_args
21
21
 
22
22
  import tomli
23
23
 
@@ -25,7 +25,7 @@ from flwr.common import object_ref
25
25
  from flwr.common.typing import UserConfigValue
26
26
 
27
27
 
28
- def get_fab_config(fab_file: Union[Path, bytes]) -> Dict[str, Any]:
28
+ def get_fab_config(fab_file: Union[Path, bytes]) -> dict[str, Any]:
29
29
  """Extract the config from a FAB file or path.
30
30
 
31
31
  Parameters
@@ -62,7 +62,7 @@ def get_fab_config(fab_file: Union[Path, bytes]) -> Dict[str, Any]:
62
62
  return conf
63
63
 
64
64
 
65
- def get_fab_metadata(fab_file: Union[Path, bytes]) -> Tuple[str, str]:
65
+ def get_fab_metadata(fab_file: Union[Path, bytes]) -> tuple[str, str]:
66
66
  """Extract the fab_id and the fab_version from a FAB file or path.
67
67
 
68
68
  Parameters
@@ -87,7 +87,7 @@ def get_fab_metadata(fab_file: Union[Path, bytes]) -> Tuple[str, str]:
87
87
  def load_and_validate(
88
88
  path: Optional[Path] = None,
89
89
  check_module: bool = True,
90
- ) -> Tuple[Optional[Dict[str, Any]], List[str], List[str]]:
90
+ ) -> tuple[Optional[dict[str, Any]], list[str], list[str]]:
91
91
  """Load and validate pyproject.toml as dict.
92
92
 
93
93
  Returns
@@ -116,7 +116,7 @@ def load_and_validate(
116
116
  return (config, errors, warnings)
117
117
 
118
118
 
119
- def load(toml_path: Path) -> Optional[Dict[str, Any]]:
119
+ def load(toml_path: Path) -> Optional[dict[str, Any]]:
120
120
  """Load pyproject.toml and return as dict."""
121
121
  if not toml_path.is_file():
122
122
  return None
@@ -125,7 +125,7 @@ def load(toml_path: Path) -> Optional[Dict[str, Any]]:
125
125
  return load_from_string(toml_file.read())
126
126
 
127
127
 
128
- def _validate_run_config(config_dict: Dict[str, Any], errors: List[str]) -> None:
128
+ def _validate_run_config(config_dict: dict[str, Any], errors: list[str]) -> None:
129
129
  for key, value in config_dict.items():
130
130
  if isinstance(value, dict):
131
131
  _validate_run_config(config_dict[key], errors)
@@ -137,7 +137,7 @@ def _validate_run_config(config_dict: Dict[str, Any], errors: List[str]) -> None
137
137
 
138
138
 
139
139
  # pylint: disable=too-many-branches
140
- def validate_fields(config: Dict[str, Any]) -> Tuple[bool, List[str], List[str]]:
140
+ def validate_fields(config: dict[str, Any]) -> tuple[bool, list[str], list[str]]:
141
141
  """Validate pyproject.toml fields."""
142
142
  errors = []
143
143
  warnings = []
@@ -183,10 +183,10 @@ def validate_fields(config: Dict[str, Any]) -> Tuple[bool, List[str], List[str]]
183
183
 
184
184
 
185
185
  def validate(
186
- config: Dict[str, Any],
186
+ config: dict[str, Any],
187
187
  check_module: bool = True,
188
188
  project_dir: Optional[Union[str, Path]] = None,
189
- ) -> Tuple[bool, List[str], List[str]]:
189
+ ) -> tuple[bool, list[str], list[str]]:
190
190
  """Validate pyproject.toml."""
191
191
  is_valid, errors, warnings = validate_fields(config)
192
192
 
@@ -210,7 +210,7 @@ def validate(
210
210
  return True, [], []
211
211
 
212
212
 
213
- def load_from_string(toml_content: str) -> Optional[Dict[str, Any]]:
213
+ def load_from_string(toml_content: str) -> Optional[dict[str, Any]]:
214
214
  """Load TOML content from a string and return as dict."""
215
215
  try:
216
216
  data = tomli.loads(toml_content)
@@ -21,10 +21,9 @@ import tempfile
21
21
  import zipfile
22
22
  from io import BytesIO
23
23
  from pathlib import Path
24
- from typing import IO, Optional, Union
24
+ from typing import IO, Annotated, Optional, Union
25
25
 
26
26
  import typer
27
- from typing_extensions import Annotated
28
27
 
29
28
  from flwr.common.config import get_flwr_dir
30
29
 
@@ -18,10 +18,9 @@ import re
18
18
  from enum import Enum
19
19
  from pathlib import Path
20
20
  from string import Template
21
- from typing import Dict, Optional
21
+ from typing import Annotated, Optional
22
22
 
23
23
  import typer
24
- from typing_extensions import Annotated
25
24
 
26
25
  from ..utils import (
27
26
  is_valid_project_name,
@@ -70,7 +69,7 @@ def load_template(name: str) -> str:
70
69
  return tpl_file.read()
71
70
 
72
71
 
73
- def render_template(template: str, data: Dict[str, str]) -> str:
72
+ def render_template(template: str, data: dict[str, str]) -> str:
74
73
  """Render template."""
75
74
  tpl_file = load_template(template)
76
75
  tpl = Template(tpl_file)
@@ -85,7 +84,7 @@ def create_file(file_path: Path, content: str) -> None:
85
84
  file_path.write_text(content)
86
85
 
87
86
 
88
- def render_and_create(file_path: Path, template: str, context: Dict[str, str]) -> None:
87
+ def render_and_create(file_path: Path, template: str, context: dict[str, str]) -> None:
89
88
  """Render template and write to file."""
90
89
  content = render_template(template, context)
91
90
  create_file(file_path, content)
@@ -136,36 +135,23 @@ def new(
136
135
  username = prompt_text("Please provide your Flower username")
137
136
 
138
137
  if framework is not None:
139
- framework_str_upper = str(framework.value)
138
+ framework_str = str(framework.value)
140
139
  else:
141
- framework_value = prompt_options(
140
+ framework_str = prompt_options(
142
141
  "Please select ML framework by typing in the number",
143
142
  [mlf.value for mlf in MlFramework],
144
143
  )
145
- selected_value = [
146
- name
147
- for name, value in vars(MlFramework).items()
148
- if value == framework_value
149
- ]
150
- framework_str_upper = selected_value[0]
151
-
152
- framework_str = framework_str_upper.lower()
153
144
 
154
145
  llm_challenge_str = None
155
- if framework_str == "flowertune":
146
+ if framework_str == MlFramework.FLOWERTUNE:
156
147
  llm_challenge_value = prompt_options(
157
148
  "Please select LLM challenge by typing in the number",
158
149
  sorted([challenge.value for challenge in LlmChallengeName]),
159
150
  )
160
- selected_value = [
161
- name
162
- for name, value in vars(LlmChallengeName).items()
163
- if value == llm_challenge_value
164
- ]
165
- llm_challenge_str = selected_value[0]
166
- llm_challenge_str = llm_challenge_str.lower()
151
+ llm_challenge_str = llm_challenge_value.lower()
167
152
 
168
- is_baseline_project = framework_str == "baseline"
153
+ if framework_str == MlFramework.BASELINE:
154
+ framework_str = "baseline"
169
155
 
170
156
  print(
171
157
  typer.style(
@@ -176,19 +162,21 @@ def new(
176
162
  )
177
163
 
178
164
  context = {
179
- "framework_str": framework_str_upper,
165
+ "framework_str": framework_str,
180
166
  "import_name": import_name.replace("-", "_"),
181
167
  "package_name": package_name,
182
168
  "project_name": app_name,
183
169
  "username": username,
184
170
  }
185
171
 
172
+ template_name = framework_str.lower()
173
+
186
174
  # List of files to render
187
175
  if llm_challenge_str:
188
176
  files = {
189
177
  ".gitignore": {"template": "app/.gitignore.tpl"},
190
- "pyproject.toml": {"template": f"app/pyproject.{framework_str}.toml.tpl"},
191
- "README.md": {"template": f"app/README.{framework_str}.md.tpl"},
178
+ "pyproject.toml": {"template": f"app/pyproject.{template_name}.toml.tpl"},
179
+ "README.md": {"template": f"app/README.{template_name}.md.tpl"},
192
180
  f"{import_name}/__init__.py": {"template": "app/code/__init__.py.tpl"},
193
181
  f"{import_name}/server_app.py": {
194
182
  "template": "app/code/flwr_tune/server_app.py.tpl"
@@ -235,44 +223,42 @@ def new(
235
223
  files = {
236
224
  ".gitignore": {"template": "app/.gitignore.tpl"},
237
225
  "README.md": {"template": "app/README.md.tpl"},
238
- "pyproject.toml": {"template": f"app/pyproject.{framework_str}.toml.tpl"},
226
+ "pyproject.toml": {"template": f"app/pyproject.{template_name}.toml.tpl"},
239
227
  f"{import_name}/__init__.py": {"template": "app/code/__init__.py.tpl"},
240
228
  f"{import_name}/server_app.py": {
241
- "template": f"app/code/server.{framework_str}.py.tpl"
229
+ "template": f"app/code/server.{template_name}.py.tpl"
242
230
  },
243
231
  f"{import_name}/client_app.py": {
244
- "template": f"app/code/client.{framework_str}.py.tpl"
232
+ "template": f"app/code/client.{template_name}.py.tpl"
245
233
  },
246
234
  }
247
235
 
248
236
  # Depending on the framework, generate task.py file
249
237
  frameworks_with_tasks = [
250
- MlFramework.PYTORCH.value.lower(),
251
- MlFramework.JAX.value.lower(),
252
- MlFramework.HUGGINGFACE.value.lower(),
253
- MlFramework.MLX.value.lower(),
254
- MlFramework.TENSORFLOW.value.lower(),
238
+ MlFramework.PYTORCH.value,
239
+ MlFramework.JAX.value,
240
+ MlFramework.HUGGINGFACE.value,
241
+ MlFramework.MLX.value,
242
+ MlFramework.TENSORFLOW.value,
255
243
  ]
256
244
  if framework_str in frameworks_with_tasks:
257
245
  files[f"{import_name}/task.py"] = {
258
- "template": f"app/code/task.{framework_str}.py.tpl"
246
+ "template": f"app/code/task.{template_name}.py.tpl"
259
247
  }
260
248
 
261
- if is_baseline_project:
249
+ if framework_str == "baseline":
262
250
  # Include additional files for baseline template
263
251
  for file_name in ["model", "dataset", "strategy", "utils", "__init__"]:
264
252
  files[f"{import_name}/{file_name}.py"] = {
265
- "template": f"app/code/{file_name}.{framework_str}.py.tpl"
253
+ "template": f"app/code/{file_name}.{template_name}.py.tpl"
266
254
  }
267
255
 
268
256
  # Replace README.md
269
- files["README.md"]["template"] = f"app/README.{framework_str}.md.tpl"
257
+ files["README.md"]["template"] = f"app/README.{template_name}.md.tpl"
270
258
 
271
259
  # Add LICENSE
272
260
  files["LICENSE"] = {"template": "app/LICENSE.tpl"}
273
261
 
274
- context["framework_str"] = "baseline"
275
-
276
262
  for file_path, value in files.items():
277
263
  render_and_create(
278
264
  file_path=project_dir / file_path,
@@ -1,18 +1,11 @@
1
1
  """$project_name: A Flower / $framework_str app."""
2
2
 
3
+ import torch
3
4
  from flwr.client import ClientApp, NumPyClient
4
5
  from flwr.common import Context
5
6
  from transformers import AutoModelForSequenceClassification
6
7
 
7
- from $import_name.task import (
8
- get_weights,
9
- load_data,
10
- set_weights,
11
- train,
12
- test,
13
- CHECKPOINT,
14
- DEVICE,
15
- )
8
+ from $import_name.task import get_weights, load_data, set_weights, test, train
16
9
 
17
10
 
18
11
  # Flower client
@@ -22,37 +15,34 @@ class FlowerClient(NumPyClient):
22
15
  self.trainloader = trainloader
23
16
  self.testloader = testloader
24
17
  self.local_epochs = local_epochs
25
-
26
- def get_parameters(self, config):
27
- return get_weights(self.net)
28
-
29
- def set_parameters(self, parameters):
30
- set_weights(self.net, parameters)
18
+ self.device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
19
+ self.net.to(self.device)
31
20
 
32
21
  def fit(self, parameters, config):
33
- self.set_parameters(parameters)
34
- train(
35
- self.net,
36
- self.trainloader,
37
- epochs=self.local_epochs,
38
- )
39
- return self.get_parameters(config={}), len(self.trainloader), {}
22
+ set_weights(self.net, parameters)
23
+ train(self.net, self.trainloader, epochs=self.local_epochs, device=self.device)
24
+ return get_weights(self.net), len(self.trainloader), {}
40
25
 
41
26
  def evaluate(self, parameters, config):
42
- self.set_parameters(parameters)
43
- loss, accuracy = test(self.net, self.testloader)
27
+ set_weights(self.net, parameters)
28
+ loss, accuracy = test(self.net, self.testloader, self.device)
44
29
  return float(loss), len(self.testloader), {"accuracy": accuracy}
45
30
 
46
31
 
47
32
  def client_fn(context: Context):
48
- # Load model and data
49
- net = AutoModelForSequenceClassification.from_pretrained(
50
- CHECKPOINT, num_labels=2
51
- ).to(DEVICE)
52
33
 
34
+ # Get this client's dataset partition
53
35
  partition_id = context.node_config["partition-id"]
54
36
  num_partitions = context.node_config["num-partitions"]
55
- trainloader, valloader = load_data(partition_id, num_partitions)
37
+ model_name = context.run_config["model-name"]
38
+ trainloader, valloader = load_data(partition_id, num_partitions, model_name)
39
+
40
+ # Load model
41
+ num_labels = context.run_config["num-labels"]
42
+ net = AutoModelForSequenceClassification.from_pretrained(
43
+ model_name, num_labels=num_labels
44
+ )
45
+
56
46
  local_epochs = context.run_config["local-epochs"]
57
47
 
58
48
  # Return Client instance
@@ -17,9 +17,6 @@ class FlowerClient(NumPyClient):
17
17
  self.batch_size = batch_size
18
18
  self.verbose = verbose
19
19
 
20
- def get_parameters(self, config):
21
- return self.model.get_weights()
22
-
23
20
  def fit(self, parameters, config):
24
21
  self.model.set_weights(parameters)
25
22
  self.model.fit(
@@ -0,0 +1,38 @@
1
+ """$project_name: A Flower / $framework_str app."""
2
+
3
+ from flwr.common import Context, ndarrays_to_parameters
4
+ from flwr.server import ServerApp, ServerAppComponents, ServerConfig
5
+ from flwr.server.strategy import FedAvg
6
+ from transformers import AutoModelForSequenceClassification
7
+
8
+ from $import_name.task import get_weights
9
+
10
+
11
+ def server_fn(context: Context):
12
+ # Read from config
13
+ num_rounds = context.run_config["num-server-rounds"]
14
+ fraction_fit = context.run_config["fraction-fit"]
15
+
16
+ # Initialize global model
17
+ model_name = context.run_config["model-name"]
18
+ num_labels = context.run_config["num-labels"]
19
+ net = AutoModelForSequenceClassification.from_pretrained(
20
+ model_name, num_labels=num_labels
21
+ )
22
+
23
+ weights = get_weights(net)
24
+ initial_parameters = ndarrays_to_parameters(weights)
25
+
26
+ # Define strategy
27
+ strategy = FedAvg(
28
+ fraction_fit=fraction_fit,
29
+ fraction_evaluate=1.0,
30
+ initial_parameters=initial_parameters,
31
+ )
32
+ config = ServerConfig(num_rounds=num_rounds)
33
+
34
+ return ServerAppComponents(strategy=strategy, config=config)
35
+
36
+
37
+ # Create ServerApp
38
+ app = ServerApp(server_fn=server_fn)
@@ -4,24 +4,25 @@ import warnings
4
4
  from collections import OrderedDict
5
5
 
6
6
  import torch
7
+ import transformers
8
+ from datasets.utils.logging import disable_progress_bar
7
9
  from evaluate import load as load_metric
10
+ from flwr_datasets import FederatedDataset
11
+ from flwr_datasets.partitioner import IidPartitioner
8
12
  from torch.optim import AdamW
9
13
  from torch.utils.data import DataLoader
10
14
  from transformers import AutoTokenizer, DataCollatorWithPadding
11
15
 
12
- from flwr_datasets import FederatedDataset
13
- from flwr_datasets.partitioner import IidPartitioner
14
-
15
-
16
16
  warnings.filterwarnings("ignore", category=UserWarning)
17
- DEVICE = torch.device("cpu")
18
- CHECKPOINT = "distilbert-base-uncased" # transformer model checkpoint
17
+ warnings.filterwarnings("ignore", category=FutureWarning)
18
+ disable_progress_bar()
19
+ transformers.logging.set_verbosity_error()
19
20
 
20
21
 
21
22
  fds = None # Cache FederatedDataset
22
23
 
23
24
 
24
- def load_data(partition_id: int, num_partitions: int):
25
+ def load_data(partition_id: int, num_partitions: int, model_name: str):
25
26
  """Load IMDB data (training and eval)"""
26
27
  # Only initialize `FederatedDataset` once
27
28
  global fds
@@ -35,10 +36,12 @@ def load_data(partition_id: int, num_partitions: int):
35
36
  # Divide data: 80% train, 20% test
36
37
  partition_train_test = partition.train_test_split(test_size=0.2, seed=42)
37
38
 
38
- tokenizer = AutoTokenizer.from_pretrained(CHECKPOINT)
39
+ tokenizer = AutoTokenizer.from_pretrained(model_name)
39
40
 
40
41
  def tokenize_function(examples):
41
- return tokenizer(examples["text"], truncation=True)
42
+ return tokenizer(
43
+ examples["text"], truncation=True, add_special_tokens=True, max_length=512
44
+ )
42
45
 
43
46
  partition_train_test = partition_train_test.map(tokenize_function, batched=True)
44
47
  partition_train_test = partition_train_test.remove_columns("text")
@@ -59,12 +62,12 @@ def load_data(partition_id: int, num_partitions: int):
59
62
  return trainloader, testloader
60
63
 
61
64
 
62
- def train(net, trainloader, epochs):
65
+ def train(net, trainloader, epochs, device):
63
66
  optimizer = AdamW(net.parameters(), lr=5e-5)
64
67
  net.train()
65
68
  for _ in range(epochs):
66
69
  for batch in trainloader:
67
- batch = {k: v.to(DEVICE) for k, v in batch.items()}
70
+ batch = {k: v.to(device) for k, v in batch.items()}
68
71
  outputs = net(**batch)
69
72
  loss = outputs.loss
70
73
  loss.backward()
@@ -72,12 +75,12 @@ def train(net, trainloader, epochs):
72
75
  optimizer.zero_grad()
73
76
 
74
77
 
75
- def test(net, testloader):
78
+ def test(net, testloader, device):
76
79
  metric = load_metric("accuracy")
77
80
  loss = 0
78
81
  net.eval()
79
82
  for batch in testloader:
80
- batch = {k: v.to(DEVICE) for k, v in batch.items()}
83
+ batch = {k: v.to(device) for k, v in batch.items()}
81
84
  with torch.no_grad():
82
85
  outputs = net(**batch)
83
86
  logits = outputs.logits
@@ -8,7 +8,7 @@ version = "1.0.0"
8
8
  description = ""
9
9
  license = "Apache-2.0"
10
10
  dependencies = [
11
- "flwr[simulation]>=1.10.0",
11
+ "flwr[simulation]>=1.11.0",
12
12
  "flwr-datasets>=0.3.0",
13
13
  "torch==2.2.1",
14
14
  "transformers>=4.30.0,<5.0",
@@ -29,10 +29,18 @@ clientapp = "$import_name.client_app:app"
29
29
 
30
30
  [tool.flwr.app.config]
31
31
  num-server-rounds = 3
32
+ fraction-fit = 0.5
32
33
  local-epochs = 1
34
+ model-name = "prajjwal1/bert-tiny" # Set a larger model if you have access to more GPU resources
35
+ num-labels = 2
33
36
 
34
37
  [tool.flwr.federations]
35
38
  default = "localhost"
36
39
 
37
40
  [tool.flwr.federations.localhost]
38
41
  options.num-supernodes = 10
42
+
43
+ [tool.flwr.federations.localhost-gpu]
44
+ options.num-supernodes = 10
45
+ options.backend.client-resources.num-cpus = 4 # each ClientApp assumes to use 4CPUs
46
+ options.backend.client-resources.num-gpus = 0.25 # at most 4 ClientApps will run in a given GPU
@@ -20,10 +20,9 @@ import subprocess
20
20
  import sys
21
21
  from logging import DEBUG
22
22
  from pathlib import Path
23
- from typing import Any, Dict, List, Optional
23
+ from typing import Annotated, Any, Optional
24
24
 
25
25
  import typer
26
- from typing_extensions import Annotated
27
26
 
28
27
  from flwr.cli.build import build
29
28
  from flwr.cli.config_utils import load_and_validate
@@ -52,7 +51,7 @@ def run(
52
51
  typer.Argument(help="Name of the federation to run the app on."),
53
52
  ] = None,
54
53
  config_overrides: Annotated[
55
- Optional[List[str]],
54
+ Optional[list[str]],
56
55
  typer.Option(
57
56
  "--run-config",
58
57
  "-c",
@@ -125,8 +124,8 @@ def run(
125
124
 
126
125
  def _run_with_superexec(
127
126
  app: Path,
128
- federation_config: Dict[str, Any],
129
- config_overrides: Optional[List[str]],
127
+ federation_config: dict[str, Any],
128
+ config_overrides: Optional[list[str]],
130
129
  ) -> None:
131
130
 
132
131
  insecure_str = federation_config.get("insecure")
@@ -187,8 +186,8 @@ def _run_with_superexec(
187
186
 
188
187
  def _run_without_superexec(
189
188
  app: Optional[Path],
190
- federation_config: Dict[str, Any],
191
- config_overrides: Optional[List[str]],
189
+ federation_config: dict[str, Any],
190
+ config_overrides: Optional[list[str]],
192
191
  federation: str,
193
192
  ) -> None:
194
193
  try: