GPU 进阶笔记(一):高性能 GPU 服务器硬件拓扑与集群组网
记录一些平时接触到的 GPU 知识。由于是笔记而非教程,因此内容不求连贯,有基础的同学可作查漏补缺之用
- 1 术语与基础
- 1.1 PCIe 交换芯片
- 1.2 NVLink
- 定义
- 演进:1/2/3/4 代
- 监控
- 1.3 NVSwitch
- 1.4 NVLink Switch
- 1.5 HBM (High Bandwidth Memory)
- 由来
- 演进:HBM 1/2/2e/3/3e
- 1.6 带宽单位
- 2 典型 8*A100/8*A800 主机
- 2.1 主机内拓扑:2-2-4-6-8-8
- 存储网卡
- NVSwitch fabric:intra-node full-mesh
- 用 nvidia-smi topo 查看拓扑
- 1.2 GPU 训练集群组网:IDC GPU fabirc
- 计算网络
- 存储网络
- RoCE vs. InfiniBand
- 1.3 数据链路带宽瓶颈分析
- 2.1 主机内拓扑:2-2-4-6-8-8
- 3 典型 8*H100/8*H800 主机
- 3.1 H100 芯片 layout
- 3.2 主机内硬件拓扑
- 3.3 组网
- 4 典型 4*L40S/8*L40S 主机
- 4.1 L40S vs A100 配置及特点对比
- 4.2 L40S 与 A100 性能对比
- 4.3 L40S 攒机
- 推荐架构:2-2-4
- 不推荐架构:2-2-8
- 4.4 组网
- 4.5 数据链路带宽瓶颈分析
- 4.6 测试注意事项
- 5 典型 8*H20 GPU 服务器(2024 更新)
- 5.1 显存:8*96GB
- 5.2 卡间互联:NVLINK x18 lanes = 900GB/s
- 5.3 网络
- 5.4 训练性能:8*H20 vs 8*A800
- 参考资料
1 术语与基础
大模型训练一般都是用单机 8 卡 GPU 主机组成集群,机型包括 8*{A100,A800,H100,H800}
可能还会用最近即将上市的 {4,8}*L40S
等。 下面一台典型 8*A100 GPU 的主机内硬件拓扑:
典型 8 卡 A100 主机硬件拓扑
本节将基于这张图来介绍一些概念和术语,有基础的可直接跳过。
1.1 PCIe 交换芯片
CPU、内存、存储(NVME)、GPU、网卡等支持 PICe 的设备,都可以连接到 PCIe 总线或专门的 PCIe 交换芯片,实现互联互通。
PCIe 目前有 5 代产品,最新的是 Gen5
。
1.2 NVLink
定义
Wikipedia 上 NVLink 上的定义:
NVLink is a wire-based serial multi-lane near-range communications link developed by Nvidia. Unlike PCI Express, a device can consist of multiple NVLinks, and devices use mesh networking to communicate instead of a central hub. The protocol was first announced in March 2014 and uses a proprietary high-speed signaling interconnect (NVHS).
简单总结:同主机内不同 GPU 之间的一种高速互联方式,
- 是一种短距离通信链路,保证包的成功传输,更高性能,替代 PCIe,
- 支持多 lane,link 带宽随 lane 数量线性增长,
- 同一台 node 内的 GPU 通过 NVLink 以 full-mesh 方式(类似 spine-leaf)互联,
- NVIDIA 专利技术。
演进:1/2/3/4 代
主要区别是单条 NVLink 链路的 lane 数量、每个 lane 的带宽(图中给的都是双向带宽)等:
NVLink 演进。Image from: HotChips 2022 [1]
例如,
- A100 是
2 lanes/NVSwitch * 6 NVSwitch * 50GB/s/lane= 600GB/s
双向带宽(单向 300GB/s)。注意:这是一个 GPU 到所有 NVSwitch 的总带宽; - A800 被阉割了 4 条 lane,所以是
8 lane * 50GB/s/lane = 400GB/s
双向带宽(单向 200GB/s)。
监控
基于 DCGM 可以采集到实时 NVLink 带宽:
Metrics from dcgm-exporter [5]
1.3 NVSwitch
还是参考下图,
典型 8 卡 A100 主机硬件拓扑
NVSwitch 是 NVIDIA 的一款交换芯片,封装在 GPU module 上,并不是主机外的独立交换机。
下面是真机图,浪潮的机器,图中 8 个盒子就是 8 片 A100,右边的 6 块超厚散热片下面就是 NVSwitch 芯片:
Inspur NF5488A5 NVIDIA HGX A100 8 GPU Assembly Side View. Image source: [2]
1.4 NVLink Switch
NVSwitch
听名字像是交换机,但实际上是 GPU module 上的交换芯片,用来连接同一台主机内的 GPU。
2022 年,NVIDIA 把这块芯片拿出来真的做成了交换机,叫 NVLink Switch
[3], 用来跨主机连接 GPU 设备。
这俩名字很容易让人混淆。
1.5 HBM (High Bandwidth Memory)
由来
传统上,GPU 显存和普通内存(DDR)一样插在主板上,通过 PCIe 连接到处理器(CPU、GPU), 因此速度瓶颈在 PCIe,Gen4 是 64GB/s,Gen5 是 128GB/s。
因此,一些 GPU 厂商(不是只有 NVIDIA 一家这么做)将将多个 DDR 芯片堆叠之后与 GPU 芯片封装到一起 (后文讲到 H100 时有图),这样每片 GPU 和它自己的显存交互时,就不用再去 PCIe 交换芯片绕一圈,速度最高可以提升一个量级。 这种“高带宽内存”(High Bandwidth Memory)缩写就是 HBM。
现在 CPU 也有用 HBM 的了,比如 Intel Xeon CPU Max Series 就自带了 64GB HBM2e。
HBM 的市场目前被 SK 海力士和三星等韩国公司垄断。
演进:HBM 1/2/2e/3/3e
From wikipedia HBM,
Bandwidth | Year | GPU | |
---|---|---|---|
HBM | 128GB/s/package | ||
HBM2 | 256GB/s/package | 2016 | V100 |
HBM2e | ~450GB/s | 2018 | A100, ~2TB/s ; 华为 Ascend 910B |
HBM3 | 600GB/s/site | 2020 | H100, 3.35TB/s |
HBM3e | ~1TB/s | 2023 | H200 , 4.8TB/s |
使用了 HBM 的近几代高端 NVIDIA GPU 显存带宽(双向),纵坐标是 TB/s。Image source: [3]
- AMD MI300X 采用 192GB HBM3 方案,带宽
5.2TB/s
; - HBM3e 是 HBM3 的增强版,速度从 6.4GT/s 到 8GT/s。
1.6 带宽单位
大规模 GPU 训练的性能与数据传输速度有直接关系。这里面涉及到很多链路,比如 PCIe 带宽、内存带宽、NVLink 带宽、HBM 带宽、网络带宽等等。
- 网络习惯用
bits/second (b/s)
表示之外,并且一般说的都是单向(TX/RX); - 其他模块带宽基本用
byte/sedond (B/s)
或transactions/second (T/s)
表示,并且一般都是双向总带宽。
比较带宽时注意区分和转换。
2 典型 8*A100/8*A800
主机
2.1 主机内拓扑:2-2-4-6-8-8
- 2 片 CPU(及两边的内存,NUMA)
- 2 张存储网卡(访问分布式存储,带内管理等)
- 4 个 PCIe Gen4 Switch 芯片
- 6 个 NVSwitch 芯片
- 8 个 GPU
- 8 个 GPU 专属网卡
典型 8 卡 A100 主机硬件拓扑
下面这个图画的更专业,需要更多细节的可参考:
NVIDIA DGX A100 主机(官方 8 卡机器)硬件拓扑。Image source: [4]
存储网卡
通过 PCIe 直连 CPU。用途:
- 从分布式存储读写数据,例如读训练数据、写 checkpoint 等;
- 正常的 node 管理,ssh,监控采集等等。
官方推荐用 BF3 DPU。但其实只要带宽达标,用什么都行。组网经济点的话用 RoCE,追求最好的性能用 IB。
NVSwitch fabric:intra-node full-mesh
8 个 GPU 通过 6 个 NVSwitch 芯片 full-mesh 连接,这个 full-mesh 也叫 NVSwitch fabric
; full-mesh 里面的每根线的带宽是 n * bw-per-nvlink-lane,
- A100 用的 NVLink3,
50GB/s/lane
,所以 full-mesh 里的每条线就是12*50GB/s=600GB/s
,注意这个是双向带宽,单向只有 300GB/s。 - A800 是阉割版,12 lane 变成 8 lane,所以每条线 8*50GB/s=400GB/s,单向 200GB/s。
用 nvidia-smi topo
查看拓扑
下面是一台 8*A800 机器上 nvidia-smi
显示的实际拓扑(网卡两两做了 bond,NIC 0~3 都是 bond):
- GPU 之间(左上角区域):都是
NV8
,表示 8 条 NVLink 连接; -
NIC 之间:
- 在同一片 CPU 上:
NODE
,表示不需要跨 NUMA,但需要跨 PCIe 交换芯片; - 不在同一片 CPU 上:
SYS
,表示需要跨 NUMA;
- 在同一片 CPU 上:
-
GPU 和 NIC 之间:
- 在同一片 CPU 上,且在同一个 PCIe Switch 芯片下面:
PXB
,表示只需要跨 PCIe 交换芯片; - 在同一片 CPU 上,且不在同一个 PCIe Switch 芯片下面:
NODE
,表示需要跨 PCIe 交换芯片和 PCIe Host Bridge; - 不在同一片 CPU 上:
SYS
,表示需要跨 NUMA、PCIe 交换芯片,距离最远;
- 在同一片 CPU 上,且在同一个 PCIe Switch 芯片下面:
1.2 GPU 训练集群组网:IDC GPU fabirc
GPU node 互联架构:
计算网络
GPU 网卡直连到置顶交换机(leaf),leaf 通过 full-mesh 连接到 spine,形成跨主机 GPU 计算网络。
- 这个网络的目的是 GPU 与其他 node 的 GPU 交换数据;
- 每个 GPU 和自己的网卡之间通过 PCIe 交换芯片连接:
GPU <--> PCIe Switch <--> NIC
。
存储网络
直连 CPU 的两张网卡,连接到另一张网络里,主要作用是读写数据,以及 SSH 管理等等。
RoCE vs. InfiniBand
不管是计算网络还是存储网络,都需要 RDMA 才能实现 AI 所需的高性能。RDMA 目前有两种选择:
- RoCEv2:公有云卖的 8 卡 GPU 主机基本都是这种网络,比如 CX6
8*100Gbps
配置;在性能达标的前提下,(相对)便宜; - InfiniBand (IB):同等网卡带宽下,性能比 RoCEv2 好 20% 以上,但是价格贵一倍。
1.3 数据链路带宽瓶颈分析
单机 8 卡 A100 GPU 主机带宽瓶颈分析
几个关键链路带宽都标在图上了,
- 同主机 GPU 之间:走 NVLink,双向 600GB/s,单向
300GB/s
; - 同主机 GPU 和自己的网卡之间:走 PICe Gen4 Switch 芯片,双向 64GB/s,单向
32GB/s
; -
跨主机 GPU 之间:需要通过网卡收发数据,这个就看网卡带宽了,目前国内 A100/A800 机型配套的主流带宽是(单向)
100Gbps=12.5GB/s
。 所以跨机通信相比主机内通信性能要下降很多。200Gbps==25GB/s
:已经接近 PCIe Gen4 的单向带宽;400Gbps==50GB/s
:已经超过 PCIe Gen4 的单向带宽。
所以在这种机型里用 400Gbps 网卡作用不大,400Gbps 需要 PCIe Gen5 性能才能发挥出来。
3 典型 8*H100/8*H800
主机
GPU Board Form Factor 分为两种类型:
- PCIe Gen5
- SXM5:性能更高一些
3.1 H100 芯片 layout
下面是一片 H100 GPU 芯片的内部结构:
单片 H100 GPU 内部逻辑布局。Image source: [3]
4nm
工艺;- 最下面一排是 18 根 Gen4 NVLink;双向总带宽
18 lanes * 50GB/s/lane = 900GB/s
; - 中间蓝色的是 L2 cache;
- 左右两侧是
HBM
芯片,即显存;
3.2 主机内硬件拓扑
跟 A100 8 卡机结构大致类似,区别:
-
NVSwitch 芯片从 6 个减少到了 4 个;真机图如下,
-
与 CPU 的互联从 PCIe Gen4 x16 升级到
PCIe Gen5 x16
,双向带宽128GB/s
;Image source: exxactcorp.com
3.3 组网
与 A100 也类似,只是标配改成了 400Gbps
的 CX7 网卡, 否则网络带宽与 PCIe Switch 和 NVLink/NVSwitch 之间的差距更大了。
4 典型 4*L40S/8*L40S
主机
L40S 是今年(2023)即将上市的新一代“性价比款”多功能 GPU,对标 A100。 除了不适合训练基座大模型之外(后面会看到为什么),官方的宣传里它几乎什么都能干。 价格的话,目前第三方服务器厂商给到的口头报价都是 A100 的 8 折左右。
4.1 L40S vs A100 配置及特点对比
L40S 最大的特点之一是 time-to-market 时间短,也就是从订货到拿到货周期比 A100/A800/H800 快很多。 这里面技术和非技术原因都有,比如:
- 不存在被美国禁售的功能(根据 2023.10 的新规定,已经禁售了),比如 FP64 和 NVLink 都干掉了;
- 使用
GDDR6
显存,不依赖 HBM 产能(及先进封装);
价格便宜也有几方面原因,后面会详细介绍:
- 大头可能来自 GPU 本身价格降低:因为去掉了一些模块和功能,或者用便宜的产品替代;
- 整机成本也有节省:例如去掉了一层 PCIe Gen4 Swtich;不过相比于 4x/8x GPU,整机的其他部分都可以说送的了;
4.2 L40S 与 A100 性能对比
下面是一个官方标称性能对比:
具体场景的性能对比网上也有很多官方资料,这里就不列举了。简单来,
- 性能 1.2x ~ 2x(看具体场景)。
- 功耗:两台 L40S 和单台 A100 差不多
需要注意,L40S 主机官方推荐的是单机 4 卡而不是 8 卡(后面会介绍为什么), 所以对比一般是用 两台 4*L40S
vs 单台 8*A100
。另外,很多场景的性能提升有个 大前提:网络需要是 200Gbps RoCE 或 IB 网络,接下来介绍为什么。
4.3 L40S 攒机
推荐架构:2-2-4
相比于 A100 的 2-2-4-6-8-8
架构, 官方推荐的 L40S GPU 主机是 2-2-4 架构,一台机器物理拓扑如下:
推荐单机 4 卡 L40S GPU 主机拓扑
最明显的变化是去掉了 CPU 和 GPU 之间的 PCIe Switch 芯片, 网卡和 GPU 都是直连 CPU 上自带的 PCIe Gen4 x16(64GB/s),
- 2 片 CPU(NUMA)
- 2 张双口 CX7 网卡(每张网卡
2*200Gbps
) - 4 片 L40S GPU
- 另外,存储网卡只配 1 张(双口),直连在任意一片 CPU 上
这样每片 GPU 平均 200Gbps 网络带宽。
不推荐架构:2-2-8
单机 8 卡 L40S GPU 主机拓扑,来自 NVIDIA L40S 官方推介材料
如图,跟单机 4 卡相比,单机 8 卡需要引入两片 PCIe Gen5 Switch 芯片:
- 说是现在PCIe Gen5 Switch 单片价格 1w 刀(不知真假),一台机器需要 2 片;价格不划算;
- PCIe switch 只有一家在生产,产能受限,周期很长;
- 平摊到每片 GPU 的网络带宽减半;
4.4 组网
官方建议 4 卡机型,搭配 200Gbps RoCE/IB 组网。
4.5 数据链路带宽瓶颈分析
单机 4 卡 L40S GPU 主机带宽瓶颈分析
以同 CPU 下面的两种 L40S 为例,这里面有两条链路可选:
-
直接通过 CPU 处理:
GPU0 <--PCIe--> CPU <--PCIe--> GPU1
- PCIe Gen4 x16 双向 64GB/s,单向
32GB/s
; - CPU 处理瓶颈?TODO
- PCIe Gen4 x16 双向 64GB/s,单向
-
完全绕过 CPU 处理,通过网卡去外面绕一圈再回来:
GPU0 <--PCIe--> NIC <-- RoCe/IB Switch --> NIC <--PCIe--> GPU1
- PCIe Gen4 x16 双向 64GB/s,单向
32GB/s
; - 平均每个 GPU 一个单向 200Gbps 网口,单向折算
25GB/s
; - 需要 NCCL 支持,官方说新版本 NCCL 正在针对 L40S 适配,默认行为就是去外面绕一圈回来;
- PCIe Gen4 x16 双向 64GB/s,单向
第二种方式看着长了很多,但官方说其实比方式一还要快很多(这里还每太搞懂,CPU 那里是怎么处理的?)—— 前提是网卡和交换机配到位:200Gbps RoCE/IB 网络。在这种网络架构下(网络带宽充足),
- 任何两片 GPU 的通信带宽和延迟都是一样的,是否在一台机器内或一片 CPU 下面并不重要,集群可以横向扩展(scaling up,compared with scaling in);
- GPU 机器成本降低;但其实对于那些对网络带宽要求没那么高的业务来说,是把 NVLINK 的成本转嫁给了网络,这时候必须要组建 200Gbps 网络,否则发挥不出 L40S 多卡训练的性能。
如果是方式二,同主机内 GPU 卡间的带宽瓶颈在网卡速度。即使网络是推荐的 2*CX7 配置,
- L40S: 200Gbps(网卡单向线速)
- A100: 300GB/s(NVLINK3 单向) ==
12x
200Gbps - A800: 200GB/s(NVLINK3 单向) ==
8x
200Gbps
可以看到,L40S 卡间带宽还是比 A100 NVLINK 慢了 12 倍, 比 A800 NVLink 慢了 8 倍,所以不适合数据密集交互的基础大模型训练。
4.6 测试注意事项
如上,即便只测试单机 4 卡 L40S 机器,也需要搭配 200Gbps 交换机,否则卡间性能发挥不出来。
5 典型 8*H20
GPU 服务器(2024 更新)
H20 是 2023 年发布,2024 年正式开始交付的 GPU。面向中国大陆市场,填补 A800/L40S 等等被禁之后的产品空缺。
5.1 显存:8*96GB
$ nvidia-smi
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.161.03 Driver Version: 535.161.03 CUDA Version: 12.2 |
|-----------------------------------------+----------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+======================+======================|
| 0 NVIDIA H20 On | 00000000:04:00.0 Off | 0 |
| N/A 24C P0 72W / 500W | 0MiB / 97871MiB | 0% Default |
| | | Disabled |
+-----------------------------------------+----------------------+----------------------+
| 1 NVIDIA H20 On | 00000000:23:00.0 Off | 0 |
| N/A 24C P0 71W / 500W | 0MiB / 97871MiB | 0% Default |
| | | Disabled |
+-----------------------------------------+----------------------+----------------------+
...
+-----------------------------------------+----------------------+----------------------+
| 7 NVIDIA H20 On | 00000000:E4:00.0 Off | 0 |
| N/A 24C P0 72W / 500W | 0MiB / 97871MiB | 0% Default |
| | | Disabled |
+-----------------------------------------+----------------------+----------------------+
GPU 最大功耗 8*500W
。
5.2 卡间互联:NVLINK x18 lanes = 900GB/s
$ nvidia-smi topo -mGPU0 GPU1 GPU2 GPU3 GPU4 GPU5 GPU6 GPU7 NIC0 NIC1 CPU Affinity NUMA Affinity GPU NUMA ID
GPU0 X NV18 NV18 NV18 NV18 NV18 NV18 NV18 SYS SYS 0-95,192-287 0 N/A
GPU1 NV18 X NV18 NV18 NV18 NV18 NV18 NV18 SYS SYS 0-95,192-287 0 N/A
GPU2 NV18 NV18 X NV18 NV18 NV18 NV18 NV18 SYS SYS 0-95,192-287 0 N/A
GPU3 NV18 NV18 NV18 X NV18 NV18 NV18 NV18 SYS SYS 0-95,192-287 0 N/A
GPU4 NV18 NV18 NV18 NV18 X NV18 NV18 NV18 NODE NODE 96-191,288-383 1 N/A
GPU5 NV18 NV18 NV18 NV18 NV18 X NV18 NV18 NODE NODE 96-191,288-383 1 N/A
GPU6 NV18 NV18 NV18 NV18 NV18 NV18 X NV18 PHB PHB 96-191,288-383 1 N/A
GPU7 NV18 NV18 NV18 NV18 NV18 NV18 NV18 X NODE NODE 96-191,288-383 1 N/A
NIC0 SYS SYS SYS SYS NODE NODE PHB NODE X PIX
NIC1 SYS SYS SYS SYS NODE NODE PHB NODE PIX X
可以看到双向 18 lanes * 50GB/s/lane= 900GB/s
(单向 450GB/s)。 作为对比,8*A800
NVLINK 是 8 lanes,见前面章节。
5.3 网络
这个看各服务器厂商怎么配了。下面是国内某家的 PCIe 和网卡信息:
$ lspci
00:00.0 Host bridge: Advanced Micro Devices, Inc. [AMD] Device 14a4 (rev 01)
c0:00.2 IOMMU: Advanced Micro Devices, Inc. [AMD] Device 149e (rev 01)
c0:01.1 PCI bridge: Advanced Micro Devices, Inc. [AMD] Device 14ab (rev 01)
c1:00.0 PCI bridge: Broadcom / LSI PEX890xx PCIe Gen 5 Switch (rev b0) # <-- PCIe Gen5
c2:00.0 PCI bridge: Broadcom / LSI PEX890xx PCIe Gen 5 Switch (rev b0)
c3:00.0 3D controller: NVIDIA Corporation Device 2329 (rev a1)
c6:00.0 Ethernet controller: Mellanox Technologies MT2894 Family [ConnectX-6 Lx] # <-- Mellanox CX6
c6:00.1 Ethernet controller: Mellanox Technologies MT2894 Family [ConnectX-6 Lx]
...
RDMA:
$ ibstat
CA 'mlx5_0'CA type: MT4127Number of ports: 1Port 1:State: DownPhysical state: DisabledRate: 40Base lid: 0LMC: 0SM lid: 0Capability mask: 0x00010000Link layer: Ethernet
CA 'mlx5_1'CA type: MT4127Number of ports: 1Port 1:State: DownPhysical state: DisabledRate: 40Base lid: 0LMC: 0SM lid: 0Capability mask: 0x00010000Link layer: Ethernet
5.4 训练性能:8*H20 vs 8*A800
单机 8 卡训练性能(实测数据,但大家用的模型、框架、数据集等可能各不相同,因此这里的结果仅供参考):
GPU Node (NVLINK interconnect) | Throughput |
---|---|
8*A800-80GB | ~30 samples/sec |
8*H20-96GB | ~21 samples/sec |
相比 A800,H20 纸面算力阉割了一半左右 [6],但在 NVLINK/cache 等地方补了一下,所以实际性能(只)下降了 1/3。
参考资料
- NVLink-Network Switch - NVIDIA’s Switch Chip for High Communication-Bandwidth SuperPODs, Hot Chips 2022
- ChatGPT Hardware a Look at 8x NVIDIA A100 Powering the Tool, 2023
- NVIDIA Hopper Architecture In-Depth, nvidia.com, 2022
- DGX A100 review: Throughput and Hardware Summary, 2020
- Understanding NVIDIA GPU Performance: Utilization vs. Saturation, 2023
- GPU Performance (Data Sheets) Quick Reference (2023)
相关文章:
GPU 进阶笔记(一):高性能 GPU 服务器硬件拓扑与集群组网
记录一些平时接触到的 GPU 知识。由于是笔记而非教程,因此内容不求连贯,有基础的同学可作查漏补缺之用 1 术语与基础 1.1 PCIe 交换芯片1.2 NVLink 定义演进:1/2/3/4 代监控1.3 NVSwitch1.4 NVLink Switch1.5 HBM (High Bandwidth Memory) 由…...
Unresolved plugin: ‘org.apache.maven.plugins:maven-site-plugin:3.12.1‘
问题 使用idea 社区办加载项目提示下面问题: Unresolved plugin: org.apache.maven.plugins:maven-site-plugin:3.12.1 问题解决 maven插件地址: https://maven.apache.org/plugins/maven-dependency-plugin/plugins.html Maven 中央仓库地址&#…...
GO性能优化的一些记录:trace工具的使用
使用场景: 1 想要查看接口延时性偏高 2 深入了解协程具体如何运营的详细信息(运行时长,或者什么原因导致了协程运行受阻) 可以使用 trace 功能,程序便会对下面的一系列事件进行详细记录,并且会依据所搜集到…...
springboot maven 构建 建议使用 --release 21 而不是 -source 21 -target 21,因为它会自动设置系统模块的位置
使用 --release 选项代替 -source 和 -target 是一种更安全、更兼容的方式,特别是在构建使用较新版本 JDK 的项目时。以下是详细解释和建议: 1. 为什么推荐使用 --release 问题点: 使用 -source 和 -target 标志时,仅设置了代码的语言级别和字节码目标版本,但编译器仍可…...
设计模式-创建型-单例模式
1. 单例模式简介 单例模式(Singleton Pattern)是一种常见的创建型设计模式,它确保一个类只有一个实例,并提供全局访问点。在很多情况下,我们只希望某个类在整个应用程序中有一个唯一的实例,且该实例需要在…...
linux 网卡配置
linux网卡可以通过命令和配置文件配置,如果是桌面环境还可以通过图形化界面配置. 1.ifconfig(interfaces config)命令方式 通常需要以root身份登录或使用sudo以便在Linux机器上使用ifconfig工具。依赖于ifconfig命令中使用一些选项属性,ifconfig工具不仅可以被用来…...
python文件操作相关(excel)
python文件操作相关(excel) 1. openpyxl 库openpyxl其他用法创建与删除操作单元格追加数据格式化单元格合并单元格插入图片公式打印设置保护工作表其他功能 2. pandas 库3. xlrd 和 xlwt 库4. xlsxwriter 库5. pyxlsb 库应用场景参考资料 在 Python 中&a…...
利用Abel_Cain软件实现ARP欺骗
ARP协议是“Address Resolution Protocol”(地址解析协议)的缩写。在局域网中,网络中实际传输的是“帧”,帧里面是有目标主机的MAC地址的。在以太网中,一个主机要和另一个主机进行直接通信,必须要知道目标主…...
搭建android开发环境 android studio
1、环境介绍 在进行安卓开发时,需要掌握java,需要安卓SDK,需要一款编辑器,还需要软件的测试环境(真机或虚拟机)。 早起开发安卓app,使用的是eclipse加安卓SDK,需要自行搭建。 目前开…...
使用 Python -m build打包 Python 项目:详解过程与细节
使用 Python -m build 打包 Python 项目:详解过程与细节 Python 项目的打包是发布和分发软件的核心环节。本文将基于用户提供的 pyproject.toml 文件和项目目录结构,详细说明 Python -m build 命令的执行过程,并解答 是否会将 oe_eval 中的代…...
019-spring-基于aop的事务控制原理
1、事务配置: <tx:annotation-driven transaction-manager"transactionManager"/> transaction-manager 默认是找这个bean:transactionManager 2、从命名空间开始找到对应的解析配置如下: 对应的是这个 后续跟源码没有搞明…...
210.xxl-job定时任务:架构,可视化,GLUE模式,负载均衡,分片
目录 一、为什么要用xxl-job 二、xxl-job架构 三、启动调度中心 1.初始化数据库 2.编译源码 四、启动执行器 五、GLUE模式运行 六、负载均衡 七、分片 1.分片环境准备 2.分片实现 八、感谢支持 一、为什么要用xxl-job 以前我们用quartz实现定时任务,但是那是单机…...
LVS 负载均衡原理 | 配置示例
注:本文为 “ LVS 负载均衡原理 | 配置” 相关文章合辑。 部分内容已过时,可以看看原理实现。 未整理去重。 使用 LVS 实现负载均衡原理及安装配置详解 posted on 2017-02-12 14:35 肖邦 linux 负载均衡集群是 load balance 集群的简写,翻…...
堆内存易碎片化
堆内存容易碎片化主要是由于其内存分配和释放的特性以及管理方式的复杂性所导致的。以下是对堆内存容易碎片化的详细解释: 一、内存分配和释放的非连续性 堆内存的分配和释放并不是连续的,这意味着在多次分配和释放后,原本连续的内存空间可…...
Docker镜像瘦身:从1.43G到22.4MB
Docker镜像瘦身:从1.43G到22.4MB 背景1、创建项目2、构建第一个镜像3、修改基础镜像4、多级构建5、使用Nginx背景 在使用 Docker 时,镜像大小至关重要。我们从 create-react-app (https://reactjs.org/docs/create-a-new-react-app.html)获得的样板项目通常都超过 1.43 GB…...
Linux套接字通信学习
Linux套接字通信 代码源码:https://github.com/say-Hai/TcpSocketLearn/tree/CThreadSocket 在网络通信的时候, 程序猿需要负责的应用层数据的处理(最上层),而底层的数据封装与解封装(如TCP/IP协议栈的功能)通常由操作系统、网络协…...
XIAO Esp32S3制作网络摄像头——音频获取
1、功能介绍 本文主要是基于XIAO Esp32S3(Sense)做的一款网络摄像头,主要包含以下功能 1 音频获取/保存 2 视频获取/视频保存 3 行人检测/火焰检测/行人追踪(告警) 4 指定区域 5 摄像头旋转 。。。 本文主要实现第一步,音频获取,后续会陆续实现后面的功能,敬请期…...
Docker搭建RocketMQ
Docker搭建RocketMQ 操作系统: CentOS 7 x64 版本号: CentOS Linux release 7.9.2009 (Core) IP地址: 192.168.157.130 Docker 信息: Client: Docker Engine - Community Version: 24.0.7 API version: 1.43 Go version: go1.20.10 Git commit: …...
Python 迭代器与生成器
Python 中的迭代器和生成器是处理集合元素的重要工具,它们在处理大量数据时特别有用,因为它们不需要一次性将所有数据加载到内存中。 迭代器(Iterator) 迭代器是一个实现了迭代器协议的对象,这意味着它有两个方法&am…...
细说STM32F407单片机通过IIC读写EEPROM 24C02
目录 一、操作说明 二、工程配置 1、时钟、DEBUG、GPIO、USART6、NVIC、Code Generator 2、 IIC2 (1)Master Features组,主设备参数 (2)Slave Features组,从设备参数 三、软件设计 1、KELED 2、E…...
Redis 深度解析:从入门到精通
引言 Redis 是一个开源的、高性能的键值存储系统,它支持多种数据结构,并且提供了丰富的功能和接口。作为内存数据库,Redis 以其快速的数据访问速度、灵活的数据模型以及持久化选项而闻名。本文将详细介绍 Redis 的核心概念、工作原理及其应用…...
6-pandas数据读取
前言 一、分组聚合 1.groupby使用: groupby() 是 pandas 库中用于对数据进行分组操作的一个非常重要的方法。 import pandas as pddata {城市: [北京, 上海, 广州, 北京, 上海, 广州],人口: [2154, 2424, 1303, 2154, 2424, 1303],年龄: [25, 30, 35, 25, 30, 3…...
omi friend实战记录
一、简介 omi friend是国外githab上开源的一个“AI硬件”的制作教程,它的形状是个三角形,属于项链佩戴这类的。可以接入llm进行对话,他有麦克风、扬声器,还有电池。外形好看,功能实用。还有专属的一系列app可以供方便…...
马原复习笔记
文章目录 前言导论物质实践人类社会资本主义社会主义共产主义后记 前言 一月二号下午四点多考试,很友好,不是早八,哈哈哈。之前豪言壮语和朋友说这次马原要全对,多做了几次测试之后,发现总有一些知识点是自己不知道的…...
VIM: Vision Mamba基于双向状态空间模型的高效视觉表示学习
这篇文章的主要内容可以概括如下: 背景与动机: 近年来,状态空间模型(SSM)在长序列建模中展现出巨大潜力,尤其是Mamba模型在硬件感知设计上的高效性。 然而,现有的SSM模型在处理视觉数据时面临…...
CannotRetrieveUpdates alert in disconnected OCP 4 cluster解决
环境: Red Hat OpenShift Container Platform (RHOCP) 4 问题: Cluster Version Operator 不断发送警报,表示在受限网络/断开连接的 OCP 4 集群中无法接收更新。 在隔离的 OpenShift 4 集群中看到 CannotRetrieveUpdates 警报: …...
libmodbus源码中重要的两个结构体讲解
文章目录 一、libmodbus重要数据结构讲解**1. 结构体 `_modbus`**定义成员解析小结**2. 结构体 `_modbus_backend`**定义成员解析小结**3. 两者关系和工作流程****关系****工作流程**一、libmodbus重要数据结构讲解 这两个结构体是 libmodbus 的核心,定义了 Modbus 通信上下文…...
PostgreSQL的一主两从集群搭建部署 (两同步)
一、实验环境 虚拟机名IP身份简称keep-postgres12-node1192.168.122.87主节点node1keep-postgres12-node2192.168.122.89备节点node2keep-postgres12-node3192.168.122.90备节点node3 二、安装数据库 源码包方式(主) 1、创建用户 [rootkeep-postgre…...
CPT203 Software Engineering 软件工程 Pt.5 软件测试(中英双语)
文章目录 8. 软件测试8.1 Testing(测试)8.1.1 A note of testing under the V & A framework8.1.2 The Basics8.1.3 The Goals8.1.4 The Stages 8.2 Developing testing(开发测试)8.2.1 Unit testing(单元测试&…...
在 Blazor 和 ASP.NET Core 中使用依赖注入和Scoped 服务实现数据共享方法详解
依赖注入(Dependency Injection,简称 DI)是一种设计模式,用于将对象的依赖关系从对象内部解耦出来,由外部容器进行管理和提供。在 Blazor 和 ASP.NET Core 中,DI 是内置的核心功能,它通过服务生…...
【信号滤波 (下)】采样条件,多种滤波算法对比(Matlab/C++)
目录 一、信号采样条件采样定理ADC的SPS设置 二、常用滤波算法对比A.滑动平均滤波B.陷波滤波陷波滤波器简介FIR(有限脉冲响应)滤波器和IIR(无限脉冲响应)滤波器 基于IIR实现陷波滤波滤波原理讲解双二阶滤波器计算过程陷波滤波优势 在上一篇中,介绍了信号时域到频域的…...
将广播发送和接收端实现一遍,完成一个发送端发送信息,对应多个接收端接收信息实验。
1、将广播发送和接收端实现一遍,完成一个发送端发送信息,对应多个接收端接收信息实验。 接受端 #include<myhead.h> #define handel_err(res,val) if(val-1){perror(res);return-1;} int main(int argc, const char *argv[]) {int rfdsocket(AF_…...
Nginx 负载均衡详解
一、Nginx 简介 Nginx 是一个高性能的开源 Web 服务器和反向代理服务器,以其轻量级、高并发、低内存消耗等特点著称。Nginx 不仅适用于静态资源的快速分发,还广泛应用于负载均衡、反向代理等场景。通过Nginx,可以轻松地构建一个高效、可靠且…...
自动驾驶新纪元:城区NOA功能如何成为智能驾驶技术的分水岭
目录 一、NOA 的定义 二、NOA 的主要特点 导航集成 场景覆盖 智能决策 高级感知能力 驾驶员参与 三、NOA 的优势 四、NOA的衡量指标 定性评价指标 安全性评价指标定义 可靠性评价指标定义 舒适性评价指标定义 通行效率评价指标 定量评价指标 五、代表厂商的实测…...
FFmpeg 编码和解码
文章目录 音频格式AACADIF音频数据交换格式ADTS音频数据传输流 音频解码音频编码 视频格式H264GOP图像组I帧,P帧,B帧H264压缩技术H264压缩级别H264视频级别H264码流结构SPSPPS 解码视频编码视频 音频格式 AAC AAC全称 Advanced Audio Coding࿰…...
【Ubuntu】Ubuntu server 18.04 搭建Slurm并行计算环境(包含NFS)
Ubuntu server 18.04 搭建Slurm并行计算环境(包含NFS) 一、Munge 认证模块 1.1、安装 munge 主节点和子节点都安装munge #安装 sudo apt update && sudo apt install munge libmunge-dev#设置开机启动 sudo systemctl enable munge sudo syste…...
WPF 绘制过顶点的圆滑曲线 (样条,贝塞尔)
在一个WPF项目中要用到样条曲线,必须过顶点,圆滑后还不能太走样,捣鼓一番,发现里面颇有玄机,于是把我多方抄来改造的方法发出来,方便新手: 如上图,看代码吧: ----------…...
Spring 的不同事务传播行为
目录 Spring 的不同事务传播行为 PROPAGATION_REQUIRES_NEW事务传播行为什么情况下会使用? 一、PROPAGATION_REQUIRES_NEW的含义 二、使用场景 三、注意事项 PROPAGATION_NESTED事务传播行为什么情况下会使用? 一、PROPAGATION_NESTED的含义 二、使用场景 三、嵌套事…...
PlantUML 时序图 基本例子
基本的例子 序列-> 用于绘制两个参与者之间的信息。参与者不必明确声明。 要有一个点状的箭头,就用--> 也可以用<- 和<-- 。这不会改变绘图,但可能提高可读性。注意,这只适用于顺序图,其他图的规则不同。 plantum…...
QILSTE H8-C414SY高亮黄光LED灯珠 发光二极管LED
在电子组件的复杂世界中,H8-C414SY型号的LED以其精确的技术参数和卓越的性能,成为了工程师和技术人员不可忽视的选择。本文将通过对这款高亮黄光LED的技术参数进行深入分析,增加文本的复杂性和突发性,以提供一份详尽的技术参考。 …...
git clone 和 conda 换源
文章目录 git clone 通过 sshconda 创建虚拟环境通过 env.yml 文件conda 换源 git clone 通过 ssh git clone ssh://用户名IP地址:/仓库名字.gitconda 创建虚拟环境通过 env.yml 文件 conda env create -f environment.ymlconda 换源 Step 1 生成 .bashrc 文件在家目录下。…...
Spring Boot 多数据源解决方案:dynamic-datasource-spring-boot-starter 的奥秘(下)
在上一篇博客《Spring Boot 多数据源解决方案:dynamic-datasource-spring-boot-starter 的奥秘》介绍了dynamic-datasource-spring-boot-starter的自动配置类和配置属性类之后,本文继续来剖析多数据源是如何切换的,什么时候切换的。 前文中提…...
移动 APP 设计规范参考
一、界面设计规范 布局原则: 内容优先:以内容为核心进行布局,突出用户需要的信息,简化页面导航,提升屏幕空间利用率.一致性:保持界面元素风格一致,包括颜色、字体、图标等,使用户在…...
yolov6算法及其改进
yolov6算法及其改进 1、YOLOV6简介2、RepVGG重参思想3、YOLOv6架构改进3.1、Backbone方面3.2、SPP改进3.3、Neck改进3.4、Head改进 4、正负样本匹配与损失函数4.1、TaskAligned样本匹配4.2、VFL Loss分类损失函数4.3、SIOU损失函数4.4、DFL损失函数 1、YOLOV6简介 YOLOv6设计主…...
java自定义注解对枚举类型参数的校验
目录 1.前提准备条件 1.1 pom.xml文件依赖: 1.2 枚举类: 1.3 controller接口: 1.4 实体参数: 1.5 knife4j的配置 2.实现要求 3.实现步骤 3.1 自定义注解类: 3.2 使用注解: 3.3 添加注解校验类: …...
K8S-LLM:用自然语言轻松操作 Kubernetes
在 Kubernetes (K8s) 的日常管理中,复杂的命令行操作常常让开发者感到头疼。无论是部署应用、管理资源还是调试问题,都需要记住大量的命令和参数。Kubernetes 作为容器编排的行业标准,其强大的功能伴随着陡峭的学习曲线和复杂的命令行操作。这…...
【GO基础学习】gin的使用
文章目录 模版使用流程参数传递路由分组数据解析和绑定gin中间件 模版使用流程 package mainimport ("net/http""github.com/gin-gonic/gin" )func main() {// 1.创建路由r : gin.Default()// 2.绑定路由规则,执行的函数// gin.Context&#x…...
【PCIe 总线及设备入门学习专栏 4.5 -- PCIe Message and PCIe MSI】
文章目录 PCIe Message 与 MSIPCIe Message 和 MSI 的作用与关系MSI 的配置与寄存器MSI 和 ARM GIC 的关系示例:MSI 在 ARM GIC 的实际应用总结 PCIe Message 与 MSI 本文将介绍 PCIe message 的作用以及message 与 MSI 的关系,再介绍 MSI 如何配置以及…...
sklearn_pandas.DataFrameMapper的用法
文章目录 介绍主要作用基本用法示例对不同列应用不同的转换器对多列应用相同的转换器输出为 Pandas DataFrame 注意事项转换器的适用性:输出格式:与 scikit-learn 的兼容性: 介绍 DataFrameMapper 是 sklearn-pandas 库中的一个工具…...
【2024年-7月-27日-开源社区openEuler实践记录】剖析 elease - management:优化软件发布流程的开源方案
开篇介绍 大家好,我是 fzr123,在软件开发流程管控领域探索许久,今天要给大家详细说说release - management这个极具价值的开源项目。在软件开发的生命周期里,发布管理至关重要,它关乎着软件能否稳定、高效且按时交付&…...