首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多线程访问GPU上的同一模型进行推理

多线程访问GPU上的同一模型进行推理
EN

Stack Overflow用户
提问于 2020-05-31 13:23:44
回答 1查看 1.7K关注 0票数 2

我有一个cnn模型加载到GPU上,对于每个图像,必须创建和分离一个新的线程,以便在此图像上运行该模型。这是可能的吗?如果可能,它是否安全?

EN

回答 1

Stack Overflow用户

发布于 2020-05-31 14:08:25

是的,你当然可以。它有两个方面。如果你想并行运行每个模型,那么你必须在多个GPU中加载相同的模型。如果您不需要它(只需要线程部分),那么您可以加载模型并使用concurrent.futures.ThreadPoolExecutor()。在每个调用中,您可以传递一个图像。

我用darknet框架演示了一个例子。

我将模型加载到两个独立的GPU中(对于并行操作,您也可以避免这种情况),每次我收到请求时,我都会使用ThreadPoolExecutor将图像传递给处理函数。

代码语言:javascript
复制
from darknet import *
import concurrent.futures
import time

# you can avoid this part if you don't need multiple GPUs
set_gpu(0) # running on GPU 0
net1 = load_net(b"cfg/yolov3-lp_vehicles.cfg", b"backup/yolov3-lp_vehicles.backup", 0)
meta1 = load_meta(b"data/lp_vehicles.data")

set_gpu(1) # running on GPU 1
net2 = load_net(b"cfg/yolov3-lp_vehicles.cfg", b"backup/yolov3-lp_vehicles.backup", 0)
meta2 = load_meta(b"data/lp_vehicles.data")


def f(x):
    if x[0] == 0: # gpu 0
        return detect_np_lp(net1, meta1, x[1])
    else:
        return detect_np_lp(net2, meta2, x[1])

    

def func2(): # with threading
    a1 = cv2.imread("lp_tester/bug1.jpg")
    a2 = cv2.imread("lp_tester/bug2.jpg")
    nums = [(0, a1), (1, a2)] # the first element in tuple denotes GPU ID
    with concurrent.futures.ThreadPoolExecutor() as executor:
        r_m = [val for val in executor.map(f, nums)]
    print('out f2')
    #return r_m

t1 = time.time()
func2()
t2 = time.time()
print(t2-t1)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62111922

复制
相关文章

相似问题

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