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.
- fedmodelkit-0.9.3/.gitlab-ci.yml +47 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/PKG-INFO +1 -1
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/pyproject.toml +1 -1
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/cli.py +1 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/mlflow_service/server.py +1 -1
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/ds.ipynb +85 -12
- fedmodelkit-0.9.3/src/FedModelKit/templates/extern_pyproject.toml +27 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/pyproject.toml +13 -2
- fedmodelkit-0.9.3/uv.lock +3181 -0
- fedmodelkit-0.8.0/src/FedModelKit/templates/extern_pyproject.toml +0 -16
- fedmodelkit-0.8.0/uv.lock +0 -3063
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/.gitignore +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/.python-version +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/LICENSE +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/README.md +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/images/aggregator.png +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/images/federated_learning_model.png +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/images/local_learner.png +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/README.md +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/__init__.py +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/aggregator.py +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/local_learner.py +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/mlflow_service/__init__.py +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/mlflow_service/client.py +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/mlflow_service/messages.py +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/py.typed +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/client_app.py +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/do1.ipynb +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/do2.ipynb +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/datasetPartition0.png +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/datasetPartition1.png +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/do1CreatesSyftDataset.png +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/do1LogsInDatasite.png +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/do1LogsInSyftBoxDatasite.png +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/do1ReviewsJob.png +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/do2CreatesSyftADataset.png +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/do2LogsInDatasite.png +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/do2LogsInSyftBoxDatasite.png +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/do2ReviewsJob.png +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/doSendModels.png +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/doWaitsForJobs.png +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/dsAggregateModels.png +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/dsAggregatedWeights.png +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/dsBootstrapping.png +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/dsDoneSubmittingJobs.png +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/dsExploresDOsDatasets.png +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/dsLogsInAsGuests.png +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/dsPreparesSyftFlwrProject.png +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/dsRunsSyftFLWRSimulation.png +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/dsSendsJobs.png +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/dsSimulationLogs.png +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/dsSubmitsJobs.png +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/dsSyftFlwrProjectArch.png +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/dsWaitsForJobsToBeApproved.png +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/fltraining.gif +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/fltraining.mp4 +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/localSyftBoxNetwork.png +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/images/overview.png +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/init.py +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/readme.md +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/server_app.py +0 -0
- {fedmodelkit-0.8.0 → fedmodelkit-0.9.3}/src/FedModelKit/templates/task.py +0 -0
- {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.
|
|
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
|
|
@@ -276,7 +276,7 @@ class MLflowServerCoordinator:
|
|
|
276
276
|
|
|
277
277
|
coordination_message = Message(
|
|
278
278
|
content=recordset,
|
|
279
|
-
message_type="query.
|
|
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
|
-
"
|
|
86
|
-
"
|
|
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
|
-
"
|
|
288
|
+
" logger.info(\"Bootstrapped project successfully ✅\")\n",
|
|
275
289
|
"except Exception as e:\n",
|
|
276
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
447
|
+
"logger.success(job)"
|
|
431
448
|
]
|
|
432
449
|
},
|
|
433
450
|
{
|
|
@@ -436,14 +453,14 @@
|
|
|
436
453
|
"metadata": {},
|
|
437
454
|
"outputs": [],
|
|
438
455
|
"source": [
|
|
439
|
-
"
|
|
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
|
-
"
|
|
463
|
+
"logger.success(job)"
|
|
447
464
|
]
|
|
448
465
|
},
|
|
449
466
|
{
|
|
@@ -473,7 +490,44 @@
|
|
|
473
490
|
"metadata": {},
|
|
474
491
|
"outputs": [],
|
|
475
492
|
"source": [
|
|
476
|
-
"
|
|
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.
|
|
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]
|