当前位置: 首页 > news >正文

旋转位置RoPE编码详解

一. 旋转位置编码和正余弦位置编码比对

旋转位置编码(RoPE)和正余弦位置编码(Sinusoidal Position Encoding)是两种常用的位置编码方法,它们在处理序列数据时具有不同的数学形式和特性。以下是对两者优劣的详细说明及底层数学推理:

1. 正余弦位置编码(Sinusoidal Position Encoding)

1)数学形式
对于位置 \( \text{pos} \) 和维度 \( i \),正余弦编码定义为:
\[
\text{PE}(\text{pos}, 2i) = \sin\left(\frac{\text{pos}}{10000^{2i/d}}\right), \quad
\text{PE}(\text{pos}, 2i+1) = \cos\left(\frac{\text{pos}}{10000^{2i/d}}\right)
\]
其中 \( d \) 是模型的嵌入维度,\( i \in [0, d/2) \)。不同维度使用不同频率的正余弦函数,频率随维度增加呈指数下降。

2)优点
1. 显式相对位置编码:  
   对于固定偏移 \( k \),存在线性变换 \( T_k \) 使得 \( \text{PE}(\text{pos} + k) = T_k \cdot \text{PE}(\text{pos}) \)。例如,对于频率 \( \omega_i = 1/10000^{2i/d} \),有:
   \[
   \begin{aligned}
   \sin(\omega_i (\text{pos} + k)) &= \sin(\omega_i \text{pos}) \cos(\omega_i k) + \cos(\omega_i \text{pos}) \sin(\omega_i k), \\
   \cos(\omega_i (\text{pos} + k)) &= \cos(\omega_i \text{pos}) \cos(\omega_i k) - \sin(\omega_i \text{pos}) \sin(\omega_i k),
   \end{aligned}
   \]
   这等效于二维旋转矩阵 \( R(\omega_i k) \) 作用在 \( [\sin(\omega_i \text{pos}), \cos(\omega_i \text{pos})]^T \)。因此,相对位置信息可通过线性组合捕捉。

2. 确定性与可扩展性: 
   编码是确定性的,无需学习参数,且能处理任意长度序列。

3)缺点
1. 内容与位置耦合:  
   位置编码与词嵌入通过加法结合,导致注意力分数包含四部分:
   \[
   \mathbf{q}_i^T \mathbf{k}_j = (\mathbf{x}_i + \text{PE}(i)) \mathbf{W}_Q \mathbf{W}_K^T (\mathbf{x}_j + \text{PE}(j))^T,
   \]
   其中交叉项(如 \( \mathbf{x}_i \mathbf{W}_Q \mathbf{W}_K^T \text{PE}(j)^T \))需要模型学习复杂的位置-内容交互。

2. 绝对位置偏差:  
   编码本质上是绝对位置的,长序列泛化可能受限。

---

2. 旋转位置编码(Rotary Position Embedding, RoPE)

1)数学形式
对词嵌入 \( \mathbf{x} \in \mathbb{R}^d \),将其划分为 \( d/2 \) 个二维子空间,对每个子空间应用旋转矩阵 \( R_m \):
\[
R_m = \begin{bmatrix}
\cos m\theta_i & -\sin m\theta_i \\
\sin m\theta_i & \cos m\theta_i
\end{bmatrix}, \quad \theta_i = 10000^{-2i/d},
\]
其中 \( m \) 是位置,\( i \) 是子空间索引。查询和键向量通过旋转注入位置信息:
\[
\mathbf{q}_m = R_m \mathbf{x}_m \mathbf{W}_Q, \quad \mathbf{k}_n = R_n \mathbf{x}_n \mathbf{W}_K.
\]

2)优点
1. 显式相对位置编码:  
   注意力分数 \( \mathbf{q}_m^T \mathbf{k}_n \) 仅依赖相对位置 \( n - m \):
   \[
   \mathbf{q}_m^T \mathbf{k}_n = (\mathbf{x}_m \mathbf{W}_Q)^T R_{m}^T R_n (\mathbf{x}_n \mathbf{W}_K) = (\mathbf{x}_m \mathbf{W}_Q)^T R_{n - m} (\mathbf{x}_n \mathbf{W}_K),
   \]
   其中 \( R_{n - m} \) 是相对位置的旋转矩阵。内积直接编码相对位置,无需模型学习。

2. 模长不变性:  
   旋转是正交变换,保持向量模长,增强数值稳定性。

3. 长序列适应性:  
   相对位置编码天然适应长序列,测试时无需外推。

3)缺点
1. *实现复杂度:  
   需将向量分块旋转,实现较复杂。

2. 预设频率敏感性:  
   频率参数 \( \theta_i \) 需预设,可能影响不同任务表现。

3. 数学推导对比

1)正余弦编码的注意力分数
\[
\mathbf{q}_i^T \mathbf{k}_j = \underbrace{\mathbf{x}_i \mathbf{W}_Q \mathbf{W}_K^T \mathbf{x}_j^T}_{\text{内容项}} + \underbrace{\mathbf{x}_i \mathbf{W}_Q \mathbf{W}_K^T \text{PE}(j)^T + \text{PE}(i) \mathbf{W}_Q \mathbf{W}_K^T \mathbf{x}_j^T}_{\text{交叉项}} + \underbrace{\text{PE}(i) \mathbf{W}_Q \mathbf{W}_K^T \text{PE}(j)^T}_{\text{位置项}}.
\]
模型需同时学习内容、位置及其交互,增加了复杂性。

2)RoPE的注意力分数
\[
\mathbf{q}_m^T \mathbf{k}_n = (\mathbf{x}_m \mathbf{W}_Q)^T R_{n - m} (\mathbf{x}_n \mathbf{W}_K) = \sum_{i=0}^{d/2-1} (\mathbf{x}_m^{(i)} \mathbf{W}_Q^{(i)})^T R^{(i)}_{n - m} (\mathbf{x}_n^{(i)} \mathbf{W}_K^{(i)}),
\]
其中 \( R^{(i)}_{n - m} \) 是第 \( i \) 个子空间的旋转矩阵。相对位置 \( n - m \) 直接作用于内积,简化了位置建模。

3)总结

特性正余弦位置编码旋转位置编码
位置信息注入方式加法(词嵌入 + 位置编码)乘法(旋转矩阵作用于词嵌入)
相对位置编码需通过线性变换学习显式编码于内积中
长序列适应性可处理任意长度,但泛化能力有限更优(依赖相对位置,无需绝对位置外推)
计算复杂度低(预计算加法)中等(分块旋转操作)
数值稳定性可能受相加干扰优(旋转保持模长不变)
实现难度简单复杂

4)选择建议:  
- 正余弦编码适合计算资源有限或需要快速实现的场景。  
- 旋转编码适合对位置敏感的任务(如长文本生成、问答),尤其是需要显式相对位置建模的场景。

二. 旋转位置编码计算逻辑示例

以下以输入 **5个token**,每个token的词向量维度为 **512** 为例,详细说明旋转位置编码的计算步骤,包括权重矩阵 \( W^Q \)、\( W^K \) 的维度及旋转矩阵 \( R_m \) 的生成过程。

1. 输入与权重矩阵

(1) 输入矩阵
输入序列为 **5个token**,每个token的词向量维度为 **512**,输入矩阵表示为:
\[
X \in \mathbb{R}^{5 \times 512}
\]

(2) 权重矩阵
- **查询权重矩阵** \( W^Q \in \mathbb{R}^{512 \times 512} \)
- **键权重矩阵** \( W^K \in \mathbb{R}^{512 \times 512} \)
- **值权重矩阵** \( W^V \in \mathbb{R}^{512 \times 512} \)

通过线性变换生成初始的 \( Q \)、\( K \)、\( V \):
\[
Q = X W^Q, \quad K = X W^K, \quad V = X W^V \quad \Rightarrow \quad Q, K, V \in \mathbb{R}^{5 \times 512}
\]

2. 旋转位置编码的核心思想

- 目标:将位置信息注入 \( Q \) 和 \( K \) 中,使得它们的点积能隐式编码相对位置。
- 方法:将每个词向量的维度划分为 **256个二维子空间**,对每个子空间应用旋转矩阵 \( R_m^{(i)} \),旋转角度由位置 \( m \) 和频率 \( \theta_i \) 决定。

3. 旋转矩阵的生成

(1) 频率参数
对第 \( i \) 个二维子空间,频率参数定义为:
\[
\theta_i = 10000^{-2i/512}, \quad i \in [0, 255]
\]
例如:
- \( i = 0 \): \( \theta_0 = 10000^{0} = 1 \)
- \( i = 1 \): \( \theta_1 = 10000^{-2/512} \approx 0.9647 \)
- \( i = 255 \): \( \theta_{255} = 10000^{-510/512} \approx 1.58 \times 10^{-5} \)

(2) 旋转角度
对位置 \( m \),第 \( i \) 个子空间的旋转角度为:
\[
\text{angle}_i = m \cdot \theta_i
\]

(3) 旋转矩阵
生成二维旋转矩阵:
\[
R_m^{(i)} = \begin{bmatrix}
\cos(\text{angle}_i) & -\sin(\text{angle}_i) \\
\sin(\text{angle}_i) & \cos(\text{angle}_i)
\end{bmatrix}
\]

4. 计算旋转后的 Q 和 K

(1) 划分二维子空间
将每个token的 **512维向量** 划分为 **256个二维子空间**:
\[
\mathbf{q}_m = [\mathbf{q}_m^{(0)}, \mathbf{q}_m^{(1)}, \ldots, \mathbf{q}_m^{(255)}], \quad \mathbf{q}_m^{(i)} \in \mathbb{R}^2
\]
例如:
- \( \mathbf{q}_m^{(0)} = [q_{m,0}, q_{m,1}] \)
- \( \mathbf{q}_m^{(1)} = [q_{m,2}, q_{m,3}] \)
- ...
- \( \mathbf{q}_m^{(255)} = [q_{m,510}, q_{m,511}] \)
(2) 应用旋转矩阵
对每个子空间 \( i \) 和位置 \( m \),计算旋转后的向量:
\[
\begin{aligned}
q_{m,2i}^{\text{rot}} &= q_{m,2i} \cos(m\theta_i) - q_{m,2i+1} \sin(m\theta_i) \\
q_{m,2i+1}^{\text{rot}} &= q_{m,2i} \sin(m\theta_i) + q_{m,2i+1} \cos(m\theta_i)
\end{aligned}
\]

(3) 重构旋转后的 Q 和 K
将所有子空间旋转后的结果拼接回 **512维向量**,得到旋转后的 \( Q_{\text{rot}} \) 和 \( K_{\text{rot}} \)。

5. 注意力分数的计算

计算旋转后的注意力分数矩阵:
\[
\text{Attention Scores} = \frac{Q_{\text{rot}} \cdot K_{\text{rot}}^T}{\sqrt{512}}
\]
由于旋转矩阵的正交性,内积仅依赖相对位置 \( n - m \):
\[
\mathbf{q}_m^{\text{rot}} \cdot \mathbf{k}_n^{\text{rot}} = \sum_{i=0}^{255} \mathbf{q}_m^{(i)} \cdot R_{n-m}^{(i)} \cdot \mathbf{k}_n^{(i)}
\]

6. 具体数值示例

假设 **位置 \( m = 1 \)**,**子空间 \( i = 0 \)**:
- 频率:\( \theta_0 = 1 \)
- 旋转角度:\( \text{angle}_0 = 1 \times 1 = 1 \) 弧度
- 旋转矩阵:
\[
R_1^{(0)} = \begin{bmatrix}
\cos(1) & -\sin(1) \\
\sin(1) & \cos(1)
\end{bmatrix} \approx \begin{bmatrix}
0.5403 & -0.8415 \\
0.8415 & 0.5403
\end{bmatrix}
\]
- 原始子空间向量:\( \mathbf{q}_1^{(0)} = [2.0, 3.0] \)
- 旋转后向量:
\[
\begin{aligned}
q_{1,0}^{\text{rot}} &= 2.0 \times 0.5403 - 3.0 \times 0.8415 \approx -1.6245 \\
q_{1,1}^{\text{rot}} &= 2.0 \times 0.8415 + 3.0 \times 0.5403 \approx 3.0252
\end{aligned}
\]

7. 总结

步骤操作
输入维度5个token,每个512维
权重矩阵WQ,WK∈R512×512WQ,WK∈R512×512
子空间划分将512维划分为256个二维子空间
旋转矩阵生成基于位置 mm 和频率 θi=10000−2i/512θi​=10000−2i/512
旋转后Q/K每个二维子空间独立旋转,拼接后保持512维
注意力分数内积隐式编码相对位置 n−mn−m

通过旋转位置编码,模型无需显式学习位置偏差,直接通过几何变换捕捉相对位置关系,提升长序列建模能力。

三. 基于pytorch的完整代码实现

基于PyTorch的正余弦位置编码与旋转位置编码(RoPE)实现详解

1. 正余弦位置编码(Sinusoidal Position Encoding)

1)数学公式:
对于位置 \( \text{pos} \) 和维度 \( i \),编码定义为:
\[
\text{PE}(\text{pos}, 2i) = \sin\left(\frac{\text{pos}}{10000^{2i/d}}\right), \quad
\text{PE}(\text{pos}, 2i+1) = \cos\left(\frac{\text{pos}}{10000^{2i/d}}\right)
\]
其中 \( d \) 为嵌入维度。

2)PyTorch实现步骤:

1. 生成位置索引与维度索引:

import torchdef sinusoidal_position_encoding(max_len, d_model):position = torch.arange(max_len).unsqueeze(1)  # (max_len, 1)div_term = torch.exp(torch.arange(0, d_model, 2) * -(math.log(10000.0) / d_model)pe = torch.zeros(max_len, d_model)pe[:, 0::2] = torch.sin(position * div_term)  # 偶数维度pe[:, 1::2] = torch.cos(position * div_term)  # 奇数维度return pe  # (max_len, d_model)

2. 与输入嵌入结合:

class TransformerEmbedding(nn.Module):def __init__(self, vocab_size, d_model, max_len):super().__init__()self.token_embed = nn.Embedding(vocab_size, d_model)self.pe = nn.Parameter(sinusoidal_position_encoding(max_len, d_model), requires_grad=False)def forward(self, x):# x: (batch_size, seq_len)embeddings = self.token_embed(x)  # (batch_size, seq_len, d_model)seq_len = x.size(1)embeddings += self.pe[:seq_len, :]  # 添加位置编码return embeddings

3. 关键细节:
- 预计算与缓存:位置编码矩阵预先计算并注册为不训练的模型参数(`requires_grad=False`)。
- 动态长度处理:通过切片 `pe[:seq_len]` 适应不同序列长度。
- 广播机制:PyTorch自动将 `pe` 广播到批次维度。

2. 旋转位置编码(RoPE)

1)数学公式:
对词向量 \( \mathbf{x} \in \mathbb{R}^d \),划分为 \( d/2 \) 个二维子空间,每个子空间应用旋转矩阵:
\[
R_m^{(i)} = \begin{bmatrix}
\cos(m\theta_i) & -\sin(m\theta_i) \\
\sin(m\theta_i) & \cos(m\theta_i)
\end{bmatrix}, \quad \theta_i = 10000^{-2i/d}
\]

2)PyTorch实现步骤:

1. 生成频率张量:

def get_freqs(d_model: int):theta = 1.0 / (10000 ** (torch.arange(0, d_model, 2) / d_model))return theta  # (d_model // 2,)

2. 生成旋转矩阵:

def rotate_half(x):# 将输入分为前后两半并旋转x1, x2 = x.chunk(2, dim=-1)return torch.cat((-x2, x1), dim=-1)def apply_rotary_pos_emb(q, k, freqs):# q, k: (batch_size, seq_len, n_heads, head_dim)# freqs: (1, seq_len, 1, head_dim // 2)theta = freqs.unsqueeze(0).unsqueeze(2)  # (1, seq_len, 1, head_dim//2)theta = theta.to(q.device)# 构造复数形式q_complex = torch.view_as_complex(q.float().reshape(*q.shape[:-1], -1, 2))k_complex = torch.view_as_complex(k.float().reshape(*k.shape[:-1], -1, 2))# 应用旋转rotated_q = q_complex * torch.polar(torch.ones_like(theta), theta)rotated_k = k_complex * torch.polar(torch.ones_like(theta), theta)# 转换回实数形式rotated_q = torch.view_as_real(rotated_q).flatten(-2)rotated_k = torch.view_as_real(rotated_k).flatten(-2)return rotated_q.type_as(q), rotated_k.type_as(k)

3. 整合到注意力层:

class RotaryAttention(nn.Module):def __init__(self, d_model, n_heads):super().__init__()self.d_model = d_modelself.n_heads = n_headsself.head_dim = d_model // n_headsself.freqs = get_freqs(self.head_dim)self.wq = nn.Linear(d_model, d_model)self.wk = nn.Linear(d_model, d_model)self.wv = nn.Linear(d_model, d_model)def forward(self, x, freqs):# x: (batch_size, seq_len, d_model)B, L, _ = x.shapeq = self.wq(x).view(B, L, self.n_heads, self.head_dim)k = self.wk(x).view(B, L, self.n_heads, self.head_dim)v = self.wv(x).view(B, L, self.n_heads, self.head_dim)# 应用RoPEq_rot, k_rot = apply_rotary_pos_emb(q, k, freqs)# 计算注意力分数scores = torch.einsum('bqhd,bkhd->bhqk', q_rot, k_rot) / (self.head_dim ** 0.5)attn = torch.softmax(scores, dim=-1)out = torch.einsum('bhqk,bkhd->bqhd', attn, v).reshape(B, L, -1)return out

4. 关键细节:
- 复数操作优化:使用 `torch.view_as_complex` 和 `torch.polar` 简化旋转操作。
- 维度处理:将多头注意力头维度(`head_dim`)分为二维子空间,适应旋转操作。
- 频率张量缓存:预先计算频率张量 `freqs`,避免重复计算。

3. 完整模型集成

1)RoPE集成到Transformer:

class RotaryTransformer(nn.Module):def __init__(self, vocab_size, d_model, n_heads, max_len):super().__init__()self.embedding = nn.Embedding(vocab_size, d_model)self.freqs = get_freqs(d_model // n_heads)self.attention = RotaryAttention(d_model, n_heads)# 其他层(FFN、LayerNorm等)省略def forward(self, x):x = self.embedding(x)freqs = self.freqs[:x.size(1)]  # 动态截取频率x = self.attention(x, freqs)return x

2)动态位置适应:

# 在训练时根据实际序列长度调整
def get_freqs_for_seq(seq_len, freqs_base):return freqs_base[:seq_len]

4. 验证与测试

1)正余弦编码验证:

max_len = 50
d_model = 512
pe = sinusoidal_position_encoding(max_len, d_model)
assert pe.shape == (max_len, d_model)

2)RoPE旋转验证:

# 检查旋转后的内积是否仅依赖相对位置
q = torch.randn(1, 2, 1, 64)  # 位置1和2的查询
k = torch.randn(1, 2, 1, 64)  # 位置1和2的键
freqs = get_freqs(64 // 2)
q_rot, k_rot = apply_rotary_pos_emb(q, k, freqs)
score_same = (q_rot[0,1] @ k_rot[0,1].T).item()  # 位置1与1
score_diff = (q_rot[0,1] @ k_rot[0,0].T).item()  # 位置1与0
assert score_same != score_diff  # 确保位置敏感

5. 总结

编码类型实现关键点
正余弦编码预计算位置编码矩阵,动态切片适配序列长度,通过广播机制高效相加。
旋转编码(RoPE)利用复数操作实现向量旋转,分块处理二维子空间,确保注意力分数反映相对位置。

性能优化建议:
- 缓存频率张量:避免每次前向传播重复计算。
- 混合精度训练:使用 `torch.cuda.amp` 加速RoPE中的复数运算。
- 自定义内核:对旋转操作编写CUDA内核以进一步提升效率。

相关文章:

旋转位置RoPE编码详解

一. 旋转位置编码和正余弦位置编码比对 旋转位置编码(RoPE)和正余弦位置编码(Sinusoidal Position Encoding)是两种常用的位置编码方法,它们在处理序列数据时具有不同的数学形式和特性。以下是对两者优劣的详细说明及…...

canvas(二)-动画(2d)

<canvas> 动画是通过 JavaScript 动态更新画布内容来实现的。它利用 requestAnimationFrame 方法实现平滑的动画效果&#xff0c;适用于游戏、数据可视化、交互式图形等场景。真的需要数据可视化等场景使用&#xff0c;还是直接引入外部模型还原度比较高&#xff0c;但同…...

Dynamics 365 Business Central Azure application registration

本方法适用于 单租户服务器身份验证。 实现方法 在大多数组织里ERP Admin 不一定有权限 Azure Admin权限&#xff0c;在实施过程中你只需要把以下指引发给你的系统管理员。 请注意后面有系统管理员设置好后&#xff0c;你如何检查。 导航到 https://admin.microsoft.com 并登…...

选择合适的Azure数据库监控工具

Azure云为组织提供了众多服务&#xff0c;使其能够无缝运行应用程序、Web服务和服务器部署&#xff0c;其中包括云端数据库部署。Azure数据库能够与云应用程序实现无缝集成&#xff0c;具备可靠、易扩展和易管理的特性&#xff0c;不仅能提升数据库可用性与性能&#xff0c;同时…...

Access链接Azure SQL

Hi&#xff0c;大家好呀&#xff01; 最近在给大家分享了SQL Server方面的一些视频&#xff0c;那今天我们也来讲讲Azure SQL。 什么是Azure SQL&#xff0c;这里我们就不介绍了&#xff0c;如果你没有用这个数据库&#xff0c;那你可以简单的把它理解成&#xff0c;就是SQL …...

34、React Server Actions深度解析

一、灵魂契约协议&#xff08;核心机制&#xff09; 1. 次元融合架构 "use server";async function borrowBook(bookId: number, readerName: string) {// 模拟数据库操作const result await db.execute(UPDATE books SET available false WHERE id ?,[bookId]…...

Azure 应用服务中的异常处理、日志记录和通知:综合指南

简介 Azure 应用服务是基于云的应用程序&#xff0c;使开发人员能够在云上构建、部署和管理应用程序。与任何应用程序一样&#xff0c;制定适当的异常处理、日志记录和通知实践至关重要&#xff0c;以确保应用程序平稳运行&#xff0c;并快速识别和解决任何问题。在本篇博文中&…...

第16天-使用Python Pillow库常见图像处理场景

1. 打开与显示图像 from PIL import Image# 打开图像文件 img = Image.open("input.jpg")# 显示图像基本信息 print(f"格式: {img.format}") # JPEG print(f"尺寸: {img.size}") # (宽度, 高度) print(f"模式: {img.mode}") …...

VUE3+TS实现图片缩放移动弹窗

完整代码 使用VUE3、TS&#xff0c;实现将图片通过鼠标拖拽缩放以及选择缩放比例。 <template><div><el-dialogv-model"dialogVisible"title"查看图片":close-on-click-modal"false":close-on-press-escape"false"fu…...

关于Vue自定义组件封装的属性/事件/插槽的透传问题

// parent.vue <Myinputv-model"keyWords"placeholder"请输入内容"size"small"input"input"change"change"width"320" ><template #prepend><el-select v-model"select" placeholder&qu…...

智能驾驶中的深度学习:基于卷积神经网络的车道线检测

摘要 智能驾驶是人工智能技术的重要应用领域之一,而车道线检测是实现自动驾驶的基础功能。本文介绍了一种基于深度学习的车道线检测方法,使用卷积神经网络(CNN)对道路图像进行实时分析。文章详细阐述了数据预处理、模型构建、训练优化及实际部署的完整流程,并提供了Pytho…...

在 Excel xll 自动注册操作 中使用东方仙盟软件2————仙盟创梦IDE

// 获取当前工作表名称string sheetName (string)XlCall.Excel(XlCall.xlfGetDocument, 7);// 构造动态名称&#xff08;例如&#xff1a;Sheet1!MyNamedCell&#xff09;string fullName $"{sheetName}!MyNamedCell";// 获取引用并设置值var namedRange (ExcelRe…...

【每周一个MCP】:将pytdx封装成MCP

文章目录 配置文件MCP代码(其实github上都有)不错不错,星星之火可以燎原。 https://github.com/ddholiday/onedayoneMCP/tree/main/MCPs/tdx-mcp 配置文件 pytdx有两种读取数据的方式,分别是,从API读取,和从本地读取。 其中,从API读取,需要IP和端口。 这个官方文档…...

Vue3中插槽, pinia的安装和使用(超详细教程)

1. 插槽 插槽是指, 将一个组件的代码片段, 引入到另一个组件。 1.1 匿名插槽 通过简单的案例来学习匿名插槽&#xff0c;案例说明&#xff0c;在父组件App.vue中导入了子组件Son1.vue&#xff0c;父组件引用子组件的位置添加了一个片段&#xff0c;比如h2标签&#xff0c;然…...

【Java高阶面经:微服务篇】5.限流实战:高并发系统流量治理全攻略

一、限流阈值的三维度计算模型 1.1 系统容量基准线:压测驱动的安全水位 1.1.1 压力测试方法论 测试目标:确定系统在资源安全水位(CPU≤80%,内存≤70%,RT≤500ms)下的最大处理能力测试工具: 单机压测:JMeter(模拟10万并发)、wrk(低资源消耗)集群压测:LoadRunner …...

学习黑客了解密码学

5分钟了解密码学&#xff1a;从古老艺术到现代科学 &#x1f510; 作者: 海尔辛 | 发布时间: 2025-05-21 08:36:35 UTC 密码学简介&#xff1a;保护信息的艺术与科学 &#x1f4dc; 密码学是研究如何安全传递和存储信息的学科。它不仅仅是加密和解密&#xff0c;更包含了身份…...

【UE5】环形菜单教程

效果 步骤 1. 下载图片资源&#xff1a;百度网盘 请输入提取码 提取码:fjjx 2. 将图片资源导入工程&#xff0c;如下 3. 新建3个控件蓝图&#xff0c;这里分别命名为“WBP_CircularMenu”、“WBP_Highlight”、“WBP_Icon” 4. 打开“WBP_Icon”&#xff0c;设置“所需” 添加…...

【JVM】学习笔记

1. JVM概述 JVM是一个抽象的计算机&#xff0c;用于运行Java程序。它将Java字节码转化为特定平台的机器代码&#xff0c;确保Java程序具有跨平台性。 2. JVM架构 JVM的架构通常包括以下几个主要部分&#xff1a; 类加载子系统&#xff08;ClassLoader&#xff09;&#xff…...

物流项目第五期(运费计算实现、责任链设计模式运用)

前四期&#xff1a; 物流项目第一期&#xff08;登录业务&#xff09;-CSDN博客 物流项目第二期&#xff08;用户端登录与双token三验证&#xff09;-CSDN博客 物流项目第三期&#xff08;统一网关、工厂模式运用&#xff09;-CSDN博客 物流项目第四期&#xff08;运费模板列…...

PrintStream PrintWriter Java 打印流

使用场景​&#xff1a; 代替 System.out 输出日志&#xff08;比如 System.setOut(printStream)&#xff09;需要输出各种类型&#xff08;如 println(123)、println("hello")&#xff09; 常用方法​&#xff1a; print(), println() → 支持所有基本类型和对象pr…...

前端excel表格解析为json,并模仿excel显示

前端环境&#xff1a;elementUI vue2 <style lang"scss" scoped> 页面效果 jsondata为mock数据&#xff0c;为方便调试其内容可清空&#xff0c;首行&#xff08;字母坐标&#xff09;随数据内容自动变化&#xff0c;首列也是一样&#xff0c;模拟excel …...

NumPy 2.x 完全指南【十六】分割数组

文章目录 1. 数组分割1.1 split1.2 array_split1.3 vsplit1.4 hsplit1.5 dsplit1.6 unstack 1. 数组分割 数组分割是指将一个数组拆分为多个子数组的操作&#xff0c;常用于数据处理、并行计算、分块处理等场景。NumPy 提供了多种分割函数&#xff0c;允许用户沿不同方向&…...

vue3 + vite 使用tailwindcss

第一步&#xff1a;安装依赖 vite版本较低&#xff08;“vite”: “^4.0.0”&#xff09;所以就使用低版本的tailwindcss npm install -D tailwindcss3.4.1 postcss autoprefixer第二步&#xff1a;配置文件生成 npx tailwindcss init -p会自动生成两个文件postcss.config.js和…...

K个一组链表翻转

目录 1. 题意 2. 解题思路 3. 代码 1. 题意 给一个链表&#xff0c;按 k 进行翻转&#xff0c;也就是 k 2 &#xff0c;两两进行翻转&#xff0c;如果不够2则不动。 2. 解题思路 首先思考怎么翻转一个链表&#xff0c;反转链表&#xff1a;https://leetcode.cn/problems…...

逆向音乐APP:Python爬虫获取音乐榜单 (1)

1. 引言 在数字音乐时代&#xff0c;许多平台如音乐有榜单&#xff0c;限制非付费用户访问高音质或独家内容。然而&#xff0c;从技术研究的角度来看&#xff0c;我们可以通过逆向工程和Python爬虫技术解音乐的API接口&#xff0c;获取付费音乐的播放链接。 2. 技术准备 在当…...

STM32之串口通信WIFI上云

一、W模块的原理与应用 基本概念 如果打算让硬件设备可以通过云服务器进行通信&#xff08;数据上报/指令下发&#xff09;&#xff0c;像主流的云服务器有阿里云、腾讯云、华为云&#xff0c;以及其他物联网云平台&#xff1a;巴法云.......&#xff0c;硬件设备需要通过TCP…...

Python爬虫实战:获取天气网最近一周北京的天气数据,为日常出行做参考

1. 引言 随着互联网技术的发展,气象数据的获取与分析已成为智慧城市建设的重要组成部分。天气网作为权威的气象信息发布平台,其数据具有较高的准确性和实时性。然而,人工获取和分析天气数据效率低下,无法满足用户对精细化、个性化气象服务的需求。本文设计并实现了一套完整…...

【Java学习笔记】main方法

main 方法 一、深入理解 main 方法 特变注意&#xff01;&#xff01; 1. 在main()方法中&#xff0c;我们可以直接调用 mian 方法所在类的静态方法或静态属性 2. 不能访问该类中的非静态成员&#xff0c;必须创建该类的一个实例对象后&#xff0c;才能通过这个对象去访问类中…...

振动分析 - 献个宝

1.一个自制的振动能量分析工具 这个分析工具似乎真的定位到了故障的具体位置。 1.1对一组实验室虚拟信号的分析结果: 1.2 对现场真实数据的分析结果 依照边频带的调制,和边频的缝隙宽度,基本定位到问题。 追加几份待看的文档: 齿轮结构的频谱特征 - 知乎使用 FFT 获得…...

数学实验(Matlab绘图基础)

一、二维曲线的绘制 Matlab绘图原理 MATLAB绘图的核心原理基于数据点或函数离散化&#xff0c;通过描点连线生成图形。以下是具体解析&#xff1a; 1.数据离散化 二维数据通过&#xff08;x, y&#xff09;坐标点表示&#xff0c;连续函数需离散化处理&#xff08;如t0:0.01…...

【android bluetooth 协议分析 02】【bluetooth hal 层详解 3】【高通蓝牙hal主要流程介绍-上】

1. 背景 本节主要讨论 高通 蓝牙 hal 中&#xff0c;的一些流程。 看看你是否都清楚如下问题&#xff1a; 高通芯片电如何控制&#xff1f;串口是在哪里控制的&#xff1f;固件如何下载&#xff1f;初始化流程是怎么样的&#xff1f; 如果你已经对上述讨论的问题&#xff0c…...

Linux | tmux | 无法复制粘贴

问题&#xff1a;在Linux中使用tmux时&#xff0c;总是没法使用复制粘贴功能&#xff1b; 解决: 如果希望直接用鼠标选择并复制&#xff08;类似普通终端&#xff09;&#xff0c;可以&#xff1a; 在 ~/.tmux.conf 中添加&#xff1a;sh set -g mouse on;重新加载 tmux 配置…...

如何通过小贝加速实现精准网络故障排查

在日常使用电脑的过程中&#xff0c;我们常常需要监控系统运行状态、优化性能或排查网络问题。最近发现一款名为小贝加速的桌面工具&#xff0c;在此分享关于小贝加速如何实现网络监控。 系统优化 该工具提供了简洁明了的系统优化功能。通过扫描可以清理系统冗余文件、释放内存…...

Nginx 网站服务

目录 一&#xff1a;基于授权的访问控制 1&#xff1a;基于授权的访问控制简介 2&#xff1a;基于授权的访问控制步骤 二&#xff1a;基于客户端的访问控制 1&#xff1a;基于客户端的访问控制简介 2&#xff1a;基于客户端的访问控制步骤 三&#xff1a;Nginx 虚拟主机…...

Python 字典的用法和技巧

字典的创建与初始化 Python 字典是一种可变容器模型&#xff0c;可存储任意类型对象。字典的每个键值对用冒号分隔&#xff0c;键值对之间用逗号分隔&#xff0c;整个字典包括在花括号中。 # 创建一个空字典 empty_dict {}# 创建一个包含键值对的字典 my_dict {name: Alice…...

电力设备制造企业数字化转型路径研究:从生产优化到生态重构

电力设备制造业作为支撑能源革命的核心领域&#xff0c;其数字化转型不仅关乎企业降本增效&#xff0c;更是实现“双碳”目标与新型电力系统建设的关键抓手。本文基于行业标杆案例与实践经验&#xff0c;系统梳理电力设备企业数字化转型的五大核心路径。 一、生产流程智能化&a…...

初识GPU加速:如何利用GPU提升AI训练效率

随着人工智能(AI)和深度学习技术的快速发展,训练深度神经网络(DNN)已经变得越来越复杂和计算密集。传统的CPU已经无法满足大量计算任务的需求,因此,GPU(图形处理单元)成为了训练深度学习模型时的必备工具。本篇文章将介绍如何利用GPU加速AI训练效率,以及在使用GPU时应…...

深入解析异步编程:Java NIO、Python `async/await` 与 C# `async/await` 的对比

在现代编程中&#xff0c;异步编程已成为处理 I/O 密集型任务&#xff08;如网络请求、文件操作等&#xff09;的高效方式。不同的编程语言提供了各自的异步编程模型&#xff0c;以提高程序的性能和资源利用率。本文将深入解析 Java 的 NIO、Python 的 async/await 和 C# 的 as…...

阿里云数据盘级别

数据盘PL0、PL1、PL2和PL3的区别体现在性能、容量范围以及应用场景等方面。具体分析如下&#xff1a; 性能 PL0&#xff1a;单盘最大IOPS为10,000&#xff0c;最大吞吐量为180MB/s。适用于中小型MySQL和SQLServer等数据库场景&#xff0c;中小规模ELK日志集群&#xff0c;SAP和…...

使用 Spring AI Alibaba 集成阿里云百炼大模型应用

随着人工智能技术的飞速发展&#xff0c;大模型在各个领域的应用越来越广泛。阿里云百炼大模型提供了强大的语言理解和生成能力&#xff0c;但如何将其高效地集成到实际应用中&#xff0c;一直是开发者关注的焦点。本文将详细介绍如何使用 Spring AI Alibaba 集成阿里云百炼大模…...

阿里云合集(不定期更新)

一、阿里云申请免费域名证书流程&#xff1a;https://blog.csdn.net/humors221/article/details/143266059 二、阿里云发送国内短信怎样编程&#xff1a;https://blog.csdn.net/humors221/article/details/139544193 三、阿里云ECS服务器磁盘空间不足的几个文件&#xff1a;h…...

零基础设计模式——创建型模式 - 抽象工厂模式

第二部分&#xff1a;创建型模式 - 抽象工厂模式 (Abstract Factory Pattern) 我们已经学习了单例模式&#xff08;保证唯一实例&#xff09;和工厂方法模式&#xff08;延迟创建到子类&#xff09;。现在&#xff0c;我们来探讨创建型模式中更为复杂和强大的一个——抽象工厂…...

ConcurrentHashMap导致的死锁事故

事故现象 某线上服务共100台容器&#xff0c;第二天上午流量高峰期部分容器&#xff08;约10%&#xff09;cpu飙升&#xff0c;升至100%。 部分堆栈信息 堆栈信息如下如所示&#xff1a; 当前线程堆栈显示在JsonContext.get方法中调用computeIfAbsent&#xff0c;其Lambda表…...

Python高效网络爬虫开发指南

Python 网络爬虫入门与实战 一、引言 随着互联网数据的爆炸性增长&#xff0c;获取和分析这些数据变得越来越重要。网络爬虫作为数据采集的重要工具&#xff0c;在这其中扮演了不可或缺的角色。 二、环境搭建 首先我们需要安装Python环境以及一些必要的库&#xff1a; req…...

关于C++使用位运算交换变量值的分析

1、使用临时变量交换 交换变量的值&#xff0c;最常见的方法就是用临时变量。 void swap1(int& a, int& b){int c a;a b;b c; }清晰明了。 2、位运算版 对于整数类型&#xff0c;相信很多人都见过下面方法&#xff0c;可以使用位运算&#xff0c;从而不借用临时…...

06 接口自动化-框架封装思想建立之httprunner框架(下)

文章目录 一、httprunner如何实现数据驱动第一种&#xff1a;直接在脚本里面指定参数列表&#xff0c;最简单。适合于参数比较少的情况。第二种&#xff1a;使用CSV文件&#xff0c;适合于参数比较大的情况。第三种方式&#xff1a;使用函数生成数据&#xff0c;适用于数据变化…...

Dirsearch 深度使用教程:从基础扫描到携带 Cookie 探索网站

在网络安全测试和网站信息收集过程中&#xff0c;Dirsearch 是一款强大的开源工具&#xff0c;能够快速扫描网站&#xff0c;找出潜在的目录和文件。而当面对需要登录才能访问的网站资源时&#xff0c;通过携带 Cookie 扫描&#xff0c;Dirsearch 可以模拟已登录状态&#xff0…...

垃圾回收(GC)基础原理全面解析

掌握 GC 原理,是高效 Java 开发的第一步! 前言 垃圾回收(Garbage Collection,简称 GC)是 Java 的核心优势之一,它让开发者无需手动管理内存,极大降低了内存泄露和悬挂指针的风险。但当应用进入高并发、大数据量的场景时,GC 机制本身反而会成为性能瓶颈。 理解 GC 的原…...

海康NVR录像回放SDK原始流转FLV视频流:基于Java的流媒体转码(无需安装第三方插件ffmpeg)

wlinker-video-monitor 代码地址&#xff1a;https://gitee.com/wlinker/wlinker-video-monitor 背景与需求 在安防监控、智能楼宇等场景中&#xff0c;海康威视设备作为行业主流硬件&#xff0c;常需要将录像回放功能集成到Web系统中。然而&#xff0c;海康设备的原始视频流…...

【项目】SpringBoot +MybatisPlus集成多数据源

引言 应项目需求&#xff0c;需要引入另外的Mysql数据库&#xff0c;但是项目已经引入一个Mysql&#xff0c;这时有几种方案 通过Dynamic-DataSource 框架&#xff0c;无缝集成 但是是动态切换数据源的&#xff0c;跟项目需求不符合&#xff0c;于是采取第二种通过自定义数据…...