DeepSeek开源周 Day04:从DualPipe聊聊大模型分布式训练的并行策略
DualPipe简介
今天是DeepSeek开源周的第四天,官方开源了一种新型并行计算优化策略——DualPipe。 其实大家阅读过Deepseek-V3技术报告的同学,对这个技术并不陌生。
开源地址:https://github.com/deepseek-ai/DualPipe
核心亮点
-
DualPipe:双向流水线并行算法
DualPipe通过创新的流水线设计,让前向传播和反向传播的计算任务可以在独立的管道中并行执行,大幅提高计算效率。 -
完全计算-通信重叠
DualPipe不仅能并行计算,还能实现计算和通信阶段的完美重叠,极大减少了GPU的空闲时间。 -
高效的内存使用与低气泡时间
与传统方法相比,DualPipe显著减少了内存占用,并优化了流水线气泡问题,使得大规模分布式训练更加高效。
在今天本次分享中,我们将重点介绍如何通过双向流水线并行算法提升V3/R1训练中的计算-通信重叠效率,彻底改变分布式训练的速度和资源利用率。
在今天本次分享中,常见流水线并行技术,可能实际大模型训练过程中直接调包用就行了,毕竟开源的太硬核,不接触Infra底层优化使用场景比较少了。
首先,我们先了解训练巨大模型的显存和计算效率的挑战,为什么要有流水行并行。
显存与计算效率挑战
在训练巨大模型时,显存和计算效率面临着巨大的挑战,特别是在大规模模型(例如万亿参数模型)的训练过程中。以下是这两个方面的具体问题:
显存效率
训练万亿参数的模型对显存的需求极为庞大,远超过单个GPU的承载能力。例如,使用Adam优化器进行混合精度训练时,仅仅保存模型状态(包括参数、梯度和优化器状态)就需要大约12TB的显存空间。以英伟达A100为例,其显存容量为40GB,这意味着仅为存储模型状态就需要多达400张A100 GPU。
此外,在前向传播过程中,模型的中间激活值需要被保存,直到反向传播完成并计算出损失函数后才会释放。即使将批量大小(batch size)设为1,训练一个万亿参数的模型也会产生超过400GB的激活显存需求。虽然可以通过Checkpoint技术(以计算时间换取显存空间)来处理部分激活显存问题,但整体显存需求依然巨大。
为避免显存溢出,必须通过分布式训练策略将模型状态和激活显存有效地分散到多个GPU设备上,这是实现大规模模型训练的关键。
计算效率
训练一个万亿参数的模型估计需要消耗约5000 Zflops的计算量。这一庞大的计算需求意味着,即使使用4000张A100 GPU并以50%的计算效率运行,也需要约100天才能完成训练。
尽管大型GPU集群可能配备超过4000个GPU,但由于批量大小的限制,要在如此规模上实现高效计算仍然面临挑战。计算效率与计算时间和通信时间的比率相关,而这个比率又受到批量大小的直接影响。更大的批量有助于提高计算效率,但若批量大小过大,则可能影响模型的收敛性。以GPT-3为例,其训练批量大小约为1500,而若将批量大小提高至4000,单张GPU的批量大小仍然只有1,这将严重限制训练的扩展性。
因此,如何在保证模型收敛的前提下,优化批量大小和计算效率,是大规模训练中的核心问题。
流水线并行
流水线并行性使得训练无法放入单个 GPU 内存的大型模型成为可能。
例如:Huggingface 的BLOOM模型是一个 175B 参数的 Transformer 模型。将权重存储为 bfloat16 需要 350GB,但他们用于训练 BLOOM 的 GPU 内存只有 80GB,而训练所需的内存远不止加载模型权重。因此,他们的最终训练分布在 384 个 GPU 上。
这是通过将模型的不同层分配给不同的 GPU 来实现的,这一过程称为模型分区。如果模型分区的实现方式简单,则会导致 GPU 利用率低。
下面我们介绍一些流水行并行方式。
朴素模型并行-Naive PP
朴素模型并行(Naive Model Parallelism) 是指将模型层组分布在多个 GPU 上。每当数据进出时,会切换到与模型层相同的设备,其余部分保持不变。
例如,下图显示一个 8 层模型:
我们将模型垂直切分为两部分,0-3 层放在 GPU0 上,4-7 层放在 GPU1 上。在 0 到 3 层的数据传输是常规的计算过程,但当数据需要从第 3 层传输到第 4 层时,就涉及到 GPU0 到 GPU1 的跨设备通信,这会产生通信开销。如果 GPU 位于同一计算节点(例如同一台物理机器),则通信速度较快,但如果 GPU 位于不同的计算节点(如多台机器),则通信开销会显著增加。接下来,4 到 7 层的计算过程与正常模型一致,在第 7 层完成后,我们需要将数据发送回标签所在的 0 层(或将标签发送到最后一层),然后计算损失并开始优化。
下面我们再看一个4卡并行的时序图
模型通过层将其垂直分成4个部分。Worker 1负责网络的第一层(离输入最近),而Worker 4负责第4层(离输出最近)。图中的“F”、“B”和“U”分别表示前向传播、反向传播和更新操作。下标表示操作在哪个Worker上运行。由于数据处理需要一个一个地按顺序进行,这会导致每个Worker之间出现很大的“空闲时间”。
同步流水线并行-GPipe
GPipe(Easy Scaling with Micro-Batch Pipeline Parallelism),由谷歌提出的一种流水线并行方案。Gpipe 流水线并行主要用来解决这两个问题:
第一,提高模型训练的并行度。 Gpipe 在朴素流水线并行的基础上,利用数据并行的思想,将 mini-batch 细分为多个更小的 micro-batch,送入GPU进行训练,来提高并行程度。
第二,通过重计算(Re-materialization)降低显存消耗。 在模型训练过程中的前向传播时,会记录每一个算子的计算结果,用于反向传播时的梯度计算。
来自 GPipe论文的插图上半部分显示了Naive MP,下半部分显示了 PP:
从下半部分中可以很容易地看出 PP 的死区较少 - 死区指GPU处于空闲状态,空闲部分被称为“bubble”(气泡)。
图的两部分都显示了 4 级并行性。也就是说,有 4 个 GPU 参与流水线。因此,有 4 个管道阶段 F0、F1、F2 和 F3 的前向路径,然后有 B3、B2、B1 和 B0 的后向路径。
PP 引入了一个新的超参数来调整,即块chunks,它定义了通过同一管道阶段按顺序发送多少个数据块。例如,上图下半部分中,你可以看到chunks = 4。GPU0 对块 0、1、2 和 3(F0,0、F0,1、F0,2、F0,3)执行相同的前向路径,然后等待其他 GPU 完成其工作,并且只有当它们的工作开始完成时,GPU0 才会再次开始工作,对块 3、2、1 和 0(B0,3、B0,2、B0,1、B0,0)执行后向路径。
使用 chunks=1 时,你最终会得到Navie MP,这是非常低效的。使用非常大的 chunks 值时,你最终会得到非常小的微批次大小,这可能也不是非常高效。因此,必须进行实验才能找到让 GPU 达到最高利用率的值。
简而言之,GPipe 通过纵向对模型进行切分解决了单个设备无法训练大模型的问题;同时,又通过微批量流水线增加了多设备上的并行程度,除此之外,还使用re-materialization降低了单设备上的显存峰值。
F-then-B 策略
F-then-B 模式,先进行前向计算,再进行反向计算。F-then-B 模式由于缓存了多个 micro-batch 的中间变量和梯度,显存的实际利用率并不高。
来源:https://juejin.cn/post/7262274383287484476
1F1B 策略
1F1B (在流水线并行中,pipeline stage 前向计算和反向计算交叉进行的方式)流水线并行方式解决了这个问题。在 1F1B 模式下,前向计算和反向计算交叉进行,可以及时释放不必要的中间变量。
来源:https://juejin.cn/post/7262274383287484476
异步并行流水线并行-PipeDream
尽管 PipeDream 与 GPipe 同期发布,但其并行思想与 GPipe 截然不同。PipeDream 将前向传递的执行流水线化,并将其与后向传递穿插在一起,以期最大限度地提高硬件利用率和吞吐量。它将小批量连续插入到流水线中,并在后向传递后异步更新参数。
PipeDream 和 GPipe 之间的区别很明显:PipeDream 应用异步后向更新,而 GPipe 应用同步后向更新。
如上图所示,PipeDream为了确保任何时候没有GPU处于空闲状态,这个框架会将多个小批次数据依次注入到流水线中。在完成一个小批次的前向传播后,每个阶段会异步地将输出的激活值传递给下一个阶段,同时开始处理下一个小批次的数据。 类似地,在完成一个小批次的反向传播后,每个阶段会异步地将输出的梯度传递给前一个阶段,同时开始计算下一个小批次的数据。这样,不同的GPU可以同时处理不同的小批次,避免了空闲等待的情况。
1F1B (上) vs 1F1B 交错模式 (下)
交错模式为了进一步减少流水线空闲时间,每个设备可以计算多个不连续的层集合,称为模型块,而不是一个连续的层集合。例如,设备1不再处理第1到第4层,设备2也不再处理第5到第8层,而是将每个设备分配两个模型块,每个模型块包含两层。这样,设备1处理的层是1、2、9、10,设备2处理的层是3、4、11、12。这种方案将多个流水线阶段分配给每个设备,每个阶段处理的层数比单个连续集合少,从而进一步减少了流水线空闲时间的开销。
总结来说,PipeDream中使用了1F1B(1 Forward 1 Backward)设计,表示一个模块交替执行前向传递和反向传递,从图中不难看出,1F1B的气泡占比不变,但同时因为更早的进行了Backward,显著降低了activation的显存占用。
张量并行-TP
张量并行训练是将一个张量沿特定维度分成 N 块,每个设备只持有整个张量的 1/N,同时不影响计算图的正确性。这需要额外的通信来确保结果的正确性。
在张量并行中,每个 GPU 仅处理张量的一部分,并且仅为需要整个张量的操作聚合整个张量。
按照 Megatron 的论文符号,我们可以将其点积部分写为Y = GeLU(XA),其中X和Y分别是输入和输出向量,A是权重矩阵。
如果我们以矩阵形式查看计算,很容易看出矩阵乘法如何在多个 GPU 之间分配:
如果我们将权重矩阵A按列拆分到N各个 GPU 并并行执行矩阵乘法XA_1,XA_n那么我们最终会得到可以独立输入的N输出向量: Y_1, Y_2, …, Y_nGeLU
[ Y 1 , Y 2 ] = [ GeLU ( X A 1 ) , GeLU ( X A 2 ) ] [Y_1, Y_2] = [\text{GeLU}(X A_1), \text{GeLU}(X A_2)] [Y1,Y2]=[GeLU(XA1),GeLU(XA2)]
利用这一原理,我们可以更新任意深度的 MLP,而无需 GPU 之间进行任何同步,直到最后,我们才需要从碎片中重建输出向量。Megatron-LM 论文作者为此提供了一个有用的例子:
并行化多头注意力层更加简单,因为它们具有多个独立的头,本质上已经是并行的!
注意:TP 需要非常快的网络,因此不建议在多个节点上进行 TP。
数据并行-DP
数据集分为n块,每块随机分配到m个设备(worker)中,相当于m个batch并行训练n/m轮,模型也被复制为n块,每块模型均在每块数据上进行训练,各自完成前向和后向的计算得到梯度,对梯度进行更新,更新后,再传回各个worker。以确保每个worker具有相同的模型参数。
3D并行-DP+PP+TP
3D并行是由数据并行(DP)、张量并行(TP)和流水线并行(PP)组成。将这三者结合起来,将得到一个3D网格,其中每个参数、优化器状态等都映射到每个GPU上。这就是3D并行。
参考资料
- 一文解析 DeepSeek 大模型高效训练背后的极限 AI 工程优化,看完这一篇你就懂了!!
- DeepSeek V3 精读(2)-DualPipe
- DeepSeek-V3 关键点解读-Infra&硬件篇
- Techniques for training large neural networks
- Pipeline-Parallelism: Distributed Training via Model Partitioning
- 图解大模型训练之:流水线并行(Pipeline Parallelism),以Gpipe为例
- 大模型训练 Pipeline Parallel 流水并行性能分析
- 大模型分布式训练并行技术(三)-流水线并行
- 并行技术
相关文章:
DeepSeek开源周 Day04:从DualPipe聊聊大模型分布式训练的并行策略
DualPipe简介 今天是DeepSeek开源周的第四天,官方开源了一种新型并行计算优化策略——DualPipe。 其实大家阅读过Deepseek-V3技术报告的同学,对这个技术并不陌生。 开源地址:https://github.com/deepseek-ai/DualPipe 核心亮点 DualPipe&…...
RabbitMQ系列(七)基本概念之Channel
RabbitMQ 中的 Channel(信道) 是客户端与 RabbitMQ 服务器通信的虚拟会话通道,其核心作用在于优化资源利用并提升消息处理效率。以下是其核心机制与功能的详细解析: 一、Channel 的核心定义 虚拟通信链路 Channel 是建立在 TCP 连…...
LeetCode 热题 100_有效的括号(69_20_简单_C++)(栈;栈+哈希表(建立左右括号的对应关系))
LeetCode 热题 100_有效的括号(69_20) 题目描述:输入输出样例:题解:解题思路:思路一(栈):思路二(栈哈希表(建立左右括号的对应关系)&a…...
c#-LINQ与lambda表达式学习笔记
https://blog.csdn.net/m0_56259289/article/details/144134122 static void Main(string[] args) //程序入口{int[] arr1 new int[] { 1, 2, 3, 4, 5, 6, 7 };int[] arr2 new int[] { 1, 2, 3, 4, 5, 6, 7 };var query1 from n in arr1 select n;var query2 from a in arr…...
数据库基础二(数据库安装配置)
打开MySQL官网进行安装包的下载 https://www.mysql.com/ 接着找到适用于windows的版本 下载版本 直接点击下载即可 接下来对应的内容分别是: 1:安装所有 MySQL 数据库需要的产品; 2:仅使用 MySQL 数据库的服务器; 3&a…...
Word 插入图片会到文字底下解决方案
一、现象描述 正常情况下,我们插入图片都是这样的。 但有时突然会这样,插入的图片陷于文字底部。 二、网上解决方案 网上有教程说,修改图片布局选项,从嵌入型改成上下型环绕。改完之后确实有用,但是需要手动拖动图片…...
有没有什么免费的AI工具可以帮忙做简单的ppt?
互联网各领域资料分享专区(不定期更新): Sheet 正文 1. 博思AIPPT 特点:专为中文用户设计,支持文本/文件导入生成PPT,内置海量模板和智能排版功能,涵盖商务、教育等多种场景。可一键优化布局、配色,并集成AI绘图功能(文生图/图生图)。适用场景:职场汇报、教育培训、商…...
实战-使用 Playbook 批量部署多台 LAMP 环境
实战-使用 Playbook 批量部署多台 LAMP 环境 playbooks 使用步骤 playbook 是一个不同于使用 ansible 命令行执行方式的模式,功能更强大更灵活。 1、在 playbooks 中定义任务: - name: task description #任务描述信息 module_name: modul…...
CSS—引入方式、选择器、复合选择器、文字控制属性、CSS特性
目录 CSS 1.引入方式 2.选择器 3.复合选择器 4.文字控制属性 5.CSS特性 CSS 层叠样式表,是一种样式表语言,用来描述HTML文档的呈现 书写时一般按照顺序:盒子模型属性—>文字样式—>圆角、阴影等修饰属性 1.引入方式 引入方式方…...
Spring 源码硬核解析系列专题(十):Spring Data JPA 的 ORM 源码解析
在前几期中,我们从 Spring 核心到 Spring Boot、Spring Cloud、Spring Security 和 Spring Batch,逐步揭示了 Spring 生态的多样性。在企业级开发中,数据访问是不可或缺的部分,而 Spring Data JPA 通过简化 JPA(Java Persistence API)操作,成为主流的 ORM 框架。本篇将深…...
爬虫和逆向教程-专栏介绍和目录
文章目录 一、爬虫基础和进阶二、App数据采集三、爬虫项目四、爬虫面试 本专栏为爬虫初学者和进阶开发者量身定制的爬虫和逆向学习园地。为你提供全面而深入的爬虫和逆向技术指导,从入门到精通,从基础理论到高级实战,助你在数据的海洋中畅游&…...
Lua | 每日一练 (4)
💢欢迎来到张胤尘的技术站 💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 Lua | 每日一练 (4)题目参考答案线程和协程调度方式上…...
【折线图 Line】——1
🌟 解锁数据可视化的魔法钥匙 —— pyecharts实战指南 🌟 在这个数据为王的时代,每一次点击、每一次交易、每一份报告背后都隐藏着无尽的故事与洞察。但你是否曾苦恼于如何将这些冰冷的数据转化为直观、吸引人的视觉盛宴? 🔥 欢迎来到《pyecharts图形绘制大师班》 �…...
大白话前端性能优化,常见方法有哪些?
大白话前端性能优化,常见方法有哪些? 咱来唠唠前端性能优化,其实就是想办法让网页打开得更快、用起来更流畅,就跟给汽车做保养让它跑得更顺溜一样。下面详细说说常见的优化方法: 压缩代码 CSS 压缩:CSS …...
IP属地是通过卫星定位的吗?如何保护用户隐私
在数字时代,网络空间成为了人们日常生活不可或缺的一部分。随着社交媒体、在线服务等平台的兴起,用户IP属地信息的重要性日益凸显。然而,关于IP属地是如何确定的,尤其是是否通过卫星定位这一问题,却常常引发公众的疑问…...
Vue3+Node/Express支付宝沙箱支付与确认支付
Vue3Node/Express支付宝沙箱支付与确认支付 支付宝沙箱配置进入沙箱选择自定义密钥 密钥工具下载生成密钥格式转换 自定义密钥设置Express安装依赖项目目录创建alipay.js请求(打开支付)代码router/pay.jsapp.js 前端代码前端封装接口前端调用 实现支付查…...
什么是大语言模型
大语言模型(Large Language Model,LLM)是一种基于深度学习技术的人工智能模型,旨在理解和生成人类语言。以下是大语言模型的详细介绍: 一、基本概念 大语言模型通常包含数百亿甚至数千亿个参数,通过在海量…...
本地部署Embedding模型API服务的实战教程
大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于大模型算法的研究与应用。曾担任百度千帆大模型比赛、BPAA算法大赛评委,编写微软OpenAI考试认证指导手册。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。授权多项发明专利。对机器学…...
postgresql postgis扩展相关
项目 下载地址 http://rpmfind.net/linux/rpm2html/search.php?queryprotobuf(x86-64) Postgis Index of /postgis/source/ proj4 Index of /proj/ geos Index of /geos/ libxml2 ftp://xmlsoft.org/libxml2/ Index of /sources Json-c Releases json-c/json-c G…...
FFmpeg-chapter3-读取视频流(原理篇)
ffmpeg网站:About FFmpeg 1 库介绍 (1)libavutil是一个包含简化编程函数的库,包括随机数生成器、数据结构、数学例程、核心多媒体实用程序等等。 (2)libavcodec是一个包含音频/视频编解码器的解码器和编…...
入门基础项目(SpringBoot+Vue)
文章目录 1. css布局相关2. JS3. Vue 脚手架搭建4. ElementUI4.1 引入ElementUI4.2 首页4.2.1 整体框架4.2.2 Aside-logo4.2.3 Aside-菜单4.2.4 Header-左侧4.2.5 Header-右侧4.2.6 iconfont 自定义图标4.2.7 完整代码 4.3 封装前后端交互工具 axios4.3.1 安装 axios4.3.2 /src…...
C#调用CANoeCLRAdapter.dll文章(二)
一、引言 在上一篇指南中,我们介绍了如何通过C#调用CANoeCLRAdapter.dll实现基础功能,包括COM接口操作、DLL导入和PANL面板集成。本文将进一步探讨高级功能开发,涵盖事件驱动编程、CAPL脚本双向通信以及异步任务处理,帮助开发者构…...
ai大模型自动化测试-TensorFlow Testing 测试模型实例
AI大模型自动化测试是确保模型质量、可靠性和性能的关键环节,以下将从测试流程、测试内容、测试工具及测试挑战与应对几个方面进行详细介绍: 测试流程 测试计划制定 确定测试目标:明确要测试的AI大模型的具体功能、性能、安全性等方面的目标,例如评估模型在特定任务上的准…...
QT——c++界面编程库
非界面编程 QT编译的时候,依赖于 .pro 配置文件: SOURCES: 所有需要参与编译的 .cpp 源文件 HEADERS:所有需要参与编译的.h 头文件 QT:所有需要参与编译的 QT函数库 .pro文件一旦修改,注意需要键盘按 ctrls 才能加载最新的配置文…...
postman--接口测试工具安装和使用教程
postman–接口测试工具 postman是一款支持http协议的接口调试与测试工具,其主要特点就是功能强大,使用简单且易用性好 。 无论是开发人员进行接口调试,还是测试人员做接口测试,postman都是我们的首选工具之一 。 下面先通过一张…...
如何用python画一棵分形树
这个代码会生成一个彩色的分形树图案,可以通过调整draw_tree函数中的参数来改变树的形状和大小 import turtle import random# 递归函数绘制分形树 def draw_tree(branch_len, t):if branch_len > 5:t.color(random.choice(colors))t.pensize(branch_len / 10)t…...
【leetcode】二分查找专题
文章目录 1.二分查找1.题目2.解题思路3. 解题代码 2.在排序数组中查找元素的第一个和最后一个位置1.题目2.算法原理3. 代码 3.x的平方根1.题目2.代码 4.搜索插入位置1.题目2.解题思路3.解题代码 5.山脉数组的索引1.题目2.解题思路3. 代码 6.寻找峰值1.题目2.解题思路3.代码 7. …...
深度学习笔记17-马铃薯病害识别(VGG-16复现)
目录 一、 前期准备 1. 设置GPU 2. 导入数据 二、手动搭建VGG-16模型 1. 搭建模型 三、 训练模型 1. 编写训练函数 3. 编写测试函数 4. 正式训练 四、 结果可视化 1. Loss与Accuracy图 2. 指定图片进行预测 3. 模型评估 前言 🍨 本文为🔗365天深度学习训…...
【LeetCode】131.分割回文串
目录 题目描述输入输出示例及数据范围思路C 实现 题目描述 这道题目来自 LeetCode 131. 分割回文串。 题目描述如下: 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。 输入输出示例及数据…...
【AIGC系列】5:视频生成模型数据处理和预训练流程介绍(Sora、MovieGen、HunyuanVideo)
AIGC系列博文: 【AIGC系列】1:自编码器(AutoEncoder, AE) 【AIGC系列】2:DALLE 2模型介绍(内含扩散模型介绍) 【AIGC系列】3:Stable Diffusion模型原理介绍 【AIGC系列】4࿱…...
基于C++“简单且有效”的“数据库连接池”
前言 数据库连接池在开发中应该是很常用的一个组件,他可以很好的节省连接数据库的时间开销;本文基使用C实现了一个简单的数据库连接池,代码量只有400行左右,但是压力测试效果很好;欢迎收藏 关注,本人将会…...
vulnhub靶场【kioptrix-4】靶机
前言 靶机:kioptrix-4,IP地址为192.168.1.75,后期IP地址为192.168.10.8 攻击:kali,IP地址为192.168.1.16,后期IP地址为192.168.10.6 都采用VMware虚拟机,网卡为桥接模式 这里的靶机…...
科普:ROC AUC与PR AUC
在评价二分类模型性能时,有许多评价指标,其中,有一对是用面积AUC(Area Under the Curve)做评价的:ROC AUC与PR AUC 本文我们对ROC AUC与PR AUC进行多维度对比分析: 一、定义与核心原理 维度RO…...
服务器IPMI用户名、密码批量检查
背景 大规模服务器部署的时候,少不了较多的网管和监测平台,这些平台会去监控服务器的性能、硬件等指标参数,为了便于管理和控制,则需要给服务器IPMI带外管理添加较多的用户,这就需要对较多的服务器检查所对应的IPMI用…...
51单片机中reg52.h与regx52.h在进行位操作时的不同
reg52.h中不能使用例如 P2_0;这样的定义 而只能使用 P2^0;这样的定义 但是都不可以对位进行直接赋值操作; 而 regx52.h中可以使用 P2_0和P2^0;但是只有使用下划线的才可以对位进行赋值操作 例如P2_0 1; 但不可以是P2^0 1; 在 C 语言中,…...
Apollo Cyber 学习笔记
目录 0 Introduction What Why Advantage 1 Example 2 Concept 3 Flow Chart 4 Module 4.1 Transport 4.1.1 Share Memory 4.1.1.1 Segment 4.1.1.1.1 State 4.1.1.1.2 Block 4.1.1.1.3 Common 4.1.1.2 Notifier 4.1.1.2.1 ConditionNotifier 4.1.1.2.2 Multi…...
【Electron入门】进程环境和隔离
目录 一、主进程和渲染进程 1、主进程(main) 2、渲染进程(renderer) 二、预加载脚本 三、沙盒化 为单个进程禁用沙盒 全局启用沙盒 四、环境访问权限控制:contextIsolation和nodeIntegration 1、contextIsola…...
拉链表介绍
拉链表 是处理 缓慢变化维(SCD) 的一种常用方法,特别适用于需要保留历史记录的场景。以下是拉链表的详细说明及实现方法: 1. 什么是拉链表? 拉链表是一种用于记录维度数据历史变化的表结构,通过 开始时间 …...
Spring Boot 日志配置与常见问题解析(详解)
目录 Spring Boot 日志配置与常见问题解析引言什么是日志?日志的重要性日志使用打印日志 日志框架介绍日志格式的说明⽇志级别日志级别的分类日志级别的使用 Spring Boot 日志配置1. 设置日志级别和格式2. 配置日志收集器3. 查看和分析日志4.日志的持久化5.设置日志…...
-bash: lsof: command not found
一、问题说明 执行如下命令时报错: # lsof |grep deleted > deleted_file -bash: lsof: command not found二、处理方法 # yum -y install lsof安装完成后可成功执行上面的命令。...
PC 端连接安卓手机恢复各类数据:安装、操作步骤与实用指南
软件介绍 这款用于恢复安卓手机数据的软件,虽运行在 PC 端,却专为安卓手机数据恢复打造,使用时得用数据线把手机和电脑连接起来。它的功能相当强大,能帮你找回安卓手机里已删除的短信、联系人、通话记录、文档,还有照…...
ES、OAS、ERP、电子政务、企业信息化(高软35)
系列文章目录 ES、OAS、ERP、电子政务、企业信息化 文章目录 系列文章目录前言一、专家系统(ES)二、办公自动化系统(OAS)三、企业资源规划(ERP)四、典型信息系统架构模型1.政府信息化和电子政务2.企业信息…...
android智能指针android::sp使用介绍
android::sp 是 Android 中的智能指针(Smart Pointer)的实现,用于管理对象的生命周期,避免手动管理内存泄漏等问题。它是 Android libutils 库中重要的一部分,常用于管理继承自 android::RefBase 的对象。 与标准库中…...
推荐一款最新开源,基于AI人工智能UI自动化测试工具!支持自然语言编写脚本!
随着互联网技术的飞速发展,Web应用越来越普及,前端页面也越来越复杂。为了确保产品质量,UI自动化测试成为了开发过程中不可或缺的一环。然而,传统的UI自动化测试工具往往存在学习成本高、维护困难等问题。特别是UI 自动化脚本里往…...
DeepSeek05-大模型WebUI
一、说明: 将DeepSeek部署到前台Web界面的方法主要有以下几种推荐方案,涵盖开源工具、第三方客户端及特定场景适配方案: Open WebUIChatbox AICherry StudioSillyTavern 二、Open WebUI 安装配置教程 特点:Open WebUI 是一个开…...
自然语言处理NLP入门 -- 第八节OpenAI GPT 在 NLP 任务中的应用
在前面的学习中,我们已经了解了如何使用一些经典的方法和模型来处理自然语言任务,如文本分类、命名实体识别等。但当我们需要更强的语言生成能力时,往往会求助于更先进的预训练语言模型。OpenAI 旗下的 GPT 系列模型(如 GPT-3、GP…...
FFmpeg av_read_frame 和iOS系统提供的 AVAudioRecorder 实现音频录制的区别
1. 第一种方式:使用 FFmpeg 的 av_read_frame 特点 底层实现:基于 FFmpeg,这是一个强大的多媒体处理库,直接操作音频流。灵活性:非常灵活,可以处理多种音频格式、编解码器和输入设备。复杂性:需要手动管理音频流、数据包(AVPacket)、内存释放等,代码复杂度较高。跨平…...
【区块链】深入理解区块链中的 Gas 机制
🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 💫个人格言: "如无必要,勿增实体" 文章目录 深入理解区块链中的 Gas 机制一、Gas 的基本概念1.1 为什么需要 Gas?…...
2020 年英语(一)考研真题 笔记(更新中)
Section I Use of English(完型填空) 原题 Directions:Read the following text. Choose the best word (s) for each numbered blank and mark A, B, C or D on the ANSWER SHEET. (10 points) Even if families are less likely to si…...
mamba_ssm和causal-conv1d详细安装教程
1.前言 Mamba是近年来在深度学习领域出现的一种新型结构,特别是在处理长序列数据方面表现优异。在本文中,我将介绍如何在 Linux 系统上安装并配置 mamba_ssm 虚拟环境。由于官方指定mamba_ssm适用于 PyTorch 版本高于 1.12 且 CUDA 版本大于 11.6 的环境…...