Paddle 使用ParallelExecutor进行infer,CPU利用率较低

gdx19jrr  于 2021-12-07  发布在  Java
关注(0)|答案(3)|浏览(718)
  • 版本、环境信息:

   1)PaddlePaddle版本:1.4.1
   2)CPU:CPU
   3)系统环境:centos

  • 问题描述:使用ParallelExecutor进行infer,CPU利用率较低,和直接使用Executor的利用率差不多,速度没有明显提升,主要是想用ParallelExecutor数据并行提升预测速度

预测代码如下:

infer_program = fluid.default_main_program().clone(for_test=True)

    # For faster executor
    exec_strategy = fluid.ExecutionStrategy()
    exec_strategy.use_experimental_executor = True
    build_strategy = fluid.BuildStrategy()
    cpu_num = int(os.environ.get('CPU_NUM', cpu_count()))
    build_strategy.reduce_strategy = \
        fluid.BuildStrategy.ReduceStrategy.Reduce if cpu_num > 1 \
        else fluid.BuildStrategy.ReduceStrategy.AllReduce

    logger.info("begin executor")
    pe = fluid.ParallelExecutor(
        use_cuda=False,
        main_program=infer_program,
        build_strategy=build_strategy,
        exec_strategy=exec_strategy)

    fluid.io.load_persistables(exe, args.model_output_dir + '/batch-%d' % args.model_steps, infer_program)
    print 'start test'
    batch_id = 0
    py_reader.start()
    auc_metric = fluid.metrics.Auc("ROC")
    while True:
        try:
            results, y_pred, y_true = pe.run(fetch_list=[cost, preds, label])
            auc_metric.update(np.r_[y_pred], np.r_[y_true])
            results = np.mean(results)
            if batch_id % 100 == 0:
                sample = (batch_id + 1) * args.batch_size * int(os.environ.get('CPU_NUM', cpu_num))
                logger.info("TEST --> samples: {} batch: {} loss:{} auc:{}".format(sample, batch_id, results, auc_metric.eval()))
            batch_id += 1
        except fluid.core.EOFException:
            py_reader.reset()
            break

之前提的issue主题是运行出错发现是我自己代码写错了

bnlyeluc

bnlyeluc1#

@minhozhou 利用率低是多少,可以给一下数字吗

ifsvaxew

ifsvaxew2#

设置cpu_num=16,batch_size=512;设置buf_size如下

infer_reader = paddle.batch(
            dataset.infer(args.infer_data_path),
        batch_size=args.batch_size)

cpu实际使用率在100%~200%之间,大部分时间都是100%,相当于单核在跑

eagi6jfj

eagi6jfj3#

除了上述CPU利用率低的问题,另外实际测试了一下,同样的机器,同样的模型文件,预测同样的900万数据,以下测试同时运行,机器配置56线程,256G内存,运行的时候资源cpu和内存足够:

  • 使用pe预测,cpunum设置为16,batchsize设置为512,耗时4h30min
  • 使用exe预测,batchsize设置为512,耗时3h43min
  • 使用exe预测,batchsize设置为5120,耗时3h23min

此外,在训练过程中每个batch都通过py_reader.queue.size()打印出py_reader维护的数据队列大小,发现每次输出都是0,上述三个测试均是如此,下图是第二个测试的输出图

下面是cprofile输出的结果,耗时最多的前两个应该是在reader里面的操作

是不是因为数据处理太耗时导致pe预测反而不如单个exe呢?pe是多个cpu同时从py_reader的队列里拿数据吗?

相关问题