模型权重格式转换与切分工具
更新时间:2025-11-24
产品介绍
模型权重格式转换与切分工具能够实现主流开源模型权重在Huggingface和Megatron框架间的转换,并支持Megatron框架下模型权重按照不同的DP、TP、PP并行策略进行切分。本篇文档介绍模型权重格式转换与切分工具使用方式。
支持模型
| 模型系列 | 模型名称 |
|---|---|
| Llama | 7B |
| Llama2 | 7B、13B、70B |
| ChatGLM | 6B |
| GLM | 10B、130B |
| Qwen | 1.8B、7B、14B、72B |
| Codellama | 7B、34B、70B |
如果您对于其他暂未支持的模型有训练需求,请提交工单或者联系您的客户经理。
注意:您应自觉遵守“LLaMA”等第三方模型的用户协议、使用规范和相关法律法规,并就使用第三方模型的合法性、合规性自行承担相关责任。百度云不对第三方模型的合法性、安全性、准确性进行任何保证,百度云不对由此引发的任何损害承担责任。
如何使用
推荐基于AIAK提供的加速镜像使用
- 进入控制台,点击左侧【AI加速套件】找到工具包,点击【获取地址】可以得到工具包的下载地址,在容器镜像中先使用wget下载。
注意:以下示例中的地址需替换为从控制台获取的地址
Bash
1# 下载工具
2wget https://doc.bce.baidu.com/bce-documentation/bos_examples/aiak_tool_mwfc.zip
- 解压工具包
Bash
1# 解压缩工具,注意查看.zip的文件名可能与示例中不一致
2unzip aiak_tool_mwfc.zip
3cd aiak_tool_mwfc/convert_checkpoint
- 进行模型权重格式转换,执行model.py脚本,配置参数如下:
Bash
1python model.py \
2 --load_platform=huggingface \
3 --save_platform=megatron \
4 --common_config_path=config/llama-7b.json \
5 --tensor_model_parallel_size=2 \
6 --pipeline_model_parallel_size=4 \
7 --data_parallel_size=1 \
8 --use_distributed_optimizer \
9 --load_ckpt_path=/workspace/tmp/llama-7b-hf/ \
10 --save_ckpt_path=/tmp/llama-7b/tp2-pp4/
参数说明
| 参数名 | 取值类型 | 是否必选 | 默认值 | 枚举值示例 | 描述 |
|---|---|---|---|---|---|
| load_platform | choices | 是 | None | huggingface、megatron | 模型权重源框架 |
| save_platform | choices | 是 | None | huggingface、megatron | 模型权重目标框架。如果基于Megatron框架进行并行策略切分,load_platform和save_platform参数均填写为megatron |
| common_config_path | str | 是 | None | config/llama-7b.json | 模型配置文件读取路径,详见common_config_path列表 |
| tensor_model_parallel_size | int | 是 | None | 2 | 目标张量并行(TP)参数,不大于GPU总数 |
| pipeline_model_parallel_size | int | 是 | None | 4 | 目标流水线并行(PP)参数,不大于GPU总数 |
| data_parallel_size | int | 是 | None | 1 | 目标数据并行(DP)参数,不大于GPU总数 |
| use_distributed_optimizer | bool | 否 | False | 目标开启ZeRO-1 | |
| load_ckpt_path | str | 是 | None | /workspace/tmp/llama-7b-hf/ | 模型权重Checkpoint文件读取路径 |
| save_config_path | str | 否 | save_ckpt_path | /tmp/llama-7b/tp2-pp4/ | 模型配置文件保存路径,默认与Checkpoint文件保存路径相同 |
| save_ckpt_path | str | 是 | None | /tmp/llama-7b/tp2-pp4/ | 目标模型权重Checkpoint文件保存路径 |
| megatron_path | str | 否 | None | /workspace/Megatron-LM/ | 当load_platform是megatron时,需指定megatron的代码库路径 |
| vocab_size | int | 否 | 130528 | padding前 | |
| torch_dtype | choices | 否 | float16 | float16, float32 | 目标权重的精度 |
| no_load_optim | bool | 否 | false | 不加载优化器 | |
| no_save_optim | bool | 否 | false | 不保存优化器 | |
| num_layers_per_virtual_pipeline_stage | int | 否 | None | 5 | number of layers per virtual pipeline stage |
| safetensors | bool | 否 | False | ckpt以safetensors保存时必选,比如qwen等模型 |
- common_config_path列表
| model | common_config_path |
|---|---|
| llama-7b | config/llama-7b.json |
| llama-2-7b | config/llama-2-7b.json |
| llama-2-13b | config/llama-2-13b.json |
| llama-2-70b | config/llama-2-70b.json |
| glm-10b | config/glm-10b.json |
| chatglm-6b | config/chatglm-6b.json |
| glm-130b | config/glm-130b.json |
| qwen-7b | config/qwen-7b.json |
| qwen-1.8b | config/qwen-1_8b.json |
| qwen-14b | config/qwen-14b.json |
| qwen-72b | config/qwen-72b.json |
| codellama-7b | config/codellama-7b.json |
| codellama-34b | config/codellama-34b.json |
| codellama-70b | config/codellama-70b.json |
使用示例
转换时间:LLaMA 7B等相对较小的模型进行模型权重格式转换用时几分钟,GLM 130B等大模型可能用时几十分钟到小时级别
示例一:Huggingface格式模型权重转换为Megatron格式
从Huggingface转换到Megatron,并行切分策略配置为TP=2,PP=4,DP=1,并开启ZeRO-1
Bash
1python model.py \
2 --load_platform=huggingface \
3 --save_platform=megatron \
4 --common_config_path=config/llama-7b.json \
5 --tensor_model_parallel_size=2 \
6 --pipeline_model_parallel_size=4 \
7 --data_parallel_size=1 \
8 --use_distributed_optimizer \
9 --load_ckpt_path=/workspace/tmp/llama-7b-hf/ \
10 --save_ckpt_path=/tmp/llama-7b/tp2-pp4/
示例二:Megatron格式下不同并行策略的切分
Megatron框架下,并行切分策略配置为TP=4,PP=2,DP=1转到TP=2,PP=2,DP=2,并关闭ZeRO1
Bash
1python model.py \
2 --load_platform=megatron \
3 --save_platform=megatron \
4 --common_config_path=config/llama-7b.json \
5 --tensor_model_parallel_size=2 \
6 --pipeline_model_parallel_size=2 \
7 --data_parallel_size=2 \
8 --load_ckpt_path=/workspace/tp4-pp2-dp1/iter_0000005/ \
9 --save_ckpt_path=/tmp/llama/mg/tp2-pp2-dp2/ \
10 --megatron_path=/code/Megatron/
示例三:Megatron格式模型权重转换为Hugging格式
Bash
1python model.py \
2 --load_platform=megatron \
3 --save_platform=huggingface \
4 --common_config_path=config/llama-7b.json \
5 --load_ckpt_path=/workspace/tp4-pp2-dp1/iter_0000005/ \
6 --save_ckpt_path=/tmp/x \
7 --no_load_optim \
8 --no_save_optim \
9 --megatron_path=/code/Megatron/
用产出的文件代替官方的
Bash
1rm /workspace/models/hf/llama-2-7b-hf/*.bin
2cp {save_ckpt_path}/* /workspace/models/hf/llama-2-7b-hf/
示例四:权重和优化器分步进行转换
对于70b及以上的大模型,优化器和模型权重需要分步进行转换以避免oom。 不支持tp/pp同时转换。比如tp8pp1不能直接转成tp4pp2,需要8-1先转8-2再转4-2 当源tp/pp和目标tp/pp都等于1时不能直接转换。比如tp8pp1转tp4pp1,需要8-1转8-2再转4-2再转4-1
Bash
1# 1. 先转换模型权重,不加载/保存优化器
2python model.py \
3 --load_platform=megatron \
4 --save_platform=megatron \
5 --common_config_path=config/llama-2-70b.json \
6 --tensor_model_parallel_size=4 \
7 --pipeline_model_parallel_size=2 \
8 --data_parallel_size=1 \
9 --num_layers_per_virtual_pipeline_stage 10\
10 --use_distributed_optimizer \
11 --no_load_optim \
12 --no_save_optim \
13 --save_ckpt_path /tmp/4-2-1 \
14 --megatron_path /workspace/code/Megatron/\
15 --load_ckpt_path=/tmp/1/iter_0000100/
16
17# 2. 再转换优化器
18python optim.py \
19 --common_config_path=config/llama-2-70b.json \
20 --load_ckpt_path=/tmp/1/iter_0000100 \
21 --tensor_model_parallel_size=4 \
22 --pipeline_model_parallel_size=2 \
23 --data_parallel_size=1 \
24 --num_layers_per_virtual_pipeline_stage 10\
25 --use_distributed_optimizer \
26 --megatron_path /workspace/code/Megatron/ \
27 --save_ckpt_path=/tmp/4-2-1
