LLaMa、Qwen、ChatGLM、ChatGLM2的区别

这篇具有很好参考价值的文章主要介绍了LLaMa、Qwen、ChatGLM、ChatGLM2的区别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

LLaMa、Qwen、ChatGLM、ChatGLM2的区别

以下比较的前提是首先和BERT(transfomer)的对比

感谢帮忙给我github repository的star,更多最新模型长期更新:https://github.com/zysNLP/quickllm

LLaMa:

  1. 去掉bias
  2. LayNorm方式:RMSnorm:https://zhuanlan.zhihu.com/p/650231190
    # torch自带LayerNorm
    if self.norm_mode == 'torch_buildin':
    	return F.layer_norm(hidden_states, self.normalized_shape, self.weight, self.bias, self.eps)
    # RMSnorm: t5、大模型系列均使用
    elif self.norm_mode == 'rmsnorm':
    	variance = hidden_states.float().pow(2).mean(-1, keepdim=True)
    	o = (hidden_states.float() * torch.rsqrt(variance + self.eps)).type_as(hidden_states)
    
    1. torch自带LayerNorm (F.layer_norm)
      • 这是PyTorch库中内置的Layer Normalization实现。
      • 输入参数包括:hidden_states(需要归一化的张量)、normalized_shape(归一化的维度,通常是最后一维)、weightbias(可学习的缩放和平移参数)以及eps(为了数值稳定性添加的小常数)。
      • 它首先计算输入在指定维度上的均值和方差,然后使用这些统计量对输入进行归一化,并通过应用可学习的缩放和平移参数来恢复模型的表达能力。
    2. RMSNorm (Root Mean Square Normalization)
      • 只计算输入的方差(即每个元素的平方的平均值),然后通过元素级操作计算归一化后的输出。
      • 具体步骤如下:
        • 计算输入的平方的平均值(variance)。
        • 使用逆平方根(torch.rsqrt())来计算方差的倒数(相当于标准差的倒数)。
        • 将输入与计算出的标准差倒数相乘,得到归一化的结果。

    torch自带的LayerNorm是最完整的实现,包括了可学习的参数;而RMSNorm和自定义LayerNorm则省略了这些参数,可能会牺牲一些模型的表达能力,但在某些情况下可能更简单或更高效。RMSNorm特别适用于那些不需要额外参数的大规模模型。

  3. feedForward不同, 三层全连接
    # 普通bert的FFN:
    self.outDense(self.inter_act_fn(self.interDense(x)))
    # llama、qwen的FFN:
    self.outDense(self.inter_act_fn(self.interDense(x)) * self.interDense2(x))
    
  4. 新增rotary相对位置编码(RoPE)

InternLM:

模型结构: 基本和llama基本一致, 只是各个linear层多了bias; 和Qwen基本一致, 除了o有bias

  1. FeedForward和Llama一致, 三个dense层
  2. 除了qkvo有bias, 其余均没有bias

Qwen:

  1. FeedForward和Llama一致, 三个dense层
  2. 除了qkv有bias, 其余均没有bias
  3. 和InternLM基本一致, 唯一的差别是InternLM的multiHeadAttention.o有bias

ChatGLM

  1. rotary(RoPE)使用的updown+position_encoding_2d

    这是ROPE的二维表达方式,普通的ROPE是一维

  2. qkv合并成一个权重convert时不是concat在一起的
  3. attention_mask的最后一个token仅能访问之前的, 之前的tokens可以互相访问
  4. 跳跃连接有权重设计;embedding之后没有layernorm
# 原始bert,LayerNorm + multiHeadAttention + dropout + FFN + dropout + x+ FFN:其中x来自第一次FFN之后
        x = self.attnLayerNorm(hidden_states, conditional_emb) if self.pre_layernorm else hidden_states  # pre/post layernorm
        self_attn_output = self.multiHeadAttention(x, attention_mask, past_key_value=past_key_value, position_ids=position_ids) 
        residual = x if self.apply_residual_post_layernorm else hidden_states
        hidden_states = self.dropout_add(self_attn_output[0], residual)
        hidden_states = self.attnLayerNorm(hidden_states, conditional_emb) if not self.pre_layernorm else hidden_states
        
        x = self.ffnLayerNorm(hidden_states, conditional_emb) if self.pre_layernorm else hidden_states  # pre/post layernorm
        feedforward_output = self.feedForward(x)
        residual = x if self.apply_residual_post_layernorm else hidden_states
        hidden_states = self.dropout_add(feedforward_output, residual)   # x在这
        hidden_states = self.ffnLayerNorm(hidden_states, conditional_emb) if not self.pre_layernorm else hidden_states
        
# GhatGLM:LayerNorm + multiHeadAttention + alpha*x + FFN + alpha*x:多了一个alpha,其中x来自一开始的LayerNorm之后
        x = self.attnLayerNorm(hidden_states)
        alpha = (2 * self.num_hidden_layers) ** 0.5
        self_attn_output = self.multiHeadAttention(x, attention_mask, past_key_value=past_key_value, **model_kwargs)
        hidden_states = x * alpha + self_attn_output[0]
        x = self.ffnLayerNorm(hidden_states)
        hidden_states = x *alpha +  self.feedForward(x)

ChatGLM2

  1. 不使用Unilm式的mask
    1. flash_attention

      这段代码定义了一个名为flash_attention_forward的函数,用于实现Flash Attention机制。以下是该函数的详细解释:

      1. 函数接受以下参数:

        • query_layer:查询(query)层的输出。
        • key_layer:键(key)层的输出。
        • value_layer:值(value)层的输出。
        • attention_mask:注意力掩码,用于指示哪些位置应该被忽略。
        • query_length:查询序列的长度。
        • softmax_scale:可选的softmax缩放因子。
      2. _get_unpad_data函数用于处理未填充的数据。它计算每个批次中的序列长度、累积和最大序列长度,并返回未填充数据的索引、累积序列长度和最大序列长度。

      3. _upad_input函数负责对输入进行解压和平铺操作。它根据attention_mask计算出需要保留的序列部分,并将查询、键和值层的输出调整为未填充的形状。

      4. dropout变量用于控制dropout概率,如果模型处于训练状态,则使用self.attention_probs_dropout_prob作为概率。

      5. 将查询、键和值层的输出进行转置,以便于后续的矩阵运算。

      6. 根据是否为因果自注意力(即是否为序列到序列任务)和注意力掩码的形状,选择不同的计算方法:

        • 如果不是因果自注意力且注意力掩码为二维(表示仅包含键填充掩码),则使用Flash Attention进行计算。首先调用_upad_input函数对输入进行解压和平铺,然后调用flash_attn_varlen_func函数执行Flash Attention操作,并在计算完成后将结果恢复为原始形状。
        • 如果不是因果自注意力但注意力掩码不符合要求,则发出警告并使用PyTorch内置的注意力计算方法。
        • 如果是因果自注意力,则直接调用flash_attn_func函数执行Flash Attention操作。
      7. 最后,将注意力输出转置回原来的形状并返回。

      总的来说,这段代码实现了Flash Attention机制,通过矩阵分解和局部注意力等技术优化了Transformer模型的计算效率和内存使用效率。在处理非因果自注意力任务时,它支持仅包含键填充掩码的情况,并在其他情况下退回到使用PyTorch内置的注意力计算方法。

    2. multi_query_attention
  • "multi_query_attention"是一种创新的注意力机制设计,它扩展了传统Transformer中的单查询注意力机制。
  • 在Multi-Query Attention中,每个位置的输入可能会生成多个查询向量,这些查询向量可以独立地参与注意力计算,并与键(key)和值(value)矩阵进行交互。
  • 多个查询向量可以捕捉到输入的不同方面或信息源,增强模型的理解和表达能力。例如,一个查询可能关注词汇级别的信息,另一个查询可能关注句法或语义级别的信息。
  • 具体实现可能包括对输入向量进行分解、复制或学习多个查询权重等技术。生成的多个查询向量将分别用于计算注意力分数,并与相应的值向量进行加权求和,得到最终的注意力输出。

NLP基础付费课程(自己讲的):《AIGC大模型理论与工业落地实战》 折扣方式:

公众号”NLP小讲堂“回复自己的联系方式,或github中issue留言联系方式。课程五折。文章来源地址https://www.toymoban.com/news/detail-772696.html

到了这里,关于LLaMa、Qwen、ChatGLM、ChatGLM2的区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【ollama】(2):在linux搭建环境,编译ollama代码,测试qwen大模型,本地运行速度飞快,本质上是对llama.cpp 项目封装

    https://github.com/ollama/ollama/tree/main/docs https://www.bilibili.com/video/BV1oS421w7aM/ 【ollama】(2):在linux搭建环境,编译ollama代码,测试qwen大模型,本地运行速度飞快,本质上是对llama.cpp 项目封装 要是失败执行,子模块更新: 需要编译 llama.cpp 的代码, 然后经过漫长的编译,就而可以

    2024年04月08日
    浏览(63)
  • llama.cpp部署通义千问Qwen-14B

    llama.cpp是当前最火热的大模型开源推理框架之一,支持了非常多的LLM的量化推理,生态比较完善,是个人学习和使用的首选。最近阿里开源了通义千问大语言模型,在众多榜单上刷榜了,是当前最炙手可热的开源中文大语言模型。今天在github上看到前几天llama.cpp已经支持Qwe

    2024年02月03日
    浏览(53)
  • LLaMA-Factory可视化界面微调chatglm2;LoRA训练微调模型 简单案例

    参考:https://github.com/huggingface/peft https://github.com/hiyouga/LLaMA-Factory 类似工具还有流萤,注意是做中文微调训练这块;来训练微调的chatglm2需要完整最新文件,不能是量化后的模型;另外测试下来显卡资源要大于20来G才能顺利,这边T4单卡训练中间显存不足,需要开启4bit量化才行

    2024年02月05日
    浏览(53)
  • LLMs:LLaMA Efficient Tuning(一款可高效微调【全参数/LoRA/QLoRA】主流大模型【ChatGLM2/LLaMA2/Baichuan等】的高效工具【预训练+指令监督微调+

    LLMs:LLaMA Efficient Tuning(一款可高效微调【全参数/LoRA/QLoRA】主流大模型【ChatGLM-2/LLaMA-2/Baichuan等】的高效工具【预训练+指令监督微调+奖励模型训练+PPO 训练+DPO 训练】)的简介、安装、使用方法之详细攻略 目录 相关文章 LLMs之ChatGLM:ChatGLM Efficient Tuning(一款高效微调ChatGLM-6B/Ch

    2024年02月09日
    浏览(67)
  • LLaMA-Factory 8卡4090 deepspeed zero3 微调Qwen14B-chat

    环境安装 推荐使用docker,Ubuntu20.04 https://www.modelscope.cn/docs/%E7%8E%AF%E5%A2%83%E5%AE%89%E8%A3%85 下载模型 在modelscope主页,找到模型 https://modelscope.cn/models/qwen/Qwen-14B-Chat/summary 可以使用如下脚本 微调 使用LLaMA-Factory, 下载下面仓库的代码, https://github.com/hiyouga/LLaMA-Factory 在代码目录,

    2024年04月15日
    浏览(53)
  • 大语言模型-中文chatGLM-LLAMA微调

    微调 大语言模型-ChatGLM-Tuning 大语言模型-微调chatglm6b 大语言模型-中文chatGLM-LLAMA微调 大语言模型-alpaca-lora 本地知识库 大语言模型2-document ai解读 大语言模型-DocumentSearch解读 大语言模型-中文Langchain 本文解读代码的地址: https://github.com/27182812/ChatGLM-LLaMA-chinese-insturct 中文inst

    2024年02月09日
    浏览(44)
  • 关于生成式语言大模型的一些工程思考 paddlenlp & chatglm & llama

    生成式语言大模型,随着chatgpt的爆火,市场上涌现出一批高质量的生成式语言大模型的项目。近期百度飞桨自然语言处理项目paddlenlp发布了2.6版本。更新了以下特性:全面支持主流开源大模型Bloom, ChatGLM, GLM, Llama, OPT的训练和推理;Trainer API新增张量训练能力, 简单配置即可开

    2024年02月12日
    浏览(42)
  • 【通义千问】大模型Qwen GitHub开源工程学习笔记(3)-- 通过Qwen预训练语言模型自动完成给定的文本

    本笔记分析了使用预训练的模型生成文本的示例代码。它的步骤如下: 使用已加载的分词器 tokenizer 对输入文本进行处理,转换为模型可以理解的格式。输入文本是国家和首都的信息,最后一句是未完成的,需要模型来生成。 将处理后的输入转移到模型所在的设备上(例如

    2024年02月07日
    浏览(51)
  • 开源语音大语言模型来了!阿里基于Qwen-Chat提出Qwen-Audio!

    论文链接: https://arxiv.org/pdf/2311.07919.pdf 开源代码: https://github.com/QwenLM/Qwen-Audio 大型语言模型(LLMs)由于其良好的知识保留能力、复杂的推理和解决问题能力,在通用人工智能(AGI)领域取得了重大进展。然而,语言模型缺乏像人类一样感知非文本模态(如图像和音频)的

    2024年01月18日
    浏览(43)
  • LLaMA-Factory使用V100微调ChatGLM2报错 RuntimeError: “addmm_impl_cpu_“ not implemented for ‘Half‘

    微调命令 已经从huggingface下载完整的模型并配置正确路径,也对自定义数据集仿照alpaca_gpt4_data_zh.json在dataset_info.json中写入相关配置。但运行如上命令还是有报错如下: 命令运行过程中,看上去已经成功加载模型了,应该是训练第1个epoch时的报错。我 --fp16 加到上面的命令中

    2024年02月04日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包