赞
踩
大模型系统优化:怎么计算模型所需的算力、内存带宽、内存容量和通信数据量?
需要的总算力 = 6 ∗ * ∗ 模型的参数量 ∗ * ∗ 训练数据的 token 数
我们可以把神经网络想象成由左边一组神经元和右边一组神经元组成的完全二分图。
选出其中任意一个左边的神经元 l l l 和右边的神经元 r r r:
总共涉及到 3 3 3 次乘法和 3 3 3 次加法的计算操作。
大模型是数据的压缩版本:
区别:
openai提出最优训练数据和模型参数配比:
比如模型参数 1 B(1B = 10亿参数),最优的训练数据量是 20.2 B 的 token。
φ是一个代表模型参数数量的变量,如 GPT2 参数是1.6B(1B是10亿)
梯度: 在神经网络训练过程中,梯度是权重的导数,用于指导模型更新权重以提高性能。
如果模型有φ个参数,每个参数需要一个梯度值。
在FP16精度下,每个梯度值需要2字节(16位)的存储空间。
因此,存储所有梯度值需要 2φ
字节的存储空间。
梯度平方: 某些优化算法,如Adam,会计算每个参数梯度的平方,用于调整学习率。这也需要 2φ
字节的存储空间(使用FP16精度)。
优化器状态: 对于Adam优化器,除了梯度和梯度平方之外,还需要存储每个参数的动量(momentum)和方差(variance)。
这通常需要额外的 4φ
字节的存储空间(每个额外状态需要2φ字节)。
总计: 因此,模型的总显存需求是梯度、梯度平方以及优化器状态的存储之和,即 2φ + 2φ + 4φ = 8φ
(FP16精度下)。
然而说的是16φ(半精度),如果是FP32精度下的计算,其中每个数值需要4字节的存储空间,总显存需求会是 2φ * 4 + 2φ * 4 + 4φ * 4 = 32φ
字节。
现在让我们来计算具体的例子:
φ = 1.6 x 10^9
。2 * φ * 2
字节,优化器状态是 4 * φ * 2
字节。(2 + 2 + 4) * φ * 2
字节。(2 + 2 + 4) * φ * 4
字节。常用的模型尺寸
+----------+----------------------+----------------------+
| 模型尺寸 | FP16 存储大小 | FP32 存储大小 |
+----------+----------------------+----------------------+
| 6B | 6000000000 * 2byte ≈ | 6000000000 * 4byte ≈ |
| | 11.18GB | 22.35GB |
+----------+----------------------+----------------------+
| 7B | 7000000000 * 2byte ≈ | 7000000000 * 4byte ≈ |
| | 13.04GB | 26.08GB |
+----------+----------------------+----------------------+
| 13B | 13000000000 * 2byte ≈| 13000000000 * 4byte ≈|
| | 24.21GB | 48.42GB |
+----------+----------------------+----------------------+
| 175B | 175000000000 * 2byte ≈| 175000000000 * 4byte ≈|
| | 325.96GB | 651.93GB |
+----------+----------------------+----------------------+
微调需要的存储大小:
使用 FP16(16位浮点数)精度时可能发生的精度损失问题。
因为 FP16 不能精确表示太小的数,可能导致梯度没有更新。
但 FP16 比 FP32 占用更少的内存,这可以允许更大的batch size(一次性处理更多的数据)。
FP16 也可以让GPU更高效地计算,提高运算速度。
两者结合:
输入:以FP16精度输入数据进行前向传播(Forward),即模型根据当前的权重计算预测值。
计算梯度:在反向传播(Backward)阶段,计算损失函数关于权重的梯度,这里也使用FP16精度。
优化器更新权重:虽然前向和反向传播都使用FP16精度,但在实际更新权重时,会将梯度转换成FP32精度。
因为FP32提供了更高的数值精度,可以减少累积的计算误差,并确保权重更新的准确性。
权重转换并应用更新:在更新权重后,再次将更新后的权重转换为FP16精度,以便下一轮的前向和反向传播。
这种混合精度训练方法结合了FP16的内存和计算效率以及FP32的数值稳定性。通过在关键步骤使用更高的精度来减少累积误差,同时又保持了大部分计算的高效率。
大语言模型在处理训练数据时的几个关键步骤:低质量数据过滤、冗余数据去除、隐私信息消除和词元切分。
这些步骤对于提高模型的性能和数据处理的有效性至关重要。
1. 低质量数据过滤(Low-Quality Data Filtering)
2. 冗余数据去除(Redundancy Removal)
3. 隐私信息消除(Privacy Elimination)
4. 词元切分(Tokenization)
这些步骤共同确保了大型语言模型能够有效地处理和学习大量的网络数据,同时也注重保护用户隐私和数据质量。
重复数据对于大模型微调也有较大影响,数据集必须去重后再用于模型训练。
请猛击:MinHash-LSH 哈希模糊去重:大规模数据去重优化
既可以做句子级别的去重,也可以做文档级别的去重。
采用前沿对齐,低资源收集技术:
记录在 — 大模型并行训练、超大模型分布式训练
论文地址:https://arxiv.org/pdf/2305.13230.pdf
在CNN、Vit 这样的模型中,模型训练的epochs可高达300次,而大语言模型的训练 epochs 通常都是 1、2、4 次。
用重复的tokens训练大语言模型会让模型降低性能。
模型参数规模的增长与模型需要的tokens数量基本是呈线性:
训练需要存储模型参数、存储梯度、优化器状态、正向传播每一层的中间状态,后面几个比参数更大,对模型内存的需求量也更大。
推理的各个输入数据之间并没有关系,不需要存储梯度和优化器状态,正向传播每一层的中间状态也不需要保存下来。
大模型的训练用 4090 是不行的,但推理用 4090 不仅可行,在性价比上还能比 H100 稍高。
4090 如果极致优化,性价比甚至可以达到 H100 的 2 倍。
H100 和 4090 最大的区别就在通信和内存上,算力差距不大。
计算通信数据量的目标是确定在多GPU环境中,数据在不同GPU之间传输时的总量。
在分布式训练或使用多GPU训练时,需要考虑通信开销。通信数据量依赖于:
例如,在数据并行中,每次同步时,每个GPU需要发送其梯度到其他GPU或参数服务器,所以通信数据量大约为 梯度大小乘以GPU数量。
例如,在张量并行中,分布式计算场景,其中包含了多个注意力头,每个头处理一部分数据,并且有必要在GPU之间交换信息以合成最终的结果。
以下是一个简化的方法来估算通信数据量:
首先,我们需要确定每个GPU需要发送或接收的数据量。
这通常涉及到输入和输出矩阵的大小,以及模型的结构。
假设我们有:
在多头注意力机制中,每个头计算得到一个输出矩阵 ( Z h e a d ) ( Z_{head} ) (Zhead),大小为 ( B × T × E H ) ( B \times T \times \frac{E}{H} ) (B×T×HE)。
对于所有头,输出矩阵 ( Z ) ( Z ) (Z) 的大小是所有 ( Z h e a d ) ( Z_{head} ) (Zhead) 拼接起来的,因此大小为 ( B × T × E ) ( B \times T \times E ) (B×T×E)。
如果每个GPU处理 ( H G ) ( \frac{H}{G} ) (GH) 个头,那么每个GPU计算得到的 ( Z h e a d ) ( Z_{head} ) (Zhead) 的总大小将是:
[ Z_{GPU} = B \times T \times \frac{E}{H} \times \frac{H}{G} = B \times T \times \frac{E}{G} ]
通信发生在每个GPU需要汇总所有其他GPU上计算的 ( Z h e a d ) ( Z_{head} ) (Zhead)时。
假设每个GPU都需要从其他 ( G − 1 ) ( G - 1 ) (G−1) 个GPU接收数据以构建完整的输出矩阵( Z )。
那么每个GPU需要接收的数据量大概是:
[ D a t a r e c v = Z G P U × ( G − 1 ) = B × T × E G × ( G − 1 ) ] [ Data_{recv} = Z_{GPU} \times (G - 1) = B \times T \times \frac{E}{G} \times (G - 1) ] [Datarecv=ZGPU×(G−1)=B×T×GE×(G−1)]
同样,每个GPU需要发送它计算的 ( Z G P U ) ( Z_{GPU} ) (ZGPU) 给其他( G - 1 )个GPU:
[ D a t a s e n d = Z G P U × ( G − 1 ) = B × T × E G × ( G − 1 ) ] [ Data_{send} = Z_{GPU} \times (G - 1) = B \times T \times \frac{E}{G} \times (G - 1) ] [Datasend=ZGPU×(G−1)=B×T×GE×(G−1)]
因此,每个GPU的总通信量(发送加接收)将是:
[ D a t a t o t a l = D a t a r e c v + D a t a s e n d = 2 × Z G P U × ( G − 1 ) ] [ Data_{total} = Data_{recv} + Data_{send} = 2 \times Z_{GPU} \times (G - 1) ] [Datatotal=Datarecv+Datasend=2×ZGPU×(G−1)]
把 ( Z G P U ) ( Z_{GPU} ) (ZGPU) 代入:
[ D a t a t o t a l = 2 × B × T × E G × ( G − 1 ) ] [ Data_{total} = 2 \times B \times T \times \frac{E}{G} \times (G - 1) ] [Datatotal=2×B×T×GE×(G−1)]
最后,我们需要把每个参数的大小也考虑进去,所以总的通信数据量(以字节为单位)是:
[ D a t a b y t e s = D a t a t o t a l × b y t e s p a r a m = 2 × B × T × E G × ( G − 1 ) × b y t e s p a r a m ] [ Data_{bytes} = Data_{total} \times bytes_{param} = 2 \times B \times T \times \frac{E}{G} \times (G - 1) \times bytes_{param} ] [Databytes=Datatotal×bytesparam=2×B×T×GE×(G−1)×bytesparam]
这就是在所有GPU之间总共需要传输的数据量。
如果你想要单向通信的数据量,只需要使用 ( D a t a r e c v ) ( Data_{recv} ) (Datarecv) 或 ( D a t a s e n d ) ( Data_{send} ) (Datasend) 的值乘以 ( b y t e s p a r a m ) ( bytes_{param} ) (bytesparam) 即可。
RedPajama开源的复刻llama的预训练数据集,1.21万亿Token
news-commentary 中英平行语料,用于中英间知识迁移: https://data.statmt.org/news-commentary/v15/training/
MNBVC 对标ChatGPT的40T:https://github.com/esbatmop/MNBVC
Pile 基于RedPajama进行清洗去重后得到的高质量数据集 6270亿Token:https://huggingface.co/datasets/cerebras/SlimPajama-627B/tree/main/train
CSL 首个中文科学文献数据集CSL,也有多种NLP任务数据:https://github.com/ydli-ai/CSL
问答偏好数据集:https://huggingface.co/datasets/liyucheng/zhihu_rlhf_3k
OpenAssistant Conversations:https://huggingface.co/datasets/OpenAssistant/oasst1
河狸开源RLHF:https://huggingface.co/datasets/PKU-Alignment/PKU-SafeRLHF-10K
Anthropic hh-rlhf:https://huggingface.co/datasets/Anthropic/hh-rlhf
Facebook Bot Adversarial Dialogues:https://github.com/facebookresearch/ParlAI
AllenAI Real Toxicity prompts:https://github.com/facebookresearch/ParlAI
Stack-exchange:https://huggingface.co/datasets/HuggingFaceH4/stack-exchange-preferences/tree/main
hh-rlhf:https://huggingface.co/datasets/liswei/rm-static-zhTW
AMC竞赛数学题:https://huggingface.co/datasets/competition_math
猿辅导开源小学应用题:https://github.com/SCNU203/Math23k/tree/main
APE210k腾讯爬取的数学问题:https://github.com/Chenny0808/ape210k
线性代数等纯数学计算题:https://huggingface.co/datasets/math_dataset
有推理过程和多项选择的数学问答数据集:https://huggingface.co/datasets/math_qa/viewer/default/test?row=2
高中数学题2-8步推理过程:https://huggingface.co/datasets/qwedsacf/grade-school-math-instructions
Conala来自StackOverflow问题:https://opendatalab.org.cn/CoNaLa/download
code-alpacaGPT生成:https://github.com/sahil280114/codealpaca.git
APPS编程网站收集:https://opendatalab.org.cn/APPS
Lyra Python操作数据库:https://opendatalab.org.cn/Lyra
LAION:https://github.com/LAION-AI/Open-Instruction-Generalist
Ultra Chat 俩个gpt对话:https://github.com/thunlp/UltraChat
Baize:https://github.com/project-baize/baize-chatbot/tree/main/data
InstructDial:https://github.com/prakharguptaz/Instructdial
BlenderBot:https://huggingface.co/datasets/blended_skill_talk
Awesome Open-domain Dialogue Models:https://github.com/cingtiye/Awesome-Open-domain-Dialogue-Models#%E4%B8%AD%E6%96%87%E5%BC%80%E6%94%BE%E5%9F%9F%E5%AF%B9%E8%AF%9D%E6%95%B0%E6%8D%AE%E9%9B%86
SODA:https://realtoxicityprompts.apps.allenai.org/
以下是整理后的中文和英文医疗、对话以及Reward数据集列表,包括数据集的名称、链接和数据条目数:
self-instruct:https://github.com/yizhongw/self-instruct
Standford Alpaca:https://github.com/tatsu-lab/stanford_alpaca
GPT4-for-LLM:https://github.com/Instruction-Tuning-with-GPT-4/GPT-4-LLM
中文翻译Alpaca:https://github.com/hikariming/alpaca_chinese_dataset https://github.com/carbonz0/alpaca-chinese-dataset
Guanaco数据:https://huggingface.co/datasets/JosephusCheung/GuanacoDataset
Vicuna:https://github.com/domeccleston/sharegpt https://huggingface.co/datasets/anon8231489123/ShareGPT_Vicuna_unfiltered/tree/main
MOSS:https://huggingface.co/datasets/Hello-SimpleAI/HC3-Chinese/tree/main
PromptCLUE:https://github.com/CLUEbenchmark/pCLUE
P3:https://huggingface.co/datasets/bigscience/P3
alpaca COT:https://github.com/PhoebusSi/Alpaca-CoT
中文写作:https://github.com/yangjianxin1/Firefly
CSL:https://github.com/ydli-ai/CSL
GPTTeacher:https://github.com/teknium1/GPTeacher/tree/main
alpaca:https://github.com/Instruction-Tuning-with-GPT-4/GPT-4-LLM/tree/main
OIG:https://github.com/BAAI-Zlab/COIG
HC3:https://huggingface.co/datasets/Hello-SimpleAI/HC3-Chinese/tree/main
InstructWild:https://github.com/XueFuzhao/InstructionWild/tree/main/data
BELLE:https://github.com/LianjiaTech/BELLE
TK-Instruct:https://instructions.apps.allenai.org/
Unnatural Instruction:https://github.com/orhonovich/unnatural-instructions
xmtf:https://github.com/bigscience-workshop/xmtf
Amazon COT:https://github.com/amazon-science/auto-cot
alpaca code 20K:https://github.com/sahil280114/codealpaca#data-release
GPT4指令+角色扮演+代码指令:https://github.com/teknium1/GPTeacher
Mol-Instructions 2043K :https://github.com/zjunlp/Mol-Instructions
Prompt 常规格式:定义角色 + 说明要求 + 罗列限制 + few shot + 指定输出格式
Prompt 优秀示例:https://github.com/yzfly/wonderful-prompts
根据功能和用途,以下是各类基准测试和评估方法的分类整理,包括它们的简介和相关链接:
MMLU (Measuring Massive Multitask Language Understanding): 测试模型在涵盖数百个任务的广泛领域的理解能力。
Link
C-MMLU (Measuring massive multitask language understanding in Chinese): MMLU的中文版本,评估中文大型语言模型在多任务上的理解。
Link
C-Eval (A Multi-Level Multi-Discipline Chinese Evaluation Suite for Foundation Models): 专注于中文的多级别、多学科评估套件,旨在测试基础模型的能力。
Link
KoLA (Carefully Benchmarking World Knowledge of Large Language Models): 旨在详尽测试大型语言模型对世界知识的理解和记忆。
Link
M3KE (A Massive Multi-Level Multi-Subject Knowledge Evaluation Benchmark for Chinese Large Language Models): 用于评估中文大型语言模型在多个层次和科目上的知识。
Link
AGIEval (A Human-Centric Benchmark for Evaluating Foundation Models): 以人为中心的评估基准,用于检验基础模型在多个维度上的性能。
Link
GSM8K (Training Verifiers to Solve Math Word Problems): 包含8000个数学问题,测试模型的问题解决能力。
Link
Maths (Measuring Mathematical Problem Solving With the MATH Dataset): 使用MATH数据集来测量数学问题解决能力。
Link
CSQA (COMMONSENSEQA: A Question Answering Challenge Targeting Commonsense Knowledge): 测试模型在常识知识方面的问答能力。
Link
StrategyQA (Did Aristotle Use a Laptop? A Question Answering Benchmark with Implicit Reasoning Strategies): 测试模型在处理需要隐式推理策略的问题的能力。
Link
MBPP (Program Synthesis with Large Language Models): 用于测试大型语言模型在程序合成方面的能力。
Link
DS-1000 (A Natural and Reliable Benchmark for Data Science Code Generation): 为数据科学代码生成提供一个自然且可靠的基准。
Link
HumanEval (Evaluating Large Language Models Trained on Code): 评估在代码上训练的大型语言模型。
Link
Safety-Prompts: 评估中文大型语言模型的安全性。
Link
CValues (Measuring the Values of Chinese Large Language Models from Safety to Responsibility): 从安全性到责任性,测量中文大型语言模型的价值观。
Link
Vicuna-80 (Vicuna: An Open-Source Chatbot Impressing GPT-4 with 90% ChatGPT Quality)*: 一个开源的聊天机器人,其质量接近GPT-4级别。
Link
Open-Assistant-953 (OpenAssistant Conversations – Democratizing Large Language Model Alignment): 旨在民主化大型语言模型校准过程的对话数据集。
Link
LLMs Bias in Evaluation: 探讨大型语言模型在评估过程中的偏见问题。
Link
Multi-Elo (Evaluation Biases for Large Language Models): 分析大型语言模型评估中的偏差。
Link
Reference-Free Evaluation: 不依赖参考答案的评估方法,更多依赖模型的自我评估。
Link
请注意,以上链接和介绍是根据您提供的信息整理的,并且可能包含一些重复的链接。此外,由于我的知识截止日期是2023年4月,一些链接或信息可能已经有所更新或更改。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。