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

PyTorch DDP 跨节点通信的底层机制

我们已经知道 torch.nn.parallel.DistributedDataParallel (DDP) 是 PyTorch 中实现高性能分布式训练的利器,它通过高效的梯度同步机制,让多个 GPU 甚至多台机器协同工作,大大加速模型训练。

当我们的训练扩展到多个节点(不同的物理机器)时,这些分布在网络各处的 GPU 进程是如何找到彼此、建立连接,并高效地交换梯度信息的?仅仅知道 DDP 使用 NCCL 进行 AllReduce 是不够的,理解其底层的通信机制对于优化性能、排查网络瓶颈以及构建更健壮的分布式系统至关重要。

一、 宏观视角:分布式训练的“握手”与“协作”

想象一下,你要组织一个分布在不同城市(节点)的团队(GPU 进程)共同完成一个大型项目(模型训练)。首先,你需要让大家互相认识并建立联系方式(初始化/Rendezvous),然后需要一套高效的协作流程来同步进度和成果(梯度同步/AllReduce)。

DDP 的跨节点通信也遵循类似的模式:

  1. 启动与发现 (Rendezvous): 所有参与训练的进程(无论在哪个节点上)需要通过一个约定的“集合点”来发现彼此,交换必要的连接信息(如 IP 地址、端口号),并确定每个进程的全局唯一身份(Rank)和总参与者数量(World Size)。
  2. 建立通信链路 (Backend Initialization): 一旦互相认识,就需要利用底层的通信库(通常是 NCCL)在所有进程(GPU)之间建立实际的数据传输通道。这个过程需要探测网络硬件、选择最优通信协议和算法。
  3. 执行集合通信 (Collective Operations): 在训练过程中(主要是梯度同步),进程们利用建立好的通信链路,通过 NCCL 执行高效的集合通信操作(如 AllReduce),交换和处理数据。

二、 寻找彼此:Rendezvous 机制详解

这是分布式系统启动的第一步,也是至关重要的一步。PyTorch 的 torch.distributed 模块提供了多种 Rendezvous 方式,最常用的是基于 TCP 的方法,通常由 torch.distributed.init_process_group 函数在后台处理:

  1. 约定集合点:

    • 通常需要指定一个 主节点 (Master Node) 的 IP 地址(通过环境变量 MASTER_ADDR 设置)和一个未被占用的端口号(通过环境变量 MASTER_PORT 设置)。
    • 所有参与训练的进程(包括主节点自己启动的进程)都需要知道这两个信息。
  2. Rank 0 的特殊角色:

    • 全局 Rank 为 0 的进程(通常位于主节点上)扮演“协调者”的角色。它会监听指定的 MASTER_PORT
  3. 其他进程“报到”:

    • 其他所有 Rank 的进程会尝试连接到 MASTER_ADDR:MASTER_PORT
  4. 信息交换:

    • 当所有进程(数量由 WORLD_SIZE 环境变量指定)都成功连接到 Rank 0 后,Rank 0 会收集所有进程的连接信息(比如它们各自用于后续通信的 IP 地址和临时端口)。
    • 然后,Rank 0 会将这个包含所有进程连接信息的“通讯录”广播给每一个进程。
  5. 建立点对点连接 (或准备好集合通信):

    • 拿到“通讯录”后,每个进程就知道了其他所有进程的网络地址。此时,底层的通信后端(如 Gloo 或 NCCL 使用的引导机制)就可以在需要时建立进程间的点对点连接,或者为后续的集合通信做好准备。

torchrun 的作用: torchrun(或旧版的 torch.distributed.launch)极大地简化了这个过程。你只需要提供 --nnodes, --nproc_per_node, --rdzv_id, --rdzv_backend, --rdzv_endpoint 等参数,torchrun 会自动处理环境变量的设置、主节点的选举以及 Rendezvous 的过程,开发者无需手动设置 MASTER_ADDR/PORT 等。其中 --rdzv_endpoint 就扮演了那个“集合点”地址的角色。c10d (Collective Operations 10 Distributed) 是 PyTorch 底层用于实现 Rendezvous 和抽象不同后端的库。

三、 NCCL 接管:跨节点通信链路的建立

当 Rendezvous 完成,所有进程互相“认识”之后,init_process_group 就会调用我们指定的后端(这里是 NCCL)进行初始化:

  1. NCCL Unique ID 广播: 与单节点类似,通常由 Rank 0 生成一个 ncclUniqueId。这个 ID 需要通过 PyTorch 的分布式后端(c10d)提供的通信机制(可能基于 TCP Socket)广播给所有其他进程。

  2. ncclCommInitRank 调用: 每个进程使用接收到的 ncclUniqueId 和全局的 world_size、自己的 rank 来调用 ncclCommInitRank

  3. NCCL 的跨节点魔法: 这是 NCCL 发挥其网络能力的关键时刻:

    • 网络接口探测: NCCL 会探测本机可用的网络接口(如 eth0, ib0 等)。你可以通过环境变量 NCCL_SOCKET_IFNAME (用于 TCP) 或 NCCL_IB_HCA (用于 InfiniBand/RoCE) 来指定使用哪个接口。
    • 节点间信息交换: NCCL 进程之间需要交换更详细的网络信息,比如选定的网络接口的 IP 地址、InfiniBand 的 GID/LID、用于 RDMA 的 QPN (Queue Pair Number) 等。这些信息的交换可能仍然借助 PyTorch c10d 提供的初始 TCP 连接,或者 NCCL 自己建立临时的 Socket 连接来完成。
    • 拓扑感知与算法选择: NCCL 会综合考虑节点内(NVLink/PCIe)和节点间(网络类型、带宽、延迟)的拓扑结构,选择最优的集合通信算法(如 Ring, Tree, 或混合算法)和传输协议。
    • 建立连接:
      • 基于 Socket: 如果使用 TCP/IP Sockets,NCCL 会在需要通信的节点之间建立标准的 TCP 连接。
      • 基于 RDMA (InfiniBand/RoCE): 这是高性能的关键。NCCL 会利用 InfiniBand Verbs API 或 RoCE 相关接口:
        • 创建和配置队列对 (Queue Pairs, QPs)。
        • 注册用于 RDMA 操作的 GPU 内存区域 (Memory Regions, MRs)。这需要 GPU 驱动、网卡驱动和 NCCL 的协同工作。
        • 交换 QPN 和 MR 信息,完成 RDMA 连接的建立。
      • GPUDirect RDMA: 如果硬件和驱动支持,NCCL 会优先使用 GPUDirect RDMA。这意味着网卡 (NIC) 可以直接读写远程节点上 GPU 的显存,完全绕过两边节点的 CPU 和主内存,极大地降低延迟、提高带宽利用率。
  4. 通信域 (ncclComm_t) 创建完成: 当所有节点间的通信路径根据选定的算法和协议建立好之后,ncclCommInitRank 返回,每个进程获得一个可用的 NCCL 通信域句柄。

四、 数据高速公路:NCCL 如何执行跨节点 AllReduce

现在,通信链路已经建立。当 DDP 在 loss.backward() 中触发梯度同步时,NCCL 如何执行跨节点的 AllReduce 呢?

  1. PyTorch DDP 调用 NCCL: DDP 后端将梯度数据(位于各 GPU 显存中)、数据量、数据类型、操作类型 (ncclSum)、通信域 (comm) 和 CUDA Stream 等信息传递给 ncclAllReduce 函数。

  2. NCCL 选择最优路径: 基于初始化时确定的拓扑和算法(例如,选择了跨节点的 Ring AllReduce):

  3. 执行 Ring AllReduce (跨节点示例):

    • 数据分块: 梯度数据被分成多个块 (Chunks)。
    • Scatter-Reduce 阶段 (跨节点):
      • GPU 0 将自己的第 0 块数据通过网络(可能是 RDMA)发送给节点 1 上的 GPU 1。
      • 同时,GPU 0 从节点 N-1 上的 GPU N-1 接收第 (N-1) 块数据。
      • GPU 0 将接收到的数据与自己本地对应的累加值进行求和。
      • 所有 GPU 同时进行类似的操作,数据块沿着跨节点的环形路径流动并进行累加。
    • AllGather 阶段 (跨节点):
      • 当 Scatter-Reduce 完成后,每个 GPU 持有最终总和的一部分。
      • 再次进行环形传递,这次是传递最终结果块,直到每个 GPU 都拥有完整的、全局求和后的梯度。
    • 数据传输细节:
      • Socket: 数据需要从 GPU 显存拷贝到 CPU 内存,然后通过操作系统 TCP/IP 协议栈发送到远程节点,远程节点接收后拷贝到 CPU 内存,最后再拷贝回目标 GPU 显存。(GPU -> CPU -> NIC -> Network -> NIC -> CPU -> GPU) - 效率较低。
      • RDMA (无 GPUDirect): 数据从 GPU 显存拷贝到 CPU 内存(或者固定的 Host Memory),然后网卡直接将数据从 CPU 内存传输到远程节点的 CPU 内存,最后拷贝回目标 GPU 显存。(GPU -> CPU(Pinned) -> NIC -> Network -> NIC -> CPU(Pinned) -> GPU) - 减少了 CPU 开销,但仍有拷贝。
      • GPUDirect RDMA: 网卡直接读取源 GPU 显存,通过网络发送,远程网卡直接写入目标 GPU 显存。(GPU -> NIC -> Network -> NIC -> GPU) - 几乎完全绕过 CPU 和主内存,延迟最低,带宽最高。这是 NCCL 在支持的硬件上实现极致性能的关键。
  4. 操作完成与 DDP 后处理: NCCL 操作在指定的 CUDA Stream 上异步完成。完成后,DDP 的 Autograd Hook 获取到全局求和的梯度,执行除以 world_size 的操作,得到平均梯度。

五、 硬件的角色

底层通信的效率严重依赖硬件:

  • 网络接口卡 (NICs): InfiniBand 卡 (如 Mellanox/NVIDIA ConnectX 系列) 或支持 RoCE 的高速以太网卡是实现 RDMA 的基础。
  • 交换机 (Switches): 连接各个节点的网络设备。高速、低延迟的交换机(如 InfiniBand 交换机)对整体性能至关重要。交换机的拓扑结构(如 Fat-Tree)也会影响通信效率。
  • GPU 与 PCIe: GPU 需要通过 PCIe 总线与 NIC 通信。支持 GPUDirect RDMA 的 GPU 和主板芯片组能实现更高效的数据路径。
  • 节点内互联 (NVLink): 对于同一节点内的多个 GPU,NVLink 提供了远超 PCIe 的带宽和低延迟,NCCL 会优先利用它进行节点内的通信,即使是在跨节点的操作中(例如,一个节点上的 GPU 通过 NVLink 快速聚合梯度,然后由一个 GPU 负责跨节点通信)。

六、 总结:DDP 跨节点通信的艺术

PyTorch DDP 的跨节点通信是一个精心设计的、分层协作的过程:

  1. PyTorch torch.distributed (c10d): 负责顶层的进程发现与 Rendezvous,使用 TCP/IP 建立初始联系,交换必要的网络地址信息。
  2. NCCL (或其他后端): 接管后续的初始化,探测硬件拓扑建立高效的通信链路(优先使用 RDMA/GPUDirect RDMA),并根据拓扑选择最优的集合通信算法(如 Ring/Tree)。
  3. DDP 包装器: 在训练循环中,通过 Autograd Hooks 触发 NCCL 的 AllReduce 操作,并利用梯度分桶计算通信重叠来优化性能。
  4. 硬件基础: 高速网卡、交换机、支持 GPUDirect RDMA 的 GPU 和良好的节点内互联(NVLink)是实现极致性能的物理保障

理解了这一系列从应用层到底层硬件的协作流程,你就能更好地配置你的分布式训练环境,诊断潜在的通信瓶颈(比如检查网络配置、NCCL 环境变量、硬件拓扑),并对 DDP 的惊人效率有更深的体会。这不再是魔法,而是一套设计精良、充分利用现代计算和网络技术的工程杰作。

相关文章:

PyTorch DDP 跨节点通信的底层机制

我们已经知道 torch.nn.parallel.DistributedDataParallel (DDP) 是 PyTorch 中实现高性能分布式训练的利器,它通过高效的梯度同步机制,让多个 GPU 甚至多台机器协同工作,大大加速模型训练。 当我们的训练扩展到多个节点(不同的物…...

Prompt工程:大模型的「精准导航系统」

在Elasticsearch中,DSL通过精确的查询语法帮助开发者从海量数据中定位目标文档;而在大模型应用中,Prompt就是用户的「意图导航仪」,通过结构化的语言模板引导模型生成符合业务需求的答案。两者的核心逻辑相似——通过精准的指令设…...

25.4.22华为--算法真题整理(2025年4月22日)

120.三角形最小路径和(120.三角形最小路径和) 题目分析: 给定一个三角形,用二维列表triangle表示,现在约定:自顶向下移动,每一步只能移动到下一行中相邻的节点上,即当前行的下标为…...

C语言高频面试题——指针函数和函数指针的区别

在 C 语言中,指针函数 和 函数指针 是两个容易混淆的概念,但它们的功能和用途完全不同。以下是详细的对比分析,帮助你彻底理解它们的区别。 1. 指针函数(Function Returning a Pointer) 定义 指针函数 是一个返回值为…...

MQTTClient_message 源码深度解析与架构设计

一、结构体内存布局与版本控制机制 #mermaid-svg-i9W8883mELYm6HUj {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-i9W8883mELYm6HUj .error-icon{fill:#552222;}#mermaid-svg-i9W8883mELYm6HUj .error-text{fill:#…...

4.21—4.22学习总结 JavaWeb:HTML-CSS

Web:能够通过浏览器访问到的网站。 Web标准: HTML: vscode中进行注释的快捷键为ctrl斜线/ h1的字体最大,依次递减,只存在h1—h6。 超链接: 设置字体颜色: 方式三写一个css文件,将方…...

STM32的定时器输出PWM时,死区时间(DTR)如何计算

在 STM32F429(以及所有 STM32F4 “高级定时器”)中,死区时间由 TIMx_BDTR 寄存器的 8 位 “Dead‑Time Generator” 字段 DTG[7:0] 来配置。其计算分三步: 计算死区时钟周期 tDTS TIM1 时钟源为 APB2 定时器时钟(PCL…...

4.LinkedList的模拟实现:

LinkedList的底层是一个不带头的双向链表。 不带头双向链表中的每一个节点有三个域:值域,上一个节点的域,下一个节点的域。 不带头双向链表的实现: public class Mylinkdelist{//定义一个内部类(节点)stat…...

使用PyTorch构建神经网络笔记

专有名词 Batch Size 在深度学习中,批大小(Batch Size) 是指每次前向传播和反向传播时使用的样本数量。它是训练神经网络时的一个关键超参数,直接影响训练速度、内存占用和模型性能。 (1) 计算梯度 在训练时,模型通过…...

麒麟系统网络连接问题排查

麒麟系统网络连接有红色叹号,不能上外网 了。 首先执行 ping -c4 8.8.8.8 和 nc -zv 8.8.8.8 53,如果 都能正常通信,说明你的网络可以访问公共 DNS 服务器(如 Google DNS 8.8.8.8),但域名解析仍然失败,可能是 DNS 解析配置问题 或 系统 DNS 缓存/代理干扰。以下是进一步…...

python高级特性01

装饰器 基本语法 在不改变原函数的基础上,新增/修改一些功能 在被装饰函数/类前使用:decorator_name 装饰器接收一个函数返回一个新函数 def decorator_name(func):# 装饰器的操作...def wrapper(*args, **kwargs):# 前置操作...result func()# 后置…...

shared_ptr八股收集 C++

(1)、具体讲一下shared_ptr自动管理内存的原理/引用计数的具体原理/shared_ptr引用计数什么时候会增加,什么时候会减少? 在shared_ptr的内部维护了⼀个计数器,来跟踪有多少个shared_ptr对象指向了某⼀个资源。当计数器…...

【gpt生成-其二】以go语言为例,详细讲解 并发模型:线程/协程/ Actor 实现

Go语言并发模型详解:线程、协程与Actor实现 ​​1. 线程模型​​ ​​概念​​ 线程是操作系统调度的最小单位,每个线程拥有独立的栈和寄存器上下文,但共享进程的内存空间。线程的创建、切换和同步需要较高的系统开销。 ​​Go中的实现​​…...

nodejs创建文件

环境要求:nodejs 运行命令: node createComponent.js各文件内容: createComponent.js /** 功能概述:* 1. 通过命令行交互,用户输入组件名称,选择模板类型。* 2. 根据用户输入生成对应的Vue组件、Service…...

三餐四季、灯火阑珊

2025年4月22日,15~28℃,挺好的 待办: 教学技能大赛教案(2025年4月24日,校赛,小组合作,其他成员给力,暂不影响校赛进度,搁置) 教学技能大赛PPT(202…...

HTTP状态码有哪些常见的类型?

HTTP 状态码用于表示服务器对客户端请求的响应状态,常见的 HTTP 状态码可以分为以下几类: 一、1xx:信息提示 状态码以 1 开头,表示请求已接收,客户端应继续其请求。常见的状态码有: • 100 Continue&…...

01-STM32基本知识点和keil5的安装

一、微控制器: 1、微控制器也被称为MCU(国内称为单片机),微控制器集成了处理器、内存、输入/输出接口等多种功能模块,能够独立完成特定的控制任务。它主要用于对设备或系统的控制和监测,MCU通常是一个高度…...

前端如何优雅地对接后端

作为一名前端开发者,与后端对接是我们日常工作中不可避免的一部分。从API设计的理解到错误处理的优雅实现,前端需要的不只是调用接口的代码,更是一种协作的艺术。本文将从Vue 3项目出发,分享如何与后端高效协作,减少联…...

Centos虚拟机远程连接缓慢

文章目录 Centos虚拟机远程连接缓慢1. 问题:SSH远程连接卡顿现象2. 原因:SSH服务端DNS检测机制3. 解决方案:禁用DNS检测与性能调优3.1 核心修复步骤3.2 辅助优化措施 4. 扩展认识:SSH协议的核心机制4.1 SSH工作原理4.2 关键配置文…...

Centos 、Linux 基础运维命令

查看系统IP ifconfig 巡检常用 显示磁盘空间使用情况 df -h 配置主机名查称看主机名称 hostname 修改主机名称 打开修改的配置文件 vim /etc/sysconfig/network 防火墙 查看防火墙状态 service iptables status 临时关闭防火墙:关机重启后防火墙还会开启 …...

算力网络有关论文自用笔记(2)

MADRLOM: A Computation offloading mechanism for software-defined cloud-edge computing power network 本质上还是计算卸载,概念套壳 主要工作 一种由软件定义的云边缘计算电力网络体系结构,包括多个用户设备、多个边缘节点和一个云数据中心。用户…...

基于外部中中断机制,实现以下功能: 1.按键1,按下和释放后,点亮LED 2.按键2,按下和释放后,熄灭LED 3.按键3,按下和释放后,使得LED闪烁

题目: 参照外部中断的原理和代码示例,再结合之前已经实现的按键切换LED状态的实验,用外部中断改进其实现。 请自行参考文档《中断》当中,有关按键切换LED状态的内容, 自行连接电路图,基于外部中断机制,实现以下功能&am…...

Go语言和Python 3的协程对比

Go语言和Python 3都支持协程(concurrent coroutines),但它们的实现机制、使用方式、调度方式和性能表现差异很大。下面是对比分析: 一、基本概念对比 特性Go 协程(goroutine)Python3 协程(asyn…...

量子计算在密码学中的应用与挑战:重塑信息安全的未来

在当今数字化时代,信息安全已成为全球关注的焦点。随着量子计算技术的飞速发展,密码学领域正面临着前所未有的机遇与挑战。量子计算的强大计算能力为密码学带来了新的应用场景,同时也对传统密码体系构成了潜在威胁。本文将深入探讨量子计算在…...

java知识点

一、ArrayList 的扩容 1.ArrayList 的扩容机制是将新容量计算为原容量的 15倍,即 oldcapacity(oldcapacity >>1)。这个操作将新容量设置为当前容量的 1.5 倍。 2.在 ArrayList 扩容时,会使用 Arrays.copyof()方法来复制原数组中的元素到新数组中&a…...

工厂模式:工厂方法模式 和 抽象工厂模式

工厂方法模式&#xff1a;优化&#xff0c;工厂类也分子类和父类 流程&#xff1a; 实例&#xff1a; #include <iostream> using namespace std; /*抽象产品类 TV(电视机类)*/ class TV { public: virtual void Show() 0; virtual ~TV();//声明析构函数为虚函数&…...

遨游通讯发布国产化旗舰三防手机AORO AU1:以自主可控重塑工业安全

在全球产业链加速重构的背景下&#xff0c;国产化技术突破已成为工业领域高质量发展的核心驱动力。作为专精特新中小企业&#xff0c;遨游通讯始终以“让世界更安全、更高效、更简单”为使命&#xff0c;深耕“危、急、特”场景智能通信设备的研发。近日&#xff0c;遨游通讯正…...

全波暗室和半波暗室的区别

什么是微波暗室&#xff1f;其作用是什么&#xff1a; 微波暗室又叫吸波室、电波暗室&#xff0c;一般是指由吸波材料和金属屏蔽体组成的特殊房间&#xff0c;该房间可有效防止电磁波的多次反射、隔绝外界电磁波的干扰&#xff0c;提供一个稳定的电磁环境&#xff0c;(高级点的…...

Qt 下载的地址集合

Qt 下载离线安装包 download.qt.io/archive/qt/5.14/5.14.2/ Qt 6 安装下载在线安装包 Index of /qt/official_releases/online_installers/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror...

08_Docker Portainer可视化管理

简介&#xff1a; Portainer 是一个轻量级的、基于 Web 的 Docker 管理用户界面。它允许用户轻松管理 Docker 环境&#xff0c;包括 Docker 主机、容器、镜像、网络等。 多主机管理&#xff0c;Portainer 支持通过 agent 的方式管理多台 Docker 主机。无论是企业级大规模的 D…...

【产品经理从0到1】用户研究和需求分析

用户角色 定义 用户角色 user personal&#xff0c;从用户群体中抽象出来的典型用户&#xff0c;一般 会包含&#xff1a; 1、个人基本信息&#xff1b; 2、家庭、工作、生活环境描述&#xff1b; 3、与产品使用相关的具体情境&#xff0c;用户目标或产品使用行为描述等。 特…...

神经网络 “疑难杂症” 破解指南:梯度消失与爆炸全攻略(六)

引言 在神经网络的发展历程中&#xff0c;梯度消失和梯度爆炸如同两座难以翻越的大山&#xff0c;阻碍着深层神经网络发挥其强大的潜力。尤其是在处理复杂任务时&#xff0c;这两个问题可能导致模型训练陷入困境&#xff0c;无法达到预期的效果。本文将深入探讨梯度消失和梯度…...

深入理解无监督学习:探索数据的潜在结构

&#x1f4cc; 友情提示&#xff1a; 本文内容由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;创作平台的gpt-4o-mini模型生成&#xff0c;旨在提供技术参考与灵感启发。文中观点或代码示例需结合实际情况验证&#xff0c;建议读者通过官方文档或实践进一步确认其准…...

Java实例化对象都有几种方式

在 Java 中&#xff0c;实例化对象的方式有多种&#xff0c;具体取决于场景需求和设计模式。以下是 ​7 种核心对象实例化方式及其原理、适用场景与代码示例&#xff1a; 1. ​new 关键字&#xff08;直接构造&#xff09;​ ​原理​&#xff1a;通过调用类的构造函数直接创建…...

数据结构:顺序表的实现

顺序表是用一段物理地址连续的存储单元依次储存数据的线性结构&#xff0c;一般情况下采用数组储存&#xff0c;在数组上完成数据的增删减改。 这里我们定义一个MyArrayList类&#xff0c;用来实现顺序表的功能&#xff1a; public class MyArrayList{int[] array;int usedsi…...

# 06_Elastic Stack 从入门到实践(六)

06_Elastic Stack 从入门到实践(六) 一、课程介绍 1、课程介绍 2、Nginx日志分析系统 3、Filebeat入门学习 4、Metricbeat入门学习 5、Kibana入门学习 6、Logstash入门学习 7、综合练习 二、Nginx 日志分析系统需求分析 1、业务需求 Nginx是一款非常优秀的web服务…...

[Android]豆包爱学v4.5.0小学到研究生 题目Ai解析

拍照解析答案 【应用名称】豆包爱学 【应用版本】4.5.0 【软件大小】95mb 【适用平台】安卓 【应用简介】豆包爱学&#xff0c;一般又称河马爱学教育平台app,河马爱学。 关于学习&#xff0c;你可能也需要一个“豆包爱学”这样的AI伙伴&#xff0c;它将为你提供全方位的学习帮助…...

重装系统后的自用包

装驱动 sudo apt update sudo apt upgrade sudo apt install nvidia-driver-535搜狗输入法&#xff1a; https://shurufa.sogou.com/linux/guideClash verge&#xff1a; ubuntu20 下载1.7.7版本的 https://github.com/clash-verge-rev/clash-verge-rev/releases/tag/v1.7.7…...

4.22tx视频后台开发一面

总时长大概在一个小时&#xff0c;主要提问C、操作系统、计网以及数据库等方面&#xff0c;最后两个算法编程题。 一上来先介绍项目 Linux下的mybash命令处理器和内存池 mybash可以再总结归纳一下&#xff0c;一上来有点紧张没有条理 内存池是用边界标识法写的&#xff0c;…...

如何Ubuntu 22.04.5 LTS 64 位 操作系统部署运行SLAM3! 详细流程

以下是在本地部署运行 ORB-SLAM3 的详细步骤&#xff0c;基于官方 README.md 和最佳实践整理&#xff0c;适用于 Ubuntu 16.04/18.04/20.04/22.04 系统&#xff1a; 一、系统要求与依赖项安装 1. 基础系统要求 操作系统&#xff1a;Ubuntu 16.04/18.04/20.04/22.04&#xff…...

Ubuntu 上安装 Conda

在 Ubuntu 上安装 Conda&#xff08;Anaconda 或 Miniconda&#xff09;的完整步骤如下&#xff1a; --- **方法1&#xff1a;安装 Miniconda&#xff08;推荐&#xff09;** Miniconda 是 Anaconda 的精简版&#xff0c;只包含基本组件。 **1. 下载安装脚本** bash # 下载最…...

初级云计算运维工程师学习二

全面解析云计算服务模式&#xff1a;公有云、私有云、混合云及IaaS/PaaS/SaaS/DaaS 云计算部署模式&#xff1a;三种主要形式 1. 公有云&#xff08;Public Cloud&#xff09; 定义&#xff1a;云端资源开放给社会公众使用&#xff0c;由第三方云服务提供商通过互联网交付。 …...

物联网蓬勃发展是助力楼宇自控技术迈向成熟的关键

在当今数字化时代&#xff0c;物联网&#xff08;IoT&#xff09;正以前所未有的速度蓬勃发展&#xff0c;其影响力已广泛渗透到各个领域&#xff0c;楼宇自控技术便是其中之一。从本质上讲&#xff0c;楼宇自控旨在实现对建筑物内各类机电设备的智能化管理与控制&#xff0c;为…...

数字孪生技术:企业数字化转型的助推器

在当今环境下&#xff0c;企业面临的挑战不断增加。从可持续发展目标的要求到员工数字技能的提升&#xff0c;转型的呼声越来越高。然而&#xff0c;即使是经验丰富的领导者&#xff0c;也很难在这种前所未有的商业环境下实现转型。企业如何在满足可持续发展目标的同时保持盈利…...

ESM 内功心法:化解 require 中的夺命一击!

前言 传闻在JavaScript与TypeScript武林中,曾有两大绝世心法:CommonJS与ESM。两派高手比肩而立,各自称霸一方,江湖一度风平浪静。 岂料,时局突变。ESM逐步修成阳春白雪之姿,登堂入室,成为主流正统。CommonJS则渐入下风,功力不济,逐渐退出主舞台。 话说某日,一位前…...

安全调度系统:安全管理的智能中枢

安全调度系统作为安全管理体系的核心枢纽&#xff0c;正在深刻改变着传统安全管理的模式和效能。这个集成了先进信息技术的智能化平台&#xff0c;通过实时监控、智能分析和快速响应三大核心功能&#xff0c;构建起全方位、多层次的安全防护网络&#xff0c;成为各类场所安全管…...

Python爬虫从入门到实战详细版教程Char01:爬虫基础与核心技术

1.1 什么是网络爬虫? 1.1.1 定义与分类 网络爬虫:互联网世界的“信息捕手” 网络爬虫(Web Crawler),又称网络蜘蛛或网络机器人,是一种通过预设规则自动访问网页、提取数据的程序系统。从技术视角看,其核心任务是通过模拟浏览器行为向目标服务器发起请求,解析网页内容…...

jsconfig.json文件的作用

jsconfig.json文件的作用 ​ 为什么今天会谈到这个呢&#xff1f;有这么一个场景&#xff1a;我们每次开发项目时都会给路径配置别名&#xff0c;配完别名之后可以简化我们的开发&#xff0c;但是随之而来的就有一个问题&#xff0c;一般来说&#xff0c;当我们使用相对路径时…...

Python线程全面详解:从基础概念到高级应用

一、线程基础概念 1.1 进程与线程的关系 进程是操作系统资源分配的基本单位&#xff0c;它是程序的一次执行过程。当我们将程序加载到内存中运行时&#xff0c;系统会为它分配CPU、内存、文件句柄等资源&#xff0c;这时就形成了一个进程。 线程是CPU调度的基本单位&#xf…...

学习模拟电路

学习模拟电路需要掌握以下几个关键领域的知识和技能&#xff0c;涵盖基础理论、器件特性、电路设计、分析工具以及实践应用&#xff1a; 1. 基础理论与概念 电路基本定律&#xff1a;欧姆定律、基尔霍夫电压定律&#xff08;KVL&#xff09;和电流定律&#xff08;KCL&#xf…...