深度学习 - 第7篇 - huggingface格式大模型强转为megatron格式的掉坑点

1. 概述

对大模型进行张量并行或流水并行切分是个比较麻烦的工作,有些同学觉得这个过程比较麻烦,而采用取巧的策略选择绕开这个切分工作,选用将原生的,比如从huggingface下载的权重转为megatron格式,从而快速完成该大模型的预训练、微调或推理。

殊不知这一过程是从一个小坑掉到另外一个大坑: 先抛开模型转换对用户使用体验不大好的问题,格式转换的致命问题是会在一定概率下引起模型的准确率分数下降,从而造成推理结果的不一致。模型准确率分数的下降也会造成大模型在排行榜上的排名下降,因此,一些大模型厂家是不能接受这种行为的。

将所有的大模型权重都转为megatron gpt或其他格式也是一种一刀切的行为,没有考虑到各个模型的特殊性,以普遍打特殊也是违背这个世界的运行法则的一种行为,不是早上会出问题就是晚上会出问题。这里参考megatron的官方文档说明如下。

2. 模型转换与微调

megatron里微调一个大模型基本上可以分为以下几个步骤:

1)从huggingface下载大模型的权重;

2)使用大模型转换脚本将该权重从Huggingface格式转换为megatron格式;

3)基于这个转换后的权重设置微调参数,然后开始微调;

4)最后保存微调好的权重。

以LLama-2为例,将Llama 权重从huggingface下载下来,然后采用megatron自带的Llama-2 转换器转换为megatron格式,但是需要注意的是这一过程必须正确设置大模型的张量并行大小即TP参数,如下:

模型大小 张量并行大小(TP)
7B 1
13B 2
70B 8

基于TP值以及Llama-2 ${TOKENIZER_MODEL}路径,在megatron根目录下执行以下转换命令可以将Llama-2 权重从Huggingface格式转换为Megatron格式:

1
2
3
4
5
6
7
8
9
$python tools/checkpoint/convert.py \
--model-type GPT \
--loader llama2 \
--saver megatron \
--target-tensor-parallel-size ${TP} \
--checkpoint-type hf \
--load-dir ${HF_FORMAT_DIR} \
--save-dir ${MEGATRON_FORMAT_DIR} \
--tokenizer-model ${TOKENIZER_MODEL}

完成此转换后,可以将该权重采用megatron进行微调,微调结束后再保存该新的权重,然后这个权重就可以用于推理了。需要注意的是如果是只识别huggingface格式的推理工具则需要将该权重再转回huggingface格式才能用于推理。

3.模型准确率分数说明

下列表格列出了原生的Llama-2与转换后的LLama-2 推理结果的准确率比较。表格里的数值是megatron格式与原生格式之间的基准测试百分误差,计算公式为:”|<llama_score> - <megatron_score>| / <llama_score>”。在所有测试中(每种模型大小共80个),平均误差为0.15%。

经过分析,两种模型之间基准分数的微小差异是由于实现中的小的算术差异造成的,这些差异稍微改变了数值,影响这种差异的因素包括:

  • Megatron在几个地方执行批量矩阵乘法,例如在self attention 内部以及在SwiGLU中,而Llama分别执行这些操作;

  • Megatron在自注意力中使用torch.baddbmm,而Llama使用torch.matmul;

  • Megatron对旋转位置嵌入使用sin/cos实现,而Llama使用极坐标/复数实现;

  • Llama在初始化期间调用torch.set_default_dtype(torch.float16),而Megatron则不调用。

准确度分数比较说明见以下表格。

3.1 Big Bench

得分类型:多项选择成绩。

bigbench / standard 7b 13b 70b
date_understanding 0.29% 0.13% 0.12%
general_knowledge 0.00% 0.00% 0.00%
human_organs_senses 0.00% 0.00% 0.00%
intent_recognition 0.00% 0.11% 0.00%
riddle_sense 0.00% 0.00% 0.00%
similarities_abstraction 0.00% 0.58% 0.00%
simple_arithmetic_json_multiple_choice 0.00% 0.00% 0.00%
undo_permutation 0.19% 0.19% 0.18%

3.2 Multilingual

得分类型:多项选择成绩。

multilingual / xcopa 7b 13b 70b
en-template-mGPT-remove-punctuation 0.08% 0.00% 0.00%
et-template-mGPT-remove-punctuation 0.00% 0.13% 0.25%
ht-template-mGPT-remove-punctuation 0.26% 0.13% 0.26%
id-template-mGPT-remove-punctuation 0.11% 0.00% 0.19%
it-template-mGPT-remove-punctuation 0.00% 0.10% 0.09%
qu-template-mGPT-remove-punctuation 0.00% 0.00% 0.27%
sw-template-mGPT-remove-punctuation 0.14% 0.13% 0.13%
th-template-mGPT-remove-punctuation 0.25% 0.13% 0.13%
tr-template-mGPT-remove-punctuation 0.26% 0.00% 0.34%
vi-template-mGPT-remove-punctuation 0.00% 0.11% 0.00%
zh-template-mGPT-remove-punctuation 0.00% 0.10% 0.09%

3.3 LM Evaluation Harness

得分类型:多项选择成绩。

lm-eval 7b 13b 70b
boolq 0.04% 0.04% 0.07%
hellaswag 0.02% 0.03% 0.03%
piqa 0.00% 0.00% 0.07%
winogrande 0.00% 0.11% 0.20%

3.4 MMLU

得分类型:多项选择成绩。

注意:括号内的数字是每个大类中子任务的数量。

mmlu 7b 13b 70b
stem [18] 0.79% 0.05% 0.01%
humanities [13] 0.19% 0.01% 0.02%
other (business, health, misc.) [14] 0.08% 0.06% 0.12%
social sciences [12] 0.37% 0.21% 0.01%

以上数据可知,模型权重从huggingface格式转换为megatron格式会引起准确率的下降,虽然下降的不多,但是这一结果不是所有的用户都愿意接受的。

4. 小结

本文介绍了模型权重从huggingface格式转换为megatron格式进行训练所造成的影响,准确率只是模型质量的一个约束指标,从工程角度看 训练或微调的性能、收敛精度也是另外两个比较重要的约束指标。

日拱一卒,功不唐捐,分享是最好的学习,与其跟随不如创新,希望这个知识点对大家有用。另作者能力与认知都有限,”我讲的,可能都是错的“,欢迎大家拍砖留念。

5. 作者简介

常平,为学,闻道,践行。

6. 参考资料

[1] https://github.com/NVIDIA/Megatron-LM/blob/main/docs/llama2.md

7. 版权申明

本文的版权协议为 CC-BY-NC-ND license:https://creativecommons.org/licenses/by-nc-nd/3.0/deed.zh

在遵循署名、非商业使用(以获利为准)以及禁止演绎的前提下可以自由阅读、分享、转发、复制、分发等。