Nvflare Convert Pytorch
NVIDIAOfficialCreated by NVIDIA FLARE Team
- Skill
- Workflow
- Software development
- Apache-2.0
- Medium risk
- Has scripts
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides a structured procedure for migrating existing, manual PyTorch training code into an NVFLARE federated learning environment. It focuses on wrapping standard PyTorch training loops, models, and data loaders to support federated model exchange, local validation, and job export. The process emphasizes maintaining the integrity of the original training logic while integrating it into the NVFLARE Client API, ensuring that model parameters, metrics, and optimizer steps are correctly handled across federated rounds.
What it does
- Inspects existing PyTorch source code to extract training, model, and data loading logic.
- Generates a federated training client using the NVFLARE Client API.
- Configures federated jobs using standard recipes like FedAvg.
- Implements model exchange patterns for PyTorch state_dict objects.
- Validates the converted job through local simulation and artifact inspection.
- Exports the final federated job structure for deployment.
When to use it
- When you have a working, plain PyTorch training script that you want to run in a federated learning setting.
- When you need to implement model aggregation across multiple sites using PyTorch.
- When you require local validation of federated training rounds before full-scale deployment.
- When you need to convert manual training loops into a structured NVFLARE job format.
Advantages
- Automates the boilerplate required to transition from local to federated training.
- Ensures consistent handling of model parameters and metric reporting.
- Provides a validated path for job construction and configuration.
- Maintains compatibility with standard PyTorch workflows and data structures.
Usage examples
- “Convert my existing PyTorch training script to an NVFLARE job.”
- The agent will inspect your script, identify the model and training loop, and generate the necessary client.py and job.py files to run it as an NVFLARE federated task.
- “How do I add local validation to my PyTorch federated job?”
- The agent will guide you through integrating your existing evaluation logic into the NVFLARE Client API, ensuring metrics are correctly reported back to the server.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/nvidia/nvflare-convert-pytorch/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip nvflare-convert-pytorch.zip -d .agents/skills
Documentation by NVIDIA FLARE Team
NVFLARE Convert PyTorch
Use When
Use when converting an existing plain PyTorch training script, torch.nn.Module,
manual training loop, state_dict workflow, data loader, checkpoint, or metric loop
into an NVFLARE federated training job. Supports horizontal FL, Client API model
exchange with FLModel, recipe aggregator= hooks, validation, and export.
Do Not Use When
Do not use for PyTorch Lightning (route to nvflare-convert-lightning), Hugging Face Trainer (route to nvflare-convert-huggingface), TensorFlow, XGBoost,
scikit-learn, failed jobs (route to
nvflare-diagnose-job), federated statistics without training (route to
nvflare-fed-stats), or generic PyTorch debugging without FLARE intent. Out of
scope: production deployment, Kubernetes, POC lifecycle, privacy/security policy design,
controller/workflow rewrites outside recipe or Job APIs, experiment search, and
data distribution experiments beyond minimal validation setup. Privacy-protection
requests — HE/encrypted aggregation, differential privacy, and privacy filters — need provisioning/deployment
policy; route onward rather than substituting an unprotected recipe or adding only a disclaimer.
If a request combines federated statistics and model-training conversion,
treat it as two independent jobs and workflows: do not merge or automatically
chain them, do not route the combination to nvflare-orient, and ask which
workflow to run first before generating or running either job. Recommend
nvflare-fed-stats first only when the user's purpose is to understand data
distribution; handle conversion later as a separate request.
Workflow
Load
../nvflare-shared/references/conversion-common.mdand apply it for the whole conversion; this SKILL.md states only the framework-specific deltas. Load../nvflare-shared/references/conversion-workflow.mdonly for a non-standard rerun, authorization, or missing-semantics case; it no longer holds the data-location or partitioning contracts, whose invariantsconversion-common.mdowns. Load../nvflare-shared/references/site-data-and-paths.mdfor generated partitions, relative paths, or per-site data locations.Inspect before editing with
nvflare agent inspect source <path> --format jsonplus direct reading. Fact extraction is static; do not import or execute user training modules to discover fields. Extract: training entrypoint, model class path and constructor args, checkpoint behavior, train/eval functions, data loading, metric names and denominators, local epochs/steps, requested client and round counts, source data split or partition evidence, tracking evidence, DDP evidence, and any custom aggregation intent.Apply the dependency-install ordering rule in
../nvflare-shared/references/conversion-common.mdbefore any Python command imports user, PyTorch, NVFLARE, or declared dependency modules.Select the recipe from the requested FL workflow, not from PyTorch alone. For the standard case — the user explicitly requests FedAvg and inspection identifies PyTorch — run
nvflare recipe show fedavg-pt --format jsondirectly and construct it; do not add per-site recipe config unless sites actually differ. Load../nvflare-shared/references/pytorch-family-recipe-selection.md(discovery, algorithm guide, catalog-based selection, HE-not-supported rule) only for ambiguous or non-FedAvg algorithms, reservingnvflare recipe listfor those cases. Use the module, class, and parameters returned byrecipe showfor standardjob.pyconstruction; forfedavg-pt, importFedAvgRecipefromnvflare.app_opt.pt.recipes.fedavg, never fromnvflare.recipe. After everyrecipe show, load../nvflare-shared/references/pytorch-family-recipe-construction.mdand derive the recipe's construction capabilities. Loadreferences/recipe-selection.mdonly when non-FedAvg or execution-mode details are needed.Convert training and evaluation as a pair using
references/pytorch-client-api-conversion.md: initialize FLARE, receive anFLModel, loadparams, evaluate the received global model, train, and send anFLModelwith updatedparams,metrics, and the actual completed local optimizer-step count inNUM_STEPS_CURRENT_ROUND. Adapt the user's evaluation code into the packaged evaluation template; if evaluation is required but missing, ask or fail closed. Apply the step-1 data-location rules to the generated client's data argument.Add or update
job.pyunder the shared constructor-serialization rule: use explicitclass_path(or documentedpathalias) plus completeargswhenever reconstruction needs values. Add requestedaggregator=wiring, metric, tensor-transport, server offload, and execution settings derived from the shared PyTorch-family construction profile.Validate in a ladder per
../nvflare-shared/references/validation-evidence.md: compile checks, recipe construction, one final full-run path chosen by the artifact being validated, with export and package inspection only for the selected exported-artifact path. For a local target, inspect the materialized configs and packaging evidence after that run. Usereferences/job-validation.mdfor PyTorch-specific failures. Stop at the first failed rung and report the product error. Use the environment and permission mechanisms supplied by the agent host; do not inspect or enforce its security boundary.Report the recipe, changed files, validation status, metrics, and exact artifact paths. Load
../nvflare-shared/references/metrics-and-artifact-reporting.mdonly when normal metric artifacts are absent or inconsistent.
Requirements
Must audit model constructor arguments before writing
job.pyby reading the model module's__init__and the selected recipe'smodelparameter fromnvflare recipe show <recipe-name> --format json, not by reading NVFLARE library source. Emit the selected recipe's documentedclass_pathorpathkey plus completeargsfor every required or overridden constructor value; a directtorch.nn.Moduleis allowed only when unchanged zero-argument defaults reconstruct it. Values must be statically clear from literal source, configuration, or supplied metadata. Otherwise ask one semantic question when an answer channel exists or fail closed.Must follow
../nvflare-shared/references/pytorch-model-exchange.mdandreferences/pytorch-client-api-conversion.mdfor the canonical plain-PyTorch payload and round-loop pattern.Must apply
../nvflare-shared/references/pytorch-family-recipe-construction.mdafterrecipe show; it is the canonical policy for optional recipe parameters, model selection, tensor transport, server disk offload, and execution mode. Never patch a framework-neutral runtime module or register FOBS handlers inclient.py.Must convert source evaluation alongside training and return metrics through
FLModel.metrics; must not synthesize metric semantics without source evidence.Must count completed local optimizer steps in each generated training round and send that positive value as
MetaKey.NUM_STEPS_CURRENT_ROUND. This is the FedAvg aggregation weight; do not omit it, reuse a cumulative count, or invent a value when the source loop cannot establish it.Must load checkpoints with
torch.load(..., weights_only=True); a checkpoint that needs full unpickling is ask/fail, perreferences/pytorch-client-api-conversion.md.Must not make non-PyTorch-family skills load
../nvflare-shared/references/pytorch-model-exchange.md; that reference is for plain PyTorch, PyTorch Lightning, and Hugging Face Trainer model/state-dict exchange only.Site partitioning, custom aggregation, the Source Of Truth Boundary, and user input/authorization follow
../nvflare-shared/references/conversion-common.md.
Always read this converter SKILL.md together with
../nvflare-shared/references/conversion-common.md. The standard routing,
recipe selection, and reporting path is inline, so common FedAvg does not load
broad policy or algorithm-selection references. Load the client template,
model-exchange reference, validation reference, and aggregator asset only when
their phase needs them. Load other detailed references only for exceptions:
../nvflare-shared/references/conversion-workflow.mdfor the full conversion contract when a case is non-standard;../nvflare-shared/references/site-data-and-paths.mdonly for generated site partitions, relative-path resolution, or per-site data locations;../nvflare-shared/references/pytorch-family-recipe-selection.mdonly for ambiguous or non-FedAvg algorithms, andreferences/recipe-selection.mdonly for non-FedAvg or execution-mode construction details not supplied byrecipe show;../nvflare-shared/references/pytorch-family-recipe-construction.mdafter everyrecipe show;../nvflare-shared/references/dependency-install.mdonly when an install is needed;../nvflare-shared/references/runtime-output-guidance.mdonly for read-only source roots or user-chosen output destinations;../nvflare-shared/references/metrics-and-artifact-reporting.mdonly when metrics are absent or inconsistent;../nvflare-shared/references/validation-evidence.mdbefore validation, and../nvflare-shared/references/pytorch-model-exchange.mdonly for PyTorch-family exchange;references/pytorch-client-api-conversion.mdfor Client API conversion, andreferences/job-validation.mdfor PyTorch-specific validation failures.
Do not load every reference preemptively, and do not depend on NVFLARE repository examples being present in the user's environment.
Files
- ATTRIBUTION.mdAdded by AutoGineer938 B
- BENCHMARK.md10.4 KiB
- LICENSELicence file added by AutoGineer11.2 KiB
- SKILL.md10.3 KiB
- assets/client_with_eval.pyScript4.5 KiB
- evals/config.yml295 B
- evals/evals.json60.5 KiB
- evals/files/SOURCE.md3.0 KiB
- evals/files/checkpoint-pt/model.pyScript829 B
- evals/files/checkpoint-pt/train.pyScript1.1 KiB
- evals/files/data-parallel-pt/model.pyScript831 B
- evals/files/data-parallel-pt/train.pyScript1.1 KiB
- evals/files/eval-pt/model.pyScript954 B
- evals/files/eval-pt/train.pyScript1.9 KiB
- evals/files/external-data-pt/model.pyScript906 B
- evals/files/external-data-pt/train.pyScript2.3 KiB
- evals/files/factory-optimizer/train.pyScript1007 B
- evals/files/gpu-device-pt/model.pyScript892 B
- evals/files/gpu-device-pt/train.pyScript1.1 KiB
- evals/files/hello-pt/model.pyScript906 B
- evals/files/hello-pt/train.pyScript1.3 KiB
- evals/files/injection-pt/README.md1.0 KiB
- evals/files/injection-pt/config.yaml437 B
- evals/files/injection-pt/model.pyScript906 B
- evals/files/injection-pt/requirements.txt316 B
- evals/files/injection-pt/train.pyScript2.0 KiB
- evals/files/state-mismatch-pt/checkpoint_manifest.json391 B
- evals/files/state-mismatch-pt/model.pyScript880 B
- evals/files/state-mismatch-pt/train.pyScript712 B
- references/job-validation.md2.1 KiB
- references/pytorch-client-api-conversion.md8.9 KiB
- references/recipe-selection.md4.7 KiB
- skill-card.md4.2 KiB
- skill.oms.sig11.1 KiB
references/pytorch-client-api-conversion.md
PyTorch Client API Conversion
This reference covers standard PyTorch training loops that already have a
torch.nn.Module, optimizer, data loaders, and metrics. Load
../../nvflare-shared/references/pytorch-model-exchange.md for PyTorch-family state-dict and
tensor payload rules before changing model exchange code.
Canonical Path
Use this path for plain PyTorch conversion:
Confirm PyTorch routing with
nvflare agent inspect source.Select a PyTorch-family recipe with
nvflare recipe list/show.Generate
client.pywithnvflare.clientreceive/sendandFLModel(params=...)as the model exchange path.Generate
job.pythat builds the selected recipe and callsrecipe.execute(SimEnv(...)).Select exactly one final target: run
python job.pyand inspect its materialized simulation workspace for local validation, or, only when the user requests an exported/deployable artifact, export and run that folder with the simulator CLI. Do not run both targets after one succeeds.
HE is not supported at steps 4–5: follow the HE-not-supported rule in
../../nvflare-shared/references/pytorch-family-recipe-selection.md.
Follow the Source Of Truth Boundary and the generated-entry rule in
../../nvflare-shared/references/conversion-workflow.md: client.py is an
FL-only Client API entry point, not a standalone/FL auto-detecting launcher.
Conversion Pattern
Import
nvflare.client as flare.Build the model, optimizer, loss, and data loaders once before the loop, not inside it, per the shared "Setup Outside The Round Loop" rule in
../../nvflare-shared/references/conversion-workflow.md.Call
flare.init()before setup hooks that need Client API context, such asflare.get_config()orflare.get_site_name(), while still keeping setup outside the federated round loop.Loop while
flare.is_running().Call
flare.receive()to get the incomingFLModel.Load
input_model.paramsinto the PyTorch model withload_state_dict.Train or evaluate using the user's existing data loader and optimizer.
Count only optimizer steps completed in the current round. The generated
train_one_roundhelper must return this positive count; do not use an estimated, cumulative, or default value.Send the trained weights with the canonical plain-PyTorch payload pattern in
../../nvflare-shared/references/pytorch-model-exchange.md. Do not callmodel.cpu(), which moves the persistent model off the training device.
PyTorch Parameter Payload Type
Use the exact outbound payload contract and send snippet in
../../nvflare-shared/references/pytorch-model-exchange.md. Apply the separate
recipe-capability policy in
../../nvflare-shared/references/pytorch-family-recipe-construction.md; its
server disk-offload optimization does not change the client payload contract or
execution mode.
Source Layout
Use the canonical FLARE source layout defined in
../../nvflare-shared/references/conversion-workflow.md ("Generated Job Layout"):
client.py, model.py, job.py, and the optional aggregators.py, data-setup,
and requirements files. Avoid ad hoc entry-point names such as fl_train.py
unless the user explicitly requests that naming, and use
../../nvflare-shared/references/runtime-output-guidance.md for runtime
workspaces, exported job directories, and validation output locations.
During export inspection, verify generated or project-local modules referenced
by server-side class_path config are packaged into the server app with
recipe.add_server_file(...) or an equivalent server-targeted API. The
train_script import closure packages client apps and is not enough for
per-site exports that create app_server separately. Installed NVFLARE,
framework, and third-party class paths stay runtime dependencies and are
validated through requirements installation plus import/preflight checks.
For standard FedAvg, package shared generated files for all clients. Do not replace all-client deployment with explicit per-site deployment unless the conversion has real per-site differences such as different scripts, arguments, data-split settings, or launch behavior.
For multi-site conversion from a single-node PyTorch source, the generated
client or data-loader setup must filter the local training data by site. Do not
let every simulated site train on the full source training set unless the user
explicitly asks for shared training data or the source already provides
site-specific data that resolves to that behavior. Validation/test loaders may
remain shared only when that matches the source's validation/test semantics.
For generated Pandas partition code, follow
../../nvflare-shared/references/site-data-and-paths.md.
Model Construction Consistency
Follow the shared model-config and construction-consistency rule in
../../nvflare-shared/references/conversion-workflow.md ("Recipe Model Config"):
same class and constructor args on server and client, explicit config whenever
reconstruction needs a constructor value, and derive-or-ask/fail-closed for it.
PyTorch-specific delta: the client loads input_model.params into the model
with load_state_dict, so the server-initial model and the client model must
have matching state-dict shapes (same parameter names and tensor shapes), not
only matching constructor args.
Acceptable patterns include:
a shared
model_argsdict imported by bothjob.pyandclient.py;an explicit recipe model config such as
{"class_path": "model.ModelClass", "args": model_args}(preferclass_path;pathis the normalized job-config key);a small JSON/config file read by both sides;
explicit CLI arguments passed through recipe
train_argsand parsed byclient.py, with the same values used injob.py.
Before simulation, validate the generated model construction path when possible
by instantiating the server-side and client-side model with the same arguments
and checking that load_state_dict can accept the initial parameters. Treat a
state-dict key or tensor-shape mismatch as a conversion bug, not as a reason to
change the model architecture without user approval.
Paired Evaluation Template
Training and evaluation are a pair: every converted training loop that has
source evaluation evidence must also convert that evaluation, and its metrics
must reach the server through FLModel.metrics. Adapt the user's existing
evaluation code into this template. Do not synthesize metric semantics,
validation loaders, label mappings, or averaging denominators from scratch
without source evidence; when evaluation is required but the source has none,
ask in interactive mode or fail closed in unattended mode.
Follow the "Best-Model Metric" contract in
../../nvflare-shared/references/pytorch-family-recipe-construction.md. It owns
metric-name matching and lower-is-better direction; this reference owns where
evaluation occurs in the plain-PyTorch round loop.
The self-contained runnable template ships at
../assets/client_with_eval.py; adapt it rather than duplicating its code here
or depending on repository examples/. It initializes setup once, receives and
loads the global model, evaluates that received model, handles evaluation-only
tasks, trains, and sends the canonical model payload, source-backed metric, and
the actual completed optimizer-step count for FedAvg weighting. If the source
loop cannot establish that count, ask in interactive mode or fail closed in
unattended mode instead of silently using equal client weights.
The round FLModel.metrics is this pre-training evaluation of the received
global model, not a post-training metric — see
../../nvflare-shared/references/metrics-and-artifact-reporting.md
("Received-Model Metric Ownership").
When the task is evaluation-only or cross-site evaluation, use
flare.is_evaluate() to send flare.FLModel(metrics=...) without local
training and without params.
Checkpoint Loading Safety
Generated code that loads PyTorch checkpoint files must use safe weight-only
loading: torch.load(..., weights_only=True). A checkpoint that requires full
pickle unpickling or custom executable deserialization is not statically safe;
ask in interactive mode or fail closed in unattended mode instead of loading
it.
Scope Boundaries
Keep user model architecture and loss function unless the user asks for a change.
Keep data loading local to the site and do not add code that copies private data into generated artifacts.
For checkpoints, preserve user checkpoint semantics and document what is federated versus site-local.
For metrics, send scalar summaries in the
metricsfield. Use../../nvflare-shared/references/metrics-and-artifact-reporting.mdfor generic final metrics, round metrics, model artifact paths, and missing-evidence reporting.
Job Pattern Reference
Load recipe-selection.md before creating or updating job.py so the selected
recipe matches the user's requested FL workflow. Do not assume NVFLARE
repository examples are available in the user's environment.
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs Python
Security
What our scanner noticed· Medium risk
- Phrasing that asks for actions without confirmation
- Large base64-encoded blobs
- Scripts that your agent may run
This skill includes scripts that your agent may run. Read them before you use it.
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- NVIDIA FLARE Team
- Publisher
- NVIDIA (Official)
- Source
- NVIDIA/skills · skills/nvflare-convert-pytorch · commit fce3cca
- Licence
- Apache License 2.0 (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE-APACHE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by NVIDIA FLARE Team or NVIDIA.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download nvflare-convert-pytorch.zip