【完整版】DeepSeek-R1大模型学习笔记(架构、训练、Infra)
文章目录
- 0 DeepSeek系列总览
- 1 模型架构设计
- 基本参数
- 专家混合模型(MoE)[DeepSeek-V2提出, DeepSeek-V3改良]
- 多头潜在注意力(MLA)[DeepSeek-V2提出]
- 多token预测(MTP)[DeepSeek-V3提出]
- 2 DeepSeek-R1-Zero及DeepSeek-R1的训练策略
- DeepSeek-R1-Zero with RL only
- DeepSeek-R1 with Both RL and SFT
- FP8混合精度量化 [DeepSeek-V3提出]
- 知识蒸馏 [DeepSeek-R1提出]
- DeepSeek-R1的一些失败尝试
- 过程奖励模型(PRM)
- 蒙特卡洛搜索树(MCTS)
- 3 Infrastructures [DeepSeek-V3提出]
- 计算集群
- 训练框架
- DualPipe和计算-通信overlap
- 跨节点all-to-all通信
- 节省显存
- 推理和部署
- Prefill阶段(compute bound)
- Decoding阶段(memory bound)
- 训练成本
0 DeepSeek系列总览
DeepSeek-R1基于DeepSeek-V3-Base模型,提出了一系列训练策略,包括基于纯强化学习的训练(DeepSeek-R1-Zero)、基于多阶段的训练和冷启动(DeepSeek-R1)、知识蒸馏等。下面是我总结的DeepSeek系列的整体框架:
1 模型架构设计
基本参数
- DeepSeek-R1和DeepSeek-V3采用同样的模型参数,并且设计和DeepSeek-V2类似
- Attention采用多头潜在注意力机制(MLA)
- FFN采用无辅助损失的DeepSeekMoE
- 61层Transformer Layer
- MoE中1个共享专家,256个路由专家,对每个token选择top-8专家
专家混合模型(MoE)[DeepSeek-V2提出, DeepSeek-V3改良]
MoE在每次推理时选择性地激活部分模型参数,在不成比例增加计算成本的情况下,可以扩展模型参数。在DeepSeek-V2中就已经提出了用于FFN层的DeepSeekMoE。
- 动态专家分配:根据token的上下文动态分配合适的专家
- DeepSeek-V2引入辅助损失进行负载均衡,确保token在专家之间的分配更加均衡。DeepSeek-V3和DeepSeek-R1进一步采用用auxiliary-loss-free load balancing实现负载均衡,引入一个expert bias,这个bias只影响专家路由,而不影响任何梯度。动态调整bias,专家overloaded则降低bias,专家unoverloaded则增大bias。简单来说就是用加法高效地对gating score进行re-weight的过程
- DeepSeek-R1和DeepSeek-V3一致,总参数量671B,通过MoE对单个token的激活参数量仅37B (~5.5%)。MoE中有1个shared expert+256个routed expert,每次只激活的8个exert。
Auxiliary-Loss-Free Load Balancing [DeepSeek-V3提出]
和DeepSeek-V3一样,DeepSeek-R1采用了细粒度的MoE,一些expert作为共享expert,另一些expert作为routed expert进行动态激活。对于第t个token u t u_t ut,下面是MoE计算的过程:
以前基于auxiliary loss的方法需要修改loss function,当auxiliary loss很大时会影响模型性能。那么Auxiliary-Loss-Free则是在gating value g g g的基础上,额外加上了bias来实现负载均衡:
注意bias只影响专家路由,而不影响任何梯度。专家overloaded则降低bias,专家unoverloaded则增大bias。调整的速度由超参数 γ \gamma γ控制,这个和反向传播的梯度更新过程类似。
下图是该方法的出处:Auxiliary-Loss-Free Load Balancing Strategy for Mixture-of-Experts文章所提出的负载均衡策略:
和DeepSeek-V2一样,DeepSeek-V3和DeepSeek-R1都采用了限制设备数量的MoE,并且不会再训练时做token dropping了。
多头潜在注意力(MLA)[DeepSeek-V2提出]
MLA通过将QKV矩阵投影到低维潜在空间,显著降低计算和内存成本。DeepSeek-V2中就提出了用MLA来替代传统的多头自注意力。
MLA和其他注意力的对比如下,KV cache以一个更低的维度去存储和计算。
K和V的联合压缩如下:
真正推理时,cache的就是低维的 c t K V c_t^{KV} ctKV,并且down-proj和up-proj矩阵可以分别被吸收进 W Q W^Q WQ和 W O W^O WO中,不会造成额外的计算开销。这个方法和Palu: Compressing KV-Cache with Low-Rank Projection那篇文章一致。具体的融合过程如下(以 W Q W^Q WQ的融合为例):
为了在训练时降低激活的memory,也对query做低秩压缩:
【对query低秩分解怎么省memory,算的时候不需要重构回去?】【回答:只需要保存低秩的query,然后在反向传播时重计算一步,节省了需要存储的memory】
RoPE位置编码兼容性考虑
但是KV cache的低秩压缩和RoPE位置编码并不兼容!如果对 k t C k_t^C ktC做RoPE, W U K W^{UK} WUK会和位置敏感的RoPE矩阵耦合在一起,从而不能在推理时被吸收进 W Q W^Q WQ中(这里应该强调一下吸收是totally offline完成的),带来额外的计算。
进一步理解 W U K W^{UK} WUK和RoPE矩阵的耦合:与生成当前token相关的RoPE矩阵位于 W Q W^{Q} WQ和 W U K W^{UK} WUK之间,而矩阵乘法不满足交换律。
于是DeepSeek-V2提出了解耦RoPE策略,用额外的多头query和一个共享key来计算RoPE,然后和原本的query和key拼接起来。至于这里怎么得到的额外query和key,就是用来两个额外的线性层来算得的。
下图体现了MLA的整个过程,值得注意的一点是,MLA的低秩分解是基于训练的,而非用SVD之类的方式post-training分解直接推理(比如Pula文章)。
所以,在MLA中不存储KV cache了,而是存储压缩后的低维度激活 c t K V c_t^{KV} ctKV和 k t R k_{t}^R ktR两部分存储开销大大降低。
多token预测(MTP)[DeepSeek-V3提出]
MTP使DeepSeek-R1并行预测多个token,从而显著提高推理速度。MTP已经在DeepSeek-V3中已经被用于训练的目标。
- 并行解码:通过允许在相同的上下文窗口内进行多个token生成预测,扩展了自回归框架
- 动态预测视距:根据模型置信度调整每步预测的token数量
- 强化学习引导的token选择:确保多token预测中的一致性,并减少错误传播
- 训练时MTP包含了多个MTP模块,主要用于提升模型的推理性能,在推理时,可以直接将多个MTP模块丢弃,只保留主模型,然后推理。也可以重新利用这些MTP模块,借助speculative decoding来加速推理过程。
2 DeepSeek-R1-Zero及DeepSeek-R1的训练策略
DeepSeek-R1-Zero with RL only
DeepSeek-R1-Zero直接在DeepSeek-V3-Base模型的基础上用纯的Group Relative Policy Optimization (GRPO)强化学习算法,而不引入Supervised Fine-tuning (SFT)训练。
强化学习算法:近端策略优化(PPO)和GRPO
GRPO相比于PPO更好,主要原因如下:1)丢弃了单独的value模型;2)GRPO计算reward时,改成了一个q生成多个r,然后reward打分
DeepSeek-R1-Zero采用基于规则的奖励机制,包含两部分奖励:**1)accuracy奖励;2)格式奖励。**遵循的训练模板如下图所示,思考过程和回答过程需要放在对应的tag中,引导模型学会标准化的思考过程格式,也提高了输出的结构化程度和可解释性。
DeepSeek-R1-Zero的缺点
DeepSeek-R1-Zero面临着可读性差和语言混合(比如中英文混杂)等挑战。于是DeepSeek-R1进一步解决了这两个问题。
DeepSeek-R1 with Both RL and SFT
在DeepSeek-R1-Zero的基础上,DeepSeek-R1加入了冷启动,并且用高质量数据做SFT+RL训练,得到了当今的“最强大模型”。下面是关键技术和训练流程:
步骤1:冷启动SFT
在高质量的长思维链(CoT)数据上做SFT,改善DeepSeek-R1-Zero可读性较差的问题。数据的采集方式如下:以带长CoT的few-shot prompting为例,直接提示模型生成带思考和验证的详细的答案;以可读的格式收集DeepSeek-R1-Zero的输出,并通过人工细化和调整结果。
步骤2:面向推理的RL
冷启动训练后,用和DeepSeek-R1-Zero一样的RL训练策略继续训练,来提高模型的推理能力。训练过程中发现CoT经常表现出语言混合,特别是当RL提示涉及多种语言时,所以提出采用语言一致性奖励改善语言混杂的问题,进一步增强模型的可读性。
步骤3:拒绝采样和SFT
RL训练收敛后,在这一步中融合推理数据和非推理数据进一步微调模型增强模型的通用能力。
-
对于推理数据,用上述RL训练的模型checkpoint中通过拒绝采样生成600k条推理数据。具体做法是借助生成式奖励模型,将ground-truth和模型预测结果输入DeepSeek-V3进行评估。此外,由于模型输出有时是混乱的,难以阅读,所以过滤了混合语言、长段落和代码块的CoT
拒绝采样微调(RFT):在一个微调过的模型上进行多个样本的采样,我们有一个拒绝或者接受函数来对模型采样生成的样本进行过滤筛筛选出符合我们目标分布的样本(比如预测正确的样本),再进行进一步的模型微调。
-
对于非推理数据(比如写作、事实质量保证、自我认知和翻译),采用DeepSeek-V3 pipeline,复用DeepSeek-V3的部分SFT数据集。对于某些非推理任务,调用DeepSeek-V3,在通过prompting在回答问题之前生成一个潜在的CoT。对于很简单的query比如"Hello",则不需要CoT了。这部分数据大约200k
然后融合上述数据,然后进行SFT,以适应非推理场景(通用能力)。总共大约800k条数据,训练DeepSeek-V3-Base 2个epoch。
步骤4:全场景RL
进一步使模型与人类的偏好保持一致,进一步用了二阶段RL阶段提高模型的帮助性和无害性,同时改进其功能推理能力。对于推理任务,继续用基于规则的奖励;对于通用任务,采用偏好奖励模型。
FP8混合精度量化 [DeepSeek-V3提出]
利用FP8量化,减少内存使用和计算成本,同时保持数值稳定性。采用混合精度训练,根据计算需求调整不同层的位宽精度。
- 对于主要的计算GEMM,采用FP8,累加精度BF16或FP32(Fprop、Wgrad、Dgrad),相比于BF16加速了2x
- 对于一些算子需要更高的精度(BF16或FP32),比如embedding层、输出head、MoE gating层、normalization层、attention算子,以保证稳定的训练动态性
- 为了进一步保证数值稳定性,将主权重、权重梯度和优化器状态也保存为高精度
为了进一步提高模型的性能,做了如下优化:
- 细粒度量化以更好地容纳outliers:对于activation,采用1x128 tile(128个channel分为1个tile);对于weight,采用128x128 block(128个input channel和128个output channel分为1个block)。对不同的tile/block维护不同的scale值
- 数据格式:在所有tensor上都采用更大的尾数E4M3,而不是E5M2,以获得更高的精度
- 在线量化:在线计算tile/block的最大绝对值
知识蒸馏 [DeepSeek-R1提出]
用DeepSeek-R1直接蒸馏Qwen2.5-Math-1.5B, Qwen2.5-Math-7B, Qwen2.5-14B, Qwen2.5-32B, Llama-3.1-8B和Llama-3.3-70B-Instruct,都有显著的性能提升。蒸馏时只在800k个样本上用了SFT,而并没有用RL。直接说一下文章的结论:
- 将更强大的模型蒸馏成更小的模型会产生良好的结果,而依赖于大规模RL的小模型则需要巨大的算力,甚至可能无法达到蒸馏的性能
- 虽然蒸馏既经济又有效,但超越智能的边界可能仍然需要更强大的基座模型和更大规模的RL
下面是在Qwen上蒸馏和RL的对比:
DeepSeek-R1的一些失败尝试
过程奖励模型(PRM)
PRM没有取得很好的效果,主要是下面三点原因:
- 很难在一般推理中明确地定义一组细粒度的步骤
- 确定“当前的中间步骤是否正确”是一项具有挑战性的任务。使用模型进行自动标注可能不会产生令人满意的结果,而手动标注则不利于模型的scale up
- 一旦基于模型的PRM被引入,它就不可避免地会导致reward hacking,并且奖励模型的再训练需要额外的训练资源,使整个训练过程变得更复杂
蒙特卡洛搜索树(MCTS)
MCTS用于增强test-time计算扩展性,但是在训练scale up是遇到问题:
- 与国际象棋不同,它的搜索空间定义相对明确,而token生成表现出指数级更大的搜索空间。于是DeepSeek-R1为每个节点设置了一个最大扩展限制,但这可能会导致模型陷入局部最优状态
- 价值模型直接影响生成的质量,因为它指导了搜索过程的每一步。训练一个细粒度的价值模型本质上是困难的,这使得在模型得到迭代改进上更有挑战性
总的来说,当与预训练好的价值模型匹配时,MCTS可以提高推理时的性能,但是通过自搜索迭代提高模型性能仍然是一个重大挑战。
3 Infrastructures [DeepSeek-V3提出]
计算集群
- 2048 NVIDIA H800 GPUs
- H800集群中的每个节点都包含8个由节点内NVLink和NVSwitch连接的GPU
- 跨不同的节点,用InfiniBand (IB)互连来促进通信
训练框架
- 采用HAI-LLM
- 16-way Pipeline Parallelism (PP)
- 跨8个节点的64-way Expert Parallelism (EP)
- ZeRO-1 Data Parallelism (DP)
DualPipe和计算-通信overlap
背景问题:跨节点专家并行性带来的通信开销会造成低效的计算通信比(约为1:1),于是提出了DualPipe,通过有效地overlap前反向传播的计算和通信阶段来加速模型训练,同时减少了bubble。
核心思想:在一对单独的前向块和反向块中overlap计算和通信
方法:将每个块分成四个部分—— attention, all-to-all dispatch, MLP, and all-to-all combine
MoE专家并行示意图如下:
)
前向传播如下:
反向传播如下:
这个图的意义:可以观察到 前向和反向传播是交替进行的,计算和通信也是交替进行的。 因此,当数据1在做计算的时候,数据2可以并行做通信,这样通信部分的时间就被完全隐藏起来了。
DualPipe流水线设计如下,核心就是尽可能用到上述的前反向传播的计算通信并行,减少了流水线中的bubble。
跨节点all-to-all通信
写了高效的跨节点all-to-all通信核,包括dispatching和combining两部分。这一部分偏比较工程的实现。
节省显存
- 不保存所有的中间激活值,而是在反向传播时重计算RMSNorm和MLA up-projection层(也就是只存储低维度的值 )
- 将指数平均(EMA)参数存储在CPU内存中,并在每个训练步骤后进行异步更新
- 用于MTP的共享embedding和输出head,将它们放到同一个pp的GPU上,减少通信和显存占用
推理和部署
Prefill阶段(compute bound)
- 总共32个GPU 4节点
- Attention:TP4、SP、DP8
- MoE:EP32(总共256个专家/专家并行数32=8个专家/GPU,所以每张GPU上8+1个专家,这个额外的专家是高负载冗余专家,每隔十分钟重新设置)
- MoE是特殊的MLP,在prefill时可以并行计算
Decoding阶段(memory bound)
- 总共320个GPU 40个节点
- Attention:TP4、DP80、SP
- MoE:EP320(每个GPU分到1个专家)
- 采用上面提到的DualPipe,两个micro-batch同时进行,一个进行计算,另一个进行通信,从而实现对all-to-all通信时间的覆盖
训练成本
DeepSeek-V3公开的预训练成本:
DeepSeek-R1在DeepSeek-V3-Base基础上进行RL+SFT微调,具体训练成本并未公开:
相关文章:

【完整版】DeepSeek-R1大模型学习笔记(架构、训练、Infra)
文章目录 0 DeepSeek系列总览1 模型架构设计基本参数专家混合模型(MoE)[DeepSeek-V2提出, DeepSeek-V3改良]多头潜在注意力(MLA)[DeepSeek-V2提出]多token预测(MTP)[DeepSeek-V3提出] 2 DeepSeek-R1-Zero及…...
深入解析:如何利用 Python 爬虫获取商品 SKU 详细信息
在电商领域,SKU(Stock Keeping Unit,库存单位)详细信息是电商运营的核心数据之一。它不仅包含了商品的规格、价格、库存等关键信息,还直接影响到库存管理、价格策略和市场分析等多个方面。本文将详细介绍如何利用 Pyth…...
【3】高并发导出场景下,服务器性能瓶颈优化方案-文件压缩
使用EasyExcel导出并压缩文件是一种高效且常见的解决方案,尤其适用于需要处理大量数据的场景。 1. 导出多个Excel文件并压缩成ZIP文件的基本流程 (1)数据准备:从数据库或其他数据源获取需要导出的数据,并将其存储在Ja…...

FPGA|生成jic文件固化程序到flash
1、单击file-》convert programming files 2、flie type中选中jic文件,configuration decive里根据自己的硬件选择,单击flash loader选择右边的add device选项 3、选择自己的硬件,单击ok 4、选中sof选项,单机右侧的add file 5、选…...

【ArcGIS_Python】使用arcpy脚本将shape数据转换为三维白膜数据
说明: 该专栏之前的文章中python脚本使用的是ArcMap10.6自带的arcpy(好几年前的文章),从本篇开始使用的是ArcGIS Pro 3.3.2版本自带的arcpy,需要注意不同版本对应的arcpy函数是存在差异的 数据准备:准备一…...

用Python获取股票数据并实现未来收盘价的预测
获取数据 先用下面这段代码获取上证指数的历史数据,得到的csv文件数据,为后面训练模型用的 import akshare as ak import pandas as pd# 获取上证指数历史数据 df ak.stock_zh_index_daily(symbol"sh000001")# 将数据保存到本地CSV文件 df.…...

Rust 所有权特性详解
Rust 所有权特性详解 Rust 的所有权系统是其内存安全的核心机制之一。通过所有权规则,Rust 在编译时避免了常见的内存错误(如空指针、数据竞争等)。本文将从堆内存与栈内存、所有权规则、变量作用域、String 类型、内存分配、所有权移动、Cl…...
Gateway路由匹配规则详解
在微服务架构中,Gateway作为请求的入口,扮演着至关重要的角色。它不仅负责路由转发,还具备安全、监控、限流等多种功能。其中,路由匹配规则是Gateway的核心功能之一,它决定了请求如何被正确地转发到目标服务。本文将详…...
项目实操:windows批处理拉取git库和处理目录、文件
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...
前端开发知识梳理 - HTMLCSS
1. 盒模型 由内容区(content)、内边距(padding)、边框(border)和外边距(margin)组成。 (1)标准盒模型(box-sizing默认值, content-boxÿ…...
nginx中的proxy_set_header参数详解
在使用 Nginx 作为反向代理服务器时,proxy_set_header 指令扮演着至关重要的角色。它允许我们自定义请求头信息,将客户端请求传递给上游服务器时,添加或修改特定的信息,从而实现更灵活的代理功能。本文将深入探讨 proxy_set_heade…...
MapReduce是什么?
MapReduce 是一种编程模型,最初由 Google 提出,旨在处理大规模数据集。它是分布式计算的一个重要概念,通常用于处理海量数据并进行并行计算。MapReduce的基本思想是将计算任务分解为两个阶段:Map 阶段和 Reduce 阶段。 Map 阶段&a…...

Text2Sql:开启自然语言与数据库交互新时代(3030)
一、Text2Sql 简介 在当今数字化时代,数据处理和分析的需求日益增长。对于众多非技术专业人员而言,数据库操作的复杂性常常成为他们获取所需信息的障碍。而 Text2Sql 技术的出现,为这一问题提供了有效的解决方案。 Text2Sql,即文…...

《图解设计模式》笔记(五)一致性
十一、Composite模式:容器与内容的一致性 像文件夹与文件一样,文件夹中可以放子文件夹与文件,再比如容器中可以放更小的容器和具体内容。 Composite模式:使容器与内容具有一致性,创造出递归结构。 Composite&#x…...

华为支付-免密支付接入免密代扣说明
免密代扣包括支付并签约以及签约代扣场景。 开发者接入免密支付前需先申请开通签约代扣产品(即申请配置免密代扣模板及协议模板ID)。 华为支付以模板维度管理每一个代扣扣费服务,主要组成要素如下: 接入免密支付需注意&#x…...
React组件中的列表渲染与分隔符处理技巧
React组件中的列表渲染与分隔符处理技巧 摘要问题背景解决方案分析方案一:数组拼接法方案二:Fragment组件方案三:动态生成key 关键技术点1. key的使用原则2. Fragment组件3. 性能优化 实战演练挑战1:动态分隔符样式挑战2ÿ…...

【Pytorch和Keras】使用transformer库进行图像分类
目录 一、环境准备二、基于Pytorch的预训练模型1、准备数据集2、加载预训练模型3、 使用pytorch进行模型构建 三、基于keras的预训练模型四、模型测试五、参考 现在大多数的模型都会上传到huggface平台进行统一的管理,transformer库能关联到huggface中对应的模型&am…...
快速了解 c++ 异常处理 基础知识
相关代码概览: #include<stdexcept>std::runtime_errorcatch (const std::runtime_error& e) e.what() 相信大家一定见过这些代码,那么这些代码具体什么意思呢?我们一起来看一下 知识精讲: 异常处理是C中非常重要…...

deepseek API 调用-python
【1】创建 API keys 【2】安装openai SDK pip3 install openai 【3】代码: https://download.csdn.net/download/notfindjob/90343352...
玩转Gin框架:Golang使用Gin完成登录流程
文章目录 背景基于Token认证机制简介常见的Token类型Token的生成和验证在项目工程里创建jwt.go文件根目录新建.env文件 创建登录接口 /loginToken认证机制的优点 背景 登录流程,相信大家都很熟悉的。传统网站采用session后端验证登录状态,大致流程如下&…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...

uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...

解析“道作为序位生成器”的核心原理
解析“道作为序位生成器”的核心原理 以下完整展开道函数的零点调控机制,重点解析"道作为序位生成器"的核心原理与实现框架: 一、道函数的零点调控机制 1. 道作为序位生成器 道在认知坐标系$(x_{\text{物}}, y_{\text{意}}, z_{\text{文}}…...