So would you please show us what your code looks like finally.
I also tried to get intermedia outputs by forward hook using multi-gpus but a weird thing happened.

In init, I initialize self.target_output as None.
In hook function, I print self.target_output which is not None when hook function is excuted.
But after self.model.forward() excuted, self.target_output  turn back to be None.

One of two forwards output None  which is vary weird.
I implement this using data_parellel function and I regard class Wrapper as a NN Module, which return self.target_output. So data_parallell will scatter and gather all the output of Wrapper.
code looks like:
import torch
from torchvision.models.vgg import vgg19

class Wrapper(torch.nn.Module):
    def __init__(self, model):
        super(Wrapper, self).__init__()
        self.model = model
        self.target_outputs = None

        def forward_hook(_, __, output):
            self.target_outputs = output.detach()
        self.model.features[2].register_forward_hook(forward_hook)

    def forward(self,input):
        self.model(input)
        return self.target_outputs


model = vgg19()
model = model.cuda(4)
wrapper = Wrapper(model)

devices = [4, 5]

inputs = torch.randn(60,3,224,224).fill_(0).cuda(4)
out = torch.nn.parallel.data_parallel(wrapper, inputs, devices)
print("first forward:   ", out)
inputs = torch.randn(60,3,224,224).fill_(1).cuda(4)
out = torch.nn.parallel.data_parallel(wrapper, inputs, devices)
print("second forward: ", out.shape)

output is:
first forward:  None
second forward: (60, 64, 224, 224)


By compare the result with single-gpu result, I found the result of second forward is indeed the result of first forward .