本文使用fsdp为后端,对Intern-S2-Preview模型进行强化学习。
支持使用语言、多模态语料进行训练。暂不支持对Intern-S2-Preview模型的时序模块进行训练。
本文档采用verl fully_async_policy进行训练。
| 配套 | 版本 | 环境准备指导 |
|---|---|---|
| CANN | cann-8.5.1 | 快速安装CANN |
| torch | 2.9.0+cpu | - |
| torch_npu | 2.9.0.post1 | - |
| transformers | 5.8.1 | - |
| vllm | 0.18.0 | - |
| vllm-ascend | 0.18.0 | - |
| verl | 0.8.0 | - |
32 * NPU(910B A2)
下文以/workspace作为源码安装的根目录
docker pull quay.io/ascend/vllm-ascend:v0.18.0通过命令,或通过服务平台加载镜像。
请按照以下文档更新镜像,在vllm18版本上支持Intern-S2-Preview。
https://ai.gitcode.com/Ascend-SACT/Intern-S2-Preview_vllm
提升权重加载和保存性能
torch/distributed/_shard/sharding_spec/_internals.py
https://github.com/pytorch/pytorch/pull/167073
def validate_non_overlapping_shards_metadata(shards: list[ShardMetadata]):
"""
Ensures none of the shards overlap with each other.
Args:
shards(List[ShardMetadata]): List of :class:`ShardMetadata` objects representing
each shard.
Raises:
``ValueError`` if there's overlap in any two shards.
"""
returntorch/distributed/checkpoint/default_planner.py
https://github.com/pytorch/pytorch/pull/166820
def _validate_global_plan(global_plan: list[SavePlan], metadata: Metadata) -> bool:
all_good = True
return all_goodpip install mathruler
pip install qwen-vl-utils
pip install transformers==5.8.1
pip install triton-ascend==3.2.1 --no-deps
pip install liger-kernel --no-deps在workspace目录下
cd /workspace
git clone https://gitcode.com/longboat/verl8.git verl
cd verl
git checkout origin/intern_s2_preview -b intern_s2_preview
pip install -e .
mkdir logsfully_async fix: Patch vllm weight loader for qwen3-moe series
modelscope download --model Shanghai_AI_Laboratory/Intern-S2-Preview --local_dir ./Intern-S2-PreviewIntern-S2-Preview权重目录中modeling文件,是基于transformers 5.2版本生成。
transformers 已修正多个bug,如:
fix bug with position_ids on qwen3-vl models, such that position_ids include text position
Fix VL model rope_deltas batch size mismatch in online RL training
Fix MoE routers returning probabilities instead of logits
因此需更新Intern-S2-Preview权重目录中modeling文件,升级modeling文件到transformers 5.8.1版本。
请下载如下两个文件,并替换入Intern-S2-Preview权重目录。
processing_interns2_preview.py
说明: modeling_interns2_preview.py文件也可以选择如下链接,改名后覆盖到权重目录。
该文件不加载time_series参数,fsdp启动时,约节省1G显存。
在verl代码中已增加从原始权重获取time_series参数并保存的流程。具体见问题3.
modeling_interns2_preview_no-ts.py
下载verl提供的多模态测试数据集geo3k
cd verl
python examples/data_preprocess/geo3k.py --local_save_dir /datasets/geo3k下载verl提供的测试数据集dapo-math-17k和aime-2024。
cd verl
python ./examples/data_preprocess/dapo_multiturn_w_tool.py --local_save_dir /datasets/dapo-math-17k
python ./examples/data_preprocess/aime2024_multiturn_w_tool.py --local_save_dir /datasets/aime-2024在首节点执行
ray start --head在其他节点执行:(以首节点IP为10.119.5.215为例)
ray start --address='10.119.5.215:6379'全部节点执行后,查看ray状态。应看到有32张NPU资源。
ray status在首节点启动训练。
使用nohup,避免因终端问题,导致训练进程挂起。
cd verl
nohup bash ./run_interns2_fsdp_async.sh &
tail -f nohup.out脚本如下: run_interns2_fsdp_async.sh
部分参数说明:
| 参数 | 说明 |
|---|---|
| root_path | 设置为全部节点可以访问的公共路径 |
| transformer_layer_cls_to_wrap | 指定fsdp模块名称 |
| +ray_kwargs.ray_init.runtime_env.env_vars | 通过ray向全部节点设置环境变量 |
VLLM已知问题:https://github.com/vllm-project/vllm/issues/42995
规避措施:增加参数
+actor_rollout_ref.rollout.engine_kwargs.vllm.mm_processor_cache_gb=0lm_head.weight的原始数据类型为float32。训练后lm_head.weight的数据类型为bf16。
目前训练不涉及mtp,model.time_series参数。
在训练保存权重时,会从原始权重中获取mtp,model.time_series参数,并保存到新权重中。
原因如下:
mtp的原始格式是逐专家,主模型的原始格式是融合。transformer加载mtp和主模型后,均会变为融合格式。
save_pretrained时如果设置save_original_format=true,transformer将mtp、主模型同时保存为逐专家格式。
save_pretrained时如果设置save_original_format=false,transformer将mtp、主模型同时保存为融合格式。
transformer5.8.1下,无法同时让mtp、主模型均保存为原始格式,即mtp为逐专家,主模型为融合格式。
当前选择save_original_format=False,确保transformer保存主模型时,不转换格式。由于没有训练mtp,从原始权重中获取mtp,直接保存。
time_series中model.time_series.encoder_embed.pos_encoder.pe的原始数据类型为float32,正常加载后再保存,会存为bf16。由于没有训练time_series,从原始权重中获取time_series,直接保存。