PaddleNLP
PaddleNLP copied to clipboard
ernie3.0转onnx以后性能不佳
问题描述
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)
最好能提供一下全套的测试代码(paddle和pytorch)给我们,因为之前我和Huggingface的模型也是对比过,测试的结论和您提供的结论差别较大
我看你这边是对相同的输入重复计算了10次求均值,麻烦再测试一下,先warmup 100轮,然后计算1000轮的均值?看看耗时怎么样
最好能提供一下全套的测试代码(paddle和pytorch)给我们,因为之前我和Huggface的模型也是对比过,测试的结论和您提供的结论差别较大
有没有可能是我这边没有用上GPU?在CPU推理的时候,paddle确实有优势。但是做GPU推理的时候,在代码中我已经配置了CUDAExecutionProvider,代码也成功运行,没有报错。如果可以,能不能提供一个能同时满足paddlenlp训练和onnxruntime-gpu的docker,让再测一下?
最好能提供一下全套的测试代码(paddle和pytorch)给我们,因为之前我和Huggface的模型也是对比过,测试的结论和您提供的结论差别较大
有没有可能是我这边没有用上GPU?在CPU推理的时候,paddle确实有优势。但是做GPU推理的时候,在代码中我已经配置了CUDAExecutionProvider,代码也成功运行,没有报错。如果可以,能不能提供一个能同时满足paddlenlp训练和onnxruntime-gpu的docker,让再测一下?
建议上面的方式来测试一下,就是热启动预测100次(这部分耗时不能放在统计里面),然后再计算1000次后的平均性能,因为Paddle的GPU启动速度相对较慢,docker这块我们没有发布,你可以先测试看看,如果结论还有问题,我们看看能不能提供一下docker出来
最好能提供一下全套的测试代码(paddle和pytorch)给我们,因为之前我和Huggface的模型也是对比过,测试的结论和您提供的结论差别较大
有没有可能是我这边没有用上GPU?在CPU推理的时候,paddle确实有优势。但是做GPU推理的时候,在代码中我已经配置了CUDAExecutionProvider,代码也成功运行,没有报错。如果可以,能不能提供一个能同时满足paddlenlp训练和onnxruntime-gpu的docker,让再测一下?
生成predictor之后,调用一下predictor.get_providers(),看看里面是否有CUDAExecutionProvider,另外运行起来中后看看显存和GPU利用率
最好能提供一下全套的测试代码(paddle和pytorch)给我们,因为之前我和Huggface的模型也是对比过,测试的结论和您提供的结论差别较大
有没有可能是我这边没有用上GPU?在CPU推理的时候,paddle确实有优势。但是做GPU推理的时候,在代码中我已经配置了CUDAExecutionProvider,代码也成功运行,没有报错。如果可以,能不能提供一个能同时满足paddlenlp训练和onnxruntime-gpu的docker,让再测一下?
生成predictor之后,调用一下predictor.get_providers(),看看里面是否有CUDAExecutionProvider,另外运行起来中后看看显存和GPU利用率
确实没有CUDAExecutionProvider,请问一下
- cuda10.2应该用哪个版本的onnx配合paddle导出的模型?
- 导出的时候的onnx版本和推理的时候要保持一致吗?
- 训练的时候用paddlepaddle-gpu, 推理的时候用paddle可以吗?
- 有没有qq群或者微信交流群?
最好能提供一下全套的测试代码(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.

需要将onnxruntime升级到最新
最初几次循环统计时间的时候GPU利用率可能还没上来,循环上千次,统计:总时间/总循环次数
This issue is stale because it has been open for 60 days with no activity. 当前issue 60天内无活动,被标记为stale。
This issue was closed because it has been inactive for 14 days since being marked as stale. 当前issue 被标记为stale已有14天,即将关闭。