加速视觉-语言模型:Habana Gaudi2上的BridgeTower
更新(2023年8月29日):此博客文章已添加H100的基准测试。此外,所有性能数据均已更新为较新版本的软件。
Optimum Habana v1.7 在 Habana Gaudi2 上,微调BridgeTower(一种最先进的视觉-语言模型)时,速度比A100快2.5倍,比H100快1.4倍。这种性能提升依赖于硬件加速的数据加载,以充分利用您的设备。
这些技术适用于任何受数据加载限制的其他工作负载,这对于许多类型的视觉模型来说是常见情况。本文将向您介绍我们用于比较Habana Gaudi2、Nvidia H100和Nvidia A100 80GB上BridgeTower微调的过程和基准测试。它还展示了在基于transformers的模型中利用这些功能是多么容易。
BridgeTower
最近,视觉-语言(VL)模型在各种VL任务中获得了极大的重要性并展现出主导地位。最常见的方法是利用单模态编码器从各自的模态中提取表示。然后,这些表示要么融合在一起,要么馈送到跨模态编码器中。为了有效处理VL表示学习中的一些性能限制和制约,BridgeTower引入了多个桥接层,它们在单模态编码器的顶层和跨模态编码器的每一层之间建立连接。这使得在跨模态编码器中,视觉和文本表示能够在不同语义级别上进行有效的自下而上的跨模态对齐和融合。
BridgeTower仅使用4M张图像进行预训练(详见下文),在各种下游视觉-语言任务中实现了最先进的性能。特别是,BridgeTower在VQAv2测试-标准集上实现了78.73%的准确率,比之前的最先进模型(METER)高1.09%,并且使用相同的预训练数据,额外参数和计算成本几乎可以忽略不计。值得注意的是,当进一步扩展模型时,BridgeTower实现了81.15%的准确率,超越了在数量级更大的数据集上预训练的模型。
硬件
NVIDIA H100 Tensor Core GPU 是Nvidia GPU的最新、最快一代。它包含一个专用的Transformer引擎,可实现fp8混合精度运行。一个设备有80GB内存。
Nvidia A100 Tensor Core GPU 包含了第三代Tensor Core技术。它仍然是您在大多数云提供商那里能找到的最快的GPU。我们在这里使用的是80GB内存版本,它也比40GB版本提供更快的内存带宽。
Habana Gaudi2是Habana Labs设计的第二代AI硬件加速器。单个服务器包含8个加速器设备,称为HPU,每个设备拥有96GB内存。请查看我们之前的博客文章,了解更深入的介绍以及如何通过Intel Developer Cloud访问它的指南。与市场上许多AI加速器不同,利用Optimum Habana,应用高级功能以充分利用Gaudi2非常简单,Optimum Habana使用户只需更改两行代码即可将Transformers兼容脚本移植到Gaudi。
基准测试
为了对训练进行基准测试,我们将微调一个包含8.66亿参数的BridgeTower Large检查点。该检查点在Conceptual Captions、SBU Captions、MSCOCO Captions和Visual Genome上使用掩码语言建模、图像-文本匹配和图像-文本对比损失进行预训练。
我们将在New Yorker Caption Contest数据集上进一步微调此检查点,该数据集包含《纽约客》的卡通画和投票最多的标题。
所有加速器的超参数均相同。我们为每个设备使用了48个样本的批量大小。您可以此处查看Gaudi2的超参数,此处查看A100的超参数。
处理涉及图像的数据集时,数据加载通常是瓶颈,因为许多耗时操作在CPU上计算(图像解码、图像增强),然后将完整图像发送到训练设备。理想情况下,我们希望只将原始字节发送到设备,然后在设备上执行解码和各种图像转换。但我们首先来看看如何轻松分配更多资源用于数据加载,从而加速您的运行。
利用 dataloader_num_workers
当图像加载在CPU上完成时,加快速度的一种快速方法是为数据加载分配更多的子进程。使用Transformers的TrainingArguments
(或其Optimum Habana对应物GaudiTrainingArguments
)可以非常容易地做到这一点:您可以使用dataloader_num_workers=N
参数来设置分配给CPU用于数据加载的子进程数(N
)。
默认值为0,这意味着数据在主进程中加载。这可能不是最佳的,因为主进程需要管理很多事情。我们可以将其设置为1,以便有一个完全专用的子进程用于数据加载。当分配多个子进程时,每个子进程将负责准备一个批次。这意味着RAM消耗将随着工作进程数量的增加而增加。一个建议是将其设置为CPU核心数,但这些核心可能并非完全空闲,因此您需要尝试才能找到最佳配置。
让我们运行以下三个实验:
- 在8个设备上分布式运行的混合精度(bfloat16/float32)运行,数据加载由与其他所有操作相同的进程执行(即
dataloader_num_workers=0
) - 一个混合精度(bfloat16/float32)运行,分布在8个设备上,有一个专用子进程用于数据加载(即
dataloader_num_workers=1
) - 使用
dataloader_num_workers=2
的相同运行
以下是我们从 Gaudi2、H100 和 A100 获得的数据吞吐量
设备 | dataloader_num_workers=0 |
dataloader_num_workers=1 |
dataloader_num_workers=2 |
---|---|---|---|
Gaudi2 HPU | 601.5 样本/秒 | 747.4 样本/秒 | 768.7 样本/秒 |
H100 GPU | 336.5 样本/秒 | 580.1 样本/秒 | 602.1 样本/秒 |
A100 GPU | 227.5 样本/秒 | 339.7 样本/秒 | 345.4 样本/秒 |
我们首先看到,在dataloader_num_workers=2
的情况下,Gaudi2比H100快1.28倍;在dataloader_num_workers=1
的情况下,快1.29倍;在dataloader_num_workers=0
的情况下,快1.79倍。Gaudi2也比上一代快得多,在dataloader_num_workers=2
的情况下,它比A100快2.23倍;在dataloader_num_workers=1
的情况下,快2.20倍;在dataloader_num_workers=0
的情况下,快2.64倍,这甚至比我们之前报告的速度提升还要好!
其次,我们看到为数据加载分配更多资源可以轻松带来速度提升:Gaudi2上提高1.28倍,H100上提高1.79倍,A100上提高1.52倍。
我们还进行了多次数据加载专用子进程的实验,但所有加速器的性能均未优于 dataloader_num_workers=2
。因此,使用 dataloader_num_workers>0
通常是加速涉及图像的运行的良好第一步!
Gaudi2的Tensorboard日志可在此处查看,A100的Tensorboard日志可在此处查看。
利用Optimum Habana进行硬件加速数据加载
为了获得更大的速度提升,我们现在将尽可能多的数据加载操作从CPU转移到加速器设备(即Gaudi2上的HPU或A100/H100上的GPU)。这可以在Gaudi2上使用Habana的媒体管线来实现。
给定一个数据集,大多数数据加载器遵循以下步骤:
- 获取数据(例如,您的JPEG图像存储在磁盘上的位置)
- CPU 读取编码图像
- CPU解码图像
- CPU应用图像转换以增强图像
- 最后,图像被发送到设备(尽管这通常不是由数据加载器本身完成的)
与其在CPU上完成整个过程并将准备好的训练数据发送到设备,更高效的工作流程是首先将编码图像发送到设备,然后执行图像解码和增强
- 与之前相同
- 与之前相同
- 编码图像被发送到设备
- 设备解码图像
- 设备应用图像变换以增强图像
这样我们就可以利用设备的计算能力来加速图像解码和转换。请注意,这样做有两个需要注意的注意事项:
- 设备内存消耗将增加,因此如果空闲内存不足,您可能需要减少批次大小。这可能会减缓此方法带来的速度提升。
- 如果设备在CPU上进行数据加载时被大量使用(接近或达到100%),那么在设备上进行数据加载时就不要期望任何加速,因为它们已经满负荷运行。
为了在Gaudi2上实现这一点,我们为您提供了解决方案:Optimum Habana中的对比图像-文本示例现在提供了一个即用型媒体管道,您可以将其与包含文本和图像的类COCO数据集一起使用!您只需在命令中添加--mediapipe_dataloader
即可使用它。
对于感兴趣的读者,Gaudi文档中此处提供了更低级别的概述,此处提供了所有支持操作的列表。
现在我们将在之前的实验中重新运行,添加mediapipe_dataloader
参数,因为它与dataloader_num_workers
兼容。
设备 | dataloader_num_workers=0 |
dataloader_num_workers=2 |
dataloader_num_workers=2 + mediapipe_dataloader |
---|---|---|---|
Gaudi2 HPU | 601.5 样本/秒 | 768.7 样本/秒 | 847.7 样本/秒 |
H100 GPU | 336.5 样本/秒 | 602.1 样本/秒 | / |
A100 GPU | 227.5 样本/秒 | 345.4 样本/秒 | / |
与之前仅使用dataloader_num_workers=2
的运行相比,我们额外获得了x1.10的加速。因此,这次最终运行比我们在Gaudi2上的基本运行快了x1.41,仅仅添加了2个即用型训练参数。它还比H100快x1.41,比A100(使用dataloader_num_workers=2
)快x2.45!
重现此基准测试
要重现此基准测试,您首先需要通过Intel Developer Cloud获取Gaudi2的访问权限(更多信息请参阅本指南)。
然后,您需要安装最新版本的Optimum Habana并运行run_bridgetower.py
,您可以在此处找到它。操作步骤如下:
pip install optimum[habana]
git clone https://github.com/huggingface/optimum-habana.git
cd optimum-habana/examples/contrastive-image-text
pip install -r requirements.txt
运行脚本的基本命令行是
python ../gaudi_spawn.py --use_mpi --world_size 8 run_bridgetower.py \
--output_dir /tmp/bridgetower-test \
--model_name_or_path BridgeTower/bridgetower-large-itm-mlm-itc \
--dataset_name jmhessel/newyorker_caption_contest --dataset_config_name matching \
--dataset_revision 3c6c4f6c0ff7e902833d3afa5f8f3875c2b036e6 \
--image_column image --caption_column image_description \
--remove_unused_columns=False \
--do_train --do_eval --do_predict \
--per_device_train_batch_size="40" --per_device_eval_batch_size="16" \
--num_train_epochs 5 \
--learning_rate="1e-5" \
--push_to_hub --report_to tensorboard --hub_model_id bridgetower\
--overwrite_output_dir \
--use_habana --use_lazy_mode --use_hpu_graphs_for_inference --gaudi_config_name Habana/clip \
--throughput_warmup_steps 3 \
--logging_steps 10
这对应于 --dataloader_num_workers 0
的情况。然后您可以添加 --dataloader_num_workers N
和 --mediapipe_dataloader
来测试其他配置。
要将您的模型和 Tensorboard 日志推送到 Hugging Face Hub,您需要事先登录您的账户,命令如下:
huggingface-cli login
对于A100和H100,您可以使用相同的run_bridgetower.py
脚本,只需进行少量更改:
- 将
GaudiTrainer
和GaudiTrainingArguments
替换为来自 Transformers 的Trainer
和TrainingArguments
- 移除对
GaudiConfig
、gaudi_config
和HabanaDataloaderTrainer
的引用 - 直接从 Transformers 导入
set_seed
:from transformers import set_seed
此基准测试中显示的结果是通过 Nvidia H100 Lambda 实例和 Nvidia A100 80GB GCP 实例(均配备8个设备)使用 Nvidia 的 Docker 镜像获得的。
请注意,--mediapipe_dataloader
仅与Gaudi2兼容,不适用于A100/H100。
关于H100使用Transformer Engine的fp8结果,目前尚不可用,因为代码会崩溃,并且需要修改BridgeTower在Transformers中的建模。我们将在Gaudi2支持fp8时重新进行此比较。
总结
在处理图像时,我们提出了两种加速训练工作流程的解决方案:为数据加载器分配更多资源,以及直接在加速器设备上而不是CPU上解码和增强图像。我们展示了这在训练像BridgeTower这样的SOTA视觉-语言模型时会带来显著的加速:使用Optimum Habana的Habana Gaudi2比Nvidia H100快约1.4倍,比Nvidia A100 80GB(使用Transformers)快2.5倍!而且这非常容易使用,您只需提供几个额外的训练参数。
为了更进一步,我们期待使用HPU图来更快地训练模型,并展示如何在Gaudi2上使用DeepSpeed ZeRO-3来加速您的LLM训练。敬请关注!
如果您对使用最新AI硬件加速器和软件库加速您的机器学习训练和推理工作流感兴趣,请查看我们的阅读我们与他们的合作并在此处联系他们。要了解 Hugging Face 在简化AI硬件加速器使用方面的努力,请查看我们的硬件合作伙伴计划。
。要了解有关 Habana 解决方案的更多信息,请