一文深入了解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的输入上下文长…...
机试题——快乐时间
题目描述 小明在工作之余喜欢在电子书城阅读不同的书籍并且获得最大的满足感,因此根据书城针对每本书籍的评分收集了 n 个书籍的打分清单 books,例如第一本书的打分 books[0]5 代表该书的满意程度为 5,第二本书 books[1]-2 代表该书的满意程…...
2024年终总结和2025年规划
2024年的主线是AI基础的学习和读书,虽然AI学习花费了更多的时间,但是读书长久看来于我是更重要的事情,哈哈哈,因此先简单回顾一下读书记忆,回顾我的2024,再展望一下我的2025. 我的2024年记忆 读万卷书&am…...
5 .TCP传输 文件/数据
文件传输 本质:客户端通过标准IO或者文件IO,读取文件中的信息 然后将读取到的信息,通过套接字发送给服务器 服务器接收到后,立刻通过标准IO或者文件IO写到文件 这个过程,服务器要知道2件事 1:客户端发来的文件名字 …...
哈希表(典型算法思想)—— OJ例题算法解析思路
目录 一、1. 两数之和 - 力扣(LeetCode) 算法代码: 1. 问题描述 2. 核心思路 3. 代码实现思路 (1)初始化哈希表 (2)遍历数组 (3)返回结果 4. 时间复杂度分析 …...
CloudberryDB(七)二级索引
在CloudberryDB中,二级索引的概念与PostgreSQL中的类似。但是,由于分布式特性,创建和使用二级索引需要考虑一些额外的因素。以下是关于二级索引的一些要点: 1. **创建索引**:在Greenplum中,可以使用CREATE…...
学习web数据埋点
什么是埋点,以及为什么需要埋点 通过代码主动收集用户行为数据(如点击、浏览、停留时长等),用于数据分析驱动产品优化。 一、前端埋点 在客户端(浏览器、移动端应用)直接采集用户行为数据,通…...
Next.js【详解】CSS 样式方案
全局样式 Global CSS 默认已创建,即 src\app\globals.css,可根据需要修改 默认在全局布局中导入 src\app\layout.tsx import "./globals.css";组件样式 CSS Modules 新建文件 src\app\test\styles.module.css .red {color: red;}导入目标页面…...
HCIA项目实践--RIP相关原理知识面试问题总结回答
9.4 RIP 9.4.1 补充概念 什么是邻居? 邻居指的是在网络拓扑结构中与某一节点(如路由器)直接相连的其他节点。它们之间可以直接进行通信和数据交互,能互相交换路由信息等,以实现网络中的数据转发和路径选择等功能。&am…...
无人机信号调制技术原理
一、调制技术的必要性 频谱搬移:将低频的基带信号搬移到高频的载波上,便于天线辐射和传播。 信道复用: 利用不同的载波频率或调制方式,实现多路信号同时传输,提高信道利用率。 抗干扰: 通过选择合适的调…...
Qt——连接MySQL数据库之编译数据库驱动的方法详细总结(各版本大同小异,看这一篇就够了)
【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《项目案例分享》 《极客DIY开源分享》 《嵌入式通用开发实战》 《C++语言开发基础总结》 《从0到1学习嵌入式Linux开发》 《QT开发实战》 《Android开发实战》 《实用硬件方案设计》 《结构建模设…...
leetcode-495.提莫攻击
leetcode-495.提莫攻击 文章目录 leetcode-495.提莫攻击一.题目描述二.代码提交三.解释 一.题目描述 二.代码提交 #include <vector> using namespace std;int findPoisonedDuration(vector<int>& timeSeries, int duration) {int total 0;for (int i 0; i …...
计算机网络知识速记 :HTTP多个TCP连接的实现方式
计算机网络知识速记 :HTTP多个TCP连接的实现方式 在当今互联网高速发展的背景下, web 应用程序对性能的要求日益增加。在众多网络协议中,HTTP (超文本传输协议) 的性能优化显得尤为重要,尤其是在多个TCP连接的管理和实现上。 引…...
5、《Spring Boot自动配置黑魔法:原理深度剖析》
Spring Boot自动配置黑魔法:原理深度剖析 一、引言:为什么Spring Boot能“开箱即用”? Spring Boot的核心理念是**“约定优于配置”,开发者只需引入一个spring-boot-starter-web依赖,就能直接编写RESTful API…...
Django 创建表时 “__str__ ”方法的使用
在 Django 模型中,__str__ 方法是一个 Python 特殊方法(也称为“魔术方法”),用于定义对象的字符串表示形式。它的作用是控制当对象被转换为字符串时,应该返回什么样的内容。 示例: 我在初学ModelForm时尝…...
CUDA-内存访问模式
在 GPU 计算中,内存访问模式 直接影响程序的性能,尤其是 全局内存(global memory) 访问的合并性(coalescing)和局部性(locality)。 1. GPU 内存层次结构 GPU 具有多级存储ÿ…...
img标签的title和alt
img标签的title和alt 显示上 title:鼠标移入到图片上时候显示的内容; alt:图片无法加载时候显示的内容; <div class"box"><div><!-- title --><h3>title</h3><img src"./image/poster.jpg" title"这是封…...
【一文读懂】HTTP与Websocket协议
HTTP协议 概述 HTTP (Hypertext Transfer Protocol),即超文本传输协议,是一种用于在客户端和服务器之间传输超文本(例如网页、图片、音频、视频等)的通信协议。它是万维网(WWW)的基础,负责在浏…...
Grafana——如何迁移Grafana到一台新服务器
背景 有时候由于服务器更新之类的,我们需要迁移一整套Grafana,这时候该怎么操作呢? 下面让我一步步说明下 安装Grafana 在新的服务器上安装Grafana 这个不再赘述,可以看一下我之前的文章 备份及迁移 迁移配置文件 配置文件即…...
android 源码切换分支
在Android源码(通常是指Android操作系统的源代码,比如AOSP - Android Open Source Project)中进行分支切换,你需要使用Git这一版本控制系统。以下是切换分支的基本步骤: 确保你在工作目录中: 首先&…...
Flutter中 List列表中移除特定元素
在 Dart 语言里,若要从子列表中移除特定元素,可以使用以下几种方法,下面为你详细介绍: 方法一:使用 where 方法创建新列表 where 方法会根据指定的条件筛选元素,然后通过 toList 方法将筛选结果转换为新列…...
一己之见:嵌入式linux开发板的选择(canmv还是...)
个人了解范围有限,仅仅介绍我略微了解的几个开发板。 野火,核桃,canmv,香蕉,香橙,庐山,地瓜,还有其他...。 野火资料全,型号多,接口丰富,支持usb…...
逻辑函数化简全解析:公式法与卡诺图法终极指南
一、为什么需要逻辑函数化简? 想象一下,你正在设计一个简单的3人投票电路:当至少两人同意时,输出通过信号。未经化简的逻辑表达式可能是: F A&B A&C B&C 若直接实现,需要3个与门和1个或门。…...
多模态基础模型训练笔记-第一篇InternVL-g
一、TL;DR 将之前所有训练过的大模型的过程都总结和回忆一下,遇到的坑别忘了 二、问题记录 还是注意镜像的选择,选择社区最火的镜像,然后下载好对应的数据,主要显卡的选择,这个时候4090已经带不动了&…...
微软AutoGen高级功能——Magentic-One
介绍 大家好,博主又来给大家分享知识了,这次给大家分享的内容是微软AutoGen框架的高级功能Magentic-One。那么它是用来做什么的或它又是什么功能呢,我们直接进入正题。 Magentic-One Magnetic-One是一个通用型多智能体系统,用于…...
Unity UI个人总结
个人总结,太简单的直接跳过。 一、缩放模式 1.固定像素大小 就是设置一个100x100的方框,在1920x1080像素下在屏幕中长度占比1/19,在3840x2160,方框在屏幕中长度占比1/38。也就是像素长款不变,在屏幕中占比发生变化 2.…...
Dubbo和OpenFeign的对比
Dubbo 和 OpenFeign 是两种常用的服务间通信框架,但设计目标和适用场景有显著差异。以下是两者的对比分析: 1. 核心定位 Dubbo RPC 框架:专注于高性能的远程过程调用(RPC),基于自定义协议(如 Du…...
牛客小白月赛110
A智乃办赛 思路:用group表示是第几个大写英文字母,以A为基础,(n-1)/500为几则往上加几,从而得到应有的字母,用number表示当前组内的编号,(n-1)%5001表示,至于最后的前导0,在输出的时…...
用大模型学大模型03-数学基础 概率论 条件概率 全概率公式 贝叶斯定理
要深入浅出地理解条件概率与贝叶斯定理,可以从以下几个方面入手,结合理论知识和实例进行学习: 贝叶斯定理与智能世界的暗语 条件概率,全概率公式与贝叶斯公式的推导,理解和应用 拉普拉斯平滑 贝叶斯解决垃圾邮件分类 …...
电商小程序(源码+文档+部署+讲解)
引言 随着移动互联网的快速发展,电商小程序成为连接消费者与商家的重要桥梁。电商小程序通过数字化手段,为消费者提供了一个便捷、高效的购物平台,从而提升购物体验和满意度。 系统概述 电商小程序采用前后端分离的架构设计,服…...
