我尝试了此处提供的seq2seq pytorch实现seq2seq 。在分析评估(evaluate.py)代码后,花费较长时间的代码段是decode_minibatch方法
def decode_minibatch(
config,
model,
input_lines_src,
input_lines_trg,
output_lines_trg_gold
):
"""Decode a minibatch."""
for i in xrange(config['data']['max_trg_length']):
decoder_logit = model(input_lines_src, input_lines_trg)
word_probs = model.decode(decoder_logit)
decoder_argmax = word_probs.data.cpu().numpy().argmax(axis=-1)
next_preds = Variable(
torch.from_numpy(decoder_argmax[:, -1])
).cuda()
input_lines_trg = torch.cat(
(input_lines_trg, next_preds.unsqueeze(1)),
1
)
return input_lines_trg
在 GPU 上训练模型,并在 CPU 模式下加载模型以进行推理。但不幸的是,每个句子似乎都需要~10秒。在 pytorch 上预计预测速度慢吗?
任何修复,加快速度的建议将不胜感激。谢谢。
性能缓慢的一种解决方案可能是使用针对推理优化的工具包,例如 OpenVINO。OpenVINO 针对英特尔硬件进行了优化,但它应该适用于任何 CPU。它通过例如图形修剪或将一些操作融合在一起来优化推理性能。
您可以在此处(FastSeg)和此处(BERT)找到有关如何转换PyTorch模型的完整教程。下面的一些片段。
安装开放维诺
最简单的方法是使用 PIP。或者,您可以使用此工具找到适合您的情况的最佳方法。
pip install openvino-dev[pytorch,onnx]
将模型保存到 ONNX
OpenVINO目前无法直接转换PyTorch模型,但它可以使用ONNX模型进行转换。此示例代码假定该模型用于计算机视觉。
dummy_input = torch.randn(1, 3, IMAGE_HEIGHT, IMAGE_WIDTH)
torch.onnx.export(model, dummy_input, "model.onnx", opset_version=11)
使用模型优化器转换 ONNX 模型
模型优化器是一个命令行工具,来自OpenVINO开发包,因此请确保您已安装它。它将 ONNX 模型转换为 OV 格式(又名 IR),这是 OpenVINO 的默认格式。它还将精度更改为 FP16(以进一步提高性能)。在命令行中运行:
mo --input_model "model.onnx" --input_shape "[1, 3, 224, 224]" --mean_values="[123.675, 116.28 , 103.53]" --scale_values="[58.395, 57.12 , 57.375]" --data_type FP16 --output_dir "model_ir"
在 CPU 上运行推理
转换后的模型可以由运行时加载并针对特定设备进行编译,例如 CPU 或 GPU(集成到您的 CPU 中,如英特尔核芯显卡)。如果您不知道什么是最适合您的选择,请使用 AUTO。
# Load the network
ie = Core()
model_ir = ie.read_model(model="model_ir/model.xml")
compiled_model_ir = ie.compile_model(model=model_ir, device_name="CPU")
# Get output layer
output_layer_ir = compiled_model_ir.output(0)
# Run inference on the input image
result = compiled_model_ir([input_image])[output_layer_ir]
免责声明:我在OpenVINO工作。
在dragon7回答之后,我建议使用Optimum的ONNX导出,它可以开箱即用地处理编码器/解码器模型的导出,以及在解码器中使用过去的键值:
optimum-cli export onnx --model gpt2 --task causal-lm-with-past --for-ort gpt2_onnx/
如果你想使用 OpenVINO,一个不错的选择可以是开箱即用的 OpenVINO(特别是对于 seq2seq 模型)处理推理的OVModel
!
免责声明:我是Optimum库的贡献
者