pytorch基于ray和accelerate实现多GPU数据并行的模型加速训练

这篇具有很好参考价值的文章主要介绍了pytorch基于ray和accelerate实现多GPU数据并行的模型加速训练。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在pytorch的DDP原生代码使用的基础上,ray和accelerate两个库对于pytorch并行训练的代码使用做了更加友好的封装。

以下为极简的代码示例。

ray

ray.py

#coding=utf-8
import os
import sys
import time
import numpy as np
import torch
from torch import nn
import torch.utils.data as Data
import ray
from ray.train.torch import TorchTrainer
from ray.air.config import ScalingConfig
import onnxruntime

# bellow code use AI model to simulate linear regression, formula is: y = x1 * w1 + x2 * w2 + b
# --- DDP RAY --- # 

# model structure
class LinearNet(nn.Module):
    def __init__(self, n_feature):
        super(LinearNet, self).__init__()
        self.linear = nn.Linear(n_feature, 1)
    
    def forward(self, x):
        y = self.linear(x)
        return y

# whole train task
def train_task():
    print("--- train_task, pid: ", os.getpid())

    # device setting
    device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
    print("device:", device)
    device_ids = torch._utils._get_all_device_indices()
    print("device_ids:", device_ids)
    if len(device_ids) <= 0:
        print("invalid device_ids, exit")
        return

    # prepare data
    num_inputs = 2
    num_examples = 1000
    true_w = [2, -3.5]
    true_b = 3.7

    features = torch.tensor(np.random.normal(0, 1, (num_examples, num_inputs)), dtype=torch.float)
    labels = true_w[0] * features[:, 0] + true_w[1] * features[:, 1] + true_b + torch.tensor(np.random.normal(0, 0.01, size=num_examples), dtype=torch.float)

    # load data
    batch_size = 10
    dataset = Data.TensorDataset(features, labels)
    data_iter = Data.DataLoader(dataset, batch_size, shuffle=True)

    for X, y in data_iter:
        print(X, y)
        break

    data_iter = ray.train.torch.prepare_data_loader(data_iter)

    # model define and init
    model = LinearNet(num_inputs)
    ddp_model = ray.train.torch.prepare_model(model)
    print(ddp_model)

    # cost function
    loss = nn.MSELoss()

    # optimizer
    optimizer = torch.optim.SGD(ddp_model.parameters(), lr=0.03)

    # train
    num_epochs = 6
    for epoch in range(1, num_epochs + 1):
        batch_count = 0
        sum_loss = 0.0
        for X, y in data_iter:
            output = ddp_model(X)
            l = loss(output, y.view(-1, 1))
            optimizer.zero_grad()
            l.backward()
            optimizer.step()
            
            batch_count += 1
            sum_loss += l.item()
        print('epoch %d, avg_loss: %f' % (epoch, sum_loss / batch_count))

    # save model
    print("save model, pid: ", os.getpid())
    torch.save(ddp_model.module.state_dict(), "ddp_ray_model.pt")

def ray_launch_task():
    num_workers = 2
    scaling_config = ScalingConfig(num_workers=num_workers, use_gpu=True)
    trainer = TorchTrainer(train_loop_per_worker=train_task, scaling_config=scaling_config)
    results = trainer.fit()

def predict_task():
    print("--- predict_task")

    # prepare data
    num_inputs = 2
    num_examples = 20
    true_w = [2, -3.5]
    true_b = 3.7

    features = torch.tensor(np.random.normal(0, 1, (num_examples, num_inputs)), dtype=torch.float)
    labels = true_w[0] * features[:, 0] + true_w[1] * features[:, 1] + true_b + torch.tensor(np.random.normal(0, 0.01, size=num_examples), dtype=torch.float)

    model = LinearNet(num_inputs)
    model.load_state_dict(torch.load("ddp_ray_model.pt"))

    model.eval()

    x, y = features[6], labels[6]
    pred_y = model(x)
    print("x:", x)
    print("y:", y)
    print("pred_y:", y)

if __name__ == "__main__":
    print("==== task begin ====")
    print("python version:", sys.version)
    print("torch version:", torch.__version__)
    print("model name:", LinearNet.__name__)
    
    ray_launch_task()
    # predict_task()

    print("==== task end ====")


accelerate

acc.py文章来源地址https://www.toymoban.com/news/detail-676265.html

#coding=utf-8
import os
import sys
import time
import numpy as np
from accelerate import Accelerator
import torch
from torch import nn
import torch.utils.data as Data
import onnxruntime

# bellow code use AI model to simulate linear regression, formula is: y = x1 * w1 + x2 * w2 + b
# --- accelerate --- # 

# model structure
class LinearNet(nn.Module):
    def __init__(self, n_feature):
        super(LinearNet, self).__init__()
        self.linear = nn.Linear(n_feature, 1)
    
    def forward(self, x):
        y = self.linear(x)
        return y

# whole train task
def train_task():
    print("--- train_task, pid: ", os.getpid())

    # device setting
    device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
    print("device:", device)
    device_ids = torch._utils._get_all_device_indices()
    print("device_ids:", device_ids)
    if len(device_ids) <= 0:
        print("invalid device_ids, exit")
        return

    # prepare data
    num_inputs = 2
    num_examples = 1000
    true_w = [2, -3.5]
    true_b = 3.7

    features = torch.tensor(np.random.normal(0, 1, (num_examples, num_inputs)), dtype=torch.float)
    labels = true_w[0] * features[:, 0] + true_w[1] * features[:, 1] + true_b + torch.tensor(np.random.normal(0, 0.01, size=num_examples), dtype=torch.float)

    # load data
    batch_size = 10
    dataset = Data.TensorDataset(features, labels)
    data_iter = Data.DataLoader(dataset, batch_size, shuffle=True)

    for X, y in data_iter:
        print(X, y)
        break

    # model define and init
    model = LinearNet(num_inputs)

    # cost function
    loss = nn.MSELoss()

    # optimizer
    optimizer = torch.optim.SGD(model.parameters(), lr=0.03)

    accelerator = Accelerator()
    model, optimizer, data_iter = accelerator.prepare(model, optimizer, data_iter) # automatically move model and data to gpu as config

    # train
    num_epochs = 3
    for epoch in range(1, num_epochs + 1):
        batch_count = 0
        sum_loss = 0.0
        for X, y in data_iter:
            output = model(X)
            l = loss(output, y.view(-1, 1))
            optimizer.zero_grad()
            accelerator.backward(l)
            optimizer.step()

            batch_count += 1
            sum_loss += l.item()
        print('epoch %d, avg_loss: %f' % (epoch, sum_loss / batch_count))
    
    # save model
    torch.save(model, "acc_model.pt")

def predict_task():
    print("--- predict_task")

    # prepare data
    num_inputs = 2
    num_examples = 20
    true_w = [2, -3.5]
    true_b = 3.7

    features = torch.tensor(np.random.normal(0, 1, (num_examples, num_inputs)), dtype=torch.float)
    labels = true_w[0] * features[:, 0] + true_w[1] * features[:, 1] + true_b + torch.tensor(np.random.normal(0, 0.01, size=num_examples), dtype=torch.float)

    model = torch.load("acc_model.pt")

    model.eval()

    x, y = features[6], labels[6]
    pred_y = model(x)
    print("x:", x)
    print("y:", y)
    print("pred_y:", y)

if __name__ == "__main__":
    # launch method: use command line
    # for example
    # accelerate launch ACC.py 

    print("python version:", sys.version)
    print("torch version:", torch.__version__)
    print("model name:", LinearNet.__name__)
    
    train_task()
    predict_task()

    print("==== task end ====")


到了这里,关于pytorch基于ray和accelerate实现多GPU数据并行的模型加速训练的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【NLP相关】PyTorch多GPU并行训练(DataParallel和DistributedDataParallel介绍、单机多卡和多机多卡案例展示)

    ❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博相关......)👈 当下深度学习应用越来越广泛,训练规模也越来越大,需要更快速的训练速

    2024年02月04日
    浏览(31)
  • 毕业设计——基于Pytorch的人脸识别及人像卡通化算法设计与实现(源码+数据+模型)

    如需完整项目,请私信博主 基于Pytorch的人脸识别及人像卡通化算法设计与实现综述 一、引言 随着深度学习技术的飞速发展,人脸识别与人像卡通化作为计算机视觉领域的两大重要应用,近年来受到了广泛关注。基于Pytorch的人脸识别技术通过构建深度学习模型,实现对人脸

    2024年04月17日
    浏览(60)
  • Python基于Pytorch Transformer实现对iris鸢尾花的分类预测,分别使用CPU和GPU训练

    iris数据集是机器学习中一个经典的数据集,由英国统计学家Ronald Fisher在1936年收集整理而成。该数据集包含了3种不同品种的鸢尾花(Iris Setosa,Iris Versicolour,Iris Virginica)各50个样本,每个样本包含了花萼长度(sepal length)、花萼宽度(sepal width)、花瓣长度(petal length)、花瓣宽度

    2024年02月01日
    浏览(40)
  • 大规模 Transformer 模型 8 比特矩阵乘简介 - 基于 Hugging Face Transformers、Accelerate 以及 bitsandbytes

    语言模型一直在变大。截至撰写本文时,PaLM 有 5400 亿参数,OPT、GPT-3 和 BLOOM 有大约 1760 亿参数,而且我们仍在继续朝着更大的模型发展。下图总结了最近的一些语言模型的尺寸。 由于这些模型很大,因此它们很难在一般的设备上运行。举个例子,仅推理 BLOOM-176B 模型,你就

    2023年04月26日
    浏览(42)
  • 基于Ray和vLLM构建70B+模型的开源RLHF全量训练框架

    背景 ChatGPT 已经问世一年+了,在训练 ChatGPT 中必不可少的一环是 RLHF 训练,目前开源社区已经有了不少 RLHF 训练框架比如,TRL, DeepSpeedChat 或者最近热门的 LLaMA Factory。这些框架往往是基于 ZeRO 等并行方式,将 RLHF 算法中的四个模型切片后放到同一个 GPU 上。在模型规模越来越

    2024年01月22日
    浏览(43)
  • 实践教程|基于 pytorch 实现模型剪枝

    PyTorch剪枝方法详解,附详细代码。 一,剪枝分类 1.1,非结构化剪枝 1.2,结构化剪枝 1.3,本地与全局修剪 二,PyTorch 的剪枝 2.1,pytorch 剪枝工作原理 2.2,局部剪枝 2.3,全局非结构化剪枝 三,总结 参考资料 所谓模型剪枝,其实是一种从神经网络中移除\\\"不必要\\\"权重或偏差(

    2024年02月12日
    浏览(31)
  • PyTorch多GPU训练模型——使用单GPU或CPU进行推理的方法

    PyTorch提供了非常便捷的多GPU网络训练方法: DataParallel 和 DistributedDataParallel 。在涉及到一些复杂模型时,基本都是采用多个GPU并行训练并保存模型。但在推理阶段往往只采用单个GPU或者CPU运行。这时怎么将多GPU环境下保存的模型权重加载到单GPU/CPU运行环境下的模型上成了一

    2024年02月09日
    浏览(35)
  • PyTorch数据并行(DP/DDP)浅析

    一直以来都是用的单机单卡训练模型,虽然很多情况下已经足够了,但总有一些情况得上分布式训练: 模型大到一张卡放不下; 单张卡batch size不敢设太大,训练速度慢; 当你有好几张卡,不想浪费; 展示一下技术 。 由于还没遇到过一张显卡放不下整个模型的情况,本文的

    2024年02月02日
    浏览(24)
  • PyTorch简单理解ChannelShuffle与数据并行技术解析

    目录 torch.nn子模块详解 nn.ChannelShuffle 用法与用途 使用技巧 注意事项 参数 示例代码 nn.DataParallel 用法与用途 使用技巧 注意事项 参数 示例 nn.parallel.DistributedDataParallel 用法与用途 使用技巧 注意事项 参数 示例 总结 torch.nn.ChannelShuffle 是 PyTorch 深度学习框架中的一个子模块,它

    2024年01月25日
    浏览(29)
  • Pycharm里配置Pytorch-gpu(运行informer算法模型)

    1.下载Anaconda安装包 去官网 https://www.anaconda.com/download下载适合自己操作系统的Anaconda安装包。 (以Windows为例) 2.安装Anaconda 双击下载后的“Anaconda3-2023.09-0-Windows-x86_64.exe”,进行安装。点击“Next”。  选择安装路径,最好选择C盘以外的路径。 选择“安装选项”,根据自己的

    2024年02月03日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包