NnGraph multi-GPU Torch

Этот вопрос касается создания сети nnGraph на нескольких графических процессорах и не относящихся к следующему сетевому экземпляру

Я пытаюсь обучить сеть, которая построена с помощью nnGraph. Обратная диаграмма прилагается. Я пытаюсь запустить parallelModel (см. Код или рис. Node 9) в настройке с несколькими GPU. Если я присоединяю параллельную модель к контейнеру nn.Sequential, а затем создаю DataParallelTable, он работает в настройке с несколькими GPU (без nnGraph). Однако после присоединения к nnGraph я получаю сообщение об ошибке. Обратный проход работает, если я тренируюсь на одном GPU (установка true для false в операторах if), но в настройке с несколькими GPU я получаю сообщение об ошибке "gmodule.lua: 418: попытка индексации локального" gradInput "(ноль стоимость)". Я думаю, что Node 9 в обратном проходе должен работать на нескольких GPU, однако этого не происходит. Создание DataParallelTable на nnGraph не сработало для меня, однако я подумал, что, по крайней мере, работа с внутренними последовательными сетями в DataParallelTable будет работать. Есть ли другой способ разбить начальные данные, которые передаются на nnGraph, чтобы он работал на нескольких GPU?

require 'torch'
require 'nn'
require 'cudnn'
require 'cunn'
require 'cutorch'
require 'nngraph'

data1 = torch.ones(4,20):cuda()
data2 = torch.ones(4,10):cuda()

tmodel = nn.Sequential()
tmodel:add(nn.Linear(20,10))
tmodel:add(nn.Linear(10,10))
parallelModel = nn.ParallelTable()
parallelModel:add(tmodel)
parallelModel:add(nn.Identity())
parallelModel:add(nn.Identity())

model = parallelModel
if true then
  local function sharingKey(m)
     local key = torch.type(m)
     if m.__shareGradInputKey then
        key = key .. ':' .. m.__shareGradInputKey
     end
     return key
  end

  -- Share gradInput for memory efficient backprop
  local cache = {}
  model:apply(function(m)
     local moduleType = torch.type(m)
     if torch.isTensor(m.gradInput) and moduleType ~= 'nn.ConcatTable' then
        local key = sharingKey(m)
        if cache[key] == nil then
           cache[key] = torch.CudaStorage(1)
        end
        m.gradInput = torch.CudaTensor(cache[key], 1, 0)
     end
  end)
end

if true then
  cudnn.fastest = true
  cudnn.benchmark = true

  -- Wrap the model with DataParallelTable, if using more than one GPU
  local gpus = torch.range(1, 2):totable()
  local fastest, benchmark = cudnn.fastest, cudnn.benchmark

  local dpt = nn.DataParallelTable(1, true, true)
     :add(model, gpus)
     :threads(function()
        local cudnn = require 'cudnn'
        cudnn.fastest, cudnn.benchmark = fastest, benchmark
     end)
  dpt.gradInput = nil

  model = dpt:cuda()
end


newmodel = nn.Sequential()
newmodel:add(model)

input1 = nn.Identity()()
input2 = nn.Identity()()
input3 = nn.Identity()()

out = newmodel({input1,input2,input3})

r1 = nn.NarrowTable(1,2)(out)
r2 = nn.NarrowTable(2,2)(out)

f1 = nn.JoinTable(2)(r1)
f2 = nn.JoinTable(2)(r2)

n1 = nn.Sequential()
n1:add(nn.Linear(20,5))

n2 = nn.Sequential()
n2:add(nn.Linear(20,5))  

f11 = n1(f1)
f12 = n2(f2)

foutput = nn.JoinTable(2)({f11,f12})

g = nn.gModule({input1,input2,input3},{foutput})
g = g:cuda()


g:forward({data1, data2, data2})
g:backward({data1, data2, data2}, torch.rand(4,10):cuda())

Backward Pass

Код в операторах if, взятый из Реализация Facebook ResNet

+7
26 июл. '16 в 18:47
источник поделиться

Посмотрите другие вопросы по меткам или Задайте вопрос