rotary_emb 位置编码 加速
目录
Rotary Position Embedding(RoPE) 的底层实现
1. 背景
2. Rotary Embedding 原理(RoPE)
3. rotary_emb 模块的作用
4. 在大模型中的位置
Rotary Position Embedding(RoPE) 的底层实现
rotary_emb
这个模块,一般是指 Rotary Position Embedding(RoPE) 的底层实现,主要用于 Transformer 模型的注意力机制里给 Query / Key 加上位置编码信息。
1. 背景
在 Transformer(尤其是大语言模型)里,位置编码是必须的,因为注意力机制本身对输入序列的顺序不敏感。
传统的 Positional Encoding(PE)是把位置向量直接加到 token embedding 上,而 RoPE 是一种改进方法,用旋转变换的方式把位置信息融入 Q/K 向量。
2. Rotary Embedding 原理(RoPE)
核心思想:
-
把 Q 和 K 的每一对维度
(q2i, q2i+1)
看成一个二维坐标; -
根据位置索引
pos
和一个频率参数,把它旋转一个角度; -
旋转角度随位置线性增长,这样注意力计算时自然包含位置信息。
数学形式:
[ q_2i', q_2i+1'] = [ cos(θ) -sin(θ) ] [ q_2i ] [ q_2i+1', q_2i ' ] [ sin(θ) cos(θ) ] [ q_2i+1]
其中 θ
= pos × base^(-2i/d)
这样做的好处:
-
位置信息是相对的,而不是绝对的,所以可以自然地支持更长的上下文长度;
-
注意力分数在不同位置间变化平滑,泛化能力更好。
3. rotary_emb
模块的作用
在代码层面:
-
rotary_emb
往往是 用 C++/CUDA 写的一个加速算子,负责在 GPU 上批量对 Q/K 做旋转操作; -
它的功能就是在模型 forward 时,快速把 RoPE 应用到多头注意力的输入上。
如果用 Python 写,类似:
而 rotary_emb
的 CUDA 版本就是做同样的事,但速度快很多。
4. 在大模型中的位置
-
LLaMA、GPT-NeoX、MPT 等模型都在注意力机制里用 RoPE;
-
在推理时,
rotary_emb
会在计算 Q/K → Attention 之前被调用一次。
总结一句:
rotary_emb
就是一个在 GPU 上快速实现 RoPE 位置编码的算子,不影响模型架构,但能大幅加速长序列推理。
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
pip install rotary-embedding-torch
pip install rotary_emb
python -c "import torch;import rotary_emb"
python -c "import torch;import rotary_emb"
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: libcudart.so.11.0: cannot open shared object file: No such file or directory