book icon indicating copy to clipboard operation
book copied to clipboard

GPU模式下,flask threaded=true时,只发送单个请求inference infer报错

Open RacingDawn opened this issue 7 years ago • 5 comments

报错具体信息: F0905 03:29:56.093694 4176 hl_cuda_cudnn.cc:251] Check failed: CUDNN_STATUS_SUCCESS == cudnnStat (0 vs. 3) Cudnn Error: CUDNN_STATUS_BAD_PARAM *** Check failure stack trace: *** @ 0x7f2ac561fcfd google::LogMessage::Fail() @ 0x7f2ac56237ac google::LogMessage::SendToLog() @ 0x7f2ac561f823 google::LogMessage::Flush() @ 0x7f2ac5624cbe google::LogMessageFatal::~LogMessageFatal() @ 0x7f2ac55d2b35 hl_conv_workspace() @ 0x7f2ac523c4d2 paddle::ConvBaseProjection::reshape() @ 0x7f2ac52f59bb paddle::ConvProjection::forward() @ 0x7f2ac523ecaf paddle::CudnnConvBaseLayer::forward() @ 0x7f2ac51f2f6d paddle::NeuralNetwork::forward() @ 0x7f2ac519157d _wrap_GradientMachine_forward @ 0x4c30ce PyEval_EvalFrameEx @ 0x4b9ab6 PyEval_EvalCodeEx @ 0x4c1e6f PyEval_EvalFrameEx @ 0x4b9ab6 PyEval_EvalCodeEx @ 0x4c1e6f PyEval_EvalFrameEx @ 0x4d4c9d (unknown) @ 0x4bc9b6 PyEval_EvalFrameEx @ 0x4d4c9d (unknown) @ 0x4bc9b6 PyEval_EvalFrameEx @ 0x4b9ab6 PyEval_EvalCodeEx @ 0x4c16e7 PyEval_EvalFrameEx @ 0x4b9ab6 PyEval_EvalCodeEx @ 0x4d55f3 (unknown) @ 0x4a577e PyObject_Call @ 0x4bed3d PyEval_EvalFrameEx @ 0x4c136f PyEval_EvalFrameEx @ 0x4c136f PyEval_EvalFrameEx @ 0x4c136f PyEval_EvalFrameEx @ 0x4b9ab6 PyEval_EvalCodeEx @ 0x4d54b9 (unknown) @ 0x4eebee (unknown) @ 0x4a577e PyObject_Call

serving代码:

@app.route('/', methods=['POST'])
def infer():
    fields = filter(lambda x: len(x) != 0, outputField.split(","))
    with open(paramFile) as param_f, open(topologyFile) as topo_f:
        params = paddle.parameters.Parameters.from_tar(param_f)
        inferer = paddle.inference.Inference(parameters=params, fileobj=topo_f)
    try:
        feeding = {}
        d = []
        for i, key in enumerate(request.json):
            d.append(request.json[key])
            feeding[key] = i
            r = inferer.infer([d,d], feeding=feeding, field=fields)
    except:
        trace = traceback.format_exc()
        errorResp(trace)
    if isinstance(r, list):
        return successResp([elem.tolist() for elem in r])
    else:
        return successResp(r.tolist())


if __name__ == '__main__':
    args = parser.parse_args()
    paddle.init(use_gpu=args.gpu)
    paramFile = args.paramFile
    topologyFile = args.topologyFile
    outputField = args.outputField
    print 'serving on port', args.port
    app.run(host='0.0.0.0', port=args.port, threaded=True)

当执行python start_paddleServ.py --topologyFile /data/objectDetection/inference_topology.pkl --paramFile /data/objectDetection/param.tar --gpu启动serve,接着只通过一个client访问时,也会报上述错误。

将treaded置为false则不会;或者非gpu模式下,启动为treaded=true也不会报错。

参考其他issue:https://github.com/PaddlePaddle/DeepSpeech/issues/254 如果GPU模式下,多线程调用cudnn不安全,但是单个访问也会出现问题吗?

RacingDawn avatar Sep 05 '18 03:09 RacingDawn

尽量使用多进程方式。v2 python端inference比较难控制GPU初始化或多stream。使用多进程模型,可以指定多个进程共用一个GPU也可以指定多个进程分别使用多个GPU。

另建议升级到最新版fluid,inference会有更多选项。

typhoonzero avatar Sep 05 '18 04:09 typhoonzero

@typhoonzero 你好,使用多进程的方式时,我是直接将Flask的执行方式改成了app.run(host='0.0.0.0', port=args.port, processes=3)依旧在发送单个请求的时候就会报上述错误。还有在之前使用的时候虽然设置了threaded=true,但只有一个client进行了访问,为什么也会跟单个线程的有区别?

fluid的有参考的python端的 inference吗?

RacingDawn avatar Sep 05 '18 06:09 RacingDawn

https://github.com/PaddlePaddle/Paddle/issues/4294 这里有一个CPU的多进程的例子。我不太清楚flask创建进程/线程的时机,合适的流程应该是,先fork一堆worker进程,然后每个进程独立import paddle 并init,然后初始化和load参数,再监听request并处理,每个进程有独自的paddle instance。能确保程序按照这个流程应该可以

typhoonzero avatar Sep 05 '18 07:09 typhoonzero

@typhoonzero 把你上面的demo实验了下,如果init(use_gpu=False)是可以的,但在init(use_gpu=True)GPU模式下还是报上述错误,所以跟Flask框架应该是没有关系的。是paddle就不支持多进程多线程调用cudnn吗?

RacingDawn avatar Sep 05 '18 08:09 RacingDawn

我没做相关实验,可能共享参数的方法不行,但不共享参数的多进程模型肯定有方法能做到。

typhoonzero avatar Sep 05 '18 09:09 typhoonzero