【问题标题】:How to do random search for hyperparameters on different GPUs in parallel?如何在不同 GPU 上并行随机搜索超参数?
【发布时间】:2019-12-02 23:23:06
【问题描述】:

假设我的模型只使用一个 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 notebook?

【问题讨论】:

    标签: python-3.x pytorch


    【解决方案1】:

    在 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 分发...

    【讨论】:

    • 是的,了解如何将模型指向特定设备(控制台应用程序可以将其作为输入参数)。回复:DataParallel - 我认为它是用于在多个 GPU 上运行一个模型?我认为我的问题更多是关于多处理......
    • 如果你能把它作为输入参数就可以了。刚刚添加它是为了让您知道,通常默认行为是使用 DataParallel,正如您所说,它会根据数据(小批量)并行化单个模型,并且不会按照您的意图进行。
    • 补充几点,给大家一个更具体的思路,有时间再补充一些代码。
    猜你喜欢
    • 2020-10-13
    • 2023-02-09
    • 2018-11-08
    • 2021-06-02
    • 2011-03-08
    • 2021-10-15
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    相关资源
    最近更新 更多