PaddleNLP icon indicating copy to clipboard operation
PaddleNLP copied to clipboard

ernie3.0转onnx以后性能不佳

Open Christmas-Wong opened this issue 2 years ago • 10 comments

问题描述

ernie3.0-medium模型转成onnx模型以后推理速度不如pytorch转onnx的速度 同样条件下:

  • ernie3.0转onnx后,推理需要0.41s
  • pytorch-bert-base转onnx,推理需要0.08s

ps:还有一个小小的疑惑,ernie3.0只有7层,为什么转成onnx以后,相比于bert-base大小并没有减小,仍然有400M

环境

CUDA Version: 10.2 

onnxruntime-gpu           1.9.0
paddle-serving-app        0.9.0
paddle-serving-client     0.9.0
paddle-serving-server-gpu 0.8.3.post102
paddle2onnx               0.9.8
paddlefsl                 1.1.0
paddlenlp                 2.3.4
paddlepaddle-gpu          2.2.2
pandas                    1.1.5

转静态模型代码

import os
import paddle
from paddlenlp.transformers import AutoModel

if __name__ == '__main__':
    model = AutoModel.from_pretrained('/xx/model/')

    model.eval()

    model = paddle.jit.to_static(
        model,
        input_spec=[
            paddle.static.InputSpec(shape=[None, None],
                                    dtype="int64"),  # input_ids
            paddle.static.InputSpec(shape=[None, None],
                                    dtype="int64")  # segment_ids
        ])

    # Save in static graph model.
    save_path = os.path.join("/xx/static_model/name")
    paddle.jit.save(model, save_path)

静态模型转onnx

paddle2onnx --model_dir "/xx/static_model/" \
            --model_filename "name.pdmodel" \
            --params_filename "name.pdiparams" \
            --save_file "/xx/static_model/name_20220719_paddle.onnx" \
            --opset_version 13 \
            --enable_onnx_checker True \
            --enable_dev_version True

推理代码

import time
import onnxruntime as ort
from paddlenlp.transformers import AutoTokenizer


PATH_BERT_MODEL = ""
PATH_ONNX_MODEL = ""

if __name__ == "__main__":
    text = ["老板,这边的费用请结一下。"]*20
    tokenizer = AutoTokenizer.from_pretrained(PATH_BERT_MODEL)

    model_inputs = tokenizer(text, return_tensors="pd", padding="max_length", max_length=128, truncation=True)
    inputs_onnx = {k: v.cpu().detach().numpy() for k, v in model_inputs.items()}

    providers = ['CUDAExecutionProvider']
    sess_options = ort.SessionOptions()
    predictor = ort.InferenceSession(PATH_ONNX_MODEL,
                                     sess_options=sess_options,
                                     providers=providers)
    predictor = create_model_for_provider(PATH_ONNX_MODEL, "CUDAExecutionProvider")

    result = predictor.run(None, inputs_onnx)
    time_cost = 0
    for ele in range(10):
        start_time = time.time()
        result = predictor.run(None, inputs_onnx)
        end_time = time.time()
        time_cost += end_time-start_time
    print("paddle推理耗时{}".format(time_cost/10))
    print(result)

Christmas-Wong avatar Jul 19 '22 03:07 Christmas-Wong

最好能提供一下全套的测试代码(paddle和pytorch)给我们,因为之前我和Huggingface的模型也是对比过,测试的结论和您提供的结论差别较大

wawltor avatar Jul 19 '22 06:07 wawltor

我看你这边是对相同的输入重复计算了10次求均值,麻烦再测试一下,先warmup 100轮,然后计算1000轮的均值?看看耗时怎么样

yeliang2258 avatar Jul 19 '22 06:07 yeliang2258

最好能提供一下全套的测试代码(paddle和pytorch)给我们,因为之前我和Huggface的模型也是对比过,测试的结论和您提供的结论差别较大

有没有可能是我这边没有用上GPU?在CPU推理的时候,paddle确实有优势。但是做GPU推理的时候,在代码中我已经配置了CUDAExecutionProvider,代码也成功运行,没有报错。如果可以,能不能提供一个能同时满足paddlenlp训练和onnxruntime-gpu的docker,让再测一下?

Christmas-Wong avatar Jul 19 '22 07:07 Christmas-Wong

最好能提供一下全套的测试代码(paddle和pytorch)给我们,因为之前我和Huggface的模型也是对比过,测试的结论和您提供的结论差别较大

有没有可能是我这边没有用上GPU?在CPU推理的时候,paddle确实有优势。但是做GPU推理的时候,在代码中我已经配置了CUDAExecutionProvider,代码也成功运行,没有报错。如果可以,能不能提供一个能同时满足paddlenlp训练和onnxruntime-gpu的docker,让再测一下?

建议上面的方式来测试一下,就是热启动预测100次(这部分耗时不能放在统计里面),然后再计算1000次后的平均性能,因为Paddle的GPU启动速度相对较慢,docker这块我们没有发布,你可以先测试看看,如果结论还有问题,我们看看能不能提供一下docker出来

wawltor avatar Jul 19 '22 07:07 wawltor

最好能提供一下全套的测试代码(paddle和pytorch)给我们,因为之前我和Huggface的模型也是对比过,测试的结论和您提供的结论差别较大

有没有可能是我这边没有用上GPU?在CPU推理的时候,paddle确实有优势。但是做GPU推理的时候,在代码中我已经配置了CUDAExecutionProvider,代码也成功运行,没有报错。如果可以,能不能提供一个能同时满足paddlenlp训练和onnxruntime-gpu的docker,让再测一下?

生成predictor之后,调用一下predictor.get_providers(),看看里面是否有CUDAExecutionProvider,另外运行起来中后看看显存和GPU利用率

yeliang2258 avatar Jul 19 '22 07:07 yeliang2258

最好能提供一下全套的测试代码(paddle和pytorch)给我们,因为之前我和Huggface的模型也是对比过,测试的结论和您提供的结论差别较大

有没有可能是我这边没有用上GPU?在CPU推理的时候,paddle确实有优势。但是做GPU推理的时候,在代码中我已经配置了CUDAExecutionProvider,代码也成功运行,没有报错。如果可以,能不能提供一个能同时满足paddlenlp训练和onnxruntime-gpu的docker,让再测一下?

生成predictor之后,调用一下predictor.get_providers(),看看里面是否有CUDAExecutionProvider,另外运行起来中后看看显存和GPU利用率

确实没有CUDAExecutionProvider,请问一下

  1. cuda10.2应该用哪个版本的onnx配合paddle导出的模型?
  2. 导出的时候的onnx版本和推理的时候要保持一致吗?
  3. 训练的时候用paddlepaddle-gpu, 推理的时候用paddle可以吗?
  4. 有没有qq群或者微信交流群?

Christmas-Wong avatar Jul 19 '22 08:07 Christmas-Wong

最好能提供一下全套的测试代码(paddle和pytorch)给我们,因为之前我和Huggface的模型也是对比过,测试的结论和您提供的结论差别较大

有没有可能是我这边没有用上GPU?在CPU推理的时候,paddle确实有优势。但是做GPU推理的时候,在代码中我已经配置了CUDAExecutionProvider,代码也成功运行,没有报错。如果可以,能不能提供一个能同时满足paddlenlp训练和onnxruntime-gpu的docker,让再测一下?

生成predictor之后,调用一下predictor.get_providers(),看看里面是否有CUDAExecutionProvider,另外运行起来中后看看显存和GPU利用率

跑pytorch导出的onnx模型没有问题,跑paddle的会有如下错误

onnxruntime.capi.onnxruntime_pybind11_state.Fail: [ONNXRuntimeError] : 1 : FAIL : Load model from /data/wangfei2/output/ysh_s2_split_model_0711role/static_model2/charge_more_20220719_paddle.onnx failed:/onnxruntime_src/onnxruntime/core/graph/model.cc:110 onnxruntime::Model::Model(onnx::ModelProto&&, const PathString&, const IOnnxRuntimeOpSchemaRegistryList*, const onnxruntime::logging::Logger&) Unknown model file format version.

Christmas-Wong avatar Jul 19 '22 08:07 Christmas-Wong

image 可以加一下这个微信群

wawltor avatar Jul 19 '22 09:07 wawltor

需要将onnxruntime升级到最新

jiangjiajun avatar Jul 23 '22 09:07 jiangjiajun

最初几次循环统计时间的时候GPU利用率可能还没上来,循环上千次,统计:总时间/总循环次数

weihua04 avatar Jul 29 '22 07:07 weihua04

This issue is stale because it has been open for 60 days with no activity. 当前issue 60天内无活动,被标记为stale。

github-actions[bot] avatar Dec 08 '22 06:12 github-actions[bot]

This issue was closed because it has been inactive for 14 days since being marked as stale. 当前issue 被标记为stale已有14天,即将关闭。

github-actions[bot] avatar Dec 22 '22 16:12 github-actions[bot]