如何在并行的不同GPU上随机搜索超参数?

时间:2019-07-24 18:24:34

标签: python-3.x pytorch

假设我的模型仅使用一个GPU,但虚拟机有4个。

如何利用所有GPU编写此代码?

channel_1_range = [8, 16, 32, 64]
channel_2_range = [8, 16, 32, 64]
kernel_size_1_range = [3, 5, 7]
kernel_size_2_range = [3, 5, 7]
max_count = 40
for count in range(max_count):
    reg = 10**np.random.uniform(-3, 0)
    learning_rate = 10**np.random.uniform(-6, -3)
    channel_1 = channel_1_range[np.random.randint(low=0, high=len(channel_1_range))]
    channel_2 = channel_2_range[np.random.randint(low=0, high=len(channel_2_range))]
    kernel_size_1 = kernel_size_1_range[np.random.randint(low=0, high=len(kernel_size_1_range))]
    kernel_size_2 = kernel_size_2_range[np.random.randint(low=0, high=len(kernel_size_2_range))]

    model = ThreeLayerConvNet(in_channel=3, channel_1=channel_1, kernel_size_1=kernel_size_1, \
        channel_2=channel_2, kernel_size_2=kernel_size_2, num_classes=10)
    optimizer = optim.Adam(model.parameters(), lr=learning_rate)
    engine = Engine(loader_train=loader_train, loader_val=loader_val, device=device, dtype=dtype, print_every=100, \
        verbose=False)
    engine.train(model, optimizer, epochs=1, reg=reg)

    print("Reg: {0:.2E}, LR: {1:.2E}, Ch_1: {2:2} [{4}], Ch_2: {3:2} [{5}], Acc: {6:.2f} [{7:.2f}], {8:.2f} secs". \
         format(reg, learning_rate, channel_1, channel_2, kernel_size_1, kernel_size_2, \
               engine.accuracy, engine.accuracy_train, engine.duration))

一种选择是将其移至独立控制台应用程序,启动N个实例(N == GPU数量)并汇总结果(一个输出文件)。

是否可以直接在Python中进行操作,以便我继续使用jupyter笔记本?

1 个答案:

答案 0 :(得分:2)

在pytorch中,您可以将模型分布在不同的GPU上。我认为在您的情况下,设备参数可让您指定实际的GPU:

device1 = torch.device('cuda:0')
device2 = torch.device('cuda:1')
             .
             .
             .
devicen = torch.device('cuda:n')

我不记得确切的细节,但是如果我的记忆对我有用,那么您可能需要使用线程或多处理来使代码无阻塞(最好采用多处理,以确保GIL可能会给您带来一些问题否则,如果您充分利用自己的流程)。 在您的情况下,这意味着并行化for循环。例如,使Queue包含所有模型,然后生成线程/进程,从而允许您使用它们(其中,在队列上工作的已生成的处理数量分别对应于一个GPU)。

因此,要回答您的问题,是的,您可以使用纯Python(我做了一段时间,所以我100%肯定)。您甚至可以让一个GPU处理多种模型(但请确保事先正确计算VRAM)。与仅仅开始多个工作相比,这是否值得呢?

作为一个小小的注解,如果您以“独立”脚本运行它,那么如果未自动调整GPU数量,它可能仍会使用相同的GPU,否则PyTorch可能会尝试使用DataParallel发行版...