CTranslate2
CTranslate2 是一个高效推理Transformer模型的C++和Python库。
该项目实现了一个自定义运行环境,应用了许多性能优化技术,如权重量化、层融合、批处理重新排序等,以加速和减少Transformer模型在CPU和GPU上的内存使用。
目前支持以下模型类型:
- 编码器-解码器模型: Transformer base/big, M2M-100, NLLB, BART, mBART, Pegasus, T5, Whisper
- 仅解码器模型: GPT-2, GPT-J, GPT-NeoX, OPT, BLOOM, MPT, Llama, Mistral, Gemma, CodeGen, GPTBigCode, Falcon
- 仅编码器模型: BERT, DistilBERT, XLM-RoBERTa
兼容的模型应首先转换为优化的模型格式。该库包含多个框架的转换器:
该项目面向生产环境,提供向后兼容性保证,同时还包括与模型压缩和推理加速相关的实验性功能。
主要特性
- 在CPU和GPU上快速且高效的执行
由于许多高级优化,执行速度显著加快,所需资源比通用深度学习框架少:层融合、填充移除、批处理重新排序、就地操作、缓存机制等。 - 量化和减少精度
模型序列化和计算支持减少精度的权重:16位浮点数(FP16),16位脑浮点数(BF16),16位整数(INT16),8位整数(INT8)和AWQ量化(INT4)。 - 支持多种CPU架构
该项目支持x86-64和AArch64/ARM64处理器,并整合了多个为这些平台优化的后端:Intel MKL,oneDNN,OpenBLAS,Ruy,和Apple Accelerate。 - 自动CPU检测和代码分发
一个二进制文件可以包含多个后端(如Intel MKL和oneDNN)和指令集架构(如AVX、AVX2),它们会在运行时根据CPU信息自动选择。 - 并行和异步执行
多个批次可以使用多个GPU或CPU内核并行且异步地处理。 - 动态内存使用
内存使用根据请求大小动态变化,同时通过CPU和GPU上的缓存分配器满足性能要求。 - 轻量级磁盘占用
量化可以使模型在磁盘上的大小减少四倍,并且准确性损失较小。 - 简单集成
该项目依赖性少,并在Python和C++中提供简单的API,以满足大多数集成需求。 - 可配置和交互式解码
高级解码功能允许自动补全部分序列,并在序列中指定位置返回替代方案。 - 支持分布式推理的张量并行性
非常大的模型可以拆分到多个GPU上。按照这个文档设置环境。
其中一些功能使用标准深度学习框架难以实现,这些功能是该项目的动机。
安装和使用
CTranslate2 可以通过 pip 安装:
pip install ctranslate2
Python模块用于转换模型,并可以用几行代码翻译或生成文本:
translator = ctranslate2.Translator(translation_model_path)
translator.translate_batch(tokens)
generator = ctranslate2.Generator(generation_model_path)
generator.generate_batch(start_tokens)
查看文档以获取更多信息和示例。
基准测试
我们使用多个模型翻译 英->德 测试集 newstest2014:
- OpenNMT-tf WMT14: 在WMT14数据集(4.5M行)上使用OpenNMT-tf训练的base Transformer
- OpenNMT-py WMT14: 在WMT14数据集(4.5M行)上使用OpenNMT-py训练的base Transformer
- OPUS-MT: 在2020-02-26所有可用的OPUS数据(81.9M行)上使用Marian训练的base Transformer
基准测试报告每秒生成的目标标记数量(数量越高越好)。结果在多次运行中汇总。请参见基准脚本了解更多细节并重现这些数字。
请注意,以下结果仅适用于该基准测试期间使用的配置:绝对和相对性能可能会随着不同的设置而变化。
CPU
每秒标记数 | 最大内存 | BLEU | |
---|---|---|---|
OpenNMT-tf WMT14 模型 | |||
OpenNMT-tf 2.31.0(使用 TensorFlow 2.11.0) | 209.2 | 2653MB | 26.93 |
OpenNMT-py WMT14 模型 | |||
OpenNMT-py 3.0.4(使用 PyTorch 1.13.1) | 275.8 | 2012MB | 26.77 |
- int8 | 323.3 | 1359MB | 26.72 |
CTranslate2 3.6.0 | 658.8 | 849MB | 26.77 |
- int16 | 733.0 | 672MB | 26.82 |
- int8 | 860.2 | 529MB | 26.78 |
- int8 + vmap | 1126.2 | 598MB | 26.64 |
OPUS-MT 模型 | |||
Transformers 4.26.1(使用 PyTorch 1.13.1) | 147.3 | 2332MB | 27.90 |
Marian 1.11.0 | 344.5 | 7605MB | 27.93 |
- int16 | 330.2 | 5901MB | 27.65 |
- int8 | 355.8 | 4763MB | 27.27 |
CTranslate2 3.6.0 | 525.0 | 721MB | 27.92 |
- int16 | 596.1 | 660MB | 27.53 |
- int8 | 696.1 | 516MB | 27.65 |
在配置了 Intel(R) Xeon(R) Platinum 8275CL CPU 的c5.2xlarge Amazon EC2 实例上,以4个线程执行。
GPU
每秒标记数 | 最大GPU内存 | 最大CPU内存 | BLEU | |
---|---|---|---|---|
OpenNMT-tf WMT14 模型 | ||||
OpenNMT-tf 2.31.0(使用 TensorFlow 2.11.0) | 1483.5 | 3031MB | 3122MB | 26.94 |
OpenNMT-py WMT14 模型 | ||||
OpenNMT-py 3.0.4(使用 PyTorch 1.13.1) | 1795.2 | 2973MB | 3099MB | 26.77 |
FasterTransformer 5.3 | 6979.0 | 2402MB | 1131MB | 26.77 |
- float16 | 8592.5 | 1360MB | 1135MB | 26.80 |
CTranslate2 3.6.0 | 6634.7 | 1261MB | 953MB | 26.77 |
- int8 | 8567.2 | 1005MB | 807MB | 26.85 |
- float16 | 10990.7 | 941MB | 807MB | 26.77 |
- int8 + float16 | 8725.4 | 813MB | 800MB | 26.83 |
OPUS-MT 模型 | ||||
Transformers 4.26.1(使用 PyTorch 1.13.1) | 1022.9 | 4097MB | 2109MB | 27.90 |
Marian 1.11.0 | 3241.0 | 3381MB | 2156MB | 27.92 |
- float16 | 3962.4 | 3239MB | 1976MB | 27.94 |
CTranslate2 3.6.0 | 5876.4 | 1197MB | 754MB | 27.92 |
- int8 | 7521.9 | 1005MB | 792MB | 27.79 |
- float16 | 9296.7 | 909MB | 814MB | 27.90 |
- int8 + float16 | 8362.7 | 813MB | 766MB | 27.90 |
使用CUDA 11在配置了 NVIDIA A10G GPU(驱动版本:510.47.03)的g5.xlarge Amazon EC2 实例上执行。