故障排查
安装问题
Q: pip install 报错 "not a supported wheel on this platform"
原因:whl 文件名中的 python 版本和架构 tag 与目标环境不匹配。
解决:在目标环境的 Python 下重新构建 whl:
cd hyper-parallel
./build.sh
# 安装 build.sh 最后打印的精确 wheel 路径
wheel_path=/absolute/path/printed/by/build.sh
pip install "${wheel_path}"
如明确只需要不含 optional native 组件的 core-only wheel,可使用
./build.sh --multicore off。indexed Dataset helper 是基础组件,没有独立关闭开关。
Q: 导入时报错 GLIBC_2.xx not found
原因:运行环境 glibc 版本低于 wheel 内 ELF 的版本需求。
解决:在不高于目标运行环境 glibc 基线的 OS 镜像内重新构建 wheel。
Q: 导入 native 组件时报错 undefined symbol
原因:装载到进程的 native 库与 Python、框架、CANN 或 CXX11 ABI 组合不匹配。
解决:记录完整符号名和实际加载的 .so 路径,确认 wheel 的 Python/架构标签、框架与 CANN
配套关系,以及框架需求的 CXX11 ABI 一致。
Q: PyTorch 扩展构建失败
原因:PyTorch/torch_npu/CANN 版本不配套,或 CXX11 ABI 不匹配。
解决:使用与当前 CANN 配套的 PyTorch/torch_npu,并确认 native adapter 按当前 PyTorch 报告的
compiled_with_cxx11_abi() 值构建。该值可能为 0 或 1,必须与实际框架一致。
python -c "import torch; print(torch.__version__); print(torch.compiled_with_cxx11_abi())"
运行时问题
Q: DTensor redistribute 性能差
原因:redistribute 缓存未命中,每次 redistribute 都重新计算 layout。
解决:确保 compact_str + rank_id 缓存生效。避免在训练循环内频繁创建新的 Layout 对象。
Q: FSDP 在 tp>1/dp=1 场景下报错
原因:FSDP 在 meta 上下文中构造 device mesh 时,tp>1/dp=1 场景下 mesh 初始化异常。
解决:此问题已在 v1.0.0 修复。确保使用最新版本。
Q: HSDP overlap 模式下梯度不正确
原因:梯度同步流与计算流冲突。
解决:使用 hsdp_sync_stream 正确管理梯度同步流。
Q: Pipeline Parallel 某些 stage 没收到数据
原因:PP stage index 配置错误,或 micro_batch_num 不匹配。
解决:
- 检查
PipelineStage(submodule, stage_index, stage_num)参数是否正确 - 确保所有 stage 的
stage_num一致 - MindSpore 后端确保 batch_size 整除 micro_batch_num
Q: overlap_b_f 导致死锁
原因:MoE 层数不对称,FWD/BWD chunk 层数不一致导致 barrier 死等。
解决:确保 FWD/BWD chunk 层数一致。不一致时需要在装钩时按短边对齐。
Q: Activation Swap 后精度下降或行为异常
常见原因:
- 未设置 swap 预取(须调用
SwapManager.set_forward_prefetch_layer),或在 PP 场景使用 swap,导致 offload 未按预期执行。 - 小 tensor 的 DMA 开销大于收益,或
policy_fn误配。 - 未在 compute stream 访问前调用
wait_load/wait_offload(见 Activation Checkpoint 指南)。
解决:使用 policy_fn 过滤小 tensor,只 swap 大激活;并确保层间 prefetch 链已注册。
from hyper_parallel.core.activation_checkpoint import CheckpointPolicy, SwapManager
def swap_policy(tensor):
if tensor.numel() < 1024:
return CheckpointPolicy.MUST_SAVE # 小 tensor 不 swap,保留在设备上
return CheckpointPolicy.MUST_SWAP # 大激活 offload 到 host
for i in range(len(model.layers) - 1):
SwapManager().set_forward_prefetch_layer(model.layers[i], model.layers[i + 1])
Q: Context Parallel 在 MindSpore 上不工作
原因:DSA 系列 async CP 目前仅 PyTorch 后端支持。
解决:MindSpore 后端使用基础 ContextParallel,DSA 系列为 noop 占位。
通信问题
Q: HCCL 通信超时
原因:进程组初始化问题或网络拓扑配置错误。
解决:
from hyper_parallel import init_process_group
# 确保正确初始化进程组
init_process_group(backend="hccl")
检查 HCCL 配置:
HCCL_WHITELIST_DISABLE=1HCCL_CONNECT_TIMEOUT=1800
Q: Gloo backend 在 NPU 场景下报错
原因:Gloo backend 不支持 NPU 通信。
解决:NPU 场景使用 HCCL backend。Gloo 仅用于 CPU 级别测试。
内存问题
Q: OOM(Out of Memory)
常见原因与解决:
| 原因 | 解决 |
|---|---|
| 模型太大 | 使用 FSDP(fully_shard)切分参数/优化器状态 |
| 序列太长 | 使用 CP(ContextParallel)切分序列维度 |
| micro_batch_num 太多 | 减少 micro_batch_num 或使用 Activation Swap |
| PP stage 不平衡 | 使用 SAPP-PPB 自动平衡 |
Q: FSDP 下 optimizer 内存仍然很高
原因:optimizer 状态未正确分片。
解决:确保使用 fully_shard 后再创建 optimizer。FSDP 会自动将 optimizer 状态分片。
from hyper_parallel.core.optimizer import get_hyper_optimizer
model = fully_shard(model, mesh=mesh) # 先 FSDP
optimizer = get_hyper_optimizer(...) # 后创建 optimizer
调试技巧
1. 检查进程组状态
from hyper_parallel import get_backend, get_process_group_ranks
print(get_backend())
print(get_process_group_ranks(group))
2. 检查 DTensor layout
# 查看分布式张量的 layout 信息
print(dtensor.layout)
print(dtensor.placements)
print(dtensor.to_local().shape)
3. 确定性模式调试
启用确定性模式进行精度调试:
# 启用确定性可帮助发现 SDC 和精度不一致问题
4. 检查 FSDP shard 状态
# 查看 FSDP 分片后的参数状态
for name, param in model.named_parameters():
if isinstance(param, DTensor):
print(f"{name}: mesh={param.layout.mesh}, placements={param.placements}")