首页 > 其他分享 >大模型 - 分布式训练方法汇总

大模型 - 分布式训练方法汇总

时间:2024-08-10 15:25:35浏览次数:14  
标签:inputs torch labels 汇总 训练方法 cuda GPU model 分布式

在深度学习和模型训练中,利用 GPU 进行加速是常见的做法,而在拥有多张显卡的情况下,学会查看本地的 GPU 列表并合理选择分布式并行训练的方法是提高训练效率的重要手段。接下来,我将介绍如何使用 Python 查看本地的显卡列表,讲解几种常见的分布式训练方法及其具体实现代码,并对这些方法进行比较分析,以便你选择最适合的方案。

1. 如何查看本地的显卡列表

你可以通过多种方式查看本地的显卡列表。例如,使用 GPUtil 库可以轻松获取显卡信息:

import GPUtil

# 获取所有可用的显卡信息
gpus = GPUtil.getGPUs()

for gpu in gpus:
    print(f"GPU ID: {gpu.id}, Name: {gpu.name}, Driver Version: {gpu.driver}, Memory Total: {gpu.memoryTotal}MB")

如果你希望查看 NVIDIA 显卡的状态信息,可以使用 py3nvml 库:

from py3nvml import nvmlInit, nvmlDeviceGetCount, nvmlDeviceGetHandleByIndex, nvmlDeviceGetName

# 初始化 NVML
nvmlInit()

# 获取显卡数量
device_count = nvmlDeviceGetCount()

for i in range(device_count):
    handle = nvmlDeviceGetHandleByIndex(i)
    print(f"GPU {i}: {nvmlDeviceGetName(handle).decode('utf-8')}")

对于已经安装了 PyTorch 的用户,可以直接使用 PyTorch 自带的函数来查看可用的 CUDA 设备:

import torch

if torch.cuda.is_available():
    for i in range(torch.cuda.device_count()):
        print(f"GPU {i}: {torch.cuda.get_device_name(i)}")
else:
    print("No CUDA-compatible GPU found.")

2. 分布式并行训练的方法及其实现

在确认显卡资源后,分布式并行训练可以帮助你充分利用多张显卡,提高训练效率。以下是几种常见的方法及其实现代码:

DataParallel(适用于 PyTorch)

DataParallel 是 PyTorch 中的一个简单方法,适合初学者。它会自动将数据分配到多个 GPU 上并汇总结果。然而,由于所有结果都需通过主 GPU,可能导致 GPU 利用率低。

import torch
import torch.nn as nn

# 假设 model 是你的神经网络模型
model = nn.DataParallel(model)
model = model.to('cuda')  # 将模型放到 GPU 上

# 训练时,DataParallel 会自动将数据分配到多个 GPU
for inputs, labels in dataloader:
    inputs, labels = inputs.to('cuda'), labels.to('cuda')
    outputs = model(inputs)
    loss = criterion(outputs, labels)
    loss.backward()
    optimizer.step()
DistributedDataParallel(适用于 PyTorch)

DistributedDataParallel 是 PyTorch 中推荐的分布式训练方法,适用于单机或多机多 GPU 环境。它有效减少了 GPU 之间的通信开销,是大规模训练的理想选择。

import torch
import torch.distributed as dist
import torch.nn as nn
from torch.nn.parallel import DistributedDataParallel as DDP

# 初始化分布式环境
dist.init_process_group(backend='nccl')

# 创建模型并放到 GPU
model = model.to('cuda')
model = DDP(model, device_ids=[your_gpu_id])

# 训练模型
for inputs, labels in dataloader:
    inputs, labels = inputs.to('cuda'), labels.to('cuda')
    outputs = model(inputs)
    loss = criterion(outputs, labels)
    loss.backward()
    optimizer.step()
Horovod(适用于 TensorFlow 和 PyTorch)

Horovod 是一个支持 TensorFlow、Keras 和 PyTorch 的开源库,简化了多 GPU 和多节点的分布式训练过程。

import horovod.torch as hvd
import torch.nn as nn
import torch.optim as optim

# 初始化 Horovod
hvd.init()

# 设置 GPU 设备
torch.cuda.set_device(hvd.local_rank())

# 将模型移动到 GPU
model = model.to('cuda')

# 包装优化器
optimizer = optim.SGD(model.parameters(), lr=0.01)
optimizer = hvd.DistributedOptimizer(optimizer, named_parameters=model.named_parameters())

# 广播初始变量
hvd.broadcast_parameters(model.state_dict(), root_rank=0)

# 训练模型
for inputs, labels in dataloader:
    inputs, labels = inputs.to('cuda'), labels.to('cuda')
    outputs = model(inputs)
    loss = criterion(outputs, labels)
    loss.backward()
    optimizer.step()
MirroredStrategy(适用于 TensorFlow)

TensorFlow 提供了 tf.distribute.MirroredStrategy 来简化在多 GPU 上的分布式训练。

import tensorflow as tf

# 使用 MirroredStrategy 进行多 GPU 并行
strategy = tf.distribute.MirroredStrategy()

with strategy.scope():
    # 创建和编译模型
    model = create_model()
    model.compile(loss='sparse_categorical_crossentropy',
                  optimizer='adam',
                  metrics=['accuracy'])

# 训练模型
model.fit(train_dataset, epochs=10)
DeepSpeed(适用于 PyTorch)

DeepSpeed 是一个针对大规模分布式训练的优化库,可以帮助你在多 GPU 环境下高效地训练大型模型。

import deepspeed

# 初始化 DeepSpeed
model_engine, optimizer, _, _ = deepspeed.initialize(
    model=model,
    model_parameters=model.parameters(),
    config_params='deepspeed_config.json'
)

# 训练模型
for inputs, labels in dataloader:
    inputs, labels = inputs.to('cuda'), labels.to('cuda')
    outputs = model_engine(inputs)
    loss = criterion(outputs, labels)
    model_engine.backward(loss)
    model_engine.step()

3. 不同方法之间的对比

在实际应用中,不同的分布式训练方法有各自的特点和适用场景。以下是对这些方法的简要对比:

方法框架支持数据并行类型适用场景优点缺点
DataParallelPyTorch同步数据并行单机多 GPU实现简单,适合快速上手GPU 利用率低,主 GPU 成为瓶颈
DistributedDataParallelPyTorch同步数据并行单机/多机多 GPU高效,适合大规模训练,减少 GPU 间通信开销实现相对复杂,需要初始化分布式环境
HorovodTensorFlow, Keras, PyTorch同步数据并行单机/多机多 GPU,特别是多节点训练简化分布式训练,支持多种框架,集成方便需要安装和配置,初学者可能觉得复杂
MirroredStrategyTensorFlow同步数据并行单机多 GPU简单易用,原生支持 TensorFlow仅限于 TensorFlow,适用范围有限
DeepSpeedPyTorch混合并行(数据并行、模型并行)大规模模型训练优化大模型训练,支持模型并行、梯度压缩等配置复杂,适合有一定经验的用户

总结

在查看本地 GPU 列表后,你可以根据具体需求选择合适的分布式并行训练方法。DataParallel 简单易用,适合快速上手,而 DistributedDataParallel 则是 PyTorch 中高效的分布式训练方法。Horovod 提供了跨框架的支持,适合多节点训练,而 MirroredStrategy 是 TensorFlow 用户的优选。DeepSpeed 针对大规模模型训练进行了优化,是有经验用户的强大工具。选择合适的方法可以大幅提升你的模型训练效率和效果。

标签:inputs,torch,labels,汇总,训练方法,cuda,GPU,model,分布式
From: https://blog.csdn.net/weixin_47552266/article/details/141091527

相关文章

  • linux 常用知识汇总(非常全面!)
    1、Linux文件系统概述Linux文件系统是指操作系统用来控制文件如何存储和检索的结构和逻辑。文件系统结构根目录:/Linux文件系统从根目录(/)开始,这是所有文件和目录的起点。目录结构:Linux使用层次化目录结构,每个目录包含文件和子目录。挂载点:各种文件系统通过挂载点(m......
  • MySQL--读写分离与分布式存储
    前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除一、读写分离1、什么是读写分离在数据库集群架构中,让主库负责处理写入操作,而从库只负责处理select查询,让两者分工明确达到提高数据库整体读写性能。当然,主数据库另外一个功能就是负责将数据变更同......
  • 周报 | 24.7.29-24.8.4文章汇总
    为了更好地整理文章和发表接下来的文章,以后每周都汇总一份周报。周报|24.7.22-24.7.28文章汇总-CSDN博客DataFunTalk|AIAgent在1688电商平台中的应用-CSDN博客Coggle数据科学|Kaggle赛题总结:AI数学奥赛挑战赛_kaggle竞赛项目都有哪些题目-CSDN博客程序员学长|......
  • [jetson]jetson上torchvision源码下载地址汇总jetson上安装torchvision方法
    这个是jetson上使用的torchvision源码,解压后使用sudopython3setup.pyinstall即可安装,编译大约耗时30分钟完成,请耐心等待,安装这个源码之前您必须安装好由nvidia官方提供对应torchwhl文件,因此需要必须先安装好pytorch才能使用源码编译。目前我主要用这个源码给同学们安装......
  • 【IO】IPC通信机制函数(消息队列,共享内存,信号量集函数整理汇总)
            整理了一下IPC通信的函数,包括消息队列,共享内存,信号量集;信号量集的使用是在共享内存的基础上使用,函数太多啦,慢慢学吧cc,争取全部记住        其中在使用有关信号量集的函数的时候,进行简单的封装函数功能之后,再进行使用,会更加方便,在文章最后对信号量集的......
  • 汇总性采购订单
    在消耗型物料的““标准””采购中,至少必须为每笔采购事务创建一个采购订单。此采购订单用作发票校验的基础。通常还根据常规采购订单输入收货。在某些情况下,会存在上游(先前)凭证,如采购申请或报价单。您可以创建一个有效期较长(例如一年),且具有特定项目值限制的采购订单。使用......
  • 分布式存储和集中式存储的区别是什么?应用场景是什么?
    原文链接:https://www.jb51.net/blockchain/944935.html在数字领域中,会有分布式存储和集中式存储这两概念,分布式存储是指数据分布在多个存储节点上,这些节点可以位于不同的地理位置。集中式存储是指所有数据都存储在一个单一的中央服务器或数据中心中。关于这两种存储方式,很多新手......
  • 快速基于 ClickHouse + Grafana 搭建可观测性解决方案 - 分布式链路追踪篇(ClickHouse
    引言在ClickHouse,我们认为可观测性仅仅是另一个实时分析问题。作为一款高性能的实时分析数据库,ClickHouse被用于多种场景,包括时间序列数据的实时分析。其应用场景的多样性推动了大量分析函数的发展,这些函数有助于查询大多数数据类型。这些查询特性和高压缩率使得越来越多的用户......
  • Redis连接问题解决汇总
    Redis连接失败常见解决方案1.检查Redis命令行是否可以正常连接使用命令行客户端,输入:redis-cli-h虚拟机ip地址-p6379-aredis访问密码如若连接成功,输入ping,看控制台是否返回PONG此步骤若正常,则代表虚拟机可正常连接2.Redis命令行无法正常连接1)未打开Redis6379端口......
  • 2024年最新免费AI大模型API汇总及国内大模型使用教程(附代码)
    免费大模型API一览大模型免费版本免费限制控制台(api_key等)API文档讯飞星火大模型spark-litetokens:总量无限;QPS:2;(每秒发送的请求数)有效期:不限访问链接访问链接百度千帆大模型平台ERNIE-Speed-8KRPM=300,TPM=300000(RPM是每分钟请求数(RequestsPerMinute),TPM是指每分......