【问题标题】:Speeding-up inference of T5-like model类 T5 模型的加速推理
【发布时间】:2022-07-28 22:08:21
【问题描述】:

我目前在生产中使用名为 T0pp (https://huggingface.co/bigscience/T0pp) 的模型,并希望加快推理速度。

我在按需 EC2 g4dn.12xlarge 实例(4 个 Nvidia T4 GPU)上运行以下代码:

from transformers import AutoTokenizer, AutoModelForSeq2SeqLM

tokenizer = AutoTokenizer.from_pretrained("bigscience/T0pp")
model = AutoModelForSeq2SeqLM.from_pretrained("bigscience/T0pp")

model.parallelize()

input_dict = tokenizer(generation_input.inputs, return_tensors="pt", padding=True)
inputs = input_dict.input_ids.to("cuda:0")
attention_mask = input_dict.attention_mask.to("cuda:0")
with torch.no_grad():
    outputs = model.generate(inputs, attention_mask=attention_mask)
tokenizer.batch_decode(outputs, skip_special_tokens=True)

我想知道您会尝试哪种替代方案来加快推理速度,以及您是否知道这样做的好教程。我看到的加速推理的主要替代方案是使用底层 Pytorch 模型:

  • ONNX
  • 深度速度
  • 或使用 fp16 而不是 fp32 参数(主要缺点是会损失一些质量)

有人有使用这些工具的经验,并且知道哪个是最好/最简单的选择吗?

所有这些对我来说都是全新的,我必须承认我在 ONNX 和 Deepspeed 教程中有点迷失。

PS:

  • 我已经尝试过 SageMaker,但这不适用于 T0pp (40Gb) 等大型模型。
  • 批处理加快了速度,允许从 1 到 2 秒进行批处理 大小 1,批量大小 32 为 16 秒。在理想的世界中,即使 批量大小 32 将在 1 或 2 秒内。

【问题讨论】:

    标签: python deep-learning pytorch huggingface-transformers


    【解决方案1】:

    也许你可以试试OpenVINO?它允许您将模型转换为中间表示 (IR),然后在支持 FP16 的 CPU 上运行。 OpenVINO 针对英特尔硬件进行了优化,但它应该适用于任何处理器。我不能保证你的模型在 CPU 上会比 Nvidia GPU 更快,但值得一试。一些 NLP 模型足够快(例如 BERT)。

    您可以找到有关如何转换 PyTorch 模型 here (FastSeg) 和 here (BERT) 的完整教程。下面是一些sn-ps。

    安装 OpenVINO

    最简单的方法是使用 PIP。或者,您可以使用this tool 来找到适合您情况的最佳方法。

    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 中,如 Intel HD Graphics)。如果您不知道什么是最适合您的选择,请使用 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 上工作。

    【讨论】:

      猜你喜欢
      • 2018-03-27
      • 1970-01-01
      • 2022-12-14
      • 2020-03-04
      • 2020-10-12
      • 2023-01-12
      • 1970-01-01
      • 1970-01-01
      • 2020-10-01
      相关资源
      最近更新 更多