Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ def main(grid: Grid, context: Context) -> None:
pyproject_path="/absolute/path/to/your-app/pyproject.toml", # absolute!
app_name="My federated run",
author={"name": "Your Name", "orcid": "https://orcid.org/0000-0000-0000-0000"},
license="https://spdx.org/licenses/MIT.html",
license="http://spdx.org/licenses/MIT",
) as tracker:
result = strategy.start(
grid=grid,
Expand Down Expand Up @@ -164,7 +164,7 @@ as absolute paths.
| `pyproject_path` | recommended | Path to your app's `pyproject.toml`. **Use an absolute path.** Default: `"pyproject.toml"` |
| `app_name` | no | Human-readable name for the crate's root dataset |
| `author` | no | `"Name"` or `{"name": ..., "orcid": ..., "affiliation": ...}` — becomes a `Person` entity (ORCID as `@id`) |
| `license` | no | License for the crate root, e.g. an SPDX URL `"https://spdx.org/licenses/MIT.html"` |
| `license` | no | License for the crate root, e.g. an SPDX URL `"http://spdx.org/licenses/MIT"` |
| `agent` | no | Who executed the run, same format as `author`. Defaults to the author |

### Semantic metric identifiers
Expand Down Expand Up @@ -204,7 +204,7 @@ The crate's `@graph` contains, linked together:
| `./` | `Dataset` | Root: name, author, license, `conformsTo` the FL profile, `mentions` the run |
| `#fl-run` | `CreateAction` | The run: `agent`, `startTime`/`endTime`, `actionStatus`, instrument/object/result |
| `#flower` | `SoftwareApplication` | Flower with its installed version |
| `#framework-*` | `SoftwareApplication` | Every declared dependency (minus an infrastructure deny-list): `softwareRequirements` = the declared version spec, `softwareVersion` = the actually-installed version |
| `#framework-*` | `SoftwareApplication` | Every declared dependency (minus an infrastructure deny-list): `softwareRequirements` = the declared version spec, `version` = the actually-installed version |
| `#fl-strategy` | `SoftwareApplication` | The aggregation strategy with its hyperparameters as `PropertyValue`s |
| `#param-*` | `PropertyValue` | Run configuration inputs (the action's `object`) |
| `#metric-*` | `PropertyValue` | Final-round metrics, attached to the output model (with `propertyID` when mapped) |
Expand Down
70 changes: 48 additions & 22 deletions examples/quickstart-pytorch/ro-crate-metadata.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,19 @@
{
"@id": "./",
"@type": "Dataset",
"author": {
"@id": "https://orcid.org/0009-0000-0000-0000"
},
"conformsTo": {
"@id": "https://esciencelab.org.uk/federated-learning-ro-crate-profile/federated-learning-profile.html"
},
"author": [
{
"@id": "https://orcid.org/0009-0000-0000-0000"
}
],
"conformsTo": [
{
"@id": "https://esciencelab.org.uk/federated-learning-ro-crate-profile/federated-learning-profile.html"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We need a permalink for this, it is not good to use an unversioned HTML page as a Profile, for instance we would then need to use <link> signposting in the HTML to upgrade it to a Profile Crate.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what would you recommend for the permalink? presumably something under w3id/ro -
https://w3id.org/ro/fl-crate ?

I anticipated that the original version of the profile would need changes during flwrCrate implementation but it's been okay! so we probably can freeze the version now as 0.1

},
{
"@id": "https://w3id.org/ro/wfrun/process/0.6"
}
],
"datePublished": "2026-06-10T10:25:49+00:00",
"description": "RO-Crate describing a federated learning run captured with flwrCrate.",
"hasPart": [
Expand All @@ -20,9 +27,11 @@
"@id": "metrics_log.json"
}
],
"license": {
"@id": "https://spdx.org/licenses/MIT.html"
},
"license": [
{
"@id": "http://spdx.org/licenses/MIT"
}
],
"mentions": [
{
"@id": "#fl-run"
Expand All @@ -42,13 +51,26 @@
},
{
"@id": "https://esciencelab.org.uk/federated-learning-ro-crate-profile/federated-learning-profile.html",
"@type": "CreativeWork",
"name": "Federated Learning RO-Crate profile v0.1"
"@type": [
"CreativeWork",
"Profile"
],
"name": "Federated Learning RO-Crate profile",
"version": "0.1"
},
{
"@id": "https://w3id.org/ro/wfrun/process/0.6",
"@type": [
"CreativeWork",
"Profile"
],
"name": "Process Run Crate",
"version": "0.6"
},
{
"@id": "https://spdx.org/licenses/MIT.html",
"@id": "http://spdx.org/licenses/MIT",
"@type": "CreativeWork",
"name": "https://spdx.org/licenses/MIT.html"
"name": "http://spdx.org/licenses/MIT"
},
{
"@id": "https://orcid.org/0009-0000-0000-0000",
Expand All @@ -59,24 +81,24 @@
"@id": "#flower",
"@type": "SoftwareApplication",
"name": "Flower",
"softwareVersion": "1.30.0",
"url": "https://flower.ai/"
"url": "https://flower.ai/",
"version": "1.30.0"
},
{
"@id": "#framework-torch",
"@type": "SoftwareApplication",
"name": "PyTorch",
"softwareRequirements": "==2.8.0",
"softwareVersion": "2.8.0",
"url": "https://pytorch.org/"
"url": "https://pytorch.org/",
"version": "2.8.0"
},
{
"@id": "#framework-torchvision",
"@type": "SoftwareApplication",
"name": "TorchVision",
"softwareRequirements": "==0.23.0",
"softwareVersion": "0.23.0",
"url": "https://pytorch.org/vision/"
"url": "https://pytorch.org/vision/",
"version": "0.23.0"
},
{
"@id": "#strategy-param-arrayrecord-key",
Expand Down Expand Up @@ -156,7 +178,9 @@
}
],
"description": "Federated aggregation strategy (flwr.serverapp.strategy.fedavg).",
"name": "FedAvg"
"name": "FedAvg",
"url": "https://flower.ai/",
"version": "1.30.0"
},
{
"@id": "final_model.pt",
Expand All @@ -179,11 +203,13 @@
}
],
"description": "Final global model produced by the federated learning run.",
"encodingFormat": "application/octet-stream",
"name": "Final aggregated model"
},
{
"@id": "metrics_log.json",
"@type": "File",
"contentSize": "1511",
"description": "Per-round training and evaluation metrics, plus federation details (participant/supernode counts and configuration) for the whole run.",
"encodingFormat": "application/json",
"name": "Per-round metrics and federation log"
Expand Down Expand Up @@ -265,7 +291,7 @@
"@id": "https://orcid.org/0009-0000-0000-0000"
},
"description": "Run using strategy FedAvg (flwr.serverapp.strategy.fedavg), 3 rounds.",
"endTime": "2026-06-10T10:25:49.281661+00:00",
"endTime": "2026-06-10T10:25:49+00:00",
"instrument": [
{
"@id": "#flower"
Expand Down Expand Up @@ -309,7 +335,7 @@
"@id": "metrics_log.json"
}
],
"startTime": "2026-06-10T10:25:00.091740+00:00"
"startTime": "2026-06-10T10:25:00+00:00"
}
]
}
2 changes: 1 addition & 1 deletion examples/quickstart-pytorch/server_app.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ def main(grid: Grid, context: Context) -> None:
pyproject_path="/absolute/path/to/quickstart-pytorch/pyproject.toml",
app_name="Quickstart PyTorch (demo)",
author={"name": "Ali Faizollah", "orcid": "https://orcid.org/0009-0000-0000-0000"},
license="https://spdx.org/licenses/MIT.html",
license="http://spdx.org/licenses/MIT",
) as tracker:
result = strategy.start(
grid=grid,
Expand Down
Loading
Loading