alibaba / Pai-Megatron-Patch

The official repo of Pai-Megatron-Patch for LLM & VLM large scale training developed by Alibaba Cloud.
Apache License 2.0
711 stars 100 forks source link

deepseek模型转换问题 #327

Open bao-xiaoyi opened 2 months ago

bao-xiaoyi commented 2 months ago

模型转换前后大小差别很大(30G->53G),是存在什么问题吗

jerryli1981 commented 2 months ago

您好,具体的命令发下,我们复现下

bao-xiaoyi commented 2 months ago

您好,具体的命令发下,我们复现下

cd Pai-Megatron-Patch/toolkits/model_checkpoints_convertor/deepseek bash hf2mcore_deepseek_v2_moe_convertor.sh A2.4B open_llm/DeepSeek-Coder-V2-Lite-Instruct output_model/deekseek-coder-V2-lite-instruction-mg 2 1 4 false

aeeeeeep commented 2 months ago

因为 deepspeek 的开源权重是 bfloat16,huggingface load 进来会自动转换成 float32,占用空间就会 double,如果你想按原类型加载,需要将加载代码修改为如下,原类型是权重目录中 config.json 的 torch_dtype 值

        config = AutoConfig.from_pretrained(args.load)
        hf_model = AutoModelForCausalLM.from_pretrained(args.load, trust_remote_code=True, torch_dtype=config.torch_dtype)

或者添加 --bf16/--fp16 参数,但是我实验过,精度损失不小,不建议使用这个参数控制类型。

bao-xiaoyi commented 2 months ago

因为 deepspeek 的开源权重是 bfloat16,huggingface load 进来会自动转换成 float32,占用空间就会 double,如果你想按原类型加载,需要将加载代码修改为如下,原类型是权重目录中 config.json 的 torch_dtype 值

        config = AutoConfig.from_pretrained(args.load)
        hf_model = AutoModelForCausalLM.from_pretrained(args.load, trust_remote_code=True, torch_dtype=config.torch_dtype)

或者添加 --bf16/--fp16 参数,但是我实验过,精度损失不小,不建议使用这个参数控制类型。

感谢大佬回答,但是为什么原类型加载会有精度损失?

aeeeeeep commented 2 months ago

因为 deepspeek 的开源权重是 bfloat16,huggingface load 进来会自动转换成 float32,占用空间就会 double,如果你想按原类型加载,需要将加载代码修改为如下,原类型是权重目录中 config.json 的 torch_dtype 值

        config = AutoConfig.from_pretrained(args.load)
        hf_model = AutoModelForCausalLM.from_pretrained(args.load, trust_remote_code=True, torch_dtype=config.torch_dtype)

或者添加 --bf16/--fp16 参数,但是我实验过,精度损失不小,不建议使用这个参数控制类型。

感谢大佬回答,但是为什么原类型加载会有精度损失?

如果你加上了 --bf16/--fp16,在代码中实际是先 load 时自动转换为 fp32 类型,再在转换时执行 model.bfloat16()/float16(),会有精度损失,具体代码见 https://github.com/aeeeeeep/Pai-Megatron-Patch/blob/ad0b25d217df8ae1d6b0f67d860c8edaf7863e14/toolkits/model_checkpoints_convertor/deepseek/hf2mcore_deepseek_v2_moe.py#L219-L225

jerryli1981 commented 2 months ago

因为 deepspeek 的开源权重是 bfloat16,huggingface load 进来会自动转换成 float32,占用空间就会 double,如果你想按原类型加载,需要将加载代码修改为如下,原类型是权重目录中 config.json 的 torch_dtype 值

        config = AutoConfig.from_pretrained(args.load)
        hf_model = AutoModelForCausalLM.from_pretrained(args.load, trust_remote_code=True, torch_dtype=config.torch_dtype)

或者添加 --bf16/--fp16 参数,但是我实验过,精度损失不小,不建议使用这个参数控制类型。

感谢大佬回答,但是为什么原类型加载会有精度损失?

如果你加上了 --bf16/--fp16,在代码中实际是先 load 时自动转换为 fp32 类型,再在转换时执行 model.bfloat16()/float16(),会有精度损失,具体代码见 https://github.com/aeeeeeep/Pai-Megatron-Patch/blob/ad0b25d217df8ae1d6b0f67d860c8edaf7863e14/toolkits/model_checkpoints_convertor/deepseek/hf2mcore_deepseek_v2_moe.py#L219-L225

同学您好,方便进入钉钉,然后加下我们一起对焦一下这个问题吗?

tzyodear commented 2 months ago

我在转换qwen2-7B的时候也遇到了,hf的权重15G,megatron的权重36G。 我起初以为是hf用了safetensor,但是发现转换的megatron权重不连续,不能直接用safetensor保存。 然后如果转成连续,用torch.save保存空间也更小。所以感觉可能是转换的megatron 的权重tensor不连续的问题