一文深入了解DeepSeek-R1:模型架构
本文深入探讨了 DeepSeek-R1 模型架构。让我们从输入到输出追踪 DeepSeek-R1 模型,以找到架构中的新发展和关键部分。DeepSeek-R1 基于 DeepSeek-V3-Base 模型架构。本文旨在涵盖其设计的所有重要方面。
📝 1. 输入上下文长度
DeepSeek-R1的输入上下文长度为128K。
DeepSeek-R1 从其基础模型 DeepSeek-V3-Base 继承了 128K 上下文长度。最初,DeepSeek-V3 使用 4K 上下文长度进行预训练。然后,利用 YaRN 技术,两阶段上下文长度扩展首先将其增加到 32K,然后增加到 128K。
YaRN(另一种 RoPE 扩展方法)是一种旨在有效扩展使用旋转位置嵌入 (RoPE)的大型语言模型 (LLM) 的上下文窗口的技术。RoPE 使用旋转矩阵对位置信息进行编码,而 YaRN 则修改这些旋转频率的缩放方式。它不是简单地推断频率(这通常会导致性能下降),而是平滑地插入和调整这些频率,从而能够更好地推广到更长的上下文。它在计算上是高效的,并且无需大量重新训练即可扩展模型上下文长度。
🏛 2. 总层数
DeepSeek-R1 由一个嵌入层、其后的 61 个变换器层以及输出阶段的多个预测头组成。
DeepSeek-R1 在所有 Transformer 层上采用多头潜在注意力 (MLA) 层,而不是标准多头注意力。前三个 Transformer 层与其他层不同,使用标准前馈网络 (FFN) 层。从第 4 层到第 61 层,混合专家 (MoE) 层取代了 FFN 层。MLA 和 MoE 的细节将在以下部分中探讨。
带有维度的完整模型架构描述:
DeepSeek-V3使用多标记预测 (MTP) 技术,利用最后两个预测头预测接下来的2 个标记。第二个预测标记的接受率介于85% 和 90%之间,表明在各个生成主题中均具有很高的可靠性。 DeepSeek-R1 (DeepSeek-V3) 总共包含 671B 个参数,其中每个标记激活 37B 个。在这里插入图片描述
🔬 3. 前 3 个 DeepSeek-R1 层
前 3 层由多头潜在注意力 (MLA) 和标准 FFN 层组成。这些通常被称为“密集 LLM 层”,因为 FFN 层不会被 MoE 层取代,相比之下 MoE 层被认为更稀疏。
DeepSeek-R1 中的前 3 个 Transformer 层
🧩 4. DeepSeek-R1 的第 4 层至第 61 层
这些层由 MLA 层和 MoE 层组成。我们将在接下来的部分中了解什么是 MLA 层和 MoE 层以及它们如何工作。
MoE Transformer 层
🧠 5.多头潜在注意力(MLA)
现在让我们了解什么是 MLA。
MLA 首次在 DeepSeek-V2 中引入,并已延续到 DeepSeek-V3 和 DeepSeek-R1。
为什么要开发MLA?
以下是 DeepSeek-V2 论文/技术报告中的一份声明,它清楚地阐述了开发 MLA 背后的原因。
“传统的Transformer模型通常采用多头注意力机制(MHA),但在生成过程中,其繁重的键值(KV)缓存会成为限制推理效率的瓶颈。为了减少KV缓存,提出了多查询注意力机制(MQA)和分组查询注意力机制(GQA)。它们需要的KV缓存量级较小,但性能不如MHA。
对于 DeepSeek-V2,我们设计了一种创新的注意力机制,称为多头潜在注意力 (MLA)。MLA 配备了低秩键值联合压缩,性能优于 MHA,但所需的 KV 缓存量却少得多。”
MLA 与 MHA、GQA 和 MQA 的比较:来自 DeepSeek-V2 的图表
MLA 如何实现减少 KV 缓存以加快推理速度?
“MLA 的核心是对注意力键和值进行低秩联合压缩,以减少推理过程中的键值 (KV) 缓存。” — DeepSeek-V2
让我们一步一步地理解这个图:
步骤 1:Q、K 和 V 的下投影
MLA 层的输入是 h t h_t ht。为清楚起见,我们假设 h t h_t ht 的形状为 (input_sequence_length×2000)。
在传统的 Transformer 层中,权重矩阵用于将 h_t 投影到查询 (Q)、键 (K) 和值 (V) 表示中。这些表示中的每一个通常都保留与输入相同的隐藏维度,从而导致 Q、K、V 具有 (input_sequence_length×2000) 的形状。
MLA 层的输入是 h t h_t ht。为清楚起见,我们假设 h t h_t ht 的形状为 (input_sequence_length×2000)。
在传统的 Transformer 层中,权重矩阵用于将 h_t 投影到查询 (Q)、键 (K) 和值 (V) 表示中。这些表示中的每一个通常都保留与输入相同的隐藏维度,从而导致 Q、K、V 具有 (input_sequence_length×2000) 的形状。
然而,在具有多头潜在注意力 (MLA) 的 Transformer 层中,权重矩阵生成的 Q、K 和 V 的尺寸明显小于输入。MLA 不会保留完整的隐藏维度,而是会减小它们的尺寸。例如,如果输入 h t h_t ht 的形状为 (序列长度 × 2000),则生成的 Q、K 和 V 的形状可能为 (序列长度 × 100)。
在实施过程中,通常会融合 Q、K 和 V 的权重矩阵,以提高GPU 上的计算和内存效率。不是应用单独的投影,而是使用组合权重矩阵来优化操作。在 MLA 中, K和V的生成遵循这一原则。具体而言,在方程中使用单个权重矩阵,表示为 W D K V W^{DKV} WDKV 。这里, W D K V W^{DKV} WDKV 中的“D”代表下投影权重矩阵,反映了其在降低维度以实现高效注意力计算方面的作用。
潜在 K 和 V 嵌入
此投影的输出是包含 K 和 V 的连接表示。可以使用简单的切片机制轻松提取它们。结果输出的形状为 (序列长度 × 200),其中第一个 (序列长度 × 100) 对应于 K,其余 (序列长度 × 100) 对应于 V。
压缩的 K 和 V 输出在推理期间被缓存,从而显著减少了 KV 缓存的内存占用。
类似地,Q 也在MLA中被压缩。Q 的结果形状为(序列长度 × 100)。
第 2 步:Q、K 和 V 的向上投影
压缩后,Q、K 和 V被向上投影回更大的尺寸以进行注意力计算。这个更大的尺寸可以匹配原始输入 h t h_t ht ,也可以遵循基于注意力头配置的结构。
例如,向上投影的形状可以是:
- (序列长度×2000),与输入大小匹配。
- 序列长度×3200),其中3200来自于64×50(有64 个注意力头,每个头有 50 个维度)。
K 和 V 向上投影
Q 向上投影
Q、K 和 V的上投影是使用专用权重矩阵执行的:
- W_UK 表示K 向上投影
- W_UV 用于垂直向上投影
- W_UQ 用于Q 向上投影
这里,“U”代表向上投影,表示将压缩表示扩展回更大维度的空间以进行注意力计算。
注意:每个注意力头的输入维度将进行调整以适应旋转位置嵌入 (RoPE)。此调整将在接下来的部分中变得更加清晰。
步骤 3:Q 和 K 中的 RoPE 嵌入用于编码位置信息
此步骤用于计算 RoPE 嵌入来编码位置信息。
旋转位置嵌入(RoPE)的结合:
- 解耦 RoPE 策略:为了整合位置信息,DeepSeek-V2(随后是 DeepSeek-V3 和 DeepSeek-R1)采用了解耦 RoPE 方法。这涉及创建专门用于携带位置信息的额外查询 (Q) 和密钥 (K) 向量。
- 连接:这些 RoPE 增强的 Q 和 K 向量与上投影的 Q 和 K 向量连接。
这是 MLA 中比较棘手的部分。
我将尝试按照我从 DeepSeek 的技术报告中理解的方式来解释它。
在传统的 Transformer 层中,RoPE 操作直接作用于 Q 和 K。它不改变 Q 和 K 的维度,而是改变 Q 和 K 中的语义表示(Q 和 K 中的数值)来编码位置信息。因此,得到的 Q 和 K 同时具有语义和位置信息。
但是,在具有 MLA 的transformer层中,RoPE 被应用于分离新生成的查询(Q)和键(K)嵌入,并将其连接到上投影的 Q 和 K。
步骤 3.1:为 Q 生成 RoPE 嵌入
传统上,RoPE(旋转位置嵌入)会根据查询 (Q) 和键 (K) 向量在序列中的位置,对它们应用旋转矩阵。此转换会直接在 Q 和 K 中编码相对位置信息,从而无需使用正弦或绝对编码等显式位置嵌入。
但是在 MLA 中,不是将 RoPE 应用于上投影的 Q( q t C q_t^C qtC),而是从 c t Q c_t^Q ctQ 生成新的 Q 嵌入( q t R q_t^R qtR)并对其应用 RoPE。
通过将 c t Q c_t^Q ctQ 与权重矩阵 W Q R W^{QR} WQR 相乘,可以生成完全独立的查询嵌入。这些新的独立查询嵌入经过 RoPE 转换,为我们提供位置编码查询嵌入 ( q t R q_t^R qtR)。
q t R q_t^R qtR 的生成方式是,它们可以连接到每个注意力头的输入查询嵌入,以便每个注意力头都具有位置信息。 [从等式来看,这个说法似乎是正确的,但需要进一步验证。]
步骤 3.2:为 K 生成 RoPE 嵌入
类似地,不是将 RoPE 应用于上投影的 K,而是生成新的 K 嵌入并对其应用 RoPE。
但是与 RoPE 嵌入的 q t R q_t^R qtR有两个关键区别:
新的 K 嵌入是由 h t h_t ht(输入嵌入)而不是向下投影的 K( c t K c_t^K ctK)生成的。
相同的 RoPE 嵌入 K(键)连接到每个注意力头的输入。但是,单独的 RoPE 嵌入 Q(查询)被计算并连接到每个注意力头,如步骤 3.1 所示。[从等式来看,这个说法似乎是正确的,但需要进一步验证。]
为什么不从向上投影的 K 即 k t C k_t^C ktC 生成?
DeepSeek-V2报告中的推理:
“如果我们将 RoPE 应用于键k _𝐶,𝑊𝑈𝐾 将与位置敏感的 RoPE 矩阵耦合。这样,𝑊𝑈𝐾 在推理过程中就不能再被吸收到𝑊_𝑄 中,因为与当前生成的 token 相关的 RoPE 矩阵将位于 𝑊_𝑄 和 𝑊𝑈𝐾 之间,而矩阵乘法不遵循交换律。”
从下面的解释截图可以更好地理解这一点:
K 的 RoPE 嵌入:第 1 部分
K 的 RoPE 嵌入:第 2 部分
K 的 RoPE 嵌入:第 3 部分
因此,为了提高推理效率,位置嵌入的 K(关键)嵌入是从输入嵌入 h t h_t ht 生成的。
在 MLA 中引入额外的权重矩阵不会导致内存和计算效率低下吗?
为了解决这些开销,DeepSeek-V2 报告:
“此外,在推理过程中,由于 𝑊𝑈𝐾 可以被吸收到 𝑊𝑄 中,而 𝑊𝑈𝑉 可以被吸收到 𝑊𝑂 中,我们甚至不需要计算键和值来引起注意。”
为了进一步减少内存消耗:
“此外,为了减少训练期间的激活内存,我们还对查询执行低秩压缩,即使它不能减少 KV 缓存”
步骤4:计算注意力输出
连接过程会增加 Q 和 K 向量的维数。为了管理这种增加的维数,模型可以采取以下任一方式:
- 增加注意力头的数量:这将保持原始的每个头的维度,但需要更多的计算资源。
- 调整每个头的维数:保持头的数量不变,但增加每个头的维数以适应连接的向量。
注意力输出是使用这些标准注意力方程来计算的:
O_t_i 是注意力得分,u_t 是注意力输出。W_o 表示输出投影权重矩阵。输出被投影回与输入相同的维度(就像在我们的例子中:这个形状将是 input_sequence_length x 2000)
🎭 6.混合专家(MoE)
什么是混合专家 (MoE)?
为了清楚地理解什么是 MoE,首先让我们看看它在 Transformer 中的具体用途以及它的架构简介。标准 Transformer 层中的 FFN 被 MoE 取代。
从本质上讲,MoE 遵循标准 Transformer 设计,但通过引入多个并行专家网络(FFN) 而不是单个密集 FFN来修改前馈层。其工作原理如下:
1. 多个 FFN(而非一个)
MoE 不使用单个共享的 FFN,而是使用多个并行训练的FFN 层(专家) 。
2. 输入处理和令牌路由
- 每个 token 都像往常一样经过 transformer自注意力层。
- 它不是由单个 FFN 处理,而是被发送到路由器,由路由器决定哪些专家应该处理它。
3. 通过路由器选择专家
- 一个小型的、可训练的路由器决定哪个专家子集(FFN)应该处理每个标记。
- 通常,每个 token仅选择 1 或 2 个专家以保持效率(例如, top-1 或 top-2 门控)。DeepSeek -V3(DeepSeek-R1)使用 9 个专家,其中 1 个是共享专家,其他 8 个是路由专家。
- 选择通常基于softmax 评分机制,其中路由器为每个专家分配概率。具体来说,在 DeepSeek-V3 (DeepSeek-R1) 中,使用 Sigmoid 而不是 softmax。
4. 专家稀疏计算
- 只有选定的专家才能处理令牌,而其他人则保持不活动状态。
- 专家输出使用加权求和进行组合,并传递到下一个 Transformer 层。在 DeepSeek-V3/R1 中,权重是归一化的 S 型输出。
- 这种稀疏激活可确保任何时候仅使用模型的一小部分,从而保持计算可管理。
为什么要用 MoE 取代单一 FFN?
- 可扩展性— MoE 允许模型使用更多参数进行扩展,而无需线性增加计算量。
- 高效学习— 专家专注于数据的不同方面,从而提高泛化能力。
- 计算节省— 由于每个 token 仅使用专家子集,因此与相同大小的密集模型相比,MoE 模型的运行成本更低。DeepSeek-V3/R1 共有 6710 亿个参数,其中每个 token 激活 370 亿个参数。
MoE 在 DeepSeek-R1 中如何发挥作用?
以下来自 DeepSeek-V3 技术报告的公式显示了每个 MoE 层中的计算。在 DeepSeek 系列模型中,MoE 架构首次在 DeepSeekMoE 模型中引入,并且正在 DeepSeek-V2、DeepSeek-V3 和 DeepSeek-R1 中使用。
路由器计算:
在 DeepSeek-V3 、 DeepSeek-R1 和其他一些现代混合专家 (MoE) 模型中,e_i 表示学习到的质心,有助于将输入路由到正确的专家。与传统的 MoE 架构中基于 FFN 的路由器计算门控分数不同,此方法预定义了一组可学习向量e_i,每个向量对应一位专家。
关键思想:
- 每个专家 i 都有一个相关的质心向量 e i e_i ei。
- 我们不是将输入 u t u_t ut 传递给 FFN 来获取专家概率,而是通过点积来计 u t u_t ut 和每个 e i e_i ei 之间的相似度:
- 该分数决定了专家与给定输入的相关程度。
- 仅激活具有最高 s i , t s_{i,t} si,t 值的Top-K专家进行处理。
- 在 S 型输出中添加了一个偏差项,以创建无辅助损失的 MoE 负载平衡。
DeepSeek-V3 论文中的这段描述进一步阐明了它的用途以及它在训练过程中的计算方式:
- 使用选定的 top-k 值对输出值进行标准化。
专家计算:
u t u_t ut是 MoE 层的输入。等式中的第二项表示输入与共享专家相乘。每个专家由 FFN(前馈网络)组成,因此用“FFN”表示。在 DeepSeek-R1 中,只有 1 个共享专家。因此,Ns=1。同样,等式中的第三项表示输入与活跃的个人专家相乘。在 DeepSeek-R1 中,总共有 256 个个人专家。但每个 token 只有 8 个活跃,因此 Nr=8。每个活跃的个人专家都将具有与等式 13 中关联的 g i , t g_{i,t} gi,t。它用于计算第三项。
输出
h t h_t ht表示 MoE 层的输出。 u t u_t ut 是 MoE 层的输入。专家计算结果添加到输入 u t u_t ut 中,得到 MoE 层的输出。
🔢 7. 多标记预测(MTP)
什么是多标记预测?
多标记预测是语言建模中的一种高级方法,其中模型不是一次预测一个序列中的下一个单词,而是同时预测多个未来标记。此方法使模型能够并行预测多个即将到来的单词,从而提高学习效率并加速文本生成。
Meta 引入了一种多标记预测架构,可训练语言模型同时预测多个未来标记,从而提高采样效率并加快推理速度。在此概念的基础上,DeepSeek-V3 整合了多标记预测 (MTP) 目标,使模型能够同时预测多个标记。这种方法使训练信号密集化,并能够更好地预先规划标记表示,从而提高复杂基准测试的性能。
DeepSeek-V3/R1 和 Meta 的多令牌预测有两个关键区别:
“与 Gloeckle 等人(2024 年)[Meta Research] 使用独立输出头并行预测 𝐷 个额外标记不同,我们按顺序预测其他标记,并在每个预测深度保留完整的因果链。” — DeepSeek-V3
- Meta 的模型预测了4 个 token,而 DeepSeek-V3 预测了2 个 token。
- Meta 模型中的预测头是独立的,而 DeepSeek-V3 的预测头是顺序连接的。
MTP 在 DeepSeek-R1 中如何工作?
让我们一步一步地看一下该图表。
在训练期间,输入标记(位于左下角)穿过嵌入层,然后传播到所有变压器块/层。
第一个预测头(包括输出头)直接连接到主模型的最终 Transformer 层。输出头通常是前馈网络 (FFN),其输出维度与模型的词汇量相匹配。该头负责按顺序预测下一个标记。给定输入标记t₁、t₂、t₃、t₄,它会预测t₂、t₃、t₄、t₅ 。但是,在推理过程中,只计算最终标记t₅ 。
第二个预测头通过添加额外的可学习层扩展了这种方法。它从主模型的最终 Transformer 层获取输出,应用 RMSNorm 进行归一化,然后将其与输入嵌入连接起来。这些输入嵌入是从主模型中使用的相同嵌入层获得的。与第一个预测头不同,这个头从t₂而不是t₁开始处理输入标记。然后使用线性投影层将连接的输出投影到合适的嵌入大小,然后使用可学习的 Transformer 块/层进行进一步处理。在训练期间,这个头将t₃预测为t₆,但在推理中,只计算t₆ 。
类似地,第三个预测头从第二个预测头的transformer器块/层获取输入以及相应的输入嵌入,现在从t₃开始到t₆。它遵循与前几个头相同的结构,在训练期间预测t₄到t₇,但在推理期间仅计算t₇。
每个预测头使用交叉熵计算损失。然后,这些损失用因子λ加权,取其平均值作为最终损失值。
单独预测头损失
最终损失
在 DeepSeek-V3 和 R1 中,MTP 仅在训练期间使用,而不在推理期间使用:
“推理中的 MTP:我们的 MTP 策略主要是为了提高主模型的性能,因此在推理过程中,我们可以直接丢弃 MTP 模块,主模型可以独立正常运行。”——DeepSeek-V3
参考资料
- https://arxiv.org/pdf/2412.19437
- https://arxiv.org/pdf/2405.04434
- https://arxiv.org/pdf/2402.03300
- https://arxiv.org/pdf/2401.02954
- https://arxiv.org/pdf/2401.06066
- https://arxiv.org/pdf/2404.19737
相关文章:
一文深入了解DeepSeek-R1:模型架构
本文深入探讨了 DeepSeek-R1 模型架构。让我们从输入到输出追踪 DeepSeek-R1 模型,以找到架构中的新发展和关键部分。DeepSeek-R1 基于 DeepSeek-V3-Base 模型架构。本文旨在涵盖其设计的所有重要方面。 📝 1. 输入上下文长度 DeepSeek-R1的输入上下文长…...
腿足机器人之二- 运动控制概览
腿足机器人之二运动控制概览 高层运动规划MPCRL 中层逆运动学和逆动力学底层执行器控制传感器校正 上一篇博客是腿足机器人的骨架和关节的机械和电气组件,关节不仅需要通过机械设计实现复杂的运动能力,还必须通过电子组件和控制系统来精确控制这些运动。…...
前端面试大全
前端面试大全 一、htmlcss1、垂直定位的实现方式 二、javascript1、深拷贝浅拷贝2、作用域3、原型原型链4、防抖节流5、设计模式 三、ES61、 四、typescript五、vue1、vue2和vue3的区别2、生命周期3、computedwatch 六、react七、uni-app八、Cesiumopenlayer九、Threejs十、ngi…...
如何使用智能化RFID管控系统,对涉密物品进行安全有效的管理?
载体主要包括纸质文件、笔记本电脑、优盘、光盘、移动硬盘、打印机、复印机、录音设备等,载体(特别是涉密载体)是各保密、机要单位保证涉密信息安全、防止涉密信息泄露的重要信息载体。载体管控系统主要采用RFID射频识别及物联网技术…...
Python 调用 DeepSeek API 案例详细教程
本案例为以 Python 为例的调用 DeepSeek API 的小白入门级详细教程 步骤 先注册并登录 DeepSeek 官网:https://www.deepseek.com/ 手机号验证码注册或登录即可 创建 API KEY 注意保存,写代码时必须提供的 打开 Pycharm 创建工程 并安装 OpenAI 库编写代…...
牛客面筋学习
准备阶段: 楼主其实很早就开始准备了,大概从年初开始,陆陆续续总结自己的项目,复盘,然后复习数电模电信号电路等,复习完后,便开始刷题;顺便说一下,如果需要发小论文的也…...
对指针的深入运用-通讯录的初步实现
1.通讯录的功能 手机里的通讯录,是能够存放联系人的信息,包括姓名,性别,地址,电话号码,也可以加上性别。而且手机中的通讯录肯定有增删查改的功能,而且在list里是按照顺序排序的,可以…...
VUE环境搭建
node.js安装 node npm – node Package Management 安装完成后,需要设置: npm config set prefix "D:\nodejs"注意:“D:\nodejs” 此处为自己安装的node.js路径。管理员身份运行 切换镜像源 npm config set registry https://r…...
DeepSeek应用——与PyCharm的配套使用
目录 一、配置方法 二、使用方法 三、注意事项 1、插件市场无continue插件 2、无结果返回,且在本地模型报错 记录自己学习应用DeepSeek的过程,使用的是自己电脑本地部署的私有化蒸馏模型...... (举一反三,这个不单单是可以用…...
C# ASP.NET的未来发展趋势
.NET学习资料 .NET学习资料 .NET学习资料 在快速发展的技术浪潮中,C# ASP.NET不断顺应时代潮流,展现出一系列令人瞩目的未来发展趋势。这些趋势不仅反映了技术的进步,也为开发者带来了更多的机遇和挑战。 云原生应用开发 随着云计算的普及…...
leetcode 416. 分割等和子集
题目如下 数据范围 本题和leetcode 2915. 和为目标值的最长子序列的长度类似,这里不过多赘述。leetcode 2915. 和为目标值的最长子序列的长度 通过代码 class Solution { public:bool canPartition(vector<int>& nums) {int n nums.size();int an…...
WPF进阶 | 深入 WPF 依赖项属性:理解其强大功能与应用场景
WPF进阶 | 深入 WPF 依赖项属性:理解其强大功能与应用场景 前言一、依赖项属性基础概念1.1 什么是依赖项属性1.2 依赖项属性与 CLR 属性的区别1.3 依赖项属性的定义与注册 二、依赖项属性的原理深入剖析2.1 依赖项属性系统的工作机制2.2 元数据(Metadata…...
浅聊MQ之Kafka与RabbitMQ简用
Kafka与RabbitMQ的使用举例 Kafka的使用举例 安装与启动: 从Apache Kafka官网下载Kafka中间件的运行脚本。解压后,通过命令行启动Zookeeper(Kafka的运行依赖于Zookeeper)。启动Kafka的服务器进程。 基本功能实现: 生…...
2.1 JUnit 5 测试发现机制详解
JUnit 5 测试发现机制详解 JUnit 5 的测试发现机制是框架的核心功能之一,负责识别测试类、方法和其他可执行元素,并构建出可执行的测试计划。该机制通过模块化设计支持高度扩展性,允许开发者自定义测试发现规则。以下是其工作原理的详细解析…...
【Elasticsearch】match查询
Elasticsearch 的match查询是全文搜索中最常用和最强大的查询类型之一。它允许用户在指定字段中搜索文本、数字、日期或布尔值,并提供了丰富的功能来控制搜索行为和结果。以下是match查询的详细解析,包括其工作原理、参数配置和使用场景。 1.match查询的…...
【开发心得】CentOS7编译Redis7.4.2打包RPM完整方案
概述 由于最近客户需要解决redis版本升级问题,故而全网寻找安全版本,redis7.4.x版本求而为果,只能自己编译了。 截止发文时间2025-02-12 最新稳定版的redis版本号为7.4.2 Security fixes (CVE-2024-46981) Lua script commands may lead t…...
云计算——AWS Solutions Architect – Associate(saa)6.CloudWatch
Amazon CloudWatch 是一种面向开发运营工程师、开发人员、站点可靠性工程师(SRE)和 IT 经理的监控和可观测性服务。CloudWatch 为我们提供相关数据和切实见解,以监控应用程序、响应系统范围的性能变化、优化资源利用率,并在统一视图中查看运营状况。 Clo…...
面试实战题:手写一个队列和介绍Stream流怎么使用
手写一个队列 思路解析: 队列要有入队和出队操作,还要有查看队列大小,查看队头元素,查看队列是否为空,查看队列是否满了这些功能 package com.example.transational.MyQueue;public class MyQueue<T> {privat…...
Jmeter+Influxdb+Grafana平台监控性能测试过程
一、Jmeter自带插件监控 下载地址:https://jmeter-plugins.org/install/Install/ 安装:下载后文件为jmeter-plugins-manager-1.3.jar,将其放入jmeter安装目录下的lib/ext目录,然后重启jmeter,即可。 启动Jmeter&…...
【现代深度学习技术】深度学习计算 | GPU
【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重…...
基于斜坡单元的机器学习模型预测滑坡易发性,考虑条件因素的异质性
1、引用 Chang Z, Catani F, Huang F, et al. Landslide susceptibility prediction using slope unit-based machine learning models considering the heterogeneity of conditioning factors[J]. Journal of Rock Mechanics and Geotechnical Engineering, 2023…...
Node.js调用DeepSeek Api 实现本地智能聊天的简单应用
在人工智能快速发展的今天,如何快速构建一个智能对话应用成为了开发者们普遍关注的话题。本文将为大家介绍一个基于Node.js的命令行聊天应用,它通过调用硅基流动(SiliconFlow)的API接口,实现了与DeepSeek模型的智能对话…...
实战 - 编写一个最简单的 Hello World 内核模块
实战 - 编写一个最简单的 Hello World 内核模块 在嵌入式开发中,编写 Linux 内核模块是设备驱动开发的重要基础。内核模块可以帮助我们在不修改内核源码的情况下扩展内核功能。本篇博客将指导你如何编写并运行一个简单的 Hello World 内核模块,让你快速…...
面向对象程序设计-实验七
6-1 计算捐款总量 这里需要设计一个捐款人类Donator及一个相关函数getMaxName( ),Donator类中包含捐款人的姓名及其捐款额 代码清单: #include <iostream> using namespace std; class Donator { private: string name; float money; //单位&…...
JVM组成
JVM是什么? JVM(Java Virtual Machine):Java程序的运行环境(java二进制字节码的运行环境) 好处: 1.一次编写,到处运行 Java代码是如何做到一次编写,到处运行? 计算机的最底层是计…...
java.lang.NoClassDefFoundError: javax/xml/bind/ValidationException
Java8升级到17之后, 启动报错, :LocalValidatorFactoryBean]: Factory method defaultValidator threw exception; nested exception is java.lang.NoClassDefFoundError: javax/xml/bind/ValidationException 报错原因:这个错误通常是由于缺少 javax.xml.bind 相关的依赖引起…...
Electron 实现自定义系统托盘菜单
效果如下: 其实实现自定义托盘菜单的本质上,就是开一个新窗口,下面直接给出核心代码。 // 加载窗口 const loadWindow (example, path) > {if (is.dev && process.env[ELECTRON_RENDERER_URL]) {example.loadURL(process.env[EL…...
HCIA-路由器相关知识和面试问题
二、 路由器 2.1 关于路由器的知识 2.1.1 什么是路由器 路由器是一种网络层互联设备,主要用于连接多个逻辑上分开的网络,实现不同网络之间的数据路由和通信。它能根据网络层地址(如 IP 地址)来转发数据包,在网络中起…...
2.【BUUCTF】bestphp‘s revenge
进入题目页面如下 进行代码审计 <?php // 1. 高亮显示当前PHP文件的源代码,方便开发者查看代码内容,在生产环境中不应使用此函数,可能会导致代码泄露。 highlight_file(__FILE__);// 2. 定义变量 $b ,其值为字符串 implode &…...
wx060基于springboot+vue+uniapp的宿舍报修系统小程序
开发语言:Java框架:springbootuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包&#…...
使用 meshgrid函数绘制网格点坐标的原理与代码实现
使用 meshgrid 绘制网格点坐标的原理与代码实现 在 MATLAB 中,meshgrid 是一个常用函数,用于生成二维平面网格点的坐标矩阵。本文将详细介绍如何利用 meshgrid 函数生成的矩阵绘制网格点的坐标,并给出具体的代码实现和原理解析。 实现思路 …...
快速上手Vim的使用
Vim Linux编辑器-vim使用命令行模式下所有选项都可以带数字底行模式可视块模式(ctrlV进入) Linux编辑器-vim使用 Vim有多种模式的编辑器。能帮助我们很快的进行代码的编辑,甚至完成很多其他事情。 默认情况下我们打开vim在命令模式下&#x…...
HCIA项目实践---ACL访问控制列表相关知识和配置过程
十 ACL访问控制列表 1 策略的概念 在网络连通之后, 把所有为了追求控制而实现的技术都叫策略 2 访问控制 在路由器流量流入或者流出的接口上,匹配流量,执行相应的动作。(流量流入或者流出的接口并不是一个固定的概念而是一个相对的…...
机器学习核心算法解析
机器学习核心算法解析 机器学习是人工智能的核心技术之一,它通过从数据中学习模式并做出预测或决策。本文将深入解析机器学习的核心算法,包括监督学习、无监督学习和强化学习,并通过具体案例和代码示例帮助读者理解这些算法的实际应用。 1. …...
Oracle 12c 并发统计信息收集功能:技术解析与实践指南
一、功能背景与核心价值 在Oracle数据库的早期版本中,统计信息收集(如通过DBMS_STATS包)是串行执行的,即一次仅处理一个表或分区。对于大规模数据库或数据仓库环境,这种串行模式可能导致统计信息收集耗时过长…...
Android Studio:EditText常见4种监听方式
1. 文本变化监听(TextWatcher) TextWatcher 主要用于监听 EditText 里的文本变化,它有三个方法: beforeTextChanged(文本变化前)onTextChanged(文本正在变化时)afterTextChanged&a…...
【第2章:神经网络基础与实现——2.3 多层感知机(MLP)的构建与调优技巧】
在当今科技飞速发展的时代,人工智能早已不是一个陌生的词汇,它已经渗透到我们生活的方方面面,从智能语音助手到自动驾驶汽车,从图像识别到自然语言处理。而支撑这一切的核心技术之一,就是神经网络。作为机器学习领域的璀璨明星,神经网络已经在众多任务中取得了令人瞩目的…...
C++ 网络编程
1. socket Socket 是一种用于网络通信的编程接口,它提供了一种类似于文件描述符的接口,允许不同计算机之间的进程进行通信。Socket 可以工作在多种协议上,最常用的是 TCP/IP 和 UDP/IP 协议 1.1 UDP 1.1.1 概念 UDP(用户数据报协…...
SQL-leetcode—1683. 无效的推文
1683. 无效的推文 表:Tweets ----------------------- | Column Name | Type | ----------------------- | tweet_id | int | | content | varchar | ----------------------- 在 SQL 中,tweet_id 是这个表的主键。 content 只包含美式键盘上的字符&am…...
vue前端可视化大屏页面适配方案
参考了其他博主的代码,但发现会有滚动条,并且居中的位置不太对,所以改了一下css,修复了这些问题,直接上代码 <template> <div class"ScaleBoxA"><divclass"ScaleBox"ref"Sca…...
mars3d接入到uniapp的时候ios上所有地图的瓦片都无法加载解决方案
用的是【Mars3d】官网的uniapp的仓库,安卓没有问题,但是ios的不行 相关链接 mars3d-uni-app: uni-app技术栈下的Mars3D项目模板 解决方案:感觉所有图片请求全被拦截了 uniapp的ios内核不允许跨域,需要先把瓦片下载后转base64&…...
Dockfile语法
目录 dockerfile的作用 1. 构建 Docker 映像 2. 提高开发和运维效率 3. 版本控制 4. 提供可移植性和灵活性 使用示例 总结 dockerfile应该放的位置 为什么放在根目录? 例外情况 调用构建 dockerfile的基本结构和常用指令 基本结构和常用指令 示例 Dock…...
Nginx负载均衡
一。Nginx负载均衡的算法以及过程 二。nginx四层负载均衡的配置(四层) 1.vi /etc/nginx/conf.d/lb.conf 比较常见:weight:设置权重,backup:当其他主机全部用不了,这个作为备份 2.systemctl r…...
【C】初阶数据结构5 -- 栈
前面学习了两种最基本的数据结构 -- 顺序表和链表,接下来就可以基于这两种数据结构来实现其他数据结构了。其实,其他的数据结构的物理结构要么是数组,要么就是链表,所以学好顺序表和链表是学好其他数据结构的基础。接下里…...
Linux查找占用的端口,并杀死进程的简单方法
在Linux系统管理中,识别并管理占用特定端口的进程是一项常见且重要的任务。以下是优化过的步骤指南,帮助您高效地完成这一操作,同时提供了一个简洁的命令参考表。 Linux下识别并终止占用端口的进程 1. 探寻端口占用者 使用 lsof命令 lsof…...
为什么Pytorch中实例化模型会直接调用forward方法?
在 PyTorch 中,为何定义一个继承自 nn.Module 的自定义类并实现 forward 方法后,直接调用模型实例时,便会自动调用其 forward 方法?例如使用 output model(x) 这种形式。 因为自定义的神经网络类所继承的 nn.Module 类对 __call_…...
easyexcel快速使用
1.easyexcel EasyExcel是一个基于ava的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel 即通过java完成对excel的读写操作, 上传下载 2.easyexcel写操作 把java类中的对象写入到excel表格中 步骤 1.引入依赖 <depen…...
DeepSeek的出现会对百度有多大影响?
当DeepSeek与ChatGPT等大模型接管搜索入口,我们正见证百年一遇的信息革命。 01 传统搜索已死?AI助手正在重写游戏规则! 当DeepSeek与ChatGPT等大模型接管搜索入口,我们正见证百年一遇的信息革命。 就像汽车淘汰马车、触屏终结按键…...
生成格雷码
以下是Verilog实现格雷码的两种常见方法: 1. 二进制转格雷码(组合逻辑实现) module binary_to_gray #(parameter N 4 // 默认4位位宽 )(input [N-1:0] binary, // 二进制输入output [N-1:0] gray // 格雷码输出 );assign gray binary…...
【STM32】BootLoader和IAP详解
文章目录 0 前言1 基本概念2 BootLoader3 主程序相关配置4 相关理论:芯片启动与中断响应5 特殊情况:Cortex-M0内核的芯片 0 前言 最近在研究一个RT-Thread的项目,遇到很多之前没咋遇见过的STM32相关的知识,想着顺带也整体过一遍。…...