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

PyTorch进阶实战指南:02分布式训练深度优化

PyTorch进阶实战指南:02分布式训练深度优化

在这里插入图片描述


前言

在大模型时代,分布式训练已成为突破单机算力瓶颈的核心技术。本文深入解析PyTorch分布式训练的技术实现,从单机多卡并行到万卡集群协同,系统揭示现代深度学习规模化训练的核心机制。通过剖析DataParallel与DDP的本质差异、解读NCCL通信优化策略、演示混合并行配置方案,为从业者提供从实验环境到生产集群的完整优化路径。


1. 单机多卡并行方案

1.1 数据并行的核心思想

核心概念:
同一个模型复制到多个GPU上,每个GPU处理不同的数据分片,最后汇总所有GPU的计算结果,更新同一份模型参数。这是目前最常用的并行训练方式。

工作流程示意图:

输入数据
数据分片
GPU0:前向计算
GPU1:前向计算
GPU2:前向计算
梯度聚合
参数更新
1.2 DataParallel 实现详解

基础用法

model = nn.DataParallel(model, device_ids=[0, 1, 2, 3],  # 指定使用的GPUoutput_device=0           # 结果收集的GPU
)

底层执行步骤

  1. 数据切分
    自动将输入数据均分到各GPU(假设batch_size=64,4卡时每卡处理16个样本)

  2. 模型复制
    将主模型的参数广播到所有指定GPU

  3. 并行计算
    各GPU独立执行前向传播和损失计算

  4. 梯度同步
    将所有GPU计算的梯度在output_device上求和求平均

  5. 参数更新
    仅在主GPU执行优化器更新操作

典型问题场景

# 示例:内存分配不均问题
# 主卡(device_ids[0])需要存储完整输出结果
output = model(input)  # 假设输出为[64, 1000],则主卡需存储全部64个样本的输出
loss = loss_fn(output, target)  # 同样在主卡计算损失
loss.backward()  # 梯度在主卡聚合

内存占用对比(4卡示例):

GPU存储内容显存占用
0模型副本+完整输出+梯度聚合12GB
1-3模型副本+分片输出+本地梯度8GB
1.3 DistributedDataParallel (DDP) 深度解析

架构优势

  • 多进程架构:每个GPU对应独立的Python进程,规避GIL限制
  • Ring-AllReduce:高效的梯度同步算法(NCCL后端)
  • 内存均衡:各卡独立维护参数和梯度

标准实现模板

import torch.distributed as dist
from torch.nn.parallel import DistributedDataParallel as DDPdef setup(rank, world_size):# 初始化进程组dist.init_process_group(backend="nccl",          # NVIDIA集体通信库init_method="tcp://10.0.0.1:23456",  # 初始化方式rank=rank,               # 当前进程编号world_size=world_size    # 总进程数)torch.cuda.set_device(rank)def train(rank, world_size):setup(rank, world_size)# 准备数据采样器dataset = YourDataset()sampler = DistributedSampler(dataset,num_replicas=world_size,rank=rank,shuffle=True)dataloader = DataLoader(dataset, batch_size=64, sampler=sampler)# 构建DDP模型model = YourModel().to(rank)ddp_model = DDP(model, device_ids=[rank])# 训练循环for epoch in range(epochs):sampler.set_epoch(epoch)for batch in dataloader:inputs, labels = batchoutputs = ddp_model(inputs.to(rank))loss = loss_fn(outputs, labels.to(rank))loss.backward()optimizer.step()optimizer.zero_grad()

关键技术细节

  1. 梯度桶 (Gradient Bucketing)
    DDP将小梯度打包成桶(默认25MB),减少通信次数:

    # 调整梯度桶大小(环境变量)
    os.environ["NCCL_IB_DISABLE"] = "1"          # 禁用InfiniBand
    os.environ["NCCL_SOCKET_IFNAME"] = "eth0"    # 指定网卡
    os.environ["NCCL_NSOCKS_PERTHREAD"] = "4"    # 每个线程的Socket数
    
  2. 计算与通信重叠
    DDP在前向传播最后阶段就开始异步梯度同步:

    # 查看同步耗时
    torch.autograd.profiler.profile(enabled=True, use_cuda=True) as prof:outputs = ddp_model(inputs)loss = criterion(outputs, targets)loss.backward()
    print(prof.key_averages().table())
    
  3. 检查点保存
    多卡训练时只需保存主卡模型:

    if rank == 0:torch.save({'model_state_dict': ddp_model.module.state_dict(),'optimizer_state_dict': optimizer.state_dict(),}, "checkpoint.pth")
    
1.4 方案对比与选型指南
特性DataParallelDistributedDataParallel
实现难度简单(单文件直接使用)需要初始化进程组
通信效率低(单线程AllGather)高(多进程Ring-AllReduce)
显存占用主卡内存压力大各卡内存均衡
最大扩展性8卡数千卡
适用场景快速原型开发生产环境训练

选型建议流程图:

开始
是否单机?
是否<=8卡?
必须用DDP
DataParallel快速验证
使用DDP
是否遇到显存瓶颈?
继续使用
完整分布式训练

1.5 本节常见问题解答

Q1:为什么DDP训练时每个进程的batch_size要相同?
A:DDP的本质是数据并行,要求所有GPU处理的数据量一致以保证梯度计算的正确性。假设总batch_size为256,使用4卡时每卡应设置batch_size=64

Q2:如何解决DDP训练中的端口冲突问题?

# 选择空闲端口(示例)
init_method="tcp://localhost:29500"  # 确保所有节点使用相同端口# 自动寻找空闲端口
import socket
s = socket.socket()
s.bind(('', 0))                     
port = s.getsockname()[1]

Q3:多卡训练时验证集如何正确处理?

# 只在主卡执行验证
if rank == 0:model.eval()with torch.no_grad():for val_batch in val_loader:# 验证逻辑...dist.barrier()  # 同步其他进程
else:dist.barrier()

1.6 性能优化实验

测试环境:

  • 机器配置:8 x NVIDIA A100 (40GB)
  • 数据集:ImageNet
  • 模型:ResNet-50

结果对比:

并行方式吞吐量(images/sec)加速比显存占用方差
单卡3121x-
DataParallel9282.97x38%
DDP11923.82x12%

2. 分布式环境配置

2.1 多节点训练环境搭建

集群架构示意图

SSH连接
SSH连接
SSH连接
NCCL通信
NCCL通信
NCCL通信
主节点
工作节点1
工作节点2
工作节点3

配置步骤详解

  1. 网络配置

    • 确保所有节点在同一个局域网
    • 配置静态IP(避免DHCP变化导致通信失败)
    # 示例:Ubuntu网络配置
    sudo vim /etc/netplan/01-netcfg.yaml
    # 添加内容
    network:ethernets:enp0s3:dhcp4: noaddresses: [10.0.0.2/24]gateway4: 10.0.0.1nameservers:addresses: [8.8.8.8, 8.8.4.4]
    
  2. SSH免密登录

    # 在主节点生成密钥
    ssh-keygen -t rsa
    # 复制公钥到所有节点(包括自己)
    ssh-copy-id -i ~/.ssh/id_rsa.pub user@10.0.0.2
    ssh-copy-id -i ~/.ssh/id_rsa.pub user@10.0.0.3
    
  3. 共享存储配置(可选)

    # 使用NFS共享数据集
    # 主节点
    sudo apt install nfs-kernel-server
    sudo mkdir /shared_data
    sudo vim /etc/exports  # 添加:/shared_data 10.0.0.0/24(rw,sync,no_subtree_check)
    sudo exportfs -a# 工作节点
    sudo apt install nfs-common
    sudo mkdir /shared_data
    sudo mount 10.0.0.1:/shared_data /shared_data
    
2.2 NCCL 后端配置优化

关键环境变量

# 在训练脚本开始处设置
import os
os.environ["NCCL_DEBUG"] = "INFO"        # 查看详细通信日志
os.environ["NCCL_IB_DISABLE"] = "1"      # 禁用InfiniBand(使用以太网时)
os.environ["NCCL_SOCKET_IFNAME"] = "eth0"# 指定网卡名称
os.environ["NCCL_BUFFSIZE"] = "4194304"  # 设置4MB的通信缓冲区
os.environ["NCCL_NSOCKS_PERTHREAD"] = "4"# 每个线程的Socket数

性能测试工具

# 安装nccl-tests
git clone https://github.com/NVIDIA/nccl-tests.git
make CUDA_HOME=/usr/local/cuda NCCL_HOME=/usr/local/nccl# 运行all_reduce性能测试
./build/all_reduce_perf -b 128M -e 4G -f 2 -g 4
2.3 分布式数据加载策略

数据分片示意图

分片1
分片2
分片1-1
分片1-2
分片2-1
分片2-2
完整数据集
节点1
节点2
GPU0
GPU1
GPU2
GPU3

实现代码

from torch.utils.data import Dataset, DataLoader
from torch.utils.data.distributed import DistributedSamplerclass CustomDataset(Dataset):def __init__(self, data):self.data = datadef __len__(self):return len(self.data)def __getitem__(self, idx):return self.data[idx]# 初始化分布式环境
dist.init_process_group(backend='nccl')dataset = CustomDataset(np.arange(1000000))
sampler = DistributedSampler(dataset,num_replicas=dist.get_world_size(),rank=dist.get_rank(),shuffle=True,seed=42
)dataloader = DataLoader(dataset,batch_size=256,sampler=sampler,num_workers=4,pin_memory=True,persistent_workers=True
)

3. 混合并行策略

3.1 模型并行基础

典型场景

  • 超大参数矩阵:将单个权重矩阵拆分到多个设备
  • 分支结构分离:不同网络分支放置在不同设备

矩阵拆分示例

class SplitLinear(nn.Module):def __init__(self, in_dim, out_dim, split_dim=0):super().__init__()self.split_dim = split_dimself.device_list = ['cuda:0', 'cuda:1']if split_dim == 0:  # 按行拆分self.w0 = nn.Parameter(torch.randn(out_dim//2, in_dim).to('cuda:0')self.w1 = nn.Parameter(torch.randn(out_dim - out_dim//2, in_dim).to('cuda:1')else:  # 按列拆分self.w0 = nn.Parameter(torch.randn(out_dim, in_dim//2).to('cuda:0')self.w1 = nn.Parameter(torch.randn(out_dim, in_dim - in_dim//2).to('cuda:1')def forward(self, x):if self.split_dim == 0:x0 = x.to('cuda:0') @ self.w0.t()x1 = x.to('cuda:1') @ self.w1.t()return torch.cat([x0.cpu(), x1.cpu()], dim=1)else:x0 = x[:, :self.w0.shape[1]].to('cuda:0') @ self.w0.t()x1 = x[:, self.w0.shape[1]:].to('cuda:1') @ self.w1.t()return (x0 + x1).cpu()
3.2 流水线并行实现

流水线示意图

输入数据
阶段1 GPU0
阶段2 GPU1
阶段3 GPU2
输出结果

使用PyTorch内置流水线

from torch.distributed.pipeline.sync import Pipemodel = nn.Sequential(nn.Linear(1024, 512).to('cuda:0'),nn.ReLU(),nn.Linear(512, 256).to('cuda:1'),nn.ReLU(),nn.Linear(256, 128).to('cuda:2')
)# 配置流水线并行
model = Pipe(model, chunks=8, checkpoint='except_last')# 训练循环
for data in dataloader:inputs = data.to('cuda:0')outputs = model(inputs)loss = outputs.local_value().mean()loss.backward()optimizer.step()
3.3 3D并行综合应用

结合策略

  • 数据并行:复制模型到多个设备组
  • 张量并行:拆分单个操作到多个设备
  • 流水线并行:分割模型层到不同设备

使用DeepSpeed配置

# ds_config.json
{"train_batch_size": 4096,"train_micro_batch_size_per_gpu": 32,"zero_optimization": {"stage": 3,"contiguous_gradients": true,"overlap_comm": true},"fp16": {"enabled": true,"loss_scale_window": 100},"pipeline": {"stages": 4,"activation_checkpointing": true},"tensor_parallel": {"enabled": true,"tensor_parallel_size": 2}
}

3.4 性能调优实验

测试环境:

  • 集群:4节点 x 8 A100 (共32卡)
  • 模型:GPT-3 (175B参数)
  • 数据集:The Pile (825GB文本)

并行策略对比:

策略组合吞吐量(tokens/s)显存占用/卡通信开销占比
纯数据并行无法运行OOM-
数据+模型并行12,34538GB25%
数据+流水线并行15,67842GB18%
3D并行21,23432GB32%

3.5 本节总结

分布式训练配置要点:

  1. 网络基础:确保节点间低延迟、高带宽连接
  2. 通信优化:合理配置NCCL参数提升AllReduce效率
  3. 数据分片:使用DistributedSampler保证数据一致性
  4. 混合并行:根据模型结构选择最佳并行组合

常见故障排查表:

现象可能原因解决方案
NCCL连接超时防火墙阻止通信检查端口开放情况
梯度不同步部分参数未注册检查named_parameters完整性
内存碎片化严重频繁创建临时张量使用固定内存池
流水线气泡过大微批次数量不足增加chunks参数值
通信带宽利用率低梯度桶大小不合理调整NCCL_BUFFSIZE

结语

关键收获总结
  1. 并行策略进化论:从单卡到数据并行,从模型拆解到3D混合并行,分布式训练的核心在于计算与通信的平衡艺术
  2. 工程实践真知
    • DDP的Ring-AllReduce通信效率比DataParallel提升30%以上
    • 合理配置NCCL参数可降低40%的通信开销
    • 流水线并行能将超大模型训练速度提升5-8倍
  3. 性能优化图谱:网络拓扑优化→通信协议调优→计算流水编排→内存复用策略,形成四位一体的优化方法论
未来演进方向
  1. 智能化并行:基于计算图分析的自动并行策略生成
  2. 异构计算融合:CPU-GPU-NPU协同训练架构
  3. 容错训练机制:动态节点调度与训练状态持久化
  4. 量子通信应用:分布式训练与量子计算的融合探索
实践倡议

建议读者在以下场景中应用本文技术:

  • 当单卡batch_size小于16时启用数据并行
  • 模型参数量超过10亿时采用张量并行
  • 网络层数超过100层时实施流水线并行
  • 集群规模超过32卡时引入3D混合并行

分布式训练技术的精进永无止境,期待本文成为读者攀登AI算力高峰的坚实阶梯。让我们共同探索,在算力洪流中寻找模型智能的进化之道。

相关文章:

PyTorch进阶实战指南:02分布式训练深度优化

PyTorch进阶实战指南&#xff1a;02分布式训练深度优化 前言 在大模型时代&#xff0c;分布式训练已成为突破单机算力瓶颈的核心技术。本文深入解析PyTorch分布式训练的技术实现&#xff0c;从单机多卡并行到万卡集群协同&#xff0c;系统揭示现代深度学习规模化训练的核心机制…...

使用Vite创建一个动态网页的前端项目

1. 引言 虽然现在的前端更新换代的速度很快&#xff0c;IDE和工具一批批的换&#xff0c;但是我们始终要理解一点基本的程序构建的思维&#xff0c;这些环境和工具都是为了帮助我们更快的发布程序。笔者还记得以前写前端代码的时候&#xff0c;只使用文本编辑器&#xff0c;然…...

常见的LLM

常见的 LLM&#xff08;大语言模型&#xff0c;Large Language Models&#xff09;可以按照开源/闭源、机构/公司、用途等维度分类。以下是一些主流和常见的 LLM 及其简介&#xff1a; 一、开源 LLM Meta&#xff08;Facebook&#xff09; 名称参数量特点LLaMA 1 / 2 / 37B /…...

助力 FPGA 国产化,ALINX 携多款方案亮相深圳、广州“紫光同创 FPGA 技术研讨会”

5 月中旬&#xff0c;一年一度的紫光同创技术研讨会系列活动正式拉开帷幕&#xff0c;相继在深圳、广州带来 FPGA 技术交流盛宴。 ALINX 作为紫光同创官方合作伙伴&#xff0c;长期助力推动 FPGA 国产化应用发展&#xff0c;此次携多款基于 Kosmo-2 系列产品开发的方案 demo 亮…...

深入浅出IIC协议 - 从总线原理到FPGA实战开发 --第四篇:I2C工业级优化实践

第四篇&#xff1a;I2C工业级优化实践 副标题 &#xff1a;从实验室到产线——I2C控制器的高可靠设计秘籍 1. 时序收敛技巧 1.1 关键路径识别与优化 Vivado时序报告解析 &#xff1a; Slack (MET): 0.152ns (要求≥0) Data Path Delay: 3.821ns (逻辑布线) Cell Delay: i…...

【leetcode】70. 爬楼梯

文章目录 1. 数组2. 优化空间 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1 阶 1…...

【web全栈】若依框架B站学习视频

文章目录 基础篇-01 AI若依导学视频基础篇02 若依搭建基础篇03 入门案例基础篇04 功能详解-权限控制 基础篇-01 AI若依导学视频 基础篇02 若依搭建 基础篇03 入门案例 基础篇04 功能详解-权限控制...

MFC 捕捉桌面存成jpg案例代码

下面是关于截屏并保存成jpg文件的代码。由主函数OnCapScreenJpg()、DDBToDIB()、JpegFromDib()、DibToSamps()以及QuadFromWord()函数组成。这些函数的功能包括截取屏幕、将截取的屏幕转成设备无关bmp、再进一步压缩成jpeg格式。这些代码是从网上得到的&#xff0c;得到的代码没…...

2.4.4-死锁的处理策略-检测和解除

知识总览 死锁的检测 用资源分配图这种数据结构来检测是否产生了死锁&#xff0c;资源分配图上有2种节点&#xff0c;进程节点用圆圈表示&#xff0c;一个圆圈代表一个进程&#xff0c;还有资源节点&#xff0c;一个矩形代表一类资源&#xff0c;用矩形中的圆圈表示当前类型的…...

豪越智能仓储:为消防应急物资管理“上锁”

在城市的繁华街角&#xff0c;一场突如其来的大火无情地肆虐着一栋商业大楼。火焰在楼内疯狂蔓延&#xff0c;滚滚浓烟迅速弥漫&#xff0c;人们的生命财产安全受到了严重威胁。消防警报声骤然响起&#xff0c;消防队员们迅速出动&#xff0c;争分夺秒赶赴火灾现场。然而&#…...

(06)数字化转型之质量管理:遵循PDCA规范的全流程避险指南

在全球化竞争和消费升级的双重驱动下&#xff0c;质量管理已从单纯的产品检验演变为企业核心竞争力的重要组成部分。一个完善的质量管理体系不仅能降低质量成本、提升客户满意度&#xff0c;更能成为品牌差异化的战略武器。本文将系统性地介绍现代企业质量管理的完整框架&#…...

图论算法精解(Java 实现):从基础到高频面试题

一、图的基础表示方法 1.1 邻接矩阵&#xff08;Adjacency Matrix&#xff09; 邻接矩阵是表示图的一种直观方式&#xff0c;它使用一个二维数组来存储节点之间的连接关系。对于一个有 n 个节点的图&#xff0c;邻接矩阵是一个 nn 的矩阵&#xff0c;其中 matrix [i][j] 表示…...

[Linux] Linux信号量深度解析与实践(代码示例)

Linux信号量深度解析与实践 文章目录 Linux信号量深度解析与实践一、什么是信号量1. 信号量的核心概念2. 信号量的分类3. 信号量的操作机制 二、怎么用信号量1. 信号量API的深度解析&#xff08;1&#xff09;无名信号量API&#xff08;2&#xff09;有名信号量API&#xff08;…...

Switch最新 模拟器 Eden(伊甸)正式发布 替代Yuzu模拟器

Switch最新 模拟器 Eden&#xff08;伊甸&#xff09;正式发布 替代Yuzu模拟器 100 帧跑满《塞尔达传说&#xff1a;旷野之息》 这款模拟器基于 Yuzu 框架开发&#xff0c;但团队强调它并非…...

[cg] [ds]深度缓冲z与线性z推导

4. GLSL 代码实现 在着色器中&#xff0c;将深度缓冲值转换为线性深度&#xff1a; float LinearizeDepth(float depth, float near, float far) {// OpenGL 的 NDC 深度范围是 [-1, 1]&#xff0c;需转换float z_ndc 2.0 * depth - 1.0;// 计算线性深度return (2.0 * near …...

clock的时钟频率check代码

在芯片验证中&#xff0c;经常遇到需要check时钟频率的场景&#xff0c;由于时钟数量有很多&#xff0c;手动写代码得到后年马月&#xff0c;所以我这边写了一个宏define&#xff0c;可以通过输入参数的形式验证需要check的时钟频率&#xff0c;大大提升了验证效率和准确率&…...

企业数字化转型是否已由信息化+自动化向智能化迈进?

DeepSeek引发的AI热潮迅速蔓延到了各个行业&#xff0c;目前接入DeepSeek的企业&#xff0c;涵盖了科技互联网、云服务、电信、金融、能源、汽车、手机等热门领域&#xff0c;甚至全国各地政府机构也纷纷引入。 在 DeepSeek 等国产 AI 技术的推动下&#xff0c;众多企业已经敏锐…...

PT5F2307触摸A/D型8-Bit MCU

1. 产品概述 ● PT5F2307是一款51内核的触控A/D型8位MCU&#xff0c;内置16K*8bit FLASH、内部256*8bit SRAM、外部512*8bit SRAM、触控检测、12位高精度ADC、RTC、PWM等功能&#xff0c;抗干扰能力强&#xff0c;适用于滑条遥控器、智能门锁、消费类电子产品等电子应用领域。 …...

嵌入式STM32学习——串口USART 2.0(printf重定义及串口发送)

printf重定义&#xff1a; C语言里面的printf函数默认输出设备是显示器&#xff0c;如果要实现printf函数输出正在串口或者LCD显示屏上&#xff0c;必须要重定义标准库函数里调用的与输出设备相关的函数&#xff0c;比如printf输出到串口&#xff0c;需要将fputc里面的输出指向…...

进程信号(上)【Linux操作系统】

文章目录 进程信号信号引入进程要如何识别信号&#xff1f;进程接收到信号的时候&#xff0c;不一定马上处理信号进程处理信号的情况 信号相关概念信号产生键盘产生通过指令向进程发送信号系统调用向进程发送信号软件条件异常错误 操作系统如何知道进程出现了异常错误&#xff…...

全方位详解微服务架构中的Service Mesh(服务网格)

一、引言 随着微服务架构的广泛应用&#xff0c;微服务之间的通信管理、流量控制、安全保障等问题变得日益复杂。服务网格&#xff08;Service Mesh&#xff09;作为一种新兴的技术&#xff0c;为解决这些问题提供了有效的方案。它将服务间通信的管理从微服务代码中分离出来&a…...

bi工具是什么意思?bi工具的主要功能有哪些?

目录 一、BI 工具是什么意思&#xff1f; 1. 基本概念 2. 发展历程 ​编辑二、BI 工具的主要功能 1. 数据连接与整合 2. 数据存储与管理 3. 数据分析与挖掘 4. 可视化呈现 5. 报表生成与分享 6. 实时监控与预警 三、BI 工具的应用场景 1. 销售与营销 2. 财务与会计…...

cocos creator使用jenkins打包微信小游戏,自动上传资源到cdn,windows版运行jenkins

cocos 版本2.4.11 在windows上jenkins的具体配置和部署&#xff0c;可参考上一篇文章cocos creator使用jenkins打包流程&#xff0c;打包webmobile_jenkins打包,发布,部署cocoscreator-CSDN博客 特别注意&#xff0c;windows上运行jenkins需要关闭windows自己的jenkins服务&a…...

PaddleOCR的Pytorch推理模块

概述 在项目中&#xff0c;遇到文字识别OCR的使用场景。 然而&#xff0c;目前效果最好的PaddleOCR只能用百度的PaddlePaddle框架运行。 常见项目中&#xff0c;往往使用更普遍的Pytorch框架&#xff0c;单独安装PaddlePaddle不仅会让项目过于臃肿&#xff0c;而且可能存在冲…...

操作系统期末复习(一)

一、选择 1.从用户的观点看&#xff0c;操作系统是&#xff08;&#xff09; A.用户与计算机之间的接口 B.控制和管理计算机资源的软件 C.合理地组织计算机工作流程的软件 由若干层次的程序按一定的结构组成的有机体 答案&#xff1a;A 2.操作系统在计算机系统中位于&#x…...

今日行情明日机会——20250521

上证指数缩量收阳线&#xff0c;个股跌多涨少&#xff0c;整体处于日线上涨末端&#xff0c;注意风险。 深证指数&#xff0c;出现60分钟的顶分型&#xff0c;需要观察方向的选择。 2025年5月21日涨停股主要行业方向分析 并购重组 涨停家数&#xff1a;9家。 代表标的&am…...

传统Spring MVC + RESTful 与 Vue3 结合 JWT Token 验证的示例

以下是针对非Spring Boot项目&#xff08;传统Spring MVC&#xff09;的示例 一、项目结构 src/ ├── main/ │ ├── java/ │ │ └── com/ │ │ └── example/ │ │ ├── config/ # 配置类目录 │ │ │ ├─…...

使用Redis的Bitmap实现了签到功能

思路分析 我们可以把 年和月 作为BitMap的key&#xff0c;然后保存到一个BitMap中&#xff0c;每次签到就到对应的位上把数字从0 变为1&#xff0c;只要是1&#xff0c;就代表是这一天签到了&#xff0c;反之咋没有签到。 关键问题 问题一&#xff1a; 什么叫做连续签到天数…...

Unity-编辑器扩展-其二

今天我们来基于之前提到的编辑器扩展的内容来做一些有实际用处的内容&#xff1a; 检查丢失的组件 首先是一个比较实际的内容&#xff1a;当我们在做项目时&#xff0c;经常会涉及到预设体在不同项目或者不同文件路径下的转移&#xff0c;这个时候很容易在某个具体的prefab对…...

项目中Warmup耗时高该如何操作处理

1&#xff09;项目中Warmup耗时高该如何操作处理 2&#xff09;如何在卸载资源后Untracked和Other的内存都回收 3&#xff09;总Triangles的值是否包含了通过GPU Instancing画的三角形 4&#xff09;有没有用Lua来修复虚幻引擎中对C代码进行插桩Hook的方案 这是第432篇UWA技术知…...

php://filter的trick

php://filter流最常见的用法就是文件包含读取文件&#xff0c;但是它不止可以用来读取文件&#xff0c;还可以和RCE&#xff0c;XXE&#xff0c;反序列化等进行组合利用 filter协议介绍 php://filter是php独有的一种协议&#xff0c;它是一种过滤器&#xff0c;可以作为一个中…...

STM32 I2C硬件读写

一、I2C外设简介 STM32内部集成了硬件I2C收发电路&#xff0c;可以由硬件自动执行时钟生成、起始终止条件生成、应答位收发、数据收发等功能&#xff0c;减轻CPU的负担支持多主机模型&#xff08;固定多主机、可变多主机&#xff09;支持7位/10位地址模式支持不同的通讯速度&a…...

Qt+线段拖曳示例代码

Qt线段拖曳示例代码&#xff0c;功能见下图。 代码如下&#xff1a; canvaswidget.h #ifndef CANVASWIDGET_H #define CANVASWIDGET_H#include <QWidget> #include <QPainter> #include <QMouseEvent> #include <QVector>class CanvasWidget : publi…...

计算机网络相关面试题

一、HTTP1.1和HTTP2的区别 HTTP/1&#xff08;主要指 HTTP/1.1&#xff09;和 HTTP/2 是 Web 协议发展中的两个重要版本&#xff0c;二者在性能、协议机制和功能特性上有显著差异。以下从多个维度对比分析&#xff0c;并结合具体案例说明&#xff1a; 一、连接与请求处理方式 1…...

docker中部署Universal Media Server (UMS)

Universal Media Server (UMS) 本身主要是作为桌面服务程序开发的&#xff08;主要面向 Java GUI DLNA 播放&#xff09;&#xff0c;但确实可以通过 Docker 进行部署。虽然官方没有提供 Docker 镜像&#xff0c;但社区有一些可用的方式可以在 Docker 中运行它。 下面是一个可…...

WordPress Elementor零基础教程

一、WordPress Elementor 是什么&#xff1f;—— 可视化网站搭建 “积木工具箱” 基础定义 Elementor 是 WordPress 的一款可视化页面构建插件&#xff0c;就如同网站搭建领域的 “PPT 编辑器”。它能让你无需编写代码&#xff0c;仅通过拖放模块&#xff08;像图片、文本、…...

鸿蒙UI开发——实现一个上拉抽屉效果

1、概 述 在项目开发中&#xff0c;我们可能会遇到临时交互的场景&#xff08;即&#xff1a;弹出一个临时交互框&#xff0c;交互完毕后继续用户的主流程&#xff09;&#xff0c;效果如下&#xff1a; 在ArkUI中&#xff0c;此类弹出窗被称为“半模态页面”&#xff0c;ArkU…...

详细介绍Qwen3技术报告中提到的模型架构技术

详细介绍Qwen3技术报告中提到的一些主流模型架构技术&#xff0c;并为核心流程配上相关的LaTeX公式。 这些技术都是当前大型语言模型&#xff08;LLM&#xff09;领域为了提升模型性能、训练效率、推理速度或稳定性而采用的关键组件。 1. Grouped Query Attention (GQA) - 分组…...

docker面试题(3)

如何临时退出一个正在交互的容器的终端&#xff0c;而不终止它 按ctrlp&#xff0c;后按ctrlq &#xff0c;如果按ctrlc会使容器内的应用进程终止&#xff0c;进而会使容器终止 很多应用容器都默认是后台运行的&#xff0c;怎么查看它们输出的日志信息 使用docker logs &#…...

2025年二级等保实施全攻略:传统架构与云等保方案深度解析

2025年&#xff0c;随着《网络安全法》的深化落实和等保2.0标准的全面推行&#xff0c;二级等保已成为中小企业及非核心业务系统的合规基线。如何在高效满足监管要求的同时&#xff0c;兼顾成本与安全效能&#xff1f;本文将结合最新政策与实战经验&#xff0c;从传统架构到云等…...

技术点对比

数据库 数据库程序在线访问与ORM访问的对比 数据库程序在线ORM访问优点性能好性能差可以处理复杂sql缺点 性能&#xff1a; 复杂sql支持&#xff1a; 开发成本&#xff1a; 架构风格 管道-过滤器风格与数据仓库风格对比 管道-过滤器风格数据仓储风格备注交互方式顺序结构…...

自监督学习与监督学习

&#x1f50d; 一、监督学习 vs 自监督学习&#xff1a;核心区别 维度监督学习&#xff08;Supervised Learning&#xff09;自监督学习&#xff08;Self-Supervised Learning&#xff09;是否需要人工标注的标签✅ 需要&#xff0c;如分类标签、边界框等❌ 不需要&#xff0c…...

Java操作数据库,JDBC

package myjdbc; import com.mysql.jdbc.Driver; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; /*** 练习JDBC&#xff0c;完成一些简单的操作。*/ public class jdbc01 {public static void main(Str…...

UML 活动图 (Activity Diagram) 使用案例

UML 活动图使用案例 UML 活动图 (Activity Diagram) 使用案例活动图的主要元素典型使用案例1. 用户登录流程2. 在线购物流程3. 订单处理系统4. 文件审批流程 活动图的优势何时使用活动图 UML 活动图 (Activity Diagram) 使用案例 活动图是UML中用于描述业务流程或系统工作流程…...

回溯法求解N皇后问题

目录 前言 一、回溯法是什么&#xff1f; 二、N皇后问题描述 分析解题思路 三、算法设计 1、递归法 2、非递归法 总结 前言 本文将从递归形式和非递归形式两种方法来介绍求解N皇后问题的回溯法&#xff0c;后续也会更新更多有关算法分析这方面的问题欢迎大家关注~&#x1f929…...

网络流量分析工具ntopng的安装与基本使用

网络流量分析工具ntopng的安装与基本使用 一、ntopng基本介绍1.1 ntopng简介1.2 主要特点1.3 使用场景 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、安装ntopng工具3.1 官网地址3.2 配置软件源3.3 添加软件源3.4 安装ntopng 四、ntopng的基本配置4.1 修改配置文件4.…...

新导游入行规范与职业发展指导

随着旅游行业的蓬勃发展&#xff0c;导游作为旅游服务的重要环节&#xff0c;其职业素养和专业能力备受关注。对于新入行的导游而言&#xff0c;了解行业规范&#xff0c;明确职业发展方向&#xff0c;是开启职业生涯的重要一步。​ 一、严格遵守行业规范​ 持证上岗&#xf…...

数据结构与算法——堆

堆 树树的概念与结构树的相关术语树的表示树形结构实际运用场景 二叉树概念与结构特殊的二叉树满二叉树完全二叉树 二叉树存储结构顺序结构链式结构 实现顺序结构二叉树堆的概念与结构堆的实现向上调整算法&#xff08;插入数据&#xff09;向下调整算法 堆的应用堆排序(建堆)向…...

【写在创作纪念日】基于SpringBoot和PostGIS的各省东西南北四至极点区县可视化

目录 前言 一、空间检索简介 1、空间表结构 2、四至空间检索 二、前后端实现 1、后端实现 2、前端集成 三、成果展示 1、东部省份 2、西部省份 3、南部省份 4、北部省份 5、中部省份 四、总结 前言 在当今数字化时代&#xff0c;地理信息数据的分析与可视化对于众…...

AI驱动新增长:亚马逊Rufus广告点击率提升300%的奥秘

在生成式人工智能迅速融入商业应用的背景下&#xff0c;全球跨境电商巨头亚马逊&#xff08;Amazon&#xff09;正以前所未有的速度重构其广告生态。2024年第一季度&#xff0c;据亚马逊官方披露&#xff0c;通过部署内部开发的AI购物助手“Rufus”&#xff0c;其平台部分广告点…...