Ascend-SACT/Intern-S2-Preview-verl
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

0. 说明

本文使用fsdp为后端,对Intern-S2-Preview模型进行强化学习。

支持使用语言、多模态语料进行训练。暂不支持对Intern-S2-Preview模型的时序模块进行训练。

本文档采用verl fully_async_policy进行训练。

表 1 版本配套表

配套版本环境准备指导
CANNcann-8.5.1快速安装CANN
torch2.9.0+cpu-
torch_npu2.9.0.post1-
transformers5.8.1-
vllm0.18.0-
vllm-ascend0.18.0-
verl0.8.0-

硬件设备

32 * NPU(910B A2)

安装目录

下文以/workspace作为源码安装的根目录

1. vllm&vllm_ascend

1.1. 下载vllm&vllm_ascend官方镜像

docker pull quay.io/ascend/vllm-ascend:v0.18.0

1.2. 启动镜像

通过命令,或通过服务平台加载镜像。

1.3. 更新镜像

请按照以下文档更新镜像,在vllm18版本上支持Intern-S2-Preview。

https://ai.gitcode.com/Ascend-SACT/Intern-S2-Preview_vllm

2. 修改torch2.9.0

提升权重加载和保存性能

2.1. validate_non_overlapping_shards_metadata

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.
    """
    return

2.2. _validate_global_plan

torch/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_good

3. 安装其他软件包

pip 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

4. 安装verl

在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 logs

4.1. 修改说明

Support Intern-S2-Preview

fully_async fix: Patch vllm weight loader for qwen3-moe series

5. 权重准备

5.1.下载权重

modelscope download --model Shanghai_AI_Laboratory/Intern-S2-Preview --local_dir ./Intern-S2-Preview

5.2. 更新modeling文件

Intern-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权重目录。

modeling_interns2_preview.py

processing_interns2_preview.py

说明: modeling_interns2_preview.py文件也可以选择如下链接,改名后覆盖到权重目录。

该文件不加载time_series参数,fsdp启动时,约节省1G显存。

在verl代码中已增加从原始权重获取time_series参数并保存的流程。具体见问题3.

modeling_interns2_preview_no-ts.py

6. 数据集准备

6.1. geo3k

下载verl提供的多模态测试数据集geo3k

cd verl
python examples/data_preprocess/geo3k.py --local_save_dir /datasets/geo3k

6.2. dapo-math-17k和aime-2024

下载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

7. 启动强化学习

7.1. ray

在首节点执行

ray start --head

在其他节点执行:(以首节点IP为10.119.5.215为例)

ray start --address='10.119.5.215:6379'

全部节点执行后,查看ray状态。应看到有32张NPU资源。

ray status

7.2. 执行强化学习脚本

在首节点启动训练。

使用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向全部节点设置环境变量

8. 常见问题

1. AssertionError: Expected a cached item for mm_hash

VLLM已知问题:https://github.com/vllm-project/vllm/issues/42995

规避措施:增加参数

+actor_rollout_ref.rollout.engine_kwargs.vllm.mm_processor_cache_gb=0

2. 保存权重后,大小发生变化。

lm_head.weight的原始数据类型为float32。训练后lm_head.weight的数据类型为bf16。

3. 关于mtp,model.time_series参数

目前训练不涉及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,直接保存。