中国专门做统计网站,苏州高新区网页设计,er图关于网站建设,许昌做网站哪家好大模型#xff08;LLMs#xff09;推理篇
1. 为什么大模型推理时显存涨的那么多还一直占着#xff1f;
首先#xff0c;序列太长了#xff0c;有很多Q/K/V#xff1b;其次#xff0c;因为是逐个预测next token#xff0c;每次要缓存K/V加速解码。
大模型在gpu和cpu上…大模型LLMs推理篇
1. 为什么大模型推理时显存涨的那么多还一直占着
首先序列太长了有很多Q/K/V其次因为是逐个预测next token每次要缓存K/V加速解码。
大模型在gpu和cpu上推理速度如何
7B量级下
cpu推理速度约10token/s单卡A6000和8核AMD的推理速度通常为 10:1。
推理速度上int8和fp16比起来怎么样
根据实践经验int8模式一般推理会明显变慢huggingface的实现
大模型有推理能力吗
大模型有推理能力。有下面2个方面的体现
ChatGPT拥有in-context correction的能力即如果说错了给出矫正ChatGPT能听懂错在哪儿了并向正确的方向修正。in-context correction要比in-context learning难了太多描述越详细清楚ChatGPT回答得越好。要知道越详细的描述在预训练的文本里越难匹配到的。
在询问ChatGPT互联网上并不存在内容的时候能给出较好答案如用ChatGPT学建模ChatGPT能通过信息猜你心中的想法你可以制定一个全新的游戏规则让ChatGPT和你玩ChatGPT可以理解。
大模型生成时的参数怎么设置
生成模型预测调参建议
建议去调整下 top_p, num_beams, repetition_renalty, temperature, do_sampleTrue;
数据生成有重复调高repetition_renalty
生成任务表达单一的样本也不多的可适当调低 temperature生成的样子跟训练集的比较像如果要复现训练集的效果temperature0.01即可。
以上是经验参数具体调参根据任务而定不是固定的。 •参数解释
top_p0.9,
#Moderately increase the probability threshold of nucleus sampling to increase the quantity of candidate tokens and increase generation diversity.temperature1.0,
#The previous low temperature parameter could lead to a severe polarization in the probability distribution of generated words, which degenerates the generation strategy into greedy decoding.do_sampleTrue,
#do_sample parameter is set to False by default. After setting to True, the generation methods turn into beam-search multinomial sampling decoding strategy.no_repeat_ngram_size6,
#Configure the probability of the next repeating n-gram to 0, to ensure that there are no n-grams appearing twice. This setting is an empirical preliminary exploration.repetition_penalty1.8,
#For words that have appeared before, in the subsequent prediction process, we reduce the probability of their reoccurrence by introducing the repetition_penalty parameter. This setting is an empirical preliminary exploration.有哪些省内存的大语言模型训练/微调/推理方法
动机大模型LLMs现在是 NLP 领域的最主流方法之一但是大模型的训练/微调/推理需要的内存也越来越多。
举例来说即使 RTX 3090 有着 24GB 的 RAM是除了 A100 之外显存最大的显卡。但使用一块 RTX 3090 依然无法 fp32 精度训练最小号的 LLaMA-6B。
Memory-Efficient 的 LLMs 的训练/微调/推理方法 fp16int8LoRAGradient checkpointingTorch FSDPCPU offloading
如何估算模型所需的RAM
首先我们需要了解如何根据参数量估计模型大致所需的 RAM这在实践中有很重要的参考意义。我们需要通过估算设置 batch_size设置模型精度选择微调方法和参数分布方法等。
接下来我们用LLaMA-6B 模型为例估算其大致需要的内存。首先考虑精度对所需内存的影响
fp32 精度一个参数需要 32 bits, 4 bytes.fp16 精度一个参数需要 16 bits, 2 bytes.int8 精度一个参数需要 8 bits, 1 byte.
其次考虑模型需要的 RAM 大致分三个部分
模型参数梯度优化器参数
模型参数等于参数量*每个参数所需内存。
对于 fp32LLaMA-6B 需要 6B*4 bytes 24GB内存对于 int8LLaMA-6B 需要 6B*1 byte 6GB
梯度同上等于参数量*每个梯度参数所需内存。
优化器参数不同的优化器所储存的参数量不同。
对于常用的 AdamW 来说需要储存两倍的模型参数用来储存一阶和二阶momentum。
fp32 的 LLaMA-6BAdamW 需要 6B*8 bytes 48 GBint8 的 LLaMA-6BAdamW 需要 6B*2 bytes 12 GB
除此之外CUDA kernel 也会占据一些 RAM大概 1.3GB 左右查看方式如下。 torch.ones((11)).to(cuda) print_gpu_utilization()GPU memory occupied: 1343 MB综上int8 精度的 LLaMA-6B 模型部分大致需要 6GB6GB12GB1.3GB 25.3GB 左右。
再根据LLaMA的架构hidden_size 4096, intermediate_size 11008, num_hidden_layers 32, context_length 2048计算中间变量内存。
每个 instance 需要 (4096 11008)* 2048 *32 * 1byte 990MB所以一张 A10080GB RAM大概可以在 int8 精度batch_size 50 的设定下进行全参数训练。查看消费级显卡的内存和算力
2023 GPU Benchmark and Graphics Card Comparison Charthttps://www.gpucheck.com/gpu-benchmark- graphics-card-comparison-chart
Fp16-mixed precision 混合精度训练的大致思路是在 forward pass 和 gradient computation 的时候使用 fp16 来加速但是在更新参数时使用 fp32。
用 torch 实现
CUDA Automatic Mixed Precision exampleshttps://pytorch.org/docs/stable/notes/amp_examples.html torch fp16 推理直接使用 model.half() 将模型转换为fp16. model.eval()model.half()使用 Huggingface Transformers在 TrainingArguments 里声明 fp16True fp16Truehttps://huggingface.co/docs/transformers/perf_train_gpu_one#fp16-training
Int8-bitsandbytes
Int8 是个很极端的数据类型它最多只能表示 - 128127 的数字并且完全没有精度。
为了在训练和 inference 中使用这个数据类型bitsandbytes 使用了两个方法最大程度地降低了其带来的误差
vector-wise quantizationmixed precision decompasition
Huggingface 在这篇文章中用动图解释了 quantization 的实现https://huggingface.co/blog/hf-bitsandbytes-integration
论文
LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scalehttps://arxiv.org/abs/2208.07339
借助 Huggingface PEFT使用 int8 训练 opt-6.5B 的完整流程
https://github.com/huggingface/peft/blob/main/examples/int8_training/Finetune_opt_bnb_peft.ipynb
LoRA Low-Rank Adaptation 是微调 LLMs 最常用的省内存方法之一。
LoRA 发现再微调 LLMs 时更新矩阵update matrix往往特别 sparse也就是说 update matrix 是低秩矩阵。LoRA 的作者根据这一特点将 update matrix reparametrize 为两个低秩矩阵的积积 。
其中A 和 B 的秩为 r且 。
如此一来AB 的参数量将大大小于 .
LoRA 的论文https://arxiv.org/pdf/2106.09685.pdf
借 助 Huggingface PEFT 框 架 使 用 LoRA 微 调 mt0
https://github.com/huggingface/peft/blob/main/examples/conditional_generation/peft_lora_seq2seq.ipynb
Gradient Checkpointing
在 torch 中使用 - 把 model 用一个 customize 的 function 包装一下即可详见
Explore Gradient-Checkpointing in PyTorchhttps://qywu.github.io/2019/05/22/explore-gradient-checkpointing.html
在 Huggingface Transformers 中使用
https://huggingface.co/docs/transformers/v4.27.2/en/perf_train_gpu_one#gradient-checkpointing
Torch FSDPCPU offload
Fully Sharded Data ParalleFSDP和 DeepSpeed 类似均通过 ZeRO 等分布优化算法减少内存的占用量。其将模型参数梯度和优化器状态分布至多个 GPU 上而非像 DDP 一样在每个 GPU 上保留完整副本。CPU offload 则允许在一个 back propagation 中将参数动态地从 GPU - CPU, CPU - GPU 进行转移从而节省 GPU 内存。
Huggingface 这篇博文解释了 ZeRO 的大致实现方法https://huggingface.co/blog/zero-deepspeed-fairscale
借助 torch 实现 FSDP只需要将 model 用 FSDPwarp 一下同样cpu_offload 也只需要一行代码
https://pytorch.org/blog/introducing-pytorch-fully-sharded-data-parallel-api/
在这个可以查看 FSDP 支持的模型https://pytorch.org/docs/stable/fsdp.html
在 Huggingface Transformers 中使用 Torch FSDP
https://huggingface.co/docs/transformers/v4.27.2/en/main_classes/trainer#transformers.Trainin
根据某些 issueshard_grad_op只分布保存 optimizer states 和 gradients模式可能比 fully_shard 更稳定
https://github.com/tatsu-lab/stanford_alpaca/issues/32
如何让大模型输出合规化
根据用户的输入问题内容大模型进行生成回答的内容但是生成的回答不直接对外输出给用户。需要进行合规的处理因为大模型的输出内容不可控对于严肃的场景以免引起用户的投诉。所以需要进合并处理。
目前处理的方法模型生成内容再把这些内容生成向量再查询话术向量库得到最相似的话术。如果查询结果或相似得分比较阈值低或者查询不到结果则走兜底策略。兜底策略按用户所在的对话阶段实验不同的兜底话术。或者使用万能兜底话术。
应用模式变更
机器人销售场景的case:
纯大模型AI模式最初直接是大模型机器人直接和用户对话全流程都是大模型对话走流程。
对比之前的AI小模型意图、话术策略人工模式发现之前的初始阶段通过率高些初步判断可能是用户说的太发散大模型不好收敛。
就调整为AI大模型AI模式。这样前面的AI主要是小模型意图、话术策略模式任务引导更明确。大模型可以更好的和有意向的用户进行交互更容易引导用户成单。
模型输出的分布比较稀疏怎么处理
可以采用一些方法来处理模型输出的分布稀疏例如使用softmax函数的温度参数调节来平滑输出分布或者引入正则化技术如Dropout以减少模型对特定类别的过度依赖。
总结
本文讨论了大模型LLMs推理时的显存占用、推理速度、推理能力、生成参数设置以及省内存的训练/微调/推理方法。大模型推理时显存占用高主要因为序列长和缓存K/V加速解码。推理速度在GPU和CPU上差异显著int8模式推理速度较慢。大模型具有推理能力如ChatGPT的in-context correction。生成参数设置需调整top_p, num_beams, repetition_renalty, temperature等。省内存方法包括fp16混合精度、int8量化、LoRA、梯度检查点和Torch FSDPCPU offload。通过这些方法可以在有限的计算资源下高效训练和推理大模型。