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

一文深入了解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

  1. Meta 的模型预测了4 个 token,而 DeepSeek-V3 预测了2 个 token。
  2. 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的输入上下文长…...

秘密信息嵌入到RGB通道的方式:分段嵌or完整嵌入各通道

目录 1. 将秘密信息分为三部分的理由 (1)均匀分布负载 (2)提高鲁棒性 (3)容量分配 2. 不将秘密信息分为三部分的情况 (1)嵌入容量 (2)视觉质量 &#…...

Ai人工智能的未来:趋势、挑战与机遇

Ai人工智能的未来:趋势、挑战与机遇 引言 人工智能(AI)已经成为当代科技发展的核心驱动力,其影响力渗透到各个行业,并塑造了我们未来的社会结构。无论是在医疗、金融、制造业,还是在自动驾驶、智能客服、…...

理解WebGPU 中的 GPUDevice :与 GPU 交互的核心接口

在 WebGPU 开发中, GPUDevice 是一个至关重要的对象,它是与 GPU 进行交互的核心接口。通过 GPUDevice ,开发者可以创建和管理 GPU 资源(如缓冲区、纹理、管线等),并提交命令缓冲区以执行渲染和计算任…...

Java 设计模式之桥接模式

文章目录 Java 设计模式之桥接模式概述UML代码实现 Java 设计模式之桥接模式 概述 桥接模式(Bridge):将抽象部分与它的实现部分分离,使它们都可以独立地变化。通过桥接模式,可以避免类爆炸问题,并提高系统的可扩展性。 UML 核心…...

机器学习(李宏毅)——GAN

一、前言 本文章作为学习2023年《李宏毅机器学习课程》的笔记,感谢台湾大学李宏毅教授的课程,respect!!! 不得不说GAN真是博大精深! 二、大纲 GAN问世基本思想原理剖析Tips of GANGAN的应用Cycle GANEva…...

QT无弹窗运行和只允许运行一个exe

最近做一个小功能&#xff0c;需要后台运行QT程序&#xff0c;无弹窗&#xff0c;并且只允许一个exe运行&#xff0c;不关闭程序&#xff0c;无法2次启动。 main.cpp #include "deleteshotcurveflie.h" #include <QApplication> #include <QSharedMemory&…...

C++ STL 容器

C 的 STL&#xff08;Standard Template Library&#xff09; 提供了多种容器&#xff0c;分为以下几类&#xff1a; 序列容器&#xff08;Sequence Containers&#xff09;关联容器&#xff08;Associative Containers&#xff09;无序关联容器&#xff08;Unordered Associa…...

开源赋能,智造未来:Odoo+工业物联网,解锁智能工厂新范式——以真实案例解读制造业数字化转型的降本增效密码

工业物联网的机遇与挑战&#xff1a;为什么企业需要Odoo&#xff1f; 《中国智能制造发展研究报告2023》指出&#xff0c;85%的制造企业已启动数字化转型&#xff0c;但超60%面临“数据孤岛、系统割裂、成本高企”的痛点[1]。传统ERP系统难以实时对接产线设备&#xff0c;而定…...

CTF-WEB: 利用iframe标签利用xss,waf过滤后再转换漏洞-- N1ctf Junior display

核心逻辑 // 获取 URL 查询参数的值 function getQueryParam(param) { // 使用 URLSearchParams 从 URL 查询字符串中提取参数 const urlParams new URLSearchParams(window.location.search); // 返回查询参数的值 return urlParams.get(param); } // 使用 DOMPuri…...

K8s组件

一、Kubernetes 集群架构组件 K8S 是属于主从设备模型&#xff08;Master-Slave 架构&#xff09;&#xff0c;即有 Master 节点负责集群的调度、管理和运维&#xff0c;Slave 节点是集群中的运算工作负载节点。 主节点一般被称为 Master 节点&#xff0c;master节点上有 apis…...

python面试题

以下是一些Python面试题: 一、基础语法 Python中的列表(list)和元组(tuple)有什么区别? 答案: 可变性:列表是可变的,可以修改列表中的元素、添加或删除元素;元组是不可变的,一旦创建就不能修改。语法:列表使用方括号[]定义,元组使用圆括号()定义(单个元素的元组…...

AOS安装及操作演示

文章目录 一、安装node1.1 在 macOS 上管理 Node版本1.1.1 安装 nvm1.1.2 验证 nvm 是否安装成功1.1.3 使用 nvm 安装/切换 Node.js 版本1.1.4 卸载 Node.js 版本 1.2 在 windows 上管理 Node版本1.2.1 安装 nvm-windows1.2.2 安装 Node.js 版本1.2.3 切换 Node.js 版本1.2.4 卸…...

蓝桥杯单片机组第十三届初赛试题-程序题(第2批)

题目到官网看即可&#xff0c;有点久了有些细节记不清了&#xff0c;可能以前发的帖子解释详细一点。 这是我单片机初学的时候写的&#xff0c;像代码结构什么的肯定有可以提升的地方&#xff0c;多多包涵&#xff0c;将就看一下。 i2c文件使用官方的&#xff0c;pcf8591函数…...

企业级高可用 Kubernetes 实践:基于青云 LB 搭建容灾与负载均衡集群全攻略

一、前言 在企业生产环境,k8s高可用是一个必不可少的特性,其中最通用的场景就是如何在 k8s 集群宕机一个节点的情况下保障服务依旧可用。部署高可用k8s集群对于企业级云平台来说是一个根本性的原则,容错、服务可用和数据安全是高可用基础设施的关键。本文是在青云上利用青云…...

Python Pandas(11):Pandas 数据可视化

数据可视化是数据分析中的重要环节&#xff0c;它帮助我们更好地理解和解释数据的模式、趋势和关系。通过图形、图表等形式&#xff0c;数据可视化将复杂的数字和统计信息转化为易于理解的图像&#xff0c;从而便于做出决策。Pandas 提供了与 Matplotlib 和 Seaborn 等可视化库…...

【练习】图论

F. Friendly Group 图中选择一个点-1 边两端点都选择1 边一个端点选择-1 添加链接描述 #include<iostream> using namespace std; #include<vector> #include<cstring> const int N300010; int n,m; vector<int> G[N]; int temp1,temp2; bool vis[N…...

【RAG落地利器】Weaviate、Milvus、Qdrant 和 Chroma 向量数据库对比

什么是向量数据库? 向量数据库是一种将数据存储为高维向量的数据库&#xff0c;高维向量是特征或属性的数学表示。每个向量都有一定数量的维度&#xff0c;根据数据的复杂性和粒度&#xff0c;可以从数十到数千不等。 向量通常是通过对原始数据(如文本、图像、音频、视频等)…...

今日AI和商界事件(2025-02-14)

今日AI大事件主要包括以下几个方面&#xff1a; 一、苹果新品预告 事件概述&#xff1a;苹果CEO蒂姆库克在社交媒体发布7秒视频&#xff0c;配文“准备好迎接家庭的新成员”&#xff0c;并宣布2月19日将有新品发布。知名科技记者马克古尔曼称&#xff0c;新款低端iPhone SE将…...

【大语言模型】最新ChatGPT、DeepSeek等大语言模型助力高效办公、论文与项目撰写、数据分析、机器学习与深度学习建模等科研应用

ChatGPT、DeepSeek等大语言模型助力科研应用 随着人工智能技术的快速发展&#xff0c;大语言模型如ChatGPT和DeepSeek在科研领域的应用正在为科研人员提供强大的支持。这些模型通过深度学习和大规模语料库训练&#xff0c;能够帮助科研人员高效地筛选文献、生成论文内容、进行数…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...