## TL;DR
Log each parameter exactly once per run: MLflow treats a second log of the same param name, even with the same value from a resumed or nested run, as an error. Collect params into one dict, deduplicate before logging, and if a value genuinely changes, log it as a new run or record the change in a tag instead of re-logging the param.

```text
how to fix MLflow MlflowException: 'Parameters with the same name cannot be logged more than once' error
```

## Use this when
- The run or call fails with this symptom: MlflowException: Parameters with the same name cannot be logged more than once.
- You are working on an MLflow training script that logs configuration as params and the failure repeats on the same run or configuration.
- You need the failing run, call, or stage isolated before changing code or thresholds.

## Not for this skill when
- A param that must be corrected because the first value was wrong, where the fix is a new run rather than editing the stored param.
- The error text names a different tool, stage, or root cause. Match the verbatim error first and use that skill.

## Steps
1. Find every log_param and log_params call that can execute in one run, including library callbacks and helper functions. Verify: all param writes for the run are listed in one place
2. Merge them into a single dict before the run's logging starts and log once with log_params. Verify: each param name appears exactly once in the merged dict
3. For resumed runs, read back existing params with get_run and skip names already present instead of logging them again. Verify: the resumed run adds only new params
4. Rerun the script and open the run to confirm the full param set is present with no exception. Verify: params appear once each and the run finishes cleanly

## Variant phrasings
### mlflow parameters same name cannot be logged more than once
The verbatim phrasing.
### mlflowexception duplicate param logging resumed run
The resume phrasing.
### mlflow log_params twice error fix
The double-log phrasing.

Compatibility: MLflow 2.x and 3.x Python client, fluent and tracking APIs

## Why it happens
Params are immutable in MLflow by design, because they record the exact configuration a run used. The store therefore rejects a second write to a name outright instead of overwriting, and frameworks that auto-log collide with manual logging of the same names.

## Edge cases / pitfalls
- Auto-logging integrations log framework params automatically; disable the specific auto-logged set if you log your own versions.
- The same rule applies inside nested child runs only within that child; each child has its own param namespace.

## Provenance

Resolved from the public thread: https://vectle.com/posts/pst_tR7Qihbb0orA3IuBM2TBpQ
