首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PyTorch:在多个GPU上运行推理

PyTorch:在多个GPU上运行推理
EN

Stack Overflow用户
提问于 2022-10-08 17:46:17
回答 1查看 26关注 0票数 0

我有一个接受两个输入的模型。我想在多个GPU上运行推断,其中一个输入是固定的,而另一个是更改的。所以,假设我使用n个GPU,每个GPU都有模型的副本。第一个gpu处理输入对(a_1,b),第二个进程(a_2,b)等等。所有的输出都被保存为文件,所以我不需要对输出执行联接操作。我怎样才能用DDP或其他方式做到这一点呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-10 21:50:01

我已经想出了如何使用torch.multiprocessing.Queue来完成这个任务。

代码语言:javascript
复制
import torch
import torch.multiprocessing as mp
from absl import app, flags
from torchvision.models import AlexNet

FLAGS = flags.FLAGS

flags.DEFINE_integer("num_processes", 2, "Number of subprocesses to use")


def infer(rank, queue):
    """Each subprocess will run this function on a different GPU which is indicated by the parameter `rank`."""
    model = AlexNet()
    device = torch.device(f"cuda:{rank}")
    model.to(device)
    while True:
        a, b = queue.get()
        if a is None:  # check for sentinel value
            break
        x = a + b
        x = x.to(device)
        model(x)
        del a, b  # free memory
        print(f"Inference on process {rank}")


def main(argv):
    queue = mp.Queue()
    processes = []
    for rank in range(FLAGS.num_processes):
        p = mp.Process(target=infer, args=(rank, queue))
        p.start()
        processes.append(p)
    for _ in range(10):
        a_1 = torch.randn(1, 3, 224, 224)
        a_2 = torch.randn(1, 3, 224, 224)
        b = torch.randn(1, 3, 224, 224)
        queue.put((a_1, b))
        queue.put((a_2, b))
    for _ in range(FLAGS.num_processes):
        queue.put((None, None))  # sentinel value to signal subprocesses to exit
    for p in processes:
        p.join()  # wait for all subprocesses to finish


if __name__ == "__main__":
    app.run(main)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73999265

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档