RoPE核心代码手撕(逐行解释)
📅 2026/7/18 20:29:10
👁️ 次浏览
RoPE核心代码手撕# RoPE核心代码手撕# 导入Pytorch核心张量运算库importtorch# 导入pytorch神经网络基类模块用于自定义层继承importtorch.nnasnn# 自定义旋转位置编码层继承nn.moduleclassRoPE(nn.Module):def__init__(self,head_dim,max_len512,base10000,*args,**kwargs):# 调用父类nn.Module的初始化方法必须执行super().__init__(*args,**kwargs)# 保存单个注意力头的特征维度旋转是按头独立进行的self.head_dimhead_dim# 旋转频率的基数控制频率衰减的速度默认10000是行业通用值self.basebase# 预计算逆频率向量长度为head_dim/2,每个元素对应一组维度的旋转频率# 公式inv_freq[i] 1 / base^(2i / head_dim)# 维度索引越大频率越低负责刻画长距离的全局位置关系对应全局位置信息# 维度索引越小频率越高对应捕捉精细的短距离位置差异对应精细位置inv_freq1.0/(base**(torch.arange(0,head_dim,2).float()/self.head_dim))# 注册为buffer:随模型自动迁移CPU/GPU设备不属于可训练参数# persistent False表示不写入模型权重文件推理时可以随时重建节省存储空间self.register_buffer(inv_freq,inv_freq,persistentFalse)# 初始化时预计算最大长度内的cos/sin值缓存起来避免重复计算self._set_cos_sin_cache(max_len)def_set_cos_sin_cache(self,seq_len):内部工具函数预计算所有位置的cos、sin旋转角度值并缓存# 生成位置索引序列[0, 1, 2, ..., seq_len-1]# 设备、数据类型与inv_freq保持一致确保跨设备兼容ttorch.arange(seq_len,deviceself.inv_freq.device).type_as(self.inv_freq)# 爱因斯坦求和实现外积每个位置索引×每个逆频率每个位置每个维度的旋转角度# 输入t形状[seq_len], inv_freq形状[head_dim // 2]# 输出freqs形状[seq_len, head_dim // 2]freqstorch.einsum(i,j - ij,t,self.inv_freq)# 前后半维度复用相同的频率拼接成完整的head_dim长度# 对应半向量拆分旋转的实现方式输出形状[seq_len, head_dim]embtorch.cat((freqs,freqs),dim-1)# 计算所有位置的cos值扩展2个维度适配[batch, heads, seq_len, dim]的广播机制# 最终缓存形状[1, 1, seq_len, head_dim]self.register_buffer(cos_cached,emb.cos()[None,None,:,:],persistentFalse)self.register_buffer(sin_cached,emb.sin()[None,None,:,:],persistentFalse)def_rotate_half(self,x): 内部工具函数构造旋转的正交分量 将特征拆分为前后两半输出[-x2, x1],对应二维旋转公式的正交部分 # 取特征拆为前后两半x1x[...,:x.shape[-1]//2]x2x[...,x.shape[-1]//2:]# 拼接得到正交分量对应二维旋转中的垂直方向returntorch.cat((-x2,x1),dim-1)defforward(self,q,k,seq_lenNone):前向传播对Q和K同时施加旋转位置编码 Args: q:查询向量形状[batch, num_heads, seq_len, head_dim] k:键向量形状[batch, num_heads, seq_len, head_dim] seq_len: 可选指定序列长度默认自动从q中读取 Returns: q_rot, k_rot:旋转后的Q、K向量形状与输入完全一致 # 未传入seq_len时从q的第3维读取当前序列长度ifseq_lenisNone:seq_lenq.shape[2]# 动态扩容如果当前序列长度超过了缓存的最大长度重新计算更长的缓存ifseq_lenself.cos_cached.shape[2]:self._set_cos_sin_cache(seq_len)# 截取当前序列长度对应的cos、sin缓存cosself.cos_cached[:,:,:seq_len,:]sinself.sin_cached[:,:,:seq_len,:]# 核心旋转公式x x * cos rotate_half(x) * sin# 数学上等价于二维旋转变换向量化并行计算所有位置、所有头q_rot(q*cos)(self._rotate_half(q)*sin)k_rot(k*cos)(self._rotate_half(k)*sin)returnq_rot,k_rot# 验证用例# 性质两个向量的注意力点积结果仅和它们的相对位置差有关和绝对位置无关if__name____main__:head_dim8ropeRoPE(head_dimhead_dim,max_len16)# 构造一个固定的特征向量v所有测试都用它保证初始向量唯一v1torch.randn(1,1,1,head_dim)# [batch1, heads1, seq_len1, dim8]v2torch.randn(1,1,1,head_dim)# [batch1, heads1, seq_len1, dim8]# 构造Q序列位置0放v1位置1放v1其余位置不影响qtorch.zeros(1,1,4,head_dim)q[0,0,0,:]v1 q[0,0,1,:]v1# print(v1_shape:, v1.shape)# 构造K序列位置2放v2位置3放v2其余位置不影响ktorch.zeros(1,1,4,head_dim)k[0,0,2,:]v2 k[0,0,3,:]v2# print(v2_shape:, v2.shape)# 执行RoPE旋转q_rot,k_rotrope(q,k)# 第0位Q · 第2位K → 相对距离 2score_0_2torch.sum(q_rot[0,0,0,:]*k_rot[0,0,2,:])# 第1位Q · 第3位K → 相对距离 2score_1_3torch.sum(q_rot[0,0,1,:]*k_rot[0,0,3,:])print(f相对距离2的两组注意力分数)print(fscore_0_2 {score_0_2.item():.6f})print(fscore_1_3 {score_1_3.item():.6f})print(f差值浮点误差内应为0{abs(score_0_2-score_1_3).item():.8f})print(✅ 若差值极小1e-6级别说明RoPE相对位置不变性成立代码正确)
💥💥💥💥💥💥💥💥💞💞💞💞💞💞💞💞💞Matlab领域博客之家💞&…
📅 2026/7/18 20:29:10
做机械零件加工,工艺路线的选择直接影响成本、交期和最终质量。同样是一个零件,工艺选对了省事省钱,选错了可能返工甚至报废。本文把常见的7种工艺:车削、铣削、钻削、镗削、磨削、线切割、电火花,以及各自适用于什么情…
📅 2026/7/18 20:29:10
高速PCB设计进阶:从阻抗本质到过孔换层的完整解析
高速数字电路设计中,信号完整性是系统稳定工作的基石,而阻抗控制是其中最为核心的工程技术。无论走线在表层还是内层,是直行还是换层,根本目标始终不变:让…
📅 2026/7/18 20:29:10
在职场摸爬滚打,或者正站在职业十字路口的朋友,心里多半都有过这样的纠结:想换个更有前景的行业,却苦于没有对口的专业背景;想在现有的岗位上往上走一步,又觉得履历上少了点能拿得出手的“硬通货”。特别是…
📅 2026/7/18 21:41:38
在当前学术写作中,无论是完成本科毕业论文、投稿期刊论文,还是准备开题报告、中期报告、结题报告或文献综述,写作者常面临选题、框架、查重等多重压力。因此,专业的AI论文写作工具应运而生,为这类学术论文创作提供了全…
📅 2026/7/18 21:41:38
导语在汽车后市场中,汽车隔热膜是提升驾驶体验的重要配件。随着2026年的到来,双流区的车主们在选择汽车隔热膜时,往往会关注专业的门店和费用明细。保圣威固7V不凡门店以其专业服务在当地小有名气。接下来,我们将为大家详细解读该…
📅 2026/7/18 21:41:38
作为熬了 3 年论文、前后踩过十几款 AI 写作工具坑的老学长,今天直接给大家上硬货 ——2026 年 AI 写论文工具排行榜!结合《2025 论文写作工具白皮书》的用户实测数据,还有我从本科毕设到硕士小论文的全程使用体验,精选出 7 款真正…
📅 2026/7/18 21:41:38
暗黑破坏神2存档编辑器:可视化修改终极指南 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor
暗黑破坏神2存档编辑器(d2s-editor)是一款专为Diablo 2和Diablo 2: Resurrected玩家设计的开源工具…
📅 2026/7/18 21:41:38
Mocode-1B-Model
模型描述
Mocode 统一模型,集成 7 个 embeddingMLP 子模型,采用 GGUF v3 格式封装为单一文件。
子模型
前缀模型名任务类别数deepseekDeepSeekQualityClassifier数据质量分类2disclawDisclawClassifier法律任务分类10intentTrainedI…
📅 2026/7/18 21:40:38
更多请点击:
https://kaifayun.com
第一章:从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则 在Claude驱动的产品需求文档(PRD)生成实践中,原始业务意图往往以自然语言片…
📅 2026/7/18 0:00:33
更多请点击:
https://codechina.net
第一章:Cursor配置生成失效?3大隐藏陷阱4行修复代码,资深工程师连夜整理的紧急补救清单 Cursor 配置生成突然失效,是近期高频报障场景。表面看是 cursor.config.json 未更新或 LSP…
📅 2026/7/18 0:00:33
作者:钟声编辑:Mark出品:红色星际头图:智能驾驶图片据悉,国内某头部智驾公司端到端模型技术大牛Z投身创业,并且已经拿到融资。Z不仅是该头部公司内部最年轻的对标阿里P10级别技术负责⼈,更是业内…
📅 2026/7/18 0:00:33
豆包openclaw最近圈子里都在聊豆包openclaw,我也没忍住,掏腰包入手了一套。说实话,刚拿到手的时候,心里是打鼓的。毕竟市面上类似的智能硬件太多了,有的吹得天花乱坠,用起来却是一堆bug。为了不让大家的钱打水漂,我连续用了半个月。从开箱到日常高频使用,甚至故意测试它…
📅 2026/7/18 4:14:57
SQLyog 13.3.1 社区版在Windows 10/11上的完整安装与连接指南 对于刚接触MySQL数据库管理的开发者和学生来说,选择一个直观易用的图形化管理工具至关重要。SQLyog作为一款轻量级但功能强大的MySQL GUI工具,能够显著提升数据库操作的效率和体验。本文将详…
📅 2026/7/18 0:00:49
SPEC CPU 2006 跨平台基准测试深度实战:ARM/X86/MIPS 架构配置优化与结果分析方法论在当今多元化的计算架构时代,如何客观评估不同处理器平台的真实性能成为系统工程师和性能优化专家的核心挑战。SPEC CPU 2006 作为业界公认的计算密集型基准测试套件&am…
📅 2026/7/18 16:05:28
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/18 7:01:02
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/18 17:01:33
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/18 5:00:56