Press "Enter" to skip to content

深入探讨:使用Hugging Face Optimum Graphcore进行视觉Transformer

本博客文章将展示如何使用Hugging Face Optimum库和Graphcore Intelligence Processing Units(IPUs)对预训练的Transformer模型进行微调,以适应您的数据集。作为示例,我们将展示一份逐步指南,并提供一个笔记本,该笔记本使用一组大型、广泛使用的胸部X射线数据集来训练一个视觉Transformer(ViT)模型。

介绍视觉Transformer(ViT)模型

2017年,一组Google AI研究人员发表了一篇论文,介绍了Transformer模型架构。Transformer以其独特的自注意机制而闻名,被提出作为语言应用的一种新型高效模型组。事实上,在过去的五年中,Transformer模型经历了爆炸性的流行,并被广泛接受为自然语言处理(NLP)的事实标准。

语言领域的Transformer模型最具代表性的莫过于快速发展的GPT和BERT模型系列。作为Hugging Face Optimum Graphcore库日益壮大的一部分,这两个模型系列都可以轻松高效地在Graphcore IPUs上运行。

深入探讨:使用Hugging Face Optimum Graphcore进行视觉Transformer 四海 第1张

关于Transformer模型架构的深入解释(重点是NLP),可以在Hugging Face网站上找到。

尽管Transformer在语言领域取得了初步的成功,但它们具有极高的通用性,可以用于包括计算机视觉(CV)在内的一系列其他目的,正如我们将在本博客文章中介绍的那样。

计算机视觉是卷积神经网络(CNNs)无疑最受欢迎的架构领域。然而,视觉Transformer(ViT)架构首次在2021年由Google Research提出,它代表了图像识别的突破,并使用了与BERT和GPT相同的自注意机制作为其主要组成部分。

与BERT和其他基于Transformer的语言处理模型以句子(即单词列表)作为输入不同,ViT模型将输入图像分成几个小块,相当于语言处理中的单个单词。每个块都由Transformer模型线性编码成可以单独处理的向量表示。这种将图像分割成块或视觉标记的方法与CNNs使用的像素数组形成对比。

通过预训练,ViT模型学习了图像的内部表示,然后可以用于提取对下游任务有用的视觉特征。例如,您可以在一个新的带有标签的图像数据集上训练一个分类器,通过在预训练的视觉编码器之上放置一个线性层。通常情况下,将线性层放置在[CLS]标记之上,因为该标记的最后隐藏状态可以看作是整个图像的表示。

深入探讨:使用Hugging Face Optimum Graphcore进行视觉Transformer 四海 第2张

与CNN相比,ViT模型在更低的计算成本下展示了更高的识别准确性,并应用于包括图像分类、目标检测和分割在内的一系列应用。仅在医疗领域,应用案例就包括COVID-19、股骨骨折、肺气肿、乳腺癌和阿尔茨海默病等等。

ViT模型 – IPU的完美匹配

由于Graphcore IPUs能够使用数据管道和模型并行处理相结合的方式进行并行训练,因此它们特别适合ViT模型。通过IPU的MIMD架构以及以IPU-Fabric为中心的扩展解决方案,加速了这个大规模并行过程。

引入流水线并行后,可以增加每个数据并行实例处理的批量大小,提高一个IPU处理的内存区域的访问效率,并减少数据并行学习的参数聚合的通信时间。

得益于将一系列经过预优化的Transformer模型添加到开源的Hugging Face Optimum Graphcore库中,通过IPU在运行和微调诸如ViT的模型时,可以轻松实现高性能和高效率。

通过Hugging Face Optimum,Graphcore发布了经过IPU训练的模型检查点和配置文件,使得以最大效率训练模型变得非常简单。这对于ViT模型通常需要在大量数据上进行预训练来说尤其有帮助。这个集成允许您使用Hugging Face模型中心发布的原始作者自己发布的检查点,因此您不必自己训练它们。通过让用户随时切换和应用任何公共数据集,Optimum缩短了AI模型的整体开发生命周期,并实现了与Graphcore先进硬件的无缝集成,提供更快的价值实现时间。

在本博客文章中,我们将使用在ImageNet-21k上预训练的ViT模型,该模型基于Dosovitskiy等人的论文“一张图片值16×16个单词:用于大规模图像识别的Transformer模型”。作为示例,我们将向您展示如何使用Optimum在ChestX-ray14数据集上对ViT进行微调。

ViT模型在X光分类中的价值

与所有医学影像任务一样,放射科医生花费了很多年时间学习如何可靠高效地在X光图像上检测问题并进行初步诊断。在很大程度上,这种困难是由于图像的微小差异和空间限制引起的,这就是为什么计算机辅助检测和诊断(CAD)技术在改善临床工作流程和患者预后方面显示出巨大潜力的原因。

与此同时,开发任何用于X光分类的模型(无论是ViT还是其他模型)都会面临一些挑战:

  • 从头开始训练模型需要大量有标签的数据;
  • 高分辨率和大量数据要求使用强大的计算资源进行训练;以及
  • 多类和多标签问题(如肺部诊断)的复杂性因疾病类别的数量而呈指数增长。

如上所述,为了演示使用Hugging Face Optimum,我们不需要从头开始训练ViT。相反,我们将使用在Hugging Face模型中心托管的模型权重。

由于X光图像可能存在多种疾病,我们将使用多标签分类模型。所使用的模型使用了google/vit-base-patch16-224-in21k检查点。它是从TIMM存储库转换而来,并在ImageNet-21k的1400万张图像上进行了预训练。为了并行化和优化IPU的作业,通过Graphcore-ViT模型卡提供了配置。

如果您是第一次使用IPU,请阅读IPU编程指南以了解基本概念。要在IPU上运行自己的PyTorch模型,请参阅PyTorch基础教程,并通过我们的Hugging Face Optimum Notebooks学习如何使用Optimum。

在ChestXRay-14数据集上训练ViT

首先,我们需要下载美国国立卫生研究院(NIH)临床中心的胸部X射线数据集。该数据集包含了从1992年到2015年期间,共计30,805名患者的112,120张去标识化的正面X射线图像。该数据集根据通过自然语言处理技术从放射学报告的文本中提取的标签,涵盖了14种常见疾病。

深入探讨:使用Hugging Face Optimum Graphcore进行视觉Transformer 四海 第3张

设置环境

以下是运行此教程所需的要求:

  • 一个具有最新的Poplar SDK和启用了PopTorch环境的Jupyter Notebook服务器(请参阅我们关于在Jupyter笔记本中使用IPU的指南)
  • 来自Graphcore教程存储库的ViT训练笔记本

Graphcore教程存储库包含了本指南中讨论的逐步教程笔记本和Python脚本。克隆该存储库并启动位于tutorials/tutorials/pytorch/vit_model_training/中的walkthrough.ipynb笔记本。

我们甚至还创建了HF Optimum Gradient,以便您可以在免费的IPU上启动入门教程。注册并启动运行时:深入探讨:使用Hugging Face Optimum Graphcore进行视觉Transformer 四海 第4张

获取数据集

下载数据集的/images目录。您可以使用bash命令提取文件:for f in images*.tar.gz; do tar xfz "$f"; done

接下来,下载包含标签的Data_Entry_2017_v2020.csv文件。默认情况下,教程期望/images文件夹和.csv文件与正在运行的脚本位于同一文件夹中。

一旦您的Jupyter环境有了数据集,您需要安装并导入最新的Hugging Face Optimum Graphcore软件包和其他依赖项在requirements.txt文件中:

%pip install -r requirements.txt

` `

Chest X-ray数据集中的检查包含了X-ray图像(灰度,224×224像素)和相应的元数据:Finding Labels, Follow-up #,Patient ID, Patient Age, Patient Gender, View Position, OriginalImage[Width Height]和OriginalImagePixelSpacing[x y]

接下来,我们定义了下载图像和标签文件的位置,在获取数据集的时候:

我们将使用Graphcore Optimum ViT模型来训练,以从图像中预测疾病(由”Finding Label”定义)。”Finding Label”可以是14种疾病之一,也可以是”No Finding”标签,表示未检测到疾病。为了与Hugging Face库兼容,文本标签需要转换为N-hot编码的数组,表示需要对每个图像进行分类的多个标签。N-hot编码的数组将标签表示为一个布尔值列表,如果标签与图像对应,则为true,否则为false。

首先,我们确定数据集中的唯一标签。

现在我们将标签转换为N-hot编码的数组:

使用datasets.load_dataset函数加载数据时,可以通过为每个标签创建一个文件夹(请参阅”ImageFolder”文档)或通过使用metadata.jsonl文件(请参阅”ImageFolder with metadata”文档)提供标签。由于这个数据集中的图像可以有多个标签,我们选择使用metadata.jsonl文件。我们将图像文件名及其关联的标签写入metadata.jsonl文件。

创建数据集

现在我们准备创建PyTorch数据集并将其分成训练集和验证集。此步骤将数据集转换为Arrow文件格式,可以在训练和验证过程中快速加载数据(有关Arrow和Hugging Face的详细信息)。由于要加载和预处理整个数据集,所以可能需要几分钟的时间。

我们将从检查点google/vit-base-patch16-224-in21k导入ViT模型。该检查点是由Hugging Face托管的标准模型,不受Graphcore管理。

要对预训练模型进行微调,新数据集必须具有与用于预训练的原始数据集相同的属性。在Hugging Face中,原始数据集的信息通过使用AutoFeatureExtractor加载的配置文件提供。对于该模型,X-ray图像被调整为正确的分辨率(224×224),从灰度转换为RGB,并在RGB通道上使用均值(0.5, 0.5, 0.5)和标准差(0.5, 0.5, 0.5)进行归一化。

为了使模型高效运行,图像需要被分批处理。为此,我们定义了vit_data_collator函数,该函数以字典形式返回图像和标签的批次,遵循Transformers Data Collator中的default_data_collator模式。

可视化数据集

为了检查数据集,我们显示元数据的前10行。

让我们还绘制一些验证集中带有其关联标签的图像。

深入探讨:使用Hugging Face Optimum Graphcore进行视觉Transformer 四海 第5张

我们的数据集现在已经准备好使用了。

准备模型

要在IPU上训练模型,我们需要从Hugging Face Hub导入模型,并使用IPUTrainer类定义一个训练器。IPUTrainer类接受与原始Transformer Trainer相同的参数,并与IPUConfig对象配合使用,该对象指定了在IPU上进行编译和执行的行为。

现在我们从Hugging Face导入ViT模型。

要在IPU上使用该模型,我们需要加载IPU配置IPUConfig,该配置控制所有特定于Graphcore IPUs的参数(现有的IPU配置可以在此处找到)。我们将使用Graphcore/vit-base-ipu

让我们使用IPUTrainingArguments来设置我们的训练超参数。这个类继承了Hugging Face的TrainingArguments类,添加了特定于IPU和其执行特性的参数。

实现用于评估的自定义性能指标

可以使用ROC(接收器操作特性)曲线下的面积(AUC_ROC)来评估多标签分类模型的性能。AUC_ROC是不同类别和不同阈值下的真阳性率(TPR)与假阳性率(FPR)的绘图。这是多标签分类任务中常用的性能指标,因为它对类别不平衡不敏感且易于解释。

对于这个数据集,AUC_ROC代表了模型分离不同疾病的能力。得分为0.5意味着50%可能得到正确的疾病,得分为1意味着它可以完美地分离疾病。这个指标在Datasets中不可用,因此我们需要自己实现它。HuggingFace Datasets包允许通过load_metric()函数进行自定义度量计算。我们定义一个compute_metrics函数,并通过datasets包将其暴露给Transformer的评估函数,就像其他支持的度量指标一样。compute_metrics函数接受ViT模型预测的标签,并计算ROC曲线下的面积。compute_metrics函数接受一个EvalPrediction对象(具有predictionslabel_ids字段的命名元组),并且必须返回一个字符串到浮点数的字典。

为了训练模型,我们使用IPUTrainer类定义一个训练器,它负责将模型编译为在IPU上运行,并进行训练和评估。IPUTrainer类的工作方式与Hugging Face Trainer类相同,但需要额外的ipu_config参数。

运行训练

为了加快训练,如果存在上次的检查点,我们将加载它。

现在我们准备好进行训练了。

绘制收敛曲线

现在我们已经完成了训练,我们可以格式化和绘制训练器的输出,以评估训练的行为。

我们绘制训练损失和学习率。

深入探讨:使用Hugging Face Optimum Graphcore进行视觉Transformer 四海 第6张 损失曲线显示了在训练开始时损失的快速减少,然后稳定在0.1左右,表明模型正在学习。学习率在训练期间的25%热身后增加,然后按照余弦衰减。

运行评估

现在我们已经训练好模型,我们可以使用验证数据集评估其预测未见数据的能力。

指标显示教程在3个时期后达到的验证AUC_ROC得分。

有几个方向可以探索以提高模型的准确性,包括更长的训练时间。通过更改优化器、学习率、学习率调度、损失缩放或使用自动损失缩放,还可以改善验证性能。

免费尝试在IPU上使用Hugging Face Optimum

在本文中,我们介绍了ViT模型,并提供了使用本地数据集在IPU上训练Hugging Face Optimum模型的教程。

现在,通过Graphcore与Paperspace的新合作伙伴关系,整个上述过程可以在几分钟内免费运行,借助Gradient(Paperspace的基于Web的Jupyter笔记本)提供的一系列由Graphcore IPUs驱动的Hugging Face Optimum模型。

深入探讨:使用Hugging Face Optimum Graphcore进行视觉Transformer 四海 第4张

如果您有兴趣在Paperspace Gradient上尝试使用IPU的Hugging Face Optimum,包括ViT、BERT、RoBERTa等模型,您可以在此处注册并在此处找到入门指南。

Hugging Face Optimum在IPUs上的更多资源

  • Graphcore GitHub上的ViT Optimum教程代码
  • Graphcore Hugging Face模型和数据集
  • GitHub上的Optimum Graphcore

没有Eva Woodbridge,James Briggs,Jinchen Ge,Alexandre Payot,Thorin Farnsworth以及来自Graphcore的其他所有贡献者以及来自Hugging Face的Jeff Boudier,Julien Simon和Michael Benayoun的广泛支持,指导和见解,就不可能进行这次深入研究。

Leave a Reply

Your email address will not be published. Required fields are marked *