尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

旋转:IMRoPE朴素

旋转:IMRoPE朴素 IMRoPE朴素.h// IMRoPE朴素.h —— 多模态分段旋转位置编码IMRoPE的朴素标量实现// 用途给 Q/K 向量注入位置信息的旋转位置编码支持多模态的 4 段频率划分文本/图像/视频/其他// 说明M1 朴素实现——逐对惰性计算 cos/sin不建缓存为后续 AVX-512 优化M2提供教学对照// 数学公式纯文本标准 RoPE IMRoPE 段划分// 标准 RoPE 对第 k 对维度 (x[2k], x[2k1]) 旋转角度 θ_k// x[2k] x[2k]·cos θ_k − x[2k1]·sin θ_k// x[2k1] x[2k]·sin θ_k x[2k1]·cos θ_k// θ_k pos / base^(2k/d) d 段内维度数pos token 位置// IMRoPE 分段头部维度按每 64 维划分为一段第 s 段的基数为 频率基数 × 段频率基数[s]// 段内按标准 RoPE 旋转段内第 j 对的指数为 2j/64#pragmaonce// 引入基础类型浮点/向量/索引#include公共/基础定义.h// 引入错误处理参数防御时抛运行错误#include公共/错误处理.h// 每段维度IMRoPE 固定将头部按每 64 维划分为一段// 说明qwen35moe 头部维度 256 4 段 × 64 维对应 4 个段频率缩放constexprsize_t 每段维度64;// RoPE配置旋转位置编码的可配置参数// 字段频率基数 基准频率基数qwen35moe 为 1e7// 段频率基数 每段的频率缩放IMRoPE 为 4 段第 s 段的实际基数为 频率基数 × 段频率基数[s]// 旋转维度 参与旋转的前缀元素数qwen35moe 为 64后 192 维不旋转// 说明段频率缩放 0 表示该段不旋转qwen35moe 段3 缩放为 0具体模型段缩放值在任务 13 集成时确定structRoPE配置{浮点 频率基数;向量浮点段频率基数;size_t 旋转维度;};// IMRoPE朴素多模态分段旋转位置编码就地旋转向量前 配置.旋转维度 个元素// 参数向量 头部 Q/K 向量容量 ≥ 头维度头维度 向量元素总数// 位置 token 位置编号配置 频率基数 / 段缩放 / 旋转维度// 说明仅处理前 配置.旋转维度 个元素按 2 维度一对旋转// 每 64 维切换段频率见 每段维度段内按标准 RoPE 逐对旋转// 段缩放 ≤ 0 时该段不旋转voidIMRoPE朴素(float*向量,size_t 头维度,size_t 位置,constRoPE配置配置);IMRoPE朴素.cpp// IMRoPE朴素.cpp —— 多模态分段旋转位置编码IMRoPE朴素实现的实现文件// 数学纯文本// 标准 RoPEθ_k pos / base^(2k/d)旋转公式// x[2k] x[2k]·cos θ_k − x[2k1]·sin θ_k// x[2k1] x[2k]·sin θ_k x[2k1]·cos θ_k// 多模态分段头部按每 64 维划分为 4 段第 s 段基数 频率基数 × 段频率基数[s]// 段内第 j 对的旋转角度 θ pos / 段基数^(2j/64)#include内核/旋转/IMRoPE朴素.h// 引入标准头余弦/正弦/幂逐对计算 cos/sin 与 基数^指数#includecmath// IMRoPE朴素就地旋转向量前 配置.旋转维度 个元素// 实现防御校验 → 逐对旋转每对独立计算 cos/sin惰性不建缓存——M1 朴素// 每 64 维切换段频率段缩放 ≤ 0 时该段跳过voidIMRoPE朴素(float*向量,size_t 头维度,size_t 位置,constRoPE配置配置){// 防御旋转维度不得超过头部维度否则旋转会越界写内存if(配置.旋转维度头维度){抛出运行错误(旋转维度超出头部维度);}// 防御旋转按 2 维度一对进行旋转维度必须是偶数if(配置.旋转维度%2!0){抛出运行错误(旋转维度必须是偶数);}// 对数旋转维度内按 2 维一对的旋转对数constsize_t 对数配置.旋转维度/2;// 逐对旋转每对角度独立计算惰性 cos/sinfor(size_t 对号0;对号对数;对号){// 当前对覆盖的起始维度号2 维一对constsize_t 维号2*对号;// 段号每 64 维切换一段IMRoPE 固定段宽 每段维度constsize_t 段号维号/每段维度;// 防御段号超出配置的段频率数组时抛错配置须覆盖旋转触及的每一段if(段号配置.段频率基数.size()){抛出运行错误(段频率基数不足段号超出配置);}// 段内对号当前对在所属段内的序号0..每段维度/2-1constsize_t 段内对号(维号%每段维度)/2;// 该段实际基数 频率基数 × 段缩放双精度计算避免浮点舍入const长浮点 段基数(长浮点)配置.频率基数*(长浮点)配置.段频率基数[段号];// 段缩放 ≤ 0 表示该段不旋转如 qwen35moe 段3 缩放 0直接跳过if(段基数0.0){continue;}// 旋转角度θ 位置 / 段基数^(2×段内对号/每段维度)双精度减小误差const长浮点 角度(长浮点)位置/std::pow(段基数,(长浮点)(2*段内对号)/每段维度);// 惰性计算本对的 cos/sinM1 朴素不建缓存const长浮点 余弦std::cos(角度);const长浮点 正弦std::sin(角度);// 先取原始两维避免就地更新时第二维已污染第一维的计算const长浮点 原第零维向量[维号];const长浮点 原第一维向量[维号1];// 标准 RoPE 旋转公式就地写入向量[维号](浮点)(原第零维*余弦-原第一维*正弦);向量[维号1](浮点)(原第零维*正弦原第一维*余弦);}}
返回列表