zoukankan      html  css  js  c++  java
  • PyTorch 数据并行处理

    PyTorch 数据并行处理

    可选择:数据并行处理(文末有完整代码下载)

    本文将学习如何用 DataParallel 来使用多 GPU。 通过 PyTorch 使用多个 GPU 非常简单。可以将模型放在一个 GPU:

     device = torch.device("cuda:0")

     model.to(device)

    然后,可以复制所有的张量到 GPU:

     

    mytensor = my_tensor.to(device)

     

    请注意,只是调用 my_tensor.to(device) 返回一个 my_tensor 新的复制在GPU上,而不是重写 my_tensor。需要分配一个新的张量并且在 GPU 上使用这个张量。

    在多 GPU 中执行前馈,后馈操作是非常自然的。尽管如此,PyTorch 默认只会使用一个 GPU。通过使用 DataParallel 让你的模型并行运行,可以很容易的在多 GPU 上运行操作。

    model = nn.DataParallel(model)

     

    这是整个教程的核心,接下来将会详细讲解。 引用和参数

    引入 PyTorch 模块和定义参数

     import torch

     import torch.nn as nn

     from torch.utils.data import Dataset, DataLoader

     

    参数

     input_size = 5

     output_size = 2

     

     batch_size = 30

     data_size = 100

    设备

    device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

     

    实验(玩具)数据

    生成一个玩具数据。只需要实现 getitem.

     

    class RandomDataset(Dataset):

     

        def __init__(self, size, length):

            self.len = length

            self.data = torch.randn(length, size)

     

        def __getitem__(self, index):

            return self.data[index]

     

        def __len__(self):

            return self.len

     

    rand_loader = DataLoader(dataset=RandomDataset(input_size, data_size),batch_size=batch_size, shuffle=True)

    简单模型

    为了做一个小 demo,模型只是获得一个输入,执行一个线性操作,然后给一个输出。尽管如此,可以使用 DataParallel   在任何模型(CNN, RNN, Capsule Net 等等.)

    放置了一个输出声明在模型中来检测输出和输入张量的大小。请注意在 batch rank 0 中的输出。

     

    class Model(nn.Module):

        # Our model

     

        def __init__(self, input_size, output_size):

            super(Model, self).__init__()

            self.fc = nn.Linear(input_size, output_size)

     

        def forward(self, input):

            output = self.fc(input)

            print(" In Model: input size", input.size(),

                  "output size", output.size())

     

            return output

    创建模型并且数据并行处理

    这是整个教程的核心。首先需要一个模型的实例,然后验证是否有多个 GPU。如果有多个 GPU,可以用 nn.DataParallel 来   包裹模型。然后使用 model.to(device) 把模型放到多 GPU 中。

    model = Model(input_size, output_size)

    if torch.cuda.device_count() > 1:

      print("Let's use", torch.cuda.device_count(), "GPUs!")

      # dim = 0 [30, xxx] -> [10, ...], [10, ...], [10, ...] on 3 GPUs

      model = nn.DataParallel(model)

     

    model.to(device)

    输出:

     

    Let's use 2 GPUs!

     

    运行模型: 现在可以看到输入和输出张量的大小了。

    for data in rand_loader:

        input = data.to(device)

        output = model(input)

        print("Outside: input size", input.size(),

              "output_size", output.size())

    输出:

    In Model: input size torch.Size([15, 5]) output size torch.Size([15, 2])

            In Model: input size torch.Size([15, 5]) output size torch.Size([15, 2])

    Outside: input size torch.Size([30, 5]) output_size torch.Size([30, 2])

            In Model: input size torch.Size([15, 5]) output size torch.Size([15, 2])

            In Model: input size torch.Size([15, 5]) output size torch.Size([15, 2])

    Outside: input size torch.Size([30, 5]) output_size torch.Size([30, 2])

            In Model: input size torch.Size([15, 5]) output size torch.Size([15, 2])

            In Model: input size torch.Size([15, 5]) output size torch.Size([15, 2])

    Outside: input size torch.Size([30, 5]) output_size torch.Size([30, 2])

            In Model: input size torch.Size([5, 5]) output size torch.Size([5, 2])

            In Model: input size torch.Size([5, 5]) output size torch.Size([5, 2])

    Outside: input size torch.Size([10, 5]) output_size torch.Size([10, 2])

    结果:

    如果没有 GPU 或者只有一个 GPU,当获取 30 个输入和 30 个输出,模型将期望获得 30 个输入和 30 个输出。但是如果有多个 GPU ,会获得这样的结果。

    多 GPU

    如果有 2 个GPU,会看到:

    # on 2 GPUs

    Let's use 2 GPUs!

        In Model: input size torch.Size([15, 5]) output size torch.Size([15, 2])

        In Model: input size torch.Size([15, 5]) output size torch.Size([15, 2])

    Outside: input size torch.Size([30, 5]) output_size torch.Size([30, 2])

        In Model: input size torch.Size([15, 5]) output size torch.Size([15, 2])

        In Model: input size torch.Size([15, 5]) output size torch.Size([15, 2])

    Outside: input size torch.Size([30, 5]) output_size torch.Size([30, 2])

        In Model: input size torch.Size([15, 5]) output size torch.Size([15, 2])

        In Model: input size torch.Size([15, 5]) output size torch.Size([15, 2])

    Outside: input size torch.Size([30, 5]) output_size torch.Size([30, 2])

        In Model: input size torch.Size([5, 5]) output size torch.Size([5, 2])

        In Model: input size torch.Size([5, 5]) output size torch.Size([5, 2])

    Outside: input size torch.Size([10, 5]) output_size torch.Size([10, 2])

     

    如果有 3个GPU,会看到:

    Let's use 3 GPUs!

        In Model: input size torch.Size([10, 5]) output size torch.Size([10, 2])

        In Model: input size torch.Size([10, 5]) output size torch.Size([10, 2])

        In Model: input size torch.Size([10, 5]) output size torch.Size([10, 2])

    Outside: input size torch.Size([30, 5]) output_size torch.Size([30, 2])

        In Model: input size torch.Size([10, 5]) output size torch.Size([10, 2])

        In Model: input size torch.Size([10, 5]) output size torch.Size([10, 2])

        In Model: input size torch.Size([10, 5]) output size torch.Size([10, 2])

    Outside: input size torch.Size([30, 5]) output_size torch.Size([30, 2])

        In Model: input size torch.Size([10, 5]) output size torch.Size([10, 2])

        In Model: input size torch.Size([10, 5]) output size torch.Size([10, 2])

        In Model: input size torch.Size([10, 5]) output size torch.Size([10, 2])

    Outside: input size torch.Size([30, 5]) output_size torch.Size([30, 2])

        In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])

        In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])

        In Model: input size torch.Size([2, 5]) output size torch.Size([2, 2])

    Outside: input size torch.Size([10, 5]) output_size torch.Size([10, 2])

    如果有 8个GPU,会看到:

    Let's use 8 GPUs!

        In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])

        In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])

        In Model: input size torch.Size([2, 5]) output size torch.Size([2, 2])

        In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])

        In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])

        In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])

        In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])

        In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])

    Outside: input size torch.Size([30, 5]) output_size torch.Size([30, 2])

        In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])

        In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])

        In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])

        In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])

        In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])

        In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])

        In Model: input size torch.Size([2, 5]) output size torch.Size([2, 2])

        In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])

    Outside: input size torch.Size([30, 5]) output_size torch.Size([30, 2])

        In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])

        In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])

        In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])

        In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])

        In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])

        In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])

        In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])

        In Model: input size torch.Size([2, 5]) output size torch.Size([2, 2])

    Outside: input size torch.Size([30, 5]) output_size torch.Size([30, 2])

        In Model: input size torch.Size([2, 5]) output size torch.Size([2, 2])

        In Model: input size torch.Size([2, 5]) output size torch.Size([2, 2])

        In Model: input size torch.Size([2, 5]) output size torch.Size([2, 2])

        In Model: input size torch.Size([2, 5]) output size torch.Size([2, 2])

        In Model: input size torch.Size([2, 5]) output size torch.Size([2, 2])

    Outside: input size torch.Size([10, 5]) output_size torch.Size([10, 2])

    总结

    数据并行自动拆分了数据并且将任务单发送到多个 GPU 上。当每一个模型都完成自己的任务之后,DataParallel 收集并且合并这些结果,然后再返回。

    人工智能芯片与自动驾驶
  • 相关阅读:
    linux创建用户
    Java理解笔记------杂项
    java高效并发
    GPG备份秘钥
    (二)数据同步利器syncthing
    (一)安装samba
    (序)利旧打造私有云
    mysql的docker化安装
    (八)netty的SSL renegotiation攻击漏洞
    (七)json序列化
  • 原文地址:https://www.cnblogs.com/wujianming-110117/p/14375814.html
Copyright © 2011-2022 走看看