Checklist / 检查清单
Bug Description / Bug 描述
背景 / Motivation
长上下文 QLoRA(如 32k)时,仅 FSDP 只能切分权重,每卡仍跑满序列,激活/cross_entropy 容易 OOM;仅 SP/CP 切序列可以顶住,但缺少权重分片。Axolotl
已有一等配方 FSDP2 + context_parallel_size(例如 4 卡上 CP=2 × dp_shard=2)。ms-swift 分别提供:
• FSDP / FSDP2(权重分片)
• --sequence_parallel_size(Ulysses + Ring,文档中的 SP)
但没有官方文档/示例将两者作为推荐组合;仓库脚本与示例多为「二选一」。我们希望 ms-swift 明确支持(或明确拒绝并给出安全替代)FSDP(+FSDP2) + SP/CP 的 2D
并行,并保证 CP/SP × FSDP shard 与 world_size 一致(例如 4 GPU → 2×2)。
实际行为 / What happens
在 2× GPU 上同时启用 accelerate FSDP(QLoRA / bitsandbytes 4bit)与 --sequence_parallel_size=2 时,模型可完成加载并进入
training_step,但在首步前向/loss 路径出现:
torch.AcceleratorError: CUDA error: an illegal memory access was encountered
堆栈大致落在 Trainer training_step → compute_loss / template SFT loss(与 ring/SP + FSDP 同进程组叠用相关)。这与「纯 FSDP @ 32k → CUDA OOM」或「纯 SP
可跑」都不同,更像未文档化组合下的错误/未定义行为,而非单纯显存不足。
对比:同机同模型用 Axolotl FSDP2 + CP,在 mesh 维度与 world_size 对齐(如 4 卡 2×2)时可正常建并行布局;若误设 CP×dp_shard > world_size
会在启动期明确报错,而不是 silent 进 step 后 illegal access。
期望 / Expected
- 文档中给出官方支持的 FSDP2 + --sequence_parallel_size(或等价 CP) 配方(含 2/4/8 卡下 SP/CP 与 FSDP shard 如何取值,使乘积 = world_size)。
- 若不支持:在参数解析阶段 显式报错(类似 “FSDP and sequence_parallel are mutually exclusive”),避免进训练后 CUDA illegal access。
- 若支持:提供最小可复现示例(QLoRA + FA2 + 长 max_length),并说明与 DeepSpeed / device_map 的互斥关系。
环境摘要 / Environment (summary)
• ms-swift ~4.4.x,PyTorch 2.11 + CUDA 12.8,flash-attn 2.8.x
• 模型:Qwen2.5-72B 类 dense(Kimi-Dev-72B),QLoRA 4bit + LoRA on attn projs
• 2× GPU 时实验叠开 FSDP + sequence_parallel_size=2 → illegal memory access
• 纯 FSDP @ 32k → OOM;多卡纯 SP 长序列可顶住(与「需要切序列」一致
How to Reproduce / 如何复现
- 安装带 FA 的 GPU 环境:ms-swift、bitsandbytes、flash-attn、accelerate FSDP。
- 准备任一 Qwen2 dense 大模型 QLoRA 配置,max_length 设为较长(如 8192–32768),attn_impl=flash_attn。
- 双卡启动,同时打开:
• accelerate distributed_type=FSDP(或 ms-swift FSDP2 路径)
• --sequence_parallel_size 2(及项目所需的 padding_free / SP 相关项)
• QLoRA:--quant_method bnb --quant_bits 4,--bnb_4bit_quant_storage bfloat16 等
- 观察:权重可加载,进入首个 training_step 后出现 CUDA error: an illegal memory access was encountered(非清晰的 OOM / 互斥参数错误)。
- 对照:同一设置去掉 FSDP、只保留 sequence_parallel_size=2(或去掉 SP、只保留 FSDP)时,失败模式变为可解释的 OOM 或可训练,而不是同一 illegal
access。
Additional Information / 补充信息
No response
Checklist / 检查清单
Bug Description / Bug 描述
背景 / Motivation
长上下文 QLoRA(如 32k)时,仅 FSDP 只能切分权重,每卡仍跑满序列,激活/cross_entropy 容易 OOM;仅 SP/CP 切序列可以顶住,但缺少权重分片。Axolotl
已有一等配方 FSDP2 + context_parallel_size(例如 4 卡上 CP=2 × dp_shard=2)。ms-swift 分别提供:
• FSDP / FSDP2(权重分片)
• --sequence_parallel_size(Ulysses + Ring,文档中的 SP)
但没有官方文档/示例将两者作为推荐组合;仓库脚本与示例多为「二选一」。我们希望 ms-swift 明确支持(或明确拒绝并给出安全替代)FSDP(+FSDP2) + SP/CP 的 2D
并行,并保证 CP/SP × FSDP shard 与 world_size 一致(例如 4 GPU → 2×2)。
实际行为 / What happens
在 2× GPU 上同时启用 accelerate FSDP(QLoRA / bitsandbytes 4bit)与 --sequence_parallel_size=2 时,模型可完成加载并进入
training_step,但在首步前向/loss 路径出现:
torch.AcceleratorError: CUDA error: an illegal memory access was encountered
堆栈大致落在 Trainer training_step → compute_loss / template SFT loss(与 ring/SP + FSDP 同进程组叠用相关)。这与「纯 FSDP @ 32k → CUDA OOM」或「纯 SP
可跑」都不同,更像未文档化组合下的错误/未定义行为,而非单纯显存不足。
对比:同机同模型用 Axolotl FSDP2 + CP,在 mesh 维度与 world_size 对齐(如 4 卡 2×2)时可正常建并行布局;若误设 CP×dp_shard > world_size
会在启动期明确报错,而不是 silent 进 step 后 illegal access。
期望 / Expected
环境摘要 / Environment (summary)
• ms-swift ~4.4.x,PyTorch 2.11 + CUDA 12.8,flash-attn 2.8.x
• 模型:Qwen2.5-72B 类 dense(Kimi-Dev-72B),QLoRA 4bit + LoRA on attn projs
• 2× GPU 时实验叠开 FSDP + sequence_parallel_size=2 → illegal memory access
• 纯 FSDP @ 32k → OOM;多卡纯 SP 长序列可顶住(与「需要切序列」一致
How to Reproduce / 如何复现
• accelerate distributed_type=FSDP(或 ms-swift FSDP2 路径)
• --sequence_parallel_size 2(及项目所需的 padding_free / SP 相关项)
• QLoRA:--quant_method bnb --quant_bits 4,--bnb_4bit_quant_storage bfloat16 等
access。
Additional Information / 补充信息
No response