## Description
When `peft_config` is set and `base_sync_done` is `True`,
`per_tensor_param` is assigned directly from the `params` dict instead
of `params.items()`, causing `ValueError: too many values to unpack
(expected 2)` when passed to `get_named_tensor_buckets()` which expects
an iterator of `(name, tensor)` tuples.
This fix adds an `isinstance()` check to handle both dict and iterator
cases, maintaining backward compatibility while fixing SGLang rollout
with LoRA adapters.
**Fixes:** `ValueError` in `sglang_rollout.update_weights()` →
`get_named_tensor_buckets()`
**Related:** Multi-turn RL training with LoRA adapters on SGLang backend
---
### What does this PR do?
This PR fixes a type mismatch bug in `fsdp_workers.py` that occurs when
using LoRA adapters with SGLang backend. The issue manifests during
weight synchronization when FSDP workers attempt to pass parameters to
the bucket creation function.
**Root Cause:** Line 681 in `verl/workers/fsdp_workers.py` assigns
`params` dict directly to `per_tensor_param`, but downstream code at
line 1520 in `get_named_tensor_buckets()` expects an iterator of `(name,
tensor)` tuples for unpacking.
**Solution:** Add backward-compatible `isinstance()` check that converts
dict to `.items()` iterator when needed:
```python
per_tensor_param = params.items() if isinstance(params, dict) else params
### What does this PR do?
add ascend megatron merge support
### Checklist Before Starting
- [x] Search for similar PRs. Paste at least one query link here: ...
- [x] Format the PR title as `[{modules}] {type}: {description}` (This
will be checked by the CI)
- `{modules}` include `fsdp`, `megatron`, `sglang`, `vllm`, `rollout`,
`trainer`, `ci`, `training_utils`, `recipe`, `hardware`, `deployment`,
`ray`, `worker`, `single_controller`, `misc`, `perf`, `model`, `algo`,
`env`, `tool`, `ckpt`, `doc`, `data`
- If this PR involves multiple modules, separate them with `,` like
`[megatron, fsdp, doc]`
- `{type}` is in `feat`, `fix`, `refactor`, `chore`, `test`
- If this PR breaks any API (CLI arguments, config, function signature,
etc.), add `[BREAKING]` to the beginning of the title.
- Example: `[BREAKING][fsdp, megatron] feat: dynamic batching`
### Test
> For changes that can not be tested by CI (e.g., algorithm
implementation, new model support), validate by experiment(s) and show
results like training curve plots, evaluation results, etc.
### API and Usage Example
> Demonstrate how the API changes if any, and provide usage example(s)
if possible.
```python
# Add code snippet or script demonstrating how to use this
```
### Design & Code Changes
> Demonstrate the high-level design if this PR is complex, and list the
specific changes.
### Checklist Before Submitting
> [!IMPORTANT]
> Please check all the following items before requesting a review,
otherwise the reviewer might deprioritize this PR for review.
- [x] Read the [Contribute
Guide](https://github.com/volcengine/verl/blob/main/CONTRIBUTING.md).
- [x] Apply [pre-commit
checks](https://github.com/volcengine/verl/blob/main/CONTRIBUTING.md#code-linting-and-formatting):
`pre-commit install && pre-commit run --all-files --show-diff-on-failure
--color=always`
- [ ] Add / Update [the
documentation](https://github.com/volcengine/verl/tree/main/docs).
- [ ] Add unit or end-to-end test(s) to [the CI
workflow](https://github.com/volcengine/verl/tree/main/.github/workflows)
to cover all the code. If not feasible, explain why: ...
- [ ] Once your PR is ready for CI, send a message in [the `ci-request`
channel](https://verl-project.slack.com/archives/C091TCESWB1) in [the
`verl` Slack
workspace](https://join.slack.com/t/verl-project/shared_invite/zt-3855yhg8g-CTkqXu~hKojPCmo7k_yXTQ).
(If not accessible, please try [the Feishu group
(飞书群)](https://applink.larkoffice.com/client/chat/chatter/add_by_link?link_token=772jd4f1-cd91-441e-a820-498c6614126a).)
@ -678,7 +678,7 @@ class ActorRolloutRefWorker(Worker, DistProfilerExtension):
set_expandable_segments(False)
ifpeft_configisnotNoneandself.base_sync_done:
per_tensor_param=params
per_tensor_param=params.items()ifisinstance(params,dict)elseparams# Fixed: handle dict case
else:
device=get_device_id()# used when fsdp2 set cpu_offload_policy
per_tensor_param=(
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.