加速视觉语言模型:Habana Gaudi2上的BridgeTower
加速视觉语言模型在Habana Gaudi2上的BridgeTower
在Habana Gaudi2上,Optimum Habana v1.6在微调BridgeTower时与A100相比实现了近3倍的加速。性能改进的两个新特性是:硬件加速的数据加载和快速DDP实现。
这些技术适用于任何由数据加载约束的工作负载,这在许多类型的视觉模型中经常发生。本文将介绍我们用于比较Habana Gaudi2和Nvidia A100 80GB上的BridgeTower微调的过程和基准测试。它还展示了在基于transformer的模型中如何轻松利用这些特性。
BridgeTower
在最近的过去,视觉语言(VL)模型在各种VL任务中获得了巨大的重要性和优势。最常见的方法是利用单模编码器从各自的模态中提取表征。然后这些表征要么被融合在一起,要么被馈送到跨模编码器中。为了有效处理VL表征学习中的一些性能限制和限制,BridgeTower引入了多个桥接层,它们在单模编码器的顶层和跨模编码器的每一层之间建立了连接。这使得在跨模编码器中在不同语义层次上有效地进行视觉和文本表征的自下而上交叉模态对齐和融合成为可能。
BridgeTower只使用了400万张图像进行预训练(详情见下文),在各种下游视觉语言任务中实现了最先进的性能。特别地,BridgeTower在VQAv2的测试集上实现了78.73%的准确率,相比之前的最先进模型(METER)使用相同的预训练数据和几乎可以忽略不计的额外参数和计算成本,提高了1.09%。值得注意的是,当进一步扩展模型时,BridgeTower实现了81.15%的准确率,超越了在数量级更大的数据集上预训练的模型。
硬件
Nvidia A100 Tensor Core GPU包括第三代Tensor Core技术。虽然最近发布了新一代的H100,但这仍然是目前大多数云服务提供商提供的最快的GPU。我们在这里使用了80GB内存的变体,它还提供比40GB内存的变体更快的内存带宽。
Habana Gaudi2是Habana Labs设计的第二代AI硬件加速器。一个服务器包含8个名为HPUs的加速器设备,每个设备有96GB的内存。请查看我们先前的博文,了解更详细的介绍和通过Intel Developer Cloud访问它的指南。与市场上的许多AI加速器不同,使用Optimum Habana可以非常轻松地应用高级功能,让Gaudi2发挥最大作用,只需进行两行更改即可将Transformers兼容的脚本迁移到Gaudi。
基准测试
为了对训练进行基准测试,我们将微调一个包含8.66亿个参数的BridgeTower Large检查点。该检查点使用遮蔽语言建模、图像-文本匹配和图像-文本对比损失在Conceptual Captions、SBU Captions、MSCOCO Captions和Visual Genome上进行了英语语言的预训练。
我们将进一步在New Yorker Caption Contest数据集上微调此检查点,该数据集包含了来自The New Yorker和最受欢迎的字幕的卡通图片。
两个加速器的超参数都相同,唯一不同的是批量大小:我们在Gaudi2上能够容纳40个样本,而在A100上只能容纳32个。您可以在此处查看Gaudi2的超参数,在此处查看A100的超参数。
处理涉及图像的数据集时,数据加载经常是瓶颈,因为许多昂贵的操作都在CPU上计算(图像解码、图像增强),然后将完整的图像发送到训练设备。理想情况下,我们希望只将原始字节发送到设备,然后在设备上进行解码和各种图像转换。但首先让我们看看如何轻松为数据加载分配更多资源以加速运行。
使用dataloader_num_workers
当图像加载在CPU上完成时,加快加载速度的一种快速方法是为数据加载分配更多的子进程。使用Transformers的TrainingArguments
(或其Optimum Habana的对应项GaudiTrainingArguments
)非常容易做到这一点:您可以使用dataloader_num_workers=N
参数来设置分配给数据加载的CPU子进程数量(N
)。
默认值为0,这意味着数据在主进程中加载。这可能不是最佳选择,因为主进程有很多事情要处理。我们可以将其设置为1,为数据加载设置一个完全专用的子进程。当分配多个子进程时,每个子进程都将负责准备一个批次。这意味着随着工作进程数量的增加,RAM的消耗将增加。一个建议是将其设置为CPU核心的数量,但这些核心可能不是完全空闲的,所以您需要试验以找到最佳的配置。
让我们运行以下两个实验:
- 一个在8个设备上分布的混合精度(bfloat16 / float)运行,其中数据加载由与其他一切相同的进程执行(即
dataloader_num_workers=0
) - 一个在8个设备上分布的混合精度(bfloat16 / float)运行,其中有1个专用的子进程用于数据加载(即
dataloader_num_workers=1
)
以下是我们在Gaudi2和A100上获得的吞吐量:
我们首先看到,使用dataloader_num_workers=1
时,Gaudi2比A100快2.16倍,使用dataloader_num_workers=0
时快2.53倍,这与我们之前报告的加速效果相当!
其次,我们看到,为数据加载分配更多资源可以轻松提高速度:在Gaudi2上为1.20倍,在A100上为1.41倍。
我们还对多个专用的数据加载子进程进行了实验,但性能与Gaudi2和A100上的dataloader_num_workers=1
一样好。因此,通常使用dataloader_num_workers=1
是加速涉及图像的运行的好方法!
可以在这里查看Gaudi2的Tensorboard日志,以及在这里查看A100的日志。
Optimum Habana快速DDP的最佳配置
在深入了解如何执行硬件加速的数据加载之前,让我们先看一看在Gaudi上如何加快分布式运行的另一种非常简单的方法。Optimum Habana的新版本1.6.0引入了一个新功能,允许用户选择要使用的分布策略:
distribution_strategy="ddp"
使用PyTorch的DistributedDataParallel
(DDP)distribution_strategy="fast_ddp"
使用一个更轻量级且通常更快的实现
Optimum Habana的快速DDP不会像DDP那样将参数梯度分成桶。它还使用HPU图形在所有进程中收集梯度,然后使用最小的主机开销更新它们(在执行all_reduce操作之后)。您可以在此处查看此实现。
在Gaudi2上简单地使用distribution_strategy="fast_ddp"
(并保持dataloader_num_workers=1
)可以获得705.9个样本/秒。 这比使用DDP快1.10倍,比A100快2.38倍!
因此,仅添加两个训练参数(dataloader_num_workers=1
和distribution_strategy="fast_ddp"
)就可以在Gaudi2上加速1.33倍,并与dataloader_num_workers=1
相比,与A100加速2.38倍。
使用Optimum Habana进行硬件加速的数据加载
为了进一步提高速度,我们现在将尽可能多的数据加载操作从CPU移动到加速器设备上(即Gaudi2上的HPU或A100上的GPU)。这可以通过在Gaudi2上使用Habana的媒体管道来实现。
给定一个数据集,大多数数据加载器遵循以下步骤:
- 获取数据(例如,您的JPEG图像存储在磁盘上的位置)
- CPU读取编码图像
- CPU解码图像
- CPU应用图像变换来增加图像
- 最后,将图像发送到设备(虽然通常不是由数据加载器本身完成的)
将整个过程在CPU上完成并将准备好的训练数据发送到设备的方法,更有效的工作流程是首先将编码图像发送到设备,然后进行图像解码和增强:
- 与以前一样
- 与以前一样
- 编码图像发送到设备
- 设备解码图像
- 设备对图像应用图像变换以增强图像
这样我们可以利用设备的计算能力加速图像解码和变换。请注意,在这样做时有两个需要注意的注意事项:
- 设备内存消耗会增加,因此如果没有足够的空闲内存,您可能需要减小批处理大小。这可能会减轻此方法带来的加速效果。
- 如果设备在CPU上进行数据加载时被密集使用(使用率达到100%或接近100%),那么在设备上进行数据加载时不要期望任何加速,因为设备已经忙得不可开交。
要在Gaudi2上实现这一点,我们已经为您准备好了:Optimum Habana中的对比图像文本示例现在提供了一个可与包含文本和图像的类似COCO的数据集一起使用的即用型媒体管道!您只需要在命令中添加--mediapipe_dataloader
即可使用它。
对于感兴趣的读者,Gaudi的文档中给出了较低级别的概述,并且所有支持的运算符的列表都可以在那里找到。
现在我们将对一个运行进行基准测试,使用dataloader_num_workers=1
、distribution_strategy="fast_ddp"
和mediapipe_dataloader
,因为所有这些优化都是兼容的:
与先前的运行相比,我们获得了额外的x1.14加速,与dataloader_num_workers=1
和distribution_strategy="fast_ddp"
相比,这次最终运行速度提高了x1.51。与Gaudi2上的基准运行相比,它也比A100快了x2.70,只需添加3个即用型训练参数。
再现此基准测试
要再现此基准测试,您首先需要通过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 \
--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 1
、--distribution_strategy fast_ddp
和--mediapipe_dataloader
来测试其他配置。
要将您的模型和Tensorboard日志推送到Hugging Face Hub,您需要先登录您的帐户:
huggingface-cli login
对于A100,您可以使用相同的run_bridgetower.py
脚本,并进行一些小的更改:
- 使用Transformers中的
Trainer
和TrainingArguments
替换GaudiTrainer
和GaudiTrainingArguments
- 删除对
GaudiConfig
、gaudi_config
和HabanaDataloaderTrainer
的引用 - 直接从Transformers中导入
set_seed
:from transformers import set_seed
此基准测试中显示的结果是在具有8个GPU的Nvidia A100 80GB GCP实例上获得的。
请注意,--distribution_strategy fast_ddp
和--mediapipe_dataloader
仅与Gaudi2兼容,不适用于A100。
结论
在处理图像时,我们提出了两种解决方案来加速训练工作流程:为数据加载器分配更多资源,以及直接在加速设备上解码和增强图像,而不是在CPU上进行。我们展示了这样做在训练类似BridgeTower这样的SOTA视觉语言模型时会导致显著加速:Habana Gaudi2与Transformers相比,使用Optimum Habana快近3倍!而且这非常容易使用,您只需要提供一些额外的训练参数。
为了更进一步,我们期待着使用HPU图表来更快地训练模型,并介绍如何在Gaudi2上使用DeepSpeed ZeRO-3加速LLM的训练。敬请关注!
如果您有兴趣使用最新的AI硬件加速器和软件库加速您的机器学习训练和推断工作流程,请查看我们的专家加速计划。要了解有关Habana解决方案的更多信息,请阅读我们的合作伙伴关系,并在此处与他们联系。要了解有关Hugging Face努力使AI硬件加速器易于使用的更多信息,请查看我们的硬件合作伙伴计划。
相关主题
- 更快的训练和推断:Habana Gaudi-2 vs Nvidia A100 80GB
- 在Habana Gaudi2加速器上进行大型语言模型的快速推断:BLOOMZ