正在为人工智能或全栈开发而苦恼?我们的专家将为您提供指导:量身定制的建议、技术整合等。联系我们 [email protected].

如何加速自然语言处理的深度学习推理 变形金刚?

基于变形金刚的自然语言处理的高级深度学习模型给出了令人印象深刻的结果,但要获得高 但要获得高速度的表现是很难的。在这篇文章中,我们总结了你所拥有的最佳选择,如果你想 减少生产中预测的延迟。

使用更好的CPU或GPU

当人们想提高基于Transformer的自然语言处理模型的速度时,"天真的 "方法是使用更多的 先进的硬件。

大多数时候,这是一个不可避免的解决方案,因为基于软件的纯解决方案都有局限性。 想象一下,你在CPU上进行推理。 你可能会花几周时间为你最喜欢的基于Transformer的模型进行低级别的优化。 但很有可能的是,你仍然可以通过简单地将你的模型转移到一台 英伟达 A100 GPU。

这些天,生产中最广泛使用的推理GPU是NVIDIA Tesla T4和V100。

NVIDIA Tesla GPU

但如果你已经升级了你的硬件呢?或者,如果你的预算有限,你不能 负担得起 利用最后的尖端昂贵的GPU?请看下面的内容!

批量推理

批量推理是指在同一时间向你的模型发送几个请求,因此它可以一次解决你的 一次性解决你的请求。

批量推理是非常强大的,因为你的模型处理几个请求和处理一个请求所需的时间几乎一样。 处理几个请求的时间几乎与处理一个请求的时间相同。在引擎盖下,一些操作将被分解,所以 这样一来,模型就不需要把所有事情做N次,而只需要做一次。

从技术上讲,它并没有减少你的请求的延迟,因为你的请求不会被更快地处理。 因为你的请求不会被更快地处理,但它将极大地提高你的应用程序的吞吐量(你的应用程序可以在相同的硬件上处理更多的请求)。 可以用同样的硬件处理更多的请求)。

不过,批量推理并不完美。

首先,它并不总是适用于在线推理(即面向客户的应用),因为 为了建立你的批次,你将不得不缓冲一些用户请求,所以一些用户将不得不 要比平时等待更长的时间。

第2个挑战:批量推理对类似的请求效果更好。例如,如果你正在部署一个 文本生成自然语言处理模型,如果你创建了具有相同长度的请求批,那么批处理会更有效率。 具有相同的长度。

最后,批量推理不是由你的深度学习模型本身执行的,而是由一个更高的 层,比如一个专门的推理服务器。要实现这样一个层并不容易。例如 例如,NVIDIA的Triton推理服务器(见下文)在执行批量推理方面非常出色。 但是 但你首先需要找到一种方法,使你的模型与Triton兼容。

一旦你设法将你的模型导出到Triton,批量推理就非常简单了。例如,以下是 如何创建由多达128个请求组成的批处理,并在处理前最多等待5秒钟。 批次(这应该放在 "config.pbtxt "文件中)。

max_batch_size: 128
dynamic_batching {
  max_queue_delay_microseconds: 5000000
}

充分利用定制的实施方案

许多人和公司正在努力为一些基于Transformer的自然语言处理进行低水平的优化。 模型。对你来说,利用你的模型的这些定制实现可能是一个好主意。

大多数情况下,这些定制的实现方式很容易使用,几乎不需要你做额外的工作。 你的额外工作。让我在这里提到其中一些。

下面是一个关于如何通过DeepSpeed为你的GPT Neo 2.7B模型进行推理的例子。不是太难,不是吗?

# Filename: gpt-neo-2.7b-generation.py
import os
import deepspeed
import torch
from transformers import pipeline

local_rank = int(os.getenv('LOCAL_RANK', '0'))
world_size = int(os.getenv('WORLD_SIZE', '1'))
generator = pipeline('text-generation', model='EleutherAI/gpt-neo-2.7B',
                        device=local_rank)



generator.model = deepspeed.init_inference(generator.model,
                                            mp_size=world_size,
                                            dtype=torch.float,
                                            replace_method='auto')

string = generator("DeepSpeed is", do_sample=True, min_length=50)
if not torch.distributed.is_initialized() or torch.distributed.get_rank() == 0:
    print(string)         
            

当使用这些自定义实现之一时,不要忘记严格测试你的新的 模型的质量,因为你永远无法100%确定这些新的实现中没有错误。

使用一个专门的推理引擎

微软和英伟达都致力于开发先进的推理引擎,以提高推理的 性能。

ONNX 微软公司的Runtime("ORT")是一个跨平台的推理和训练机器学习的加速器。 加速器 (见此). 英伟达公司的TensorRT("TRT")是一个用于高性能深度学习的SDK。 推理的SDK。它包括一个深度学习推理优化器和运行时间,为深度学习推理应用提供低延迟和高吞吐量。 为深度学习推理应用提供低延迟和高吞吐量 (见此).

此外,NVIDIA Triton Inference Server是一款推理服务软件,它使AI推理变得更加容易。 使得从各种框架中部署AI模型成为可能。借助于Triton,你可以 例如,轻松执行批量推理,在同一个GPU上同时运行多个深度学习模型。 在多个GPU上部署模型,以及更多。 请看这里。

ONNX Runtime
TensorRT
Triton Inference Server

上述情况似乎令人激动,但当然不是那么简单......为了使你的模型能够利用这些 专用推理引擎,你首先需要将你现有的模型转换成适当的格式。

你有几个选择。

在使用上述方法时,你应该非常注意你导出的模型的质量。你 你可能认为你成功地导出了你的模型,但是你有可能在这个过程中失去了一些准确性。 过程中失去了一些准确性,所以要非常严格地测试你的新导出的模型。

总结

现代基于变换器的自然语言处理模型给出了令人印象深刻的结果,因此越来越多的公司希望在生产中使用它们。 在生产中使用它们。但是,很多时候,性能似乎是令人失望的......

努力提高你的预测速度是至关重要的,但是,正如你在上面看到的,没有一个适合所有的解决方案。 一个适合所有人的解决方案。

如果你有关于如何加快推理速度的问题,请不要犹豫,与我们联系!

Julien Salinas
NLP Cloud的首席技术官