PyTorch 分布式训练:DDP vs FSDP

news2026/4/17 0:38:51
PyTorch 分布式训练DDP vs FSDP核心结论DDP (DistributedDataParallel)基于数据并行的分布式训练方法适用于中小规模模型FSDP (FullyShardedDataParallel)基于模型分片的分布式训练方法适用于超大规模模型性能对比DDP 在中小模型上速度更快FSDP 在大模型上内存效率更高适用场景DDP 适合一般深度学习任务FSDP 适合超大模型训练内存优化FSDP 通过模型分片显著减少内存使用一、分布式训练基础1.1 为什么需要分布式训练模型规模增长现代深度学习模型规模越来越大单个 GPU 内存无法容纳训练速度提升通过多 GPU 并行加速训练过程数据并行将数据分成多个批次同时在多个 GPU 上处理模型并行将模型分成多个部分在不同 GPU 上运行1.2 分布式训练的挑战通信开销GPU 之间的通信成为瓶颈内存管理大模型需要高效的内存管理同步机制确保不同 GPU 上的模型参数保持一致扩展性随着 GPU 数量增加性能是否线性提升1.3 PyTorch 分布式训练组件torch.distributed核心分布式训练库DDP数据并行实现FSDP模型分片实现RPC远程过程调用集体通信all_reduce, broadcast, gather 等操作二、DDP (DistributedDataParallel) 详解2.1 DDP 基本原理数据并行每个 GPU 拥有完整的模型副本梯度同步通过 all_reduce 操作同步梯度批处理每个 GPU 处理不同的数据批次同步更新所有 GPU 完成梯度计算后统一更新参数2.2 DDP 工作流程初始化进程组设置分布式环境模型复制将模型复制到每个 GPU数据分发将数据分发到不同 GPU前向传播每个 GPU 独立执行前向计算反向传播计算梯度梯度同步通过 all_reduce 同步梯度参数更新使用同步后的梯度更新模型参数2.3 代码示例DDP 基本用法import torch import torch.distributed as dist import torch.nn as nn import torch.optim as optim from torch.utils.data import Dataset, DataLoader from torch.nn.parallel import DistributedDataParallel as DDP import os import argparse # 解析命令行参数 parser argparse.ArgumentParser() parser.add_argument(--local_rank, typeint, default0) args parser.parse_args() # 初始化进程组 dist.init_process_group(backendnccl) torch.cuda.set_device(args.local_rank) # 定义简单模型 class SimpleModel(nn.Module): def __init__(self): super(SimpleModel, self).__init__() self.fc1 nn.Linear(1000, 512) self.fc2 nn.Linear(512, 256) self.fc3 nn.Linear(256, 10) def forward(self, x): x torch.relu(self.fc1(x)) x torch.relu(self.fc2(x)) x self.fc3(x) return x # 创建模型并移至 GPU model SimpleModel().cuda(args.local_rank) # 包装为 DDP 模型 model DDP(model, device_ids[args.local_rank], output_deviceargs.local_rank) # 定义损失函数和优化器 criterion nn.CrossEntropyLoss() optimizer optim.SGD(model.parameters(), lr0.001) # 创建数据集和数据加载器 class RandomDataset(Dataset): def __len__(self): return 1000 def __getitem__(self, idx): return torch.randn(1000), torch.randint(0, 10, (1,)).item() dataset RandomDataset() sampler torch.utils.data.distributed.DistributedSampler(dataset) dataloader DataLoader(dataset, batch_size32, samplersampler) # 训练循环 epochs 10 for epoch in range(epochs): sampler.set_epoch(epoch) # 确保每个 epoch 数据打乱 running_loss 0.0 for i, (inputs, labels) in enumerate(dataloader): inputs inputs.cuda(args.local_rank) labels labels.cuda(args.local_rank) # 前向传播 outputs model(inputs) loss criterion(outputs, labels) # 反向传播和优化 optimizer.zero_grad() loss.backward() optimizer.step() running_loss loss.item() if i % 10 9 and args.local_rank 0: print(fEpoch [{epoch1}/{epochs}], Step [{i1}/{len(dataloader)}], Loss: {running_loss/10:.4f}) running_loss 0.0 # 清理进程组 dist.destroy_process_group()2.4 DDP 的优缺点优点实现简单易于使用通信开销相对较小适合中小规模模型训练速度快缺点每个 GPU 需要完整的模型副本内存使用效率低不适合超大规模模型三、FSDP (FullyShardedDataParallel) 详解3.1 FSDP 基本原理模型分片将模型参数、梯度和优化器状态分片到多个 GPU内存优化显著减少每个 GPU 的内存使用计算效率通过流水线并行提高计算效率灵活性支持不同的分片策略3.2 FSDP 工作流程初始化进程组设置分布式环境模型分片将模型参数分片到不同 GPU数据分发将数据分发到不同 GPU前向传播按需加载模型参数执行前向计算反向传播计算梯度并更新分片参数参数同步通过通信同步分片参数参数更新使用同步后的梯度更新模型参数3.3 代码示例FSDP 基本用法import torch import torch.distributed as dist import torch.nn as nn import torch.optim as optim from torch.utils.data import Dataset, DataLoader from torch.distributed.fsdp import FullyShardedDataParallel as FSDP from torch.distributed.fsdp.fully_sharded_data_parallel import CPUOffload import os import argparse # 解析命令行参数 parser argparse.ArgumentParser() parser.add_argument(--local_rank, typeint, default0) args parser.parse_args() # 初始化进程组 dist.init_process_group(backendnccl) torch.cuda.set_device(args.local_rank) # 定义模型 class LargeModel(nn.Module): def __init__(self): super(LargeModel, self).__init__() self.fc1 nn.Linear(10000, 5000) self.fc2 nn.Linear(5000, 2500) self.fc3 nn.Linear(2500, 1000) self.fc4 nn.Linear(1000, 500) self.fc5 nn.Linear(500, 10) def forward(self, x): x torch.relu(self.fc1(x)) x torch.relu(self.fc2(x)) x torch.relu(self.fc3(x)) x torch.relu(self.fc4(x)) x self.fc5(x) return x # 创建模型 model LargeModel() # 配置 FSDP fsdp_config { full_shard_strategy: FSDP.ShardingStrategy.FULL_SHARD, cpu_offload: CPUOffload(offload_paramsTrue), auto_wrap_policy: lambda module: isinstance(module, nn.Linear), } # 包装为 FSDP 模型 model FSDP( model, **fsdp_config ) # 定义损失函数和优化器 criterion nn.CrossEntropyLoss() optimizer optim.SGD(model.parameters(), lr0.001) # 创建数据集和数据加载器 class RandomDataset(Dataset): def __len__(self): return 1000 def __getitem__(self, idx): return torch.randn(10000), torch.randint(0, 10, (1,)).item() dataset RandomDataset() sampler torch.utils.data.distributed.DistributedSampler(dataset) dataloader DataLoader(dataset, batch_size32, samplersampler) # 训练循环 epochs 10 for epoch in range(epochs): sampler.set_epoch(epoch) running_loss 0.0 for i, (inputs, labels) in enumerate(dataloader): inputs inputs.cuda(args.local_rank) labels labels.cuda(args.local_rank) # 前向传播 outputs model(inputs) loss criterion(outputs, labels) # 反向传播和优化 optimizer.zero_grad() loss.backward() optimizer.step() running_loss loss.item() if i % 10 9 and args.local_rank 0: print(fEpoch [{epoch1}/{epochs}], Step [{i1}/{len(dataloader)}], Loss: {running_loss/10:.4f}) running_loss 0.0 # 清理进程组 dist.destroy_process_group()3.4 FSDP 的优缺点优点内存使用效率高支持超大规模模型灵活的分片策略支持 CPU 卸载缺点实现相对复杂通信开销较大中小模型上可能比 DDP 慢配置参数较多四、DDP 与 FSDP 对比4.1 性能对比模型规模方法GPU 内存使用训练速度扩展性小型模型 (10M 参数)DDP低快好小型模型 (10M 参数)FSDP低中中中型模型 (100M 参数)DDP中快好中型模型 (100M 参数)FSDP低中中大型模型 (1B 参数)DDP高慢差大型模型 (1B 参数)FSDP中中好超大型模型 (10B 参数)DDP不可行--超大型模型 (10B 参数)FSDP高中好4.2 内存使用对比import torch import torch.distributed as dist import torch.nn as nn from torch.nn.parallel import DistributedDataParallel as DDP from torch.distributed.fsdp import FullyShardedDataParallel as FSDP import os import psutil # 初始化进程组 dist.init_process_group(backendgloo) rank dist.get_rank() # 定义不同规模的模型 class SmallModel(nn.Module): def __init__(self): super(SmallModel, self).__init__() self.fc1 nn.Linear(1000, 512) self.fc2 nn.Linear(512, 256) self.fc3 nn.Linear(256, 10) def forward(self, x): x torch.relu(self.fc1(x)) x torch.relu(self.fc2(x)) x self.fc3(x) return x class LargeModel(nn.Module): def __init__(self): super(LargeModel, self).__init__() self.fc1 nn.Linear(10000, 5000) self.fc2 nn.Linear(5000, 2500) self.fc3 nn.Linear(2500, 1000) self.fc4 nn.Linear(1000, 500) self.fc5 nn.Linear(500, 10) def forward(self, x): x torch.relu(self.fc1(x)) x torch.relu(self.fc2(x)) x torch.relu(self.fc3(x)) x torch.relu(self.fc4(x)) x self.fc5(x) return x # 测试内存使用 def test_memory_usage(model_class, method): model model_class() if method DDP: model DDP(model) elif method FSDP: model FSDP(model) # 模拟前向和反向传播 input torch.randn(32, model.fc1.in_features) output model(input) loss output.sum() loss.backward() # 测量内存使用 memory torch.cuda.memory_allocated() / 1024**3 # GB if rank 0: print(f{model_class.__name__} with {method}: {memory:.2f} GB) # 测试 test_memory_usage(SmallModel, DDP) test_memory_usage(SmallModel, FSDP) test_memory_usage(LargeModel, DDP) test_memory_usage(LargeModel, FSDP) # 清理 dist.destroy_process_group()4.3 训练速度对比import torch import torch.distributed as dist import torch.nn as nn import torch.optim as optim from torch.utils.data import Dataset, DataLoader from torch.nn.parallel import DistributedDataParallel as DDP from torch.distributed.fsdp import FullyShardedDataParallel as FSDP import time import os # 初始化进程组 dist.init_process_group(backendnccl) rank dist.get_rank() # 定义模型 class Model(nn.Module): def __init__(self, hidden_size): super(Model, self).__init__() self.fc1 nn.Linear(1000, hidden_size) self.fc2 nn.Linear(hidden_size, hidden_size) self.fc3 nn.Linear(hidden_size, 10) def forward(self, x): x torch.relu(self.fc1(x)) x torch.relu(self.fc2(x)) x self.fc3(x) return x # 创建数据集 class RandomDataset(Dataset): def __len__(self): return 1000 def __getitem__(self, idx): return torch.randn(1000), torch.randint(0, 10, (1,)).item() # 测试训练速度 def test_training_speed(hidden_size, method): model Model(hidden_size) if method DDP: model DDP(model) elif method FSDP: model FSDP(model) criterion nn.CrossEntropyLoss() optimizer optim.SGD(model.parameters(), lr0.001) dataset RandomDataset() sampler torch.utils.data.distributed.DistributedSampler(dataset) dataloader DataLoader(dataset, batch_size32, samplersampler) start_time time.time() for epoch in range(5): sampler.set_epoch(epoch) for inputs, labels in dataloader: outputs model(inputs) loss criterion(outputs, labels) optimizer.zero_grad() loss.backward() optimizer.step() end_time time.time() if rank 0: print(fHidden size {hidden_size} with {method}: {end_time - start_time:.2f} seconds) # 测试 test_training_speed(512, DDP) test_training_speed(512, FSDP) test_training_speed(5000, DDP) test_training_speed(5000, FSDP) # 清理 dist.destroy_process_group()五、高级配置与优化5.1 DDP 高级配置进程组配置选择合适的后端 (nccl, gloo, mpi)同步策略设置broadcast_buffers和find_unused_parameters混合精度结合 AMP (Automatic Mixed Precision) 提高性能梯度累积通过accumulate_grad_batches减少内存使用5.2 FSDP 高级配置分片策略选择FULL_SHARD,SHARD_GRAD_OP,NO_SHARDCPU 卸载通过CPUOffload进一步减少 GPU 内存使用自动包装策略自定义auto_wrap_policy控制模型分片状态字典管理使用state_dict_type控制状态字典的保存方式5.3 代码示例FSDP 高级配置from torch.distributed.fsdp import FullyShardedDataParallel as FSDP from torch.distributed.fsdp.fully_sharded_data_parallel import CPUOffload, ShardingStrategy from torch.distributed.fsdp.wrap import transformer_auto_wrap_policy import torch.nn as nn # 定义模型 class TransformerLayer(nn.Module): def __init__(self, d_model): super(TransformerLayer, self).__init__() self.attention nn.Linear(d_model, d_model) self.ffn nn.Linear(d_model, d_model) def forward(self, x): x torch.relu(self.attention(x)) x torch.relu(self.ffn(x)) return x class TransformerModel(nn.Module): def __init__(self, d_model, num_layers): super(TransformerModel, self).__init__() self.layers nn.ModuleList([TransformerLayer(d_model) for _ in range(num_layers)]) self.fc nn.Linear(d_model, 10) def forward(self, x): for layer in self.layers: x layer(x) x self.fc(x) return x # 配置 FSDP fsdp_config { sharding_strategy: ShardingStrategy.FULL_SHARD, cpu_offload: CPUOffload(offload_paramsTrue), auto_wrap_policy: transformer_auto_wrap_policy(TransformerLayer), state_dict_type: FSDP.StateDictType.SHARDED_STATE_DICT, use_orig_params: True, } # 创建模型 model TransformerModel(d_model1024, num_layers10) # 包装为 FSDP 模型 model FSDP(model, **fsdp_config)六、实际应用案例6.1 中小规模模型训练场景图像分类、目标检测等一般深度学习任务推荐方法DDP配置建议使用 nccl 后端结合 AMP示例ResNet, EfficientNet 等模型6.2 大规模模型训练场景大型语言模型、大型推荐模型推荐方法FSDP配置建议使用 FULL_SHARD 策略结合 CPU 卸载示例GPT, BERT 等大型模型6.3 代码示例大规模模型训练import torch import torch.distributed as dist import torch.nn as nn import torch.optim as optim from torch.utils.data import Dataset, DataLoader from torch.distributed.fsdp import FullyShardedDataParallel as FSDP from torch.distributed.fsdp.fully_sharded_data_parallel import CPUOffload, ShardingStrategy import os import argparse # 解析命令行参数 parser argparse.ArgumentParser() parser.add_argument(--local_rank, typeint, default0) args parser.parse_args() # 初始化进程组 dist.init_process_group(backendnccl) torch.cuda.set_device(args.local_rank) # 定义大型模型 class LargeLanguageModel(nn.Module): def __init__(self, vocab_size, hidden_size, num_layers): super(LargeLanguageModel, self).__init__() self.embedding nn.Embedding(vocab_size, hidden_size) self.layers nn.ModuleList([ nn.Sequential( nn.Linear(hidden_size, hidden_size), nn.ReLU(), nn.Linear(hidden_size, hidden_size) ) for _ in range(num_layers) ]) self.fc nn.Linear(hidden_size, vocab_size) def forward(self, x): x self.embedding(x) for layer in self.layers: x layer(x) x self.fc(x) return x # 创建模型 model LargeLanguageModel(vocab_size10000, hidden_size2048, num_layers12) # 配置 FSDP fsdp_config { sharding_strategy: ShardingStrategy.FULL_SHARD, cpu_offload: CPUOffload(offload_paramsTrue), auto_wrap_policy: lambda module: isinstance(module, nn.Sequential), state_dict_type: FSDP.StateDictType.SHARDED_STATE_DICT, } # 包装为 FSDP 模型 model FSDP(model, **fsdp_config) # 定义损失函数和优化器 criterion nn.CrossEntropyLoss() optimizer optim.Adam(model.parameters(), lr1e-4) # 创建数据集 class TextDataset(Dataset): def __len__(self): return 1000 def __getitem__(self, idx): # 模拟文本数据 input_ids torch.randint(0, 10000, (512,)) labels torch.randint(0, 10000, (512,)) return input_ids, labels dataset TextDataset() sampler torch.utils.data.distributed.DistributedSampler(dataset) dataloader DataLoader(dataset, batch_size8, samplersampler) # 训练循环 epochs 3 for epoch in range(epochs): sampler.set_epoch(epoch) running_loss 0.0 for i, (input_ids, labels) in enumerate(dataloader): input_ids input_ids.cuda(args.local_rank) labels labels.cuda(args.local_rank) # 前向传播 outputs model(input_ids) loss criterion(outputs.view(-1, 10000), labels.view(-1)) # 反向传播和优化 optimizer.zero_grad() loss.backward() optimizer.step() running_loss loss.item() if i % 5 4 and args.local_rank 0: print(fEpoch [{epoch1}/{epochs}], Step [{i1}/{len(dataloader)}], Loss: {running_loss/5:.4f}) running_loss 0.0 # 保存模型 if args.local_rank 0: # 保存分片状态字典 model.save_state_dict(model_sharded.pt) # 清理进程组 dist.destroy_process_group()七、性能优化技巧7.1 通信优化使用 NCCL 后端NCCL 是 GPU 间通信的最佳选择调整通信缓冲区设置合适的timeout和init_method批量通信减少通信频率增加通信批量使用混合精度减少通信数据量7.2 内存优化梯度累积通过累积梯度减少内存使用模型分片使用 FSDP 的分片策略CPU 卸载将部分参数卸载到 CPU激活检查点使用checkpoint_activations减少激活内存7.3 计算优化混合精度训练使用torch.cuda.amp提高计算效率自动混合精度结合 FSDP 和 AMP梯度裁剪防止梯度爆炸稳定训练学习率调度使用合适的学习率调度策略7.4 代码示例混合精度训练from torch.cuda.amp import autocast, GradScaler import torch import torch.distributed as dist import torch.nn as nn import torch.optim as optim from torch.nn.parallel import DistributedDataParallel as DDP # 初始化进程组 dist.init_process_group(backendnccl) rank dist.get_rank() # 创建模型 model nn.Sequential( nn.Linear(1000, 5000), nn.ReLU(), nn.Linear(5000, 2500), nn.ReLU(), nn.Linear(2500, 10) ).cuda(rank) # 包装为 DDP 模型 model DDP(model, device_ids[rank], output_devicerank) # 定义损失函数和优化器 criterion nn.CrossEntropyLoss() optimizer optim.SGD(model.parameters(), lr0.001) # 创建梯度缩放器 scaler GradScaler() # 训练循环 for epoch in range(10): for i in range(100): # 生成随机数据 inputs torch.randn(32, 1000).cuda(rank) labels torch.randint(0, 10, (32,)).cuda(rank) # 前向传播自动混合精度 with autocast(): outputs model(inputs) loss criterion(outputs, labels) # 反向传播 optimizer.zero_grad() scaler.scale(loss).backward() scaler.step(optimizer) scaler.update() # 清理 dist.destroy_process_group()八、总结PyTorch 提供了两种主要的分布式训练方法DDP 和 FSDP。DDP 适合中小规模模型通过数据并行实现高效训练FSDP 适合超大规模模型通过模型分片显著减少内存使用。技术演进的内在逻辑从简单的数据并行到复杂的模型分片分布式训练技术的发展反映了对更大规模模型训练的需求。随着模型规模的不断增长FSDP 等内存高效的分布式训练方法将成为未来的主流。在实际应用中应根据模型规模和硬件条件选择合适的分布式训练方法中小模型优先选择 DDP享受更快的训练速度大型模型必须使用 FSDP突破内存限制超大型模型结合 FSDP 和 CPU 卸载实现更大规模的模型训练通过合理配置和优化可以充分发挥分布式训练的优势加速模型训练过程突破单 GPU 内存限制实现更大规模的深度学习模型训练。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2524988.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…