我的需求是在reader中使用inference_model进行预测,reader放在multiprocess_reader中。使用了两种实现方式都报错:Error: cudaSetDevice failed in paddle::platform::SetDeviced, error code : 3, Please see detail in https://docs.nvidia.com/cuda/cuda-runtime-api/group__CUDART__TYPES.htm l#group__CUDART__TYPES_1g3f51e3575c2178246db0a94a430e0038: initialization error at (/paddle/paddle/fluid/platform/gpu_info.cc:240)
第一种是:在reader中定义CUDAPlace和exe;第二种是在reader中使用python API预测。其中第二种方法在pool构造的多进程中没问题,在本场景的multiprocess_reader中有问题。
最小可复现代码:paddle1.7 post97
import os
os.environ["CUDA_VISIBLE_DEVICES"]="2"
import paddle
import paddle.fluid as fluid
from paddle.fluid.core import PaddleTensor
from paddle.fluid.core import AnalysisConfig
from paddle.fluid.core import create_paddle_predictor
def reader():
landmark_config = AnalysisConfig('lmk_model/model','lmk_model/params')
landmark_config.switch_use_feed_fetch_ops(False)
#landmark_config.disable_gpu()
landmark_config.enable_use_gpu(100, 0)
landmark_predictor = create_paddle_predictor(landmark_config)
for i in range(10):
yield i
if __name__=="__main__":
place = fluid.CUDAPlace(0)
exe = fluid.Executor(place)
train_reader = paddle.reader.multiprocess_reader([reader, reader])
for data in train_reader():
print(data)
27条答案
按热度按时间quhf5bfb16#
这里多个进程不能都用一张GPU卡,这里是不是每个进程都用的是CUDAPlace(0)
tag5nh1u17#
类似,又不完全一样。
报错为:
szqfcxe218#
@wang-kangkang
第一种是:在reader中定义CUDAPlace和exe;
,请问第一种报什么错izj3ouym19#
@NHZlX 从示例代码和报错能看出来,为什么这么写会报CUDA没初始化的错误吗
6g8kf2rb20#
您上面说pool构造的多进程没有问题,是怎么实现的?不能满足您的需求吗
svujldwt21#
其实multiprocess_reader只是一个简单的多进程装饰器,没有实现进程间同步的安全机制,仅用在原先数据读取接口较慢的情况下,用户从磁盘读取数据这种简单场景,而且现在也不推荐使用
v440hwme22#
文档里写的multiprocess_reader是多进程的。而且我上面改动后,仅剩一个reader在运行了,非线程安全也没影响吧
ipakzgxi23#
multiprocess reader我理解是多线程了吧,你在reader中使用了create_paddle_predictor ,但是这个接口非线程安全的。
holgip5t24#
我改成:
#place = fluid.CUDAPlace(0)
#exe = fluid.Executor(place)
train_reader = paddle.reader.multiprocess_reader([reader])
也报同样的错,看起来是multiprocess_reader导致的问题?
ou6hu8tu25#
create_paddle_predictor 非线程安全,可加锁试下
6tqwzwtp26#
贴一下我这边的报错供分析:
dwbf0jvd27#
可以的,将for循环改成:for data in reader(): 可以正常跑。