Gemma中RoPE代码详细讲解

深入解析torch.outer算子:从基础用法到版本迁移指南 本文深入解析了PyTorch中torch.outer算子的功能、原理及其与torch.ger的演变关系。文章详细介绍了从torch.ger到torch.outer的版本迁移历程,提供了关键版本节点梳理、常见报错排查方法,并给出了实用的代码兼容性实战指南,帮助开发者平滑应对API变更。 阅读详情

最近在看Gemma代码感觉比LLama的代码看的方便点, 看到RoPE代码跟常规的方式不太一样(也不算常规,就是我理解的方式),特此记录一下。我的RoPE入门代码参考:Rotary Position Embedding (RoPE, 旋转式位置编码) | 原理讲解+torch代码实现
原理我就不讲了,直接贴一下图,图源自于上面的链接。
在这里插入图片描述
我们先粘贴一下代码,逐步讲解:

dim:单头维度信息
end:序列长度
theta:10000
def precompute_freqs_cis(dim: int,
                         end: int,
                         theta: float = 10000.0) -> torch.Tensor:
    """Precomputes the frequency cis."""
    freqs = 1.0 / (theta**(torch.arange(0, dim, 2)[:(dim // 2)].float() / dim))
    t = torch.arange(end, device=freqs.device)
    freqs = torch.outer(t, freqs).float()
    freqs_cis = torch.polar(torch.ones_like(freqs), freqs)  # complex64
    return freqs_cis

x:输入特征维度[batch, end, num_head, dim]
freqs_cis:上个函数获取的结果
def apply_rotary_emb(x: torch.Tensor, freqs_cis: torch.Tensor) -> torch.Tensor:
    """Applies the rotary embedding to the query and key tensors."""
    x_ = torch.view_as_complex(
        torch.stack(torch.chunk(x.transpose(1, 2).float(), 2, dim=-1),
                    dim=-1))
    x_out = torch.view_as_real(x_ * freqs_cis).type_as(x)
    x_out = torch.cat(torch.chunk(x_out, 2, dim=-1), dim=-2)
    x_out = x_out.reshape(x_out.shape[0], x_out.shape[1], x_out.shape[2],
                          -1).transpose(1, 2)
    return x_out

precompute_freqs_cis

  • freqs = 1.0 / (theta**(torch.arange(0, dim, 2)[:(dim // 2)].float() / dim))
    这个代码主要是实现一下公式在这里插入图片描述
    torch.arange(0, dim, 2),生成列表 [0,2, …d_model//2]
  • t = torch.arange(end, device=freqs.device)
    生成序列长度, [0, 1, …, end(也就是序列长度)]
  • freqs = torch.outer(t, freqs).float()
    进行笛卡尔积,维度变成[end, dim//2]
    在这里插入图片描述
  • freqs_cis = torch.polar(torch.ones_like(freqs), freqs)
    通过polar函数生成cos和sin值,为什么要使用torch.ones_like(freqs), 下面公式,abs为1,不就是cos值和sin值了
    在这里插入图片描述

apply_rotary_emb

  • x_ = torch.view_as_complex(
    torch.stack(torch.chunk(x.transpose(1, 2).float(), 2, dim=-1),
    dim=-1))
    x.transpose(1, 2).float()将输入维度变为[batch, num_head, end, dim]
    torch.chunk将数据前dim//2 和后dim//2分开,我理解的是[q0, q1, …qn]是奇偶分开,而不是前后分开,可能无所谓吧。
    torch.stack则是对维度进行合并,产生[batch, num_head, end, dim//2, 2]这种维度。
    我简单举例子验证一下:
import torch
a = torch.arange(10)
print(a)
b = torch.chunk(a, 2, dim=-1)
print(b)
c = torch.stack(b, dim = -1)
print(c)

在这里插入图片描述
并且用torch.view_as_complex转为复述的形式

  • x_out = torch.view_as_real(x_ * freqs_cis).type_as(x)
    x_ * freqs_cis实现复述的预算
    举例子解释一下:
    x_为:q0+q1 i
    freqs_cis:cos+sin i
    实部为:q0cos -q1sin
    虚部为:q1cos + q1sin
    torch.view_as_real函数则是把转为实数的形式,a+bi->[a, b]形式
  • x_out = torch.cat(torch.chunk(x_out, 2, dim=-1), dim=-2)
    则是把维度转为[batch, num_head, end, dim]的形式
  • x_out = x_out.reshape(x_out.shape[0], x_out.shape[1], x_out.shape[2],
    -1).transpose(1, 2)
    转为输入的形式

下面为LLama的RoPE实现:

def apply_rotary_emb(
    xq: torch.Tensor,
    xk: torch.Tensor,
    freqs_cis: torch.Tensor,
) -> Tuple[torch.Tensor, torch.Tensor]:
    xq_ = torch.view_as_complex(xq.float().reshape(*xq.shape[:-1], -1, 2))
    xk_ = torch.view_as_complex(xk.float().reshape(*xk.shape[:-1], -1, 2))
    freqs_cis = reshape_for_broadcast(freqs_cis, xq_)
    xq_out = torch.view_as_real(xq_ * freqs_cis).flatten(3)
    xk_out = torch.view_as_real(xk_ * freqs_cis).flatten(3)
    return xq_out.type_as(xq), xk_out.type_as(xk)

LLama我理解,他则是采用类似于奇偶分开的方式,我简单尝试了一下:

import torch
a = torch.arange(10)
print(a)
b = a.reshape(5,2)
print(b)

在这里插入图片描述

总结:

以上就是我对RoPE代码实现的理解,相比原来理解的方式,这种相对更加简洁,但是略有一些绕

【pytorch算子】torch.ger / torch.outer算子的用法,以及与torch库版本的关系 前情提要:在npu服务器上运行程序,ger算子报错,查看pytorch官方文档后将torch.ger换成了torch.outer 程序运行报错:显示torch没有outer算子 查看torch版本发现我的torch版本是1.5.0 关键点来了: 在pytorch1.7.0之后,torch.ger算子被删掉了,用torch.outer代替。 也就是说,只有pytorch1.7.0的torch.outer与torch.ger功能等价,因此torch1.5.0没有outer算子。 于是我安装了最新的torc 阅读详情

相关推荐

Gemma架构与训练深度解析:从RoPE、GQA到端侧部署实战

Gemma作为面向端侧与企业集成的轻量级开源大模型,其核心并非参数规模堆砌,而是以旋转位置编码(RoPE)、分组查询注意力(GQA)、交替注意力机制和Pre-RMSNorm四大支柱构建高效推理与稳定训练能力。RoPE通过硬件友好的旋转矩阵实现长程建模,GQA显著压缩KV缓存提升显存利用率,交替注意力在全局结构与局部逻辑间取得平衡,而RMSNorm时序设计则增强低精度训练鲁棒性。这些特性使Gemma在消费级GPU、边缘设备及云上vLLM服务中均具备高吞吐、低延迟、易审计的工程优势,广泛应用于金融摘要、工业质检

weixin_34081595的博客 473

详解torch.dot()、torch.outer()、torch.mul()、torch.mm()和torch.matmul()等函数使用技巧

torch.matmul()函数可以用于1维向量×1维向量,1维向量×2维矩阵,2维矩阵×1维向量,矩阵相乘等不同情况。现将相关案例进行介绍方便日后回顾。

li1784506的博客 9614

Gemma 2工程实现深度解析:内存布局、RoPE分组与FlashAttention优化

大语言模型架构设计已从理论FLOPs计算转向硬件感知的内存访问优化。理解Transformer底层的数据移动模式(如KV Cache复用、RoPE位置编码的显存友好实现)是突破边缘部署瓶颈的关键。Gemma 2作为面向长上下文(128K)优化的轻量级模型,其真实价值体现在对GPU显存带宽、PCIe吞吐、cache line对齐等系统级约束的精细适配——例如RoPE动态基频缩放、GeGLU门控的bias归零设计、safetensors零拷贝加载机制。这些细节共同决定了模型能否在A10或树莓派5等资源受限设备上

weixin_30520015的博客 401

torch.view_as_complex用法及代码示例

用法: torch.view_as_complex(input) → Tensor 参数: input(Tensor) -输入张量。 将input的视图作为复数张量返回。对于sizem1,m2,…,mi,2的输入复数张量,此函数返回sizem1,m2,…,mi的新复数张量,其中输入张量的最后一个维度应表示复数的实部和虚部。 警告 view_as_complex()仅支持带有torch.dtypetorch.float64和torch.float32的张量。输入的最后一...

小羊羔子的BLOG 6850

Gemma-4实测解析:隐藏架构、动态RoPE与稀疏FFN的工程落地

大语言模型架构演进已从单纯堆叠参数转向精细化硬件协同设计。以Gemma系列为代表的开源模型,其真实能力往往藏于官方配置之外的运行时行为中——如动态旋转位置编码(RoPE)、分层稀疏前馈网络(FFN)和隐式注意力优化机制。这类设计直指GPU显存带宽瓶颈,通过局部升维、条件激活与kernel级fallback策略,在不增加硬件成本前提下提升长上下文推理效率与生成质量。技术实践者需关注权重文件中的未声明参数、量化兼容性陷阱及vLLM等推理引擎的底层适配逻辑。本文聚焦Gemma-4这一社区共识的隐性升级版本,深入拆

weixin_34408717的博客 391

Gemma 4多模态架构解析:PLE、双RoPE与共享KV缓存实战指南

多模态大模型正从‘能看会说’迈向‘可部署、可商用、可嵌入’的新阶段。其核心挑战在于小参数规模下保持长程语义连贯性、超长上下文稳定性及边缘端推理效率。Gemma 4通过每层嵌入(PLE)机制显著提升多步指令保真度,结合滑动窗口+全局注意力的混合架构与双RoPE位置编码,实现128K上下文下的鲁棒推理;再依托共享KV缓存策略大幅降低显存占用,使31B级模型可在16GB显存云实例稳定运行。这些技术突破直指GUI自动化、视频内容审核、端侧AI Agent等真实工程场景,为开源多模态模型树立了‘真好用’的实用新标准。

weixin_33857679的博客 389

请详细说明Gemma3在Gemma2上改进了什么,有哪些优劣和异同

请详细说明Gemma3在Gemma2上改进了什么,有哪些优劣和异同。

具身机器人和通用AI 1631

torchtyping:PyTorch张量的形状,dtype等的运行时类型注释

火炬打字 输入张量的形状,dtype,名称,...的注释 转这个: def batch_outer_product ( x : torch . Tensor , y : torch . Tensor ) -> torch . Tensor : # x has shape (batch, x_channels) # y has shape (batch, y_channels) # return has shape (batch, x_channels, y_channels) return x . unsqueeze ( - 1 ) * y . unsqueeze ( - 2 ) 到这个: def batch_outer_product ( x : TensorType [ "batch" , "x_channels" ],

一文速览Gemma 1至Gemma 4:从Gemma 1(MHA/MQA,且π0自定义了300M)、Gemma2(新增局部滑窗/改用GQA)、Gemma 3(含270M且首次出现4B)、Gemma 4

如此文《》所讲Google作为曾经的AI老大,我司自然紧密关注,所以当Google总算开源了一个gemma 7b,作为有技术追求、技术信仰的我司,那必须得支持一下,比如用我司的paper-review数据集微调试下,彰显一下gemma的价值与威力。

结构之法 算法之道 7855

沧小海深入剖析xilinx的GTP/GTX核,掌握高速串行收发机制——第六章 接收端结构及功能说明

总目录在这哦~ https://blog.csdn.net/z123canghai/article/details/107700878 第六章 接收端结构及功能说明 子目录 6.1 RX的模拟前端 6.2 RX的OOB信号 6.3 RX的均衡器 6.4 RX的CDR 时钟数据恢复 6.5 RX时钟输出结构 6.6 RX 的极性控制 6.7 RX 的PRBS 6.8 Rx字节、字的对齐功能 6.9 Rx接收弹性缓冲区 6.10 Rx的时钟纠正 6.11 Rx接收通道绑定 6...

滄海的博客 1万+

Arm A-profile架构RAS系统设计:可靠性、可用性与可服务性解析

在计算机体系结构中,可靠性(Reliability)、可用性(Availability)和可服务性(Serviceability)是构建高可信系统的核心要素。RAS系统通过硬件错误检测、隔离和恢复机制,确保系统持续稳定运行。其技术原理包括ECC内存纠错、冗余执行单元和错误传播阻断等关键技术,可显著降低数据中心等关键业务场景的故障率。现代芯片设计中,Arm A-profile架构提供标准化的RAS框架,涵盖从内存子系统到计算单元的全方位错误管理。通过分层防御策略和统一错误记录格式,实现硬件错误可追溯、可修复。

weixin_30920853的博客 355

请说明Gemma2在Gemma1上改进了哪些,详细说明各自架构

特性Gemma 1Gemma 2架构基础Transformer 解码器Transformer 解码器位置编码旋转位置嵌入(RoPE)旋转位置嵌入(RoPE)非线性激活GeGLU近似 GeGLU归一化方式RMSNormRMSNorm最大上下文长度8192 Token8192 Token注意力机制传统多头注意力(MHA)交替局部滑动窗口注意力与全局注意力(滑窗4096,全局8192)查询注意力标准多头分组查询注意力(GQA),提升推理效率网络深度相对较浅更。

具身机器人和通用AI 5508

STM32F103C8T6+HX711:手把手教你打造高精度智能体重秤(附完整代码)

本文详细介绍了如何使用STM32F103C8T6微控制器和HX711称重模块构建高精度智能体重秤,涵盖硬件选型、电路设计、软件开发到无线数据传输的全过程。通过完整的代码示例和校准方法,帮助开发者快速实现毕业设计或商业项目,打造具备物联网功能的智能健康设备。

h6i7j8的博客 1025

Gemma注意力机制详解:RoPE与相对位置编码对比

你是否在训练长文本模型时遇到过位置信息丢失的问题?是否想知道为什么Gemma在处理超长序列时表现更稳定?本文将深入解析Gemma模型中两种关键的位置编码技术——RoPE(Rotary Position Embedding,旋转位置嵌入)和相对位置编码,通过对比分析帮助你理解它们的工作原理、实现差异及适用场景。读完本文,你将能够:掌握Gemma位置编码的核心实现,理解两种编码技术的优缺点,以及在实际...

gitblog_00399的博客 401

西红柿成熟度检测数据集总结

成熟度类别标注数量semiripe(半成熟)10275rotten(腐烂)13470fullyripe(完全成熟)35031unripe(未成熟)26212。

crz1336768325的博客 2125

探索robotics-toolbox-python:从基础安装到高级机器人运动学应用

本文详细介绍了robotics-toolbox-python工具箱,从基础安装、环境配置到机器人运动学与动力学的核心应用。通过D-H参数、URDF导入和内置模型三种方式快速构建机器人模型,并演示了正逆运动学计算、关节空间与任务空间轨迹规划以及三维可视化仿真。该工具箱极大地简化了机器人算法开发流程,是进行机器人学研究和应用实践的强大工具。

i1j2k的博客 496

【论文笔记】Gemma: Open Models Based on Gemini Research and Technology

日期: March 5, 2024平台: 优快云, 知乎状态: Writing谷歌最近放出的Gemma模型【模型名字来源于拉丁文gemma,意为宝石】采用的是与先前Gemini相同的架构。这次谷歌开源了两个规模的模型,分别是2B和7B的版本。【对于个人电脑来说,2B真的要容易运行的多】。在18个基于文本的任务上,有11项胜过其他开源的模型。

Yulki的博客 1890

L2CAP 面向连接信道(CoC)在 BLE 中的应用:建立、流控与数据传输

L2CAP(逻辑链路控制与适配协议)是蓝牙协议栈中的核心层,位于基带层之上,为上层协议提供数据传输服务。在低功耗蓝牙(BLE)中,L2CAP面向连接信道(Connection-Oriented Channel, CoC) 是实现可靠数据传输的关键机制,广泛应用于健康监测、智能家居、工业控制等领域。

byte轻骑兵的技术小窝 3633

Transformer 22. Gemma 1 架构详解:Decoder-only、GeGLU、RoPE 与每一步计算

Gemma 1模型架构解析 Gemma 1是基于Decoder Only Transformer架构的开源语言模型,采用现代LLM设计范式,包括RMSNorm、RoPE位置编码和GeGLU前馈网络等关键技术。模型提供2B和7B两种规模,主要区别在于: 2B版本使用MQA(多头查询注意力)以提升推理效率 7B版本采用标准MHA(多头注意力) 均使用GeGLU替代传统FFN中的ReLU激活 核心流程: 输入文本通过SentencePiece分词为子词序列(词表大小256128) 经过嵌入层和RoPE位置编码后输

破浪会有时的博客 590

完整复现YOLOv8:包括训练、测试、评估、预测阶段【本文源码已开源,地址在文章末尾】

(这里主要是在colab.research.google.com实现的,本地的配置也是类似的方法)YOLOv8是一种用于目标检测的深度学习算法。主要参考:https://github.com/ultralytics/ultralytics/blob/main/README.zh-CN.md。yolov8的权重:https://github.com/ultralytics/assets/releases。yolov8的文档:https://v8docs.ultralytics.com/

源代码杀手的博客 1万+

YOLOv10改进策略【注意力机制篇】| 2024 蒙特卡罗注意力(MCAttn)模块,提高小目标的关注度

本文记录的是基于蒙特卡罗注意力(MCAttn)模块的YOLOv10目标检测改进方法研究。利用提高的跨尺度特征提取能力,使模型能够更好地传递和融合提取的多尺度特征,提高对小目标的关注度。Exploiting Scale-Variant Attention for Segmenting Small Medical Objects使用一种基于随机采样的池化操作来生成尺度无关的注意力图。它从三个不同尺度(3×33×33×3、2×22×22×2和1×11×11×1,即池化张量)中随机选择一个1×11×11×1注意力图

Limiiiing的博客 2186

从架构角度对比gemma3 vs qwen3

gemma3和qwen3是当前最新最优秀的开源大模型,gemma3提供了1B、4B、12B、27B多个版本,其27B量化版支持在一个GPU部署,支持140多种语言。qwen3提供了4B, 8B, 14B, 30B MoE, 32B, 235B MoE等,32B版本支持单GPU部署,支持100多种语言。

liliang199的专栏 3121

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

LLMs之Gemma-2:Gemma 2 的简介、安装和使用方法、案例应用之详细攻略

​ LLMs之Gemma-2:Gemma 2 的简介、安装和使用方法、案例应用之详细攻略 目录 Gemma 2 的简介 Gemma 2 的安装和使用方法 Gemma 2 的案例应用 Gemma 2 的简介 Gemma 2 是 Google 最新的开放大语言模型。它有两种规模:90 亿参数和 270 亿参数,分别具有基础(预训练)和指令调优版本。Gemma 基于 Google DeepMind 的 Gemini,拥有 8K Tokens 的上下文长度: gemma-2-9b:

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 3038

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

谷歌Gemma开源了

谷歌推出了全新的开源模型系列Gemma,相比谷歌之前的 Gemini模型,Gemma 更加轻量,可以免费使用,模型权重也一并开源了,且允许商用。(2)Meta采用开源方式,已经吸引很多开发者参与进来, 谷歌希望借Gemma 的开源,谷歌能够吸引更多的人使用自己的 AI 模型,而不是直接投奔 Meta、Mistral 这样的竞争对手。(3)人类反馈强化学习(RLHF):使用 RLHF 对监督微调模型进一步微调,不仅从人类评分者那里收集了偏好对,还在 Bradley-Terry 模型下训练了奖励函数。

youbingchen的博客 760

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

gemma_pytorch对话问答算法模型

谷歌发布的号称“全球性能最强大、轻量级”的新一代开源2B小模型Gemma,打响小模型战争。

qq_27815483的博客 1006

详细说明Gemma2相对于Gemma1改进了哪些?优势是哪些?

详细说明Gemma2相对于Gemma1改进了哪些?优势是哪些?

具身机器人和通用AI 983
上一篇: KoPA: Making Large Language Models Perform Better in Knowledge Graph Completion
下一篇: P-Tunning V2简单理解
Re:fused
博客等级 码龄9年 474粉丝 162原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值