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

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

在深度学习和模型训练中,利用 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 torchif 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 针对大规模模型训练进行了优化,是有经验用户的强大工具。选择合适的方法可以大幅提升你的模型训练效率和效果。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • SQL-锁
  • 【算法】最短路径算法思路小结
  • C#中Override与New关键字的运用及实例解析
  • c# 什么是扩展方法
  • Oracle-OracleConnector
  • Linux应用层开发(7):网络编程
  • html+css+js网页设计 找法网2个页面(带js)ui还原度百分之90
  • C语言实现UDP广播
  • 力扣227题基本计算器II(Python实现)
  • Kali Linux——网络安全的瑞士军刀
  • 登录页滑块验证图
  • Windows下编译安装PETSc
  • 简单介绍BTC的Layer2项目RGB
  • Java面试篇(JVM相关专题)
  • C#使用NPOI进行Excel和Word文件处理(二)
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • [nginx文档翻译系列] 控制nginx
  • 【附node操作实例】redis简明入门系列—字符串类型
  • angular学习第一篇-----环境搭建
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • Fastjson的基本使用方法大全
  • fetch 从初识到应用
  • PAT A1092
  • React+TypeScript入门
  • vue-router 实现分析
  • windows-nginx-https-本地配置
  • 闭包,sync使用细节
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • - 概述 - 《设计模式(极简c++版)》
  • 构建二叉树进行数值数组的去重及优化
  • 前端工程化(Gulp、Webpack)-webpack
  • 树莓派 - 使用须知
  • 通过几道题目学习二叉搜索树
  • 一个SAP顾问在美国的这些年
  • nb
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • ​虚拟化系列介绍(十)
  • # 职场生活之道:善于团结
  • #VERDI# 关于如何查看FSM状态机的方法
  • #数据结构 笔记一
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (1)SpringCloud 整合Python
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (PySpark)RDD实验实战——取最大数出现的次数
  • (补)B+树一些思想
  • (第二周)效能测试
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (一)Thymeleaf用法——Thymeleaf简介
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (状压dp)uva 10817 Headmaster's Headache
  • **CI中自动类加载的用法总结