• PyTorch Data Parrallel数据并行


    PyTorch Data Parrallel数据并行

    • 可选择:数据并行处理
    • 本文将学习如何用 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.
    • classRandomDataset(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 中的输出。
    • classModel(nn.Module):
    • # Our model
    • def__init__(self, input_size, output_size):
    •         super(Model, self).__init__()
    •         self.fc = nn.Linear(input_size, output_size)
    • defforward(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 收集并且合并这些结果,然后再返回。
    人工智能芯片与自动驾驶
  • 相关阅读:
    Tarjan求图的连通性总结
    hdu3849 Tarjan求无向图的割边+map
    两种代码风格解决强连通分量解决加多少条边使整个图连通&多少个点可以到达所有点
    hdu 离线处理+并查集
    hdu 1325判断是不是树
    poj3041 最小点覆盖即最大匹配(匈牙利算法)(模板)
    poj 2186 tarjan求强连通分量(模板题)
    poj2135 最小费用最大流模板
    SPFA队列模板
    链表专项刷题
  • 原文地址:https://www.cnblogs.com/wujianming-110117/p/14660790.html
Copyright © 2020-2023  润新知