Skip to content
Merged
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
14 changes: 11 additions & 3 deletions src/prime_rl/trainer/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
from torch.distributed.checkpoint.state_dict_loader import load as dcp_load
from torch.distributed.device_mesh import DeviceMesh
from torch.distributed.fsdp import CPUOffloadPolicy, FSDPModule, MixedPrecisionPolicy, OffloadPolicy, fully_shard
from torch.distributed.tensor import Shard
from transformers import AutoConfig, AutoModelForCausalLM, AutoTokenizer, GenerationConfig, PretrainedConfig
from transformers.tokenization_utils import PreTrainedTokenizer
from transformers.utils.import_utils import is_flash_attn_3_available
Expand Down Expand Up @@ -504,16 +505,23 @@ def setup_fsdp(model: nn.Module, config: ModelConfig, parallel_dims: ParallelDim
mp_policy = MixedPrecisionPolicy(param_dtype=torch.bfloat16, reduce_dtype=DTYPE_MAP[config.reduce_dtype])
offload_policy: OffloadPolicy = CPUOffloadPolicy(pin_memory=True) if config.fsdp_cpu_offload else OffloadPolicy()

shard_placement_fn = get_fsdp_shard_placement_fn(model) if config.fusions.shard_fused_on_dim1 else None
fused_shard_placement_fn = get_fsdp_shard_placement_fn(model) if config.fusions.shard_fused_on_dim1 else None
hsdp_mesh = parallel_dims.get_mesh("hsdp")
Comment thread
hubert-marek marked this conversation as resolved.
Resolved
shard_size = parallel_dims.get_mesh("dp_shard_cp").size()

def shard_placement_fn(parameter: nn.Parameter) -> Shard | None:
# Qwen's single-row shared-expert gates need equal shards for Muon's all-to-all.
if parameter.ndim == 2 and parameter.shape[0] == 1 and parameter.shape[1] % shard_size == 0:
return Shard(1)
Comment thread
hubert-marek marked this conversation as resolved.
Resolved
return fused_shard_placement_fn(parameter) if fused_shard_placement_fn is not None else None
Comment thread
hubert-marek marked this conversation as resolved.
Resolved

fsdp_config = {
"mp_policy": mp_policy,
"offload_policy": offload_policy,
"reshard_after_forward": config.reshard_after_forward,
"shard_placement_fn": shard_placement_fn,
}

hsdp_mesh = parallel_dims.get_mesh("hsdp")

dp_mod_ep_mesh: DeviceMesh | None = None
if parallel_dims.ep_enabled:
dp_mod_ep_mesh_dim_names = []
Expand Down
Loading