深度学习的多主机多GPU协同训练

来源于wetab AI-4o,未经验证,仅记录,供研究

A:  请介绍比较新的和先进的多主机多GPU训练方法

Q:  在现代深度学习中,多主机多GPU训练已经变得非常常见,尤其是对于大规模模型和数据集。除了PyTorch的DistributedDataParallel(DDP)之外,还有一些其他先进的方法和工具可以用于多主机多GPU训练。        以下是一些比较新的和先进的方法:

1. Horovod

Horovod 是一个由Uber开源的分布式训练框架,专门针对多GPU和多主机环境进行了优化。它支持TensorFlow、PyTorch和MxNet等多种深度学习框架。

特点
  • 易于使用:可以通过简单的API调用进行分布式训练。
  • 高性能:使用NCCL进行高效的GPU通信。
  • 灵活性:支持多种通信后端,包括MPI。
  • 容错性:支持进程动态加入和退出,提高了容错性。
安装
pip install horovod

示例代码(PyTorch)
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, Dataset
import horovod.torch as hvdclass SimpleModel(nn.Module):def __init__(self):super(SimpleModel, self).__init__()self.linear = nn.Linear(10, 5)def forward(self, x):return self.linear(x)class SimpleDataset(Dataset):def __init__(self, data, targets):self.data = dataself.targets = targetsdef __len__(self):return len(self.data)def __getitem__(self, idx):return self.data[idx], self.targets[idx]def train():# 初始化Horovodhvd.init()# 设置当前进程的GPU设备torch.cuda.set_device(hvd.local_rank())# 创建模型并将其移动到指定的GPUmodel = SimpleModel().cuda()# 创建优化器并使用Horovod包装optimizer = optim.SGD(model.parameters(), lr=0.01 * hvd.size())optimizer = hvd.DistributedOptimizer(optimizer, named_parameters=model.named_parameters())# 载入数据dataset = SimpleDataset(torch.randn(1000, 10), torch.randint(0, 2, (1000, 5)))sampler = torch.utils.data.distributed.DistributedSampler(dataset, num_replicas=hvd.size(), rank=hvd.rank())dataloader = DataLoader(dataset, batch_size=32, sampler=sampler)# 训练循环for epoch in range(10):sampler.set_epoch(epoch)for batch_idx, (data, target) in enumerate(dataloader):optimizer.zero_grad()output = model(data.cuda())loss = nn.MSELoss()(output, target.cuda())loss.backward()optimizer.step()if batch_idx % 10 == 0 and hvd.rank() == 0:print(f'Epoch {epoch}, Batch {batch_idx}, Loss {loss.item()}')if __name__ == "__main__":train()

2. DeepSpeed

DeepSpeed 是由Microsoft开源的一个深度学习优化库,特别适用于大规模模型的训练。它提供了多种优化技术,包括内存优化、梯度累积、混合精度训练等。

特点
  • 高性能:支持多种优化技术,大幅提高训练效率。
  • 易用性:通过简单的配置文件进行优化,无需修改大量代码。
  • 大规模模型支持:特别适合训练超过几十亿参数的大模型。
安装
pip install deepspeed

示例代码(PyTorch)
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, Dataset
import deepspeedclass SimpleModel(nn.Module):def __init__(self):super(SimpleModel, self).__init__()self.linear = nn.Linear(10, 5)def forward(self, x):return self.linear(x)class SimpleDataset(Dataset):def __init__(self, data, targets):self.data = dataself.targets = targetsdef __len__(self):return len(self.data)def __getitem__(self, idx):return self.data[idx], self.targets[idx]def train():# 创建模型model = SimpleModel()# 创建优化器optimizer = optim.SGD(model.parameters(), lr=0.01)# 创建数据集和数据加载器dataset = SimpleDataset(torch.randn(1000, 10), torch.randint(0, 2, (1000, 5)))dataloader = DataLoader(dataset, batch_size=32)# 使用DeepSpeed初始化模型和优化器model_engine, optimizer, _, _ = deepspeed.initialize(model=model, optimizer=optimizer, args=None)# 训练循环for epoch in range(10):for batch_idx, (data, target) in enumerate(dataloader):data, target = data.to(model_engine.local_rank), target.to(model_engine.local_rank)output = model_engine(data)loss = nn.MSELoss()(output, target)model_engine.backward(loss)model_engine.step()if batch_idx % 10 == 0 and model_engine.local_rank == 0:print(f'Epoch {epoch}, Batch {batch_idx}, Loss {loss.item()}')if __name__ == "__main__":train()

3. Megatron-LM

Megatron-LM 是一个由NVIDIA开源的高效并行化库,特别适用于大规模语言模型的训练。它提供了模型并行、数据并行和流水线并行等多种并行策略。

特点
  • 高效并行:支持多种并行策略,大幅提高训练速度。
  • 大规模模型支持:特别适合训练超过几百亿参数的模型。
  • 灵活的并行策略:可以根据模型和硬件配置灵活选择并行策略。
安装
pip install megatron-lm

示例代码
import torch
import torch.distributed as dist
import torch.nn as nn
from torch.utils.data import DataLoader, Dataset
from megatron import get_args, initialize_megatron, mpuclass SimpleModel(nn.Module):def __init__(self):super(SimpleModel, self).__init__()self.linear = nn.Linear(10, 5)def forward(self, x):return self.linear(x)class SimpleDataset(Dataset):def __init__(self, data, targets):self.data = dataself.targets = targetsdef __len__(self):return len(self.data)def __getitem__(self, idx):return self.data[idx], self.targets[idx]def train():# 初始化Megatronargs = get_args()initialize_megatron(backend='nccl', world_size=args.world_size, rank=args.rank, tensor_model_parallel_size=args.tensor_model_parallel_size, pipeline_model_parallel_size=args.pipeline_model_parallel_size)# 创建模型并将其移动到指定的GPUmodel = SimpleModel().cuda()# 创建优化器optimizer = torch.optim.SGD(model.parameters(), lr=0.01)# 创建数据集和数据加载器dataset = SimpleDataset(torch.randn(1000, 10), torch.randint(0, 2, (1000, 5)))dataloader = DataLoader(dataset, batch_size=32)# 训练循环for epoch in range(10):for batch_idx, (data, target) in enumerate(dataloader):data, target = data.cuda(), target.cuda()output = model(data)loss = nn.MSELoss()(output, target)loss.backward()optimizer.step()if batch_idx % 10 == 0 and mpu.get_data_parallel_rank() == 0:print(f'Epoch {epoch}, Batch {batch_idx}, Loss {loss.item()}')if __name__ == "__main__":# 解析命令行参数parser = argparse.ArgumentParser()parser.add_argument("--rank", type=int, required=True)parser.add_argument("--world-size", type=int, required=True)parser.add_argument("--tensor-model-parallel-size", type=int, default=1)parser.add_argument("--pipeline-model-parallel-size", type=int, default=1)args = parser.parse_args()# 设置环境变量os.environ["MASTER_ADDR"] = "192.168.1.1"os.environ["MASTER_PORT"] = "1234"train()

4. PyTorch Elastic

PyTorch Elastic 是PyTorch的一个扩展,用于在动态集群环境中进行分布式训练。它支持自动的规模扩展和容错性。

特点
  • 动态扩展:支持训练过程中动态增加或减少计算资源。
  • 容错性:支持进程动态加入和退出,提高了容错性。
示例代码
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
from torch.utils.data import DataLoader, Dataset
import argparseclass SimpleModel(nn.Module):def __init__(self):super(SimpleModel, self).__init__()self.linear = nn.Linear(10, 5)def forward(self, x):return self.linear(x)class SimpleDataset(Dataset):def __init__(self, data, targets):self.data = dataself.targets = targetsdef __len__(self):return len(self.data)def __getitem__(self, idx):return self.data[idx], self.targets[idx]def train(rank, world_size, backend):dist.init_process_group(backend, rank=rank, world_size=world_size)torch.cuda.set_device(rank)# 创建模型并将其移动到指定的GPUmodel = SimpleModel().to(rank)ddp_model = DDP(model, device_ids=[rank])# 创建优化器optimizer = optim.SGD(ddp_model.parameters(), lr=0.01)# 创建数据集和数据加载器dataset = SimpleDataset(torch.randn(1000, 10), torch.randint(0, 2, (1000, 5)))sampler = torch.utils.data.distributed.DistributedSampler(dataset)dataloader = DataLoader(dataset, batch_size=32, sampler=sampler)# 训练循环for epoch in range(10):sampler.set_epoch(epoch)for batch_idx, (data, target) in enumerate(dataloader):optimizer.zero_grad()output = ddp_model(data)loss = nn.MSELoss()(output, target.to(rank))loss.backward()optimizer.step()if batch_idx % 10 == 0 and rank == 0:print(f'Epoch {epoch}, Batch {batch_idx}, Loss {loss.item()}')dist.destroy_process_group()if __name__ == "__main__":parser = argparse.ArgumentParser()parser.add_argument("--rank", type=int, required=True)parser.add_argument("--world-size", type=int, required=True)parser.add_argument("--backend", type=str, default="nccl")args = parser.parse_args()train(args.rank, args.world_size, args.backend)

5. Ray

Ray 是一个用于构建分布式应用程序的框架,支持分布式训练、超参数调优等任务。

特点
  • 灵活性:支持多种深度学习框架和库。
  • 高性能:提供了高效的分布式调度和通信机制。
  • 易用性:通过高级API简化分布式应用的开发。
示例代码
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, Dataset
import ray
from ray.util import ActorPoolclass SimpleModel(nn.Module):def __init__(self):super(SimpleModel, self).__init__()self.linear = nn.Linear(10, 5)def forward(self, x):return self.linear(x)class SimpleDataset(Dataset):def __init__(self, data, targets):self.data = dataself.targets = targetsdef __len__(self):return len(self.data)def __getitem__(self, idx):return self.data[idx], self.targets[idx]@ray.remote(num_gpus=1)
class Worker:def __init__(self, rank, world_size):self.rank = rankself.world_size = world_sizeself.device = torch.device(f"cuda:{self.rank}")# 创建模型并将其移动到指定的GPUself.model = SimpleModel().to(self.device)# 创建优化器self.optimizer = optim.SGD(self.model.parameters(), lr=0.01)# 创建数据集和数据加载器dataset = SimpleDataset(torch.randn(1000, 10), torch.randint(0, 2, (1000, 5)))self.dataloader = DataLoader(dataset, batch_size=32)def train_step(self, data, target):self.optimizer.zero_grad()output = self.model(data.to(self.device))loss = nn.MSELoss()(output, target.to(self.device))loss.backward()self.optimizer.step()return loss.item()def train(world_size):workers = [Worker.remote(i, world_size) for i in range(world_size)]pool = ActorPool(workers)for epoch in range(10):for batch_idx, (data, target) in enumerate(dataloader):losses = list(pool.map(lambda w, v: w.train_step.remote(v[0], v[1]), [(data, target)] * world_size))avg_loss = sum(losses) / len(losses)if batch_idx % 10 == 0:print(f'Epoch {epoch}, Batch {batch_idx}, Average Loss {avg_loss}')if __name__ == "__main__":ray.init()world_size = 2  # 假设有两块GPUtrain(world_size)ray.shutdown()

结论

        这些先进的多主机多GPU训练方法各有特点,适用的场景也有所不同。选择哪种方法取决于你的具体需求和硬件配置:

  • Horovod:简单易用,支持多种深度学习框架,适合中小规模的分布式训练。
  • DeepSpeed:提供多种优化技术,特别适合大规模模型的训练。
  • Megatron-LM:高效的并行策略,特别适合大规模语言模型的训练。
  • PyTorch Elastic:支持动态扩展和容错性,适合在云环境中进行分布式训练。
  • Ray:灵活性高,支持多种任务,适合构建复杂的分布式应用程序。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PCA 原理推导

针对高维数据的降维问题,PCA 的基本思路如下:首先将需要降维的数据的各个变量标准化(规范化)为均值为 0,方差为 1 的数据集,然后对标准化后的数据进行正交变换,将原来的数据转换为若干个线性无关…

Selective attention improves transformer详细解读

Selective attention improves transformer Google 2024.10.3 一句话:简单且无需额外参数的选择性注意力机制,通过选择性忽略不相关信息并进行上下文剪枝,在不增加计算复杂度的情况下显著提升了Transformer模型的语言建模性能和推理效率。 论…

卡尔曼滤波:从理论到应用的简介

卡尔曼滤波(Kalman Filter)是一种递归算法,用于对一系列噪声观测数据进行动态系统状态估计。它广泛应用于导航、控制系统、信号处理、金融预测等多个领域。本文将介绍卡尔曼滤波的基本原理、核心公式和应用案例。 1. 什么是卡尔曼滤波&#x…

tdengine学习笔记

官方文档:用 Docker 快速体验 TDengine | TDengine 文档 | 涛思数据 整体架构 TDENGINE是分布式,高可靠,支持水平扩展的架构设计 TDengine分布式架构的逻辑结构图如下 一个完整的 TDengine 系统是运行在一到多个物理节点上的,包含…

ROS进阶:使用URDF和Xacro构建差速轮式机器人模型

前言 本篇文章介绍的是ROS高效进阶内容,使用URDF 语言(xml格式)做一个差速轮式机器人模型,并使用URDF的增强版xacro,对机器人模型文件进行二次优化。 差速轮式机器人:两轮差速底盘由两个动力轮位于底盘左…

VPI photonics的一些使用经验(测相位 快速搜索)持续更新

1.使用FuncSinEl模块的注意事项: 2.在VPI player(示波器)测电信号相位时候,可以使用正则表达式,快速搜索。 比如我要搜索以30开头的数据,输入: ^30 其他的正则表达式不适用,比如以…

前端知识点---this的用法 , this动态绑定(Javascript)

文章目录 this动态绑定 , this的用法01. 全局作用域下的 this02. 函数中的 this2.1 普通函数调用2.2 构造函数调用2.3 箭头函数中的 this 03对象方法调用04. 事件处理中的 this05. 动态绑定的方式5.1 call 方法5.2 apply 方法5.3 bind 方法 06类中的 this07. 总结 this动态绑定…

【MySQL 保姆级教学】详细讲解视图--(15)

视图 1. 为什么要有视图?2.视图的定义和特点3. 创建视图4. 视图的使用举例4.1 创建表并插入数据4.2 举例 5. 视图和基表之间有什么联系呢? 1. 为什么要有视图? 当我们频繁地使用用多表查询和复合查询出的结果时,就需要频繁的使用…

聊聊Flink:Flink的分区机制

一、前言 flink任务在执行过程中,一个流(stream)包含一个或多个分区(Stream partition)。TaskManager中的一个slot的subtask就是一个stream partition(流分区),一个Job的流&#xf…

探索SAP财务管理软件:重塑企业财务管理新境界

在当今瞬息万变的商业环境中,企业对于财务管理的精准性、高效性和透明度要求日益增高。作为全球领先的企业管理软件解决方案提供商,SAP凭借其强大的财务管理软件,正引领着全球企业迈向财务管理的新纪元。 SAP 财务管理系统通过智能化技术&am…

数字孪生乡村:数字乡村智慧化营建思路

数字化技术已然成为全球理论和产业界关注的热点命题 ,并广泛应用于城市规划、交通管理、工业、医疗、教育等领域,已经成为文化遗产保护领域最主要方式 ,如数字非遗、数字文物、数字文旅等。 传统村落的数字化保护呈现由单一技术向多技术集成…

《FreeRTOS任务基础知识以及任务创建相关函数》

目录 1.FreeRTOS多任务系统与传统单片机单任务系统的区别 2.FreeRTOS中的任务(Task)介绍 2.1 任务特性 2.2 FreeRTOS中的任务状态 2.3 FreeRTOS中的任务优先级 2.4 在任务函数中退出 2.5 任务控制块和任务堆栈 2.5.1 任务控制块 2.5.2 任务堆栈…

SpringCloud基础 入门级 学习SpringCloud 超详细(简单通俗易懂)

Spring Cloud 基础入门级学习 超详细(简单通俗易懂) 一、SpringCloud核心组件第一代:SpringCloud Netflix组件第二代:SpringCloud Alibaba组件SpringCloud原生组件 二、SpringCloud体系架构图三、理解分布式与集群分布式集群 四、…

Photoshop(PS)——人像磨皮

1.新建一个文件,背景为白色,将图片素材放入文件中 2.利用CtrlJ 复制两个图层出来,选择第一个拷贝图层,选择滤镜---杂色---蒙尘与划痕 3.调整一下数值,大概能够模糊痘印痘坑,点击确定。 4.然后选择拷贝2图层…

core 文件

sysctl -a | grep core_pattern 查看core 的路径 linux下寻找段错误的方法 - 空水 - 博客园 /var/log/messages dmesg -T 一、dmesg命令 dmesg命令,用于获取程序出错时的堆栈地址,用grep过滤出发生崩溃的程序,以及对应的堆栈信息 [Thu Nov …

centos rich 美观打印日志

文章目录 步骤 1: 安装 Python 和 pip步骤 2: 安装 rich-cli步骤 3: 验证安装步骤 4: 使用 rich-cli参考 在 CentOS 上安装 rich-cli 工具,你可以按照以下步骤进行操作。rich-cli 是一个命令行工具,用于将 rich 库的功能(例如美化输出&#x…

《动手学深度学习》中d2l库的安装以及问题解决

当我们在按照《动手学深度学习》这本书或者网课学习时会有需要导入d2l库的使用。​d2I是一个与《动手学深度学习》(Dive into Deep Learning)一书配套的开源教学库,它包含了作者李沐设计的深度学习相关代码和示例。这个库旨在帮助读者通过实践经验来理解…

【大模型实战篇】vLLM的由来以及大模型部署、推理加速实践

1. 问题背景分析及vLLM的由来 大模型毫无疑问,在工作、生活中已经逐渐扮演越来越重要的角色。但大模型的尺寸一般都比较大,处理一个大模型请求的成本可能比传统关键字查询高出 10 倍。推理的成本代价较高,因此提高大模型服务系统的吞吐量&…

常用在汽车PKE无钥匙进入系统的高度集成SOC芯片:CSM2433

CSM2433是一款集成2.4GHz频段发射器、125KHz接收器和8位RISC(精简指令集)MCU的SOC芯片,用在汽车PKE无钥匙进入系统里。 什么是汽车PKE无钥匙进入系统? 无钥匙进入系统具有无钥匙进入并且启动的功能,英文名称是PKE&…

路由器基本原理与配置

一 , 路由是什么? 从源主机到目标主机的转发过程; 二 , 路由器 (1)路由器的工作原理 路由器是一种三层设备,是使用IP地址寻址,实现从源IP到达目标IP地址的端到端的服务&#xff0c…