FedModelKit 0.8.0__tar.gz → 0.9.3__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.
Files changed (63) hide show
  1. fedmodelkit-0.9.3/.gitlab-ci.yml +47 -0
  2. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/PKG-INFO +1 -1
  3. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/pyproject.toml +1 -1
  4. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/cli.py +1 -0
  5. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/mlflow_service/server.py +1 -1
  6. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/ds.ipynb +85 -12
  7. fedmodelkit-0.9.3/src/FedModelKit/templates/extern_pyproject.toml +27 -0
  8. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/pyproject.toml +13 -2
  9. fedmodelkit-0.9.3/uv.lock +3181 -0
  10. fedmodelkit-0.8.0/src/FedModelKit/templates/extern_pyproject.toml +0 -16
  11. fedmodelkit-0.8.0/uv.lock +0 -3063
  12. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/.gitignore +0 -0
  13. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/.python-version +0 -0
  14. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/LICENSE +0 -0
  15. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/README.md +0 -0
  16. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/images/aggregator.png +0 -0
  17. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/images/federated_learning_model.png +0 -0
  18. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/images/local_learner.png +0 -0
  19. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/README.md +0 -0
  20. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/__init__.py +0 -0
  21. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/aggregator.py +0 -0
  22. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/local_learner.py +0 -0
  23. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/mlflow_service/__init__.py +0 -0
  24. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/mlflow_service/client.py +0 -0
  25. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/mlflow_service/messages.py +0 -0
  26. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/py.typed +0 -0
  27. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/client_app.py +0 -0
  28. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/do1.ipynb +0 -0
  29. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/do2.ipynb +0 -0
  30. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/datasetPartition0.png +0 -0
  31. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/datasetPartition1.png +0 -0
  32. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/do1CreatesSyftDataset.png +0 -0
  33. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/do1LogsInDatasite.png +0 -0
  34. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/do1LogsInSyftBoxDatasite.png +0 -0
  35. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/do1ReviewsJob.png +0 -0
  36. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/do2CreatesSyftADataset.png +0 -0
  37. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/do2LogsInDatasite.png +0 -0
  38. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/do2LogsInSyftBoxDatasite.png +0 -0
  39. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/do2ReviewsJob.png +0 -0
  40. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/doSendModels.png +0 -0
  41. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/doWaitsForJobs.png +0 -0
  42. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/dsAggregateModels.png +0 -0
  43. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/dsAggregatedWeights.png +0 -0
  44. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/dsBootstrapping.png +0 -0
  45. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/dsDoneSubmittingJobs.png +0 -0
  46. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/dsExploresDOsDatasets.png +0 -0
  47. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/dsLogsInAsGuests.png +0 -0
  48. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/dsPreparesSyftFlwrProject.png +0 -0
  49. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/dsRunsSyftFLWRSimulation.png +0 -0
  50. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/dsSendsJobs.png +0 -0
  51. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/dsSimulationLogs.png +0 -0
  52. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/dsSubmitsJobs.png +0 -0
  53. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/dsSyftFlwrProjectArch.png +0 -0
  54. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/dsWaitsForJobsToBeApproved.png +0 -0
  55. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/fltraining.gif +0 -0
  56. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/fltraining.mp4 +0 -0
  57. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/localSyftBoxNetwork.png +0 -0
  58. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/overview.png +0 -0
  59. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/init.py +0 -0
  60. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/readme.md +0 -0
  61. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/server_app.py +0 -0
  62. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/task.py +0 -0
  63. {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates.py +0 -0
@@ -0,0 +1,47 @@
1
+ image: python:3.12-slim
2
+
3
+ stages:
4
+ - check
5
+ - build
6
+ - publish
7
+
8
+ variables:
9
+ UV_VERSION: "0.5.18"
10
+
11
+ # Install uv once and reuse across jobs
12
+ .uv-base:
13
+ before_script:
14
+ - pip install uv==$UV_VERSION
15
+
16
+ check_project:
17
+ stage: check
18
+ extends: .uv-base
19
+ script:
20
+ - uv lock --check
21
+ - uv build --sdist
22
+
23
+ build_package:
24
+ stage: build
25
+ extends: .uv-base
26
+ script:
27
+ - uv build
28
+ artifacts:
29
+ paths:
30
+ - dist/
31
+ rules:
32
+ - if: $CI_COMMIT_TAG
33
+
34
+ publish_to_pypi:
35
+ stage: publish
36
+ extends: .uv-base
37
+ id_tokens:
38
+ PYPI_ID_TOKEN:
39
+ aud: https://pypi.org
40
+ script:
41
+ - uv pip install --system twine
42
+ - TWINE_USERNAME=__token__ TWINE_PASSWORD=$PYPI_ID_TOKEN twine upload
43
+ --verbose dist/*
44
+ rules:
45
+ - if: $CI_COMMIT_TAG
46
+ dependencies:
47
+ - build_package
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: FedModelKit
3
- Version: 0.8.0
3
+ Version: 0.9.3
4
4
  Summary: Tools to scaffold and run privacy-preserving federated learning experiments across distributed data sites.
5
5
  Author-email: ceresale <alessandro.ceresi@upm.es>
6
6
  License-File: LICENSE
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "FedModelKit"
3
- version = "0.8.0"
3
+ version = "0.9.3"
4
4
  description = "Tools to scaffold and run privacy-preserving federated learning experiments across distributed data sites."
5
5
  readme = "README.md"
6
6
  authors = [
@@ -36,6 +36,7 @@ def create_structure(exp_name: str = "new_experiment") -> None:
36
36
  structure = {
37
37
  f"{exp_name}": {
38
38
  "pyproject.toml": get_pyproject(exp_name),
39
+ ".python-version": "3.12",
39
40
  f"{exp_name}": {
40
41
  "__init__.py": get_init(),
41
42
  "task.py": get_task(),
@@ -276,7 +276,7 @@ class MLflowServerCoordinator:
276
276
 
277
277
  coordination_message = Message(
278
278
  content=recordset,
279
- message_type="query.mlflow.coordination",
279
+ message_type="query.mlflow_coordination",
280
280
  dst_node_id=node_id,
281
281
  group_id="mlflow_coordination",
282
282
  ttl=DEFAULT_TTL,
@@ -67,6 +67,15 @@
67
67
  "<img src=\"./images/dsLogsInAsGuests.png\" width=\"53%\" alt=\"DS logs into DOs' datasites as guests\">"
68
68
  ]
69
69
  },
70
+ {
71
+ "cell_type": "code",
72
+ "execution_count": null,
73
+ "metadata": {},
74
+ "outputs": [],
75
+ "source": [
76
+ "!uv sync"
77
+ ]
78
+ },
70
79
  {
71
80
  "cell_type": "code",
72
81
  "execution_count": null,
@@ -80,10 +89,14 @@
80
89
  "DS = Client.load().email\n",
81
90
  "logger.info(f\"DS's email: {DS}\")\n",
82
91
  "\n",
92
+ "USE_RDS_DASHBOARD = False\n",
93
+ "ds = sy.init_session(host=DS, email=DS, start_syft_event_server=not USE_RDS_DASHBOARD)\n",
94
+ "\n",
83
95
  "DO1 = \"data.owner1@example.com\"\n",
84
96
  "DO2 = \"data.owner2@example.com\"\n",
85
- "do1_guest = sy.init_session(host=DO1)\n",
86
- "do2_guest = sy.init_session(host=DO2)"
97
+ "\n",
98
+ "do1_guest = sy.init_session(host=DO1, email=DS)\n",
99
+ "do2_guest = sy.init_session(host=DO2, email=DS)"
87
100
  ]
88
101
  },
89
102
  {
@@ -270,17 +283,18 @@
270
283
  "\n",
271
284
  "try:\n",
272
285
  " !rm -rf {SYFT_FLWR_PROJECT_PATH / \"main.py\"}\n",
286
+ " logger.info(f\"syft_flwr version = {syft_flwr.__version__}\")\n",
273
287
  " syft_flwr.bootstrap(SYFT_FLWR_PROJECT_PATH, aggregator=DS, datasites=do_emails)\n",
274
- " print(\"Bootstrapped project successfully ✅\")\n",
288
+ " logger.info(\"Bootstrapped project successfully ✅\")\n",
275
289
  "except Exception as e:\n",
276
- " print(e)"
290
+ " logger.error(e)"
277
291
  ]
278
292
  },
279
293
  {
280
294
  "cell_type": "markdown",
281
295
  "metadata": {},
282
296
  "source": [
283
- "## ▶️ Start MLflow (local)\n",
297
+ "## ▶️ Start MLflow (for local simulation)\n",
284
298
  "\n",
285
299
  "Run this in a terminal:\n",
286
300
  "```bash\n",
@@ -308,7 +322,10 @@
308
322
  "os.environ[\"MLFLOW_EXP_NAME\"] = \"EXPERIMENT_NAME\"\n",
309
323
  "os.environ[\"MLFLOW_CLIENT_EMAILS\"] = \",\".join(do_emails)\n",
310
324
  "os.environ[\"MLFLOW_ENABLE_LOGGING\"] = \"true\"\n",
311
- "os.environ[\"MLFLOW_TRACKING_URI\"] = \"http://localhost:5000\""
325
+ "os.environ[\"MLFLOW_TRACKING_URI\"] = \"\" # For simulation http://localhost:5000\n",
326
+ "os.environ[\"MLFLOW_TRACKING_USERNAME\"] = \"\" # For simulation leave empty\n",
327
+ "os.environ[\"MLFLOW_TRACKING_TOKEN\"] = \"\" # For simulation leave empty\n",
328
+ "os.environ[\"MLFLOW_WORKSPACE\"] = \"\" # For simulation leave empty"
312
329
  ]
313
330
  },
314
331
  {
@@ -420,14 +437,14 @@
420
437
  "metadata": {},
421
438
  "outputs": [],
422
439
  "source": [
423
- "print(f\"sending job to {do1_guest.host}\")\n",
440
+ "logger.info(f\"sending job to {do1_guest.host}\")\n",
424
441
  "job = do1_guest.job.submit(\n",
425
442
  " name=\"EXPERIMENT_NAME\",\n",
426
443
  " user_code_path=SYFT_FLWR_PROJECT_PATH,\n",
427
444
  " dataset_name=SYFTBOX_DATASET_NAME,\n",
428
445
  " entrypoint=\"main.py\",\n",
429
446
  ")\n",
430
- "print(job)"
447
+ "logger.success(job)"
431
448
  ]
432
449
  },
433
450
  {
@@ -436,14 +453,14 @@
436
453
  "metadata": {},
437
454
  "outputs": [],
438
455
  "source": [
439
- "print(f\"sending job to {do2_guest.host}\")\n",
456
+ "logger.info(f\"sending job to {do2_guest.host}\")\n",
440
457
  "job = do2_guest.job.submit(\n",
441
458
  " name=\"EXPERIMENT_NAME\",\n",
442
459
  " user_code_path=SYFT_FLWR_PROJECT_PATH,\n",
443
460
  " dataset_name=SYFTBOX_DATASET_NAME,\n",
444
461
  " entrypoint=\"main.py\",\n",
445
462
  ")\n",
446
- "print(job)"
463
+ "logger.success(job)"
447
464
  ]
448
465
  },
449
466
  {
@@ -473,7 +490,44 @@
473
490
  "metadata": {},
474
491
  "outputs": [],
475
492
  "source": [
476
- "!uv run {str(SYFT_FLWR_PROJECT_PATH / \"main.py\")} --active"
493
+ "job = ds.job.submit(\n",
494
+ " name=\"EXPERIMENT_NAME_DS\",\n",
495
+ " user_code_path=SYFT_FLWR_PROJECT_PATH,\n",
496
+ " entrypoint=\"main.py\",\n",
497
+ ")\n",
498
+ "job"
499
+ ]
500
+ },
501
+ {
502
+ "cell_type": "code",
503
+ "execution_count": null,
504
+ "metadata": {},
505
+ "outputs": [],
506
+ "source": [
507
+ "ds.job.get_all()"
508
+ ]
509
+ },
510
+ {
511
+ "cell_type": "code",
512
+ "execution_count": null,
513
+ "metadata": {},
514
+ "outputs": [],
515
+ "source": [
516
+ "ds.job.approve(job)"
517
+ ]
518
+ },
519
+ {
520
+ "cell_type": "code",
521
+ "execution_count": null,
522
+ "metadata": {},
523
+ "outputs": [],
524
+ "source": [
525
+ "import os\n",
526
+ "\n",
527
+ "os.environ[\"LOGURU_LEVEL\"] = \"DEBUG\"\n",
528
+ "os.environ[\"SYFT_FLWR_MSG_TIMEOUT\"] = \"120\"\n",
529
+ "\n",
530
+ "ds.run_private(ds.job.get_all()[0], blocking=True)"
477
531
  ]
478
532
  },
479
533
  {
@@ -493,6 +547,25 @@
493
547
  "<img src=\"./images/dsAggregatedWeights.png\" width=\"35%\" alt=\"DS weights\">"
494
548
  ]
495
549
  },
550
+ {
551
+ "cell_type": "code",
552
+ "execution_count": null,
553
+ "metadata": {},
554
+ "outputs": [],
555
+ "source": [
556
+ "ds.job.show_logs(job)\n",
557
+ "ds.job.get_output_dir(job)"
558
+ ]
559
+ },
560
+ {
561
+ "cell_type": "code",
562
+ "execution_count": null,
563
+ "metadata": {},
564
+ "outputs": [],
565
+ "source": [
566
+ "ds.job.delete_all()"
567
+ ]
568
+ },
496
569
  {
497
570
  "cell_type": "markdown",
498
571
  "metadata": {},
@@ -520,4 +593,4 @@
520
593
  },
521
594
  "nbformat": 4,
522
595
  "nbformat_minor": 2
523
- }
596
+ }
@@ -0,0 +1,27 @@
1
+ [project]
2
+ name = "EXPERIMENT_NAME"
3
+ version = "0.1.0"
4
+ description = "Description of the experiment"
5
+ readme = "README.md"
6
+ requires-python = ">=3.13"
7
+ dependencies = [
8
+ "FedModelKit>=0.9.3",
9
+ "imblearn>=0.0",
10
+ "jupyterlab>=4.4.4",
11
+ "loguru>=0.7.3",
12
+ "scikit-learn==1.6.1",
13
+ "torch==2.7.0",
14
+ "ray>=2.47.1",
15
+ "syft-client==0.1.94",
16
+ "syft-core==0.3.0",
17
+ "syft-crypto==0.1.2",
18
+ "syft-dataset==0.1.5",
19
+ "syft-event==0.4.3",
20
+ "syft-flwr==0.5.1",
21
+ "syft-job==0.1.39",
22
+ "syft-notebook-ui==0.1.1",
23
+ "syft-permissions==0.1.14",
24
+ "syft-perms==0.1.14",
25
+ "syft-rds==0.5.0",
26
+ "syft-rpc==0.4.1",
27
+ ]
@@ -10,13 +10,24 @@ version = "1.0.0"
10
10
  description = "Description of the experiment"
11
11
  license = "Apache-2.0"
12
12
  dependencies = [
13
- "FedModelKit>=0.7.0",
13
+ "FedModelKit>=0.9.3",
14
14
  "imblearn>=0.0",
15
15
  "jupyterlab>=4.4.4",
16
16
  "loguru>=0.7.3",
17
17
  "scikit-learn==1.6.1",
18
- "syft-flwr>=0.4.0",
19
18
  "torch==2.7.0",
19
+ "syft-client==0.1.94",
20
+ "syft-core==0.3.0",
21
+ "syft-crypto==0.1.2",
22
+ "syft-dataset==0.1.5",
23
+ "syft-event==0.4.3",
24
+ "syft-flwr==0.5.1",
25
+ "syft-job==0.1.39",
26
+ "syft-notebook-ui==0.1.1",
27
+ "syft-permissions==0.1.14",
28
+ "syft-perms==0.1.14",
29
+ "syft-rds==0.5.0",
30
+ "syft-rpc==0.4.1",
20
31
  ]
21
32
 
22
33
  [tool.hatch.build.targets.wheel]