模型权重格式转换与切分工具
更新时间:2024-05-09
产品介绍
模型权重格式转换与切分工具能够实现主流开源模型权重在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提供的加速镜像使用
- 下载工具包,点击【获取地址】可以得到工具包的下载地址(示例:https://doc.bce.baidu.com/bce-documentation/BOS/aiak_tool_mwfc.zip ),在容器镜像中先使用wget下载
# 下载工具
wget https://doc.bce.baidu.com/bce-documentation/BOS/aiak_tool_mwfc.zip
- 解压工具包
unzip aiak_tool_mwfc.zip
cd aiak_tool_mwfc.zip
- 进行模型权重格式转换,执行model.py脚本,配置参数如下:
python model.py \
--load_platform=huggingface \
--save_platform=megatron \
--common_config_path=config/llama-7b.json \
--tensor_model_parallel_size=2 \
--pipeline_model_parallel_size=4 \
--data_parallel_size=1 \
--use_distributed_optimizer \
--load_ckpt_path=/workspace/tmp/llama-7b-hf/ \
--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
python model.py \
--load_platform=huggingface \
--save_platform=megatron \
--common_config_path=config/llama-7b.json \
--tensor_model_parallel_size=2 \
--pipeline_model_parallel_size=4 \
--data_parallel_size=1 \
--use_distributed_optimizer \
--load_ckpt_path=/workspace/tmp/llama-7b-hf/ \
--save_ckpt_path=/tmp/llama-7b/tp2-pp4/
示例二:Megatron格式下不同并行策略的切分
Megatron框架下,并行切分策略配置为TP=4,PP=2,DP=1转到TP=2,PP=2,DP=2,并关闭ZeRO1
python model.py \
--load_platform=megatron \
--save_platform=megatron \
--common_config_path=config/llama-7b.json \
--tensor_model_parallel_size=2 \
--pipeline_model_parallel_size=2 \
--data_parallel_size=2 \
--load_ckpt_path=/workspace/tp4-pp2-dp1/iter_0000005/ \
--save_ckpt_path=/tmp/llama/mg/tp2-pp2-dp2/ \
--megatron_path=/code/Megatron/
示例三:Megatron格式模型权重转换为Hugging格式
python model.py \
--load_platform=megatron \
--save_platform=huggingface \
--common_config_path=config/llama-7b.json \
--load_ckpt_path=/workspace/tp4-pp2-dp1/iter_0000005/ \
--save_ckpt_path=/tmp/x \
--no_load_optim \
--no_save_optim \
--megatron_path=/code/Megatron/
用产出的文件代替官方的
rm /workspace/models/hf/llama-2-7b-hf/*.bin
cp {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
# 1. 先转换模型权重,不加载/保存优化器
python model.py \
--load_platform=megatron \
--save_platform=megatron \
--common_config_path=config/llama-2-70b.json \
--tensor_model_parallel_size=4 \
--pipeline_model_parallel_size=2 \
--data_parallel_size=1 \
--num_layers_per_virtual_pipeline_stage 10\
--use_distributed_optimizer \
--no_load_optim \
--no_save_optim \
--save_ckpt_path /tmp/4-2-1 \
--megatron_path /workspace/code/Megatron/\
--load_ckpt_path=/tmp/1/iter_0000100/
# 2. 再转换优化器
python optim.py \
--common_config_path=config/llama-2-70b.json \
--load_ckpt_path=/tmp/1/iter_0000100 \
--tensor_model_parallel_size=4 \
--pipeline_model_parallel_size=2 \
--data_parallel_size=1 \
--num_layers_per_virtual_pipeline_stage 10\
--use_distributed_optimizer \
--megatron_path /workspace/code/Megatron/ \
--save_ckpt_path=/tmp/4-2-1