LLama3.1之我见

文摘   2024-07-24 12:07   新加坡  

本文涉及到的详细测试代码和测试步骤后续放置于:

https://github.com/davidsajare/david-share.git

下的:LLM/Llama3.1-Test

欢迎给repo点亮Star,您的点赞是作者持续创作的动力。

一、模型查看

Llama3.1发布后,再度刷榜。我们静下心看看技术点。

Meta Llama 3.1系列是Meta开发的多语言大规模语言模型(LLMs),包括8B、70B和405B三种规模。Llama 3.1模型经过预训练和指令调优,专为多语言对话场景优化,性能优于许多现有的开源和闭源聊天模型。

查看Hugging Face上发布的模型,其中405B的模型原生已经提供FP8的版本:

我们结合Meta-Llama-3.1-405B-Instruct的模型配置文件,做一些分析:

https://huggingface.co/meta-llama/Meta-Llama-3.1-405B-Instruct/blob/main/config.json

  1. 架构

  • 这是一个用于因果语言模型的架构,适用于生成任务,如文本生成和对话系统。

  • 模型架构LlamaForCausalLM

  • 优化的Transformer架构:使用优化的Transformer架构,支持自回归语言模型。

  • 注意力机制

    Meta-Llama-3.1-405B-Instruct模型使用了分组查询注意力(Grouped-Query Attention, GQA)

    • 有16个键值头,帮助捕捉和表示输入数据的不同方面。

    • 模型有128个注意力头,提高模型的表达能力和性能。

    • 不使用注意力dropout,保持模型的完整性。

    • 不使用注意力偏置,为了简化模型或提高计算效率。

    • attention_biasfalse

    • attention_dropout0.0

    • num_attention_heads128

    • num_key_value_heads16

  • 标记

    • 句子结束的标记ID。

    • 句子开始的标记ID。

    • bos_token_id128000

    • eos_token_id[128001, 128008, 128009]

  • 隐藏层

    • 模型有126个隐藏层。

    • 中间层的大小为53248。

    • 隐藏层的大小为16384。

    • 使用的激活函数是silu(Sigmoid Linear Unit)。

    • hidden_actsilu

    • hidden_size16384

    • intermediate_size53248

    • num_hidden_layers126

  • 位置嵌入

    • factor8.0

    • low_freq_factor1.0

    • high_freq_factor4.0

    • original_max_position_embeddings8192

    • rope_typellama3

    • 最大位置嵌入为131072。

    • max_position_embeddings131072

    • rope_scaling

    • rope_theta500000.0

  • 其他参数

    • 词汇表大小为128256。

    • 使用的Transformers库版本为4.42.3

    • 使用的Torch数据类型为bfloat16

    • 不绑定词嵌入。

    • RMSNorm的epsilon值。

    • 预训练的TP为1。

    • 模型类型为llama

    • 不使用MLP偏置。

    • mlp_biasfalse

    • model_typellama

    • pretraining_tp1

    • rms_norm_eps1e-05

    • tie_word_embeddingsfalse

    • torch_dtypebfloat16

    • transformers_version4.42.3

    • use_cachetrue

    • vocab_size128256

    训练数据和方法

    • 训练数据:Llama 3.1预训练数据来自公开可用的在线数据,总计约15万亿个token。微调数据包括公开可用的指令数据集和超过2500万个合成生成的示例。

    • 数据新鲜度:预训练数据截止到2023年12月。

    • 训练硬件:使用Meta定制的GPU集群和生产基础设施进行预训练和微调。

    • 训练时间和能耗:总共使用了39.3M GPU小时,峰值功耗为700W,训练期间的温室气体排放为11,390吨CO2eq,但由于Meta使用可再生能源,市场基础的温室气体排放为0吨CO2eq。


    二、训练和推理资源需求

    https://huggingface.co/blog/llama31

    针对训练。从下表可以看出,微调还是建议使用Q-LoRA。

    针对推理,推理推荐使用FP8。FP8会与主流推理引擎兼容:(transformers, TGI, VLLM).

    看目前代码支持的是Flash att2:

    后续应该会支持Flash att3。这样在NVIDIA H系列GPU上FP8推理有tensor core硬件加速,LLama3.1用了Flash att3后性能应该有不少提升。

    FlashAttention-3

    FlashAttention-3 使用 NVIDIA 的 CUTLASS 库中的抽象来整合这些新的 Hopper 特性。像 ThunderKitten 2 和 cuDNN 9 这样的研究表明,这些硬件特性可以显著加速注意力计算。通过调整 FlashAttention 以利用这些特性,其性能显著提高(例如,从 FlashAttention-2 FP16 前向传递的 350 TFLOPS 到约 540-570 TFLOPS)。Hopper 上的异步指令(WGMMA 和 TMA)进一步提供了算法优化的机会。FlashAttention-3 引入了三种关键技术来增强现代 GPU 架构上的性能:

    1. 生产者-消费者异步(Producer-Consumer Asynchrony)

    • 解释:这种方法采用 warp 专用的软件流水线,将数据生产者和消费者分成不同的 warp。

    • 优势:这种分离利用异步执行来更好地隐藏内存和指令发出延迟。

    • 例子:假设你在做一个复杂的计算任务,任务分为两个部分:数据准备和数据处理。传统方法中,这两个部分是顺序执行的,数据准备完成后才开始数据处理。而使用生产者-消费者异步技术,数据准备和数据处理可以同时进行。比如,当一个 warp 在准备数据时,另一个 warp 已经在处理之前准备好的数据,这样可以更好地利用 GPU 资源,提高整体效率。

  • 在异步块状 GEMM 下隐藏 Softmax(Hiding Softmax Under Asynchronous Block-wise GEMMs)

    • 解释:通过将低吞吐量的 softmax 操作与异步 WGMMA 指令重叠,FlashAttention-3 可以绕过 softmax 和 GEMM 之间的顺序依赖。

    • 优势:这种方法可以显著提高计算效率。例如,在一个两阶段版本中,当 softmax 处理分数矩阵的一个块时,WGMMA 计算下一个块。

    • 例子:假设你在做一个神经网络的前向传递,需要进行矩阵乘法(GEMM)和 softmax 操作。传统方法中,这两个操作是顺序执行的,必须等待 GEMM 完成后才能进行 softmax。而使用这种技术,当 softmax 处理第一个数据块时,WGMMA 已经开始计算下一个数据块的 GEMM,这样可以更好地利用计算资源,提高整体速度。

  • 硬件加速的低精度 GEMM(Hardware-accelerated Low-precision GEMM)

    • 解释:这种调整针对 FP8 张量核心进行 GEMM,几乎将测量的 TFLOPS/s 翻倍。

    • 优势:通过块量化和不一致处理来管理 FP32 累加器和 FP8 操作数矩阵的不同布局要求,以减轻精度降低带来的影响。

    • 例子:假设你在做一个大规模的矩阵乘法运算,使用高精度的 FP32 浮点数可以得到非常精确的结果,但处理速度较慢。现在你决定使用低精度的 FP8 浮点数,虽然精度有所降低,但处理速度大大提高。例如,原来使用 FP32 需要 2 秒钟完成的任务,现在使用 FP8 只需要 1 秒钟。这对于对速度要求高且对精度要求不高的应用非常有用。

    重量选手:FlashAttention-3



    大魏分享
    https://github.com/davidsajare/david-share.git
     最新文章