使用Hugging Face和IPU在Paperspace上快速制作NLP应用原型
从零开始进行深度学习是非常困难的。
在用深度学习解决商业问题之前,你需要掌握广泛的技能:编写模型、收集和加载数据、管理训练运行、调整超参数、优化训练速度、储存模型权重、在生产中部署终端、优化时延......如果你的团队对这些中的一半有些认识就已经很不错了。
那么,如何用深度学习来解决问题?更重要的是如何说服你的主管这是最便宜、最快的方法?假设你能做到这点,那你又是为什么选择在一个新的人工智能加速器平台上运行它呢?
在这篇博文中,我将向你展示如何通过10行熟悉的Hugging Face代码来使用Graphcore拟未的IPU驱动网络应用。该应用识别与疾病相关的词语,你的打字速度有多快,它就有多快。
你可以使用Paperspace Gradient Notebook[1]关注此博文,该Paperspace Gradient Notebook由拟未的IPU驱动。
Paperspace支持你在单个Jupyter notebook环境中进行测试、开发和部署。它能够根据你项目的生命周期来定价,并满足你对速度和扩展性的要求。新用户还有六个小时的免费试用。
关于拟未和Paperspace Gradient Notebooks的更多细节,请参见我们的博客[2]。
Hugging Face
使用Hugging Face生态系统快速制作解决方案的原型是处理自然语言处理(NLP)任务的一种快速而简单的方法。
生态系统过去几年的发展意味着开发人员现在可以挑选现成的模型,并且该模型已经在与他们感兴趣的任务相似的任务中进行了微调。
你可以在notebook上或通过应用程序快速评估这个模型,然后用一个更能代表你想解决的具体任务的数据集来系统地加以评估。
开始使用
从零开始的时代早已过去。如今,建立一个使用深度学习的应用程序的方法是安装库,我指的不是Pytorch或TensorFlow,而是🤗Transformers和Datasets。这些库允许即时访问大多数标准模型架构的验证实现、预训练的检查点以及标准和自定义数据集。
要在拟未的IPU上使用🤗Transformers,请安装optimum-graphcore集成。
这些扩展实现了许多可以用来解决NLP问题的模型。一种简单的方法是从一个预先训练好的模型开始,该模型已经在正确的任务上进行了微调。
在这篇博文中,我们要做的是命名实体识别(NER),这是一种标记分类:我们需要给输入提示中的每个词分配一个类别。
一种简单的方法是使用🤗Transformers和optimum-graphcore提供的`pipeline` API:
在这3行代码中,`pipeline`函数已经:
根据任务从HuggingFace Hub中选择了一个合适的模型
下载了预先训练好的权重和IPU配置
为IPU连接和编译了模型
以与模型兼容的方式对提示进行了标记
将输出处理成了可用于下游任务的格式
着手使用深度学习应用从未如此轻松,获取全新的先进硬件也从未如此容易。从使用CPU或GPU到IPU,唯一需要改变的是软件包的导入,其他的都可以保持不变。`optimum-graphcore`库是公开开发并且开源的。它支持你了解模型是如何实现的,并授予你许可,使你能够进行修改,让库适应你的需求(或者在我们的GitHub存储库中提出问题)。
如果你通过Paperspace Notebook对这方面保持关注,你可以不断向`ner_pipeline`发出新的提示,以快速对新的标记进行分类。
将输出视觉化
2023年了,没有人还愿意与脚本进行交互。想要成功解决需要NER的基础业务问题,你需要将该服务作为应用程序或API端点提供给其他人。我发现使用Gradio[3]制作解决方案原型是一种快速的方法。
Gradio可以让你构建一个非常简单的WebUI,它可以直接存在于你的notebook中,也可以独立存在于你的浏览器中。此外,它还受益于与Transformers库的紧密集成。
要安装gradio,只需执行以下操作:
然后,创建一个可以输入提示并查看输出的简单的WebApp,这只需要几行额外的代码:
因为`Interface.from_pipeline`方法不支持NER流水线,所以我们需要编写自己的接口。所幸,这项工作很容易:
我们将一个`inputs` TextBox连接到UI元素,它将突显模型输出的文本。为了方便起见,我们还添加了一些示例,一旦我们连接了所有的元素,每当输入框中的文本发生变化,高亮突出的输出就会被显示出来。在IPU速度的支持下,模型的响应速度足够快,可以提供很好的互动体验。
迅速建立解决方案的原型,并以互动方式展示给非技术性的同事进行测试和评估,这种能力可以让我们快速获得反馈,而不必浪费大量时间开发不会被使用的功能。
尝试其他的模型
由流水线加载的初始模型不太可能恰好是你所需要的。值得庆幸的是,我们并不局限于默认模型。
在🤗Hub[4]上快速浏览一下,在标记分类任务上有近6000个预训练的模型可供选择。这些模型可能有不同的架构,也可能是在不同的数据集上训练或微调的,以处理更具体的任务。你可能会找到针对其他语言或为了识别不同标记而训练的模型。
虽然IPU并不支持所有的架构,但我们一直在努力增加新的架构[5],使它们对你可用。
现在,使用流水线接口从Hub加载模型非常简单,只需在创建流水线时将模型名称作为参数传给函数即可:
这个模型经过微调,可以识别生物医学实体。它可以用来检测在诊断或评估病人时可能具有临床意义的词语。将这个模型整合到我们上面写的Gradio应用程序中,我们得到以下输出:
如果你在医疗领域工作,你可能会使用这样一个小应用程序让工作人员注意到书面请求的相关部分,或者你可能会用它来做自动标签,方便医生在查看病人病历时检索记录。该模型的确切用途取决于你试图实现的目标。
与Hugging Face Hub的集成让你可以利用IPU快速、低成本推理,并使用你已经训练过的模型。如果你已经有一个在GPU上的训练流水线,你可以很容易地用IPU中更便宜和同样快速的替代方案来替换昂贵和难以访问的GPU,而不需要改变你的工作流程。
使用IPUTrainer进行训练
微调是模型生命周期的最后一步,对此,你可以用Transformers库和IPU非常轻松地加以解决。如果你正在考虑深度学习,你很可能有自定义的数据,你希望你的模型在这些数据上表现得特别好。为了做到这一点,我们需要看看如何对加载的模型进行微调。
如果你熟悉🤗Transformers库提供的Trainer类型,本节的内容就非常简单易懂。需要IPU特定参数的训练参数和配置选项能让你利用IPU的计算结构和多设备并行性,除此之外,其他步骤对IPU和GPU都是一样的。
为了微调从hub加载的模型,首先需要使用🤗数据集库加载自定义数据集。
这可能需要进行一些数据处理,但一旦加载,数据集可以被标记和分批,从而可以被模型处理。
到目前为止,代码在GPU和IPU之间是没有变化的。然而,IPU的计算架构意味着需要多几个步骤来正确地对数据进行批处理,并确保有效的训练。拟未的IPU上的Pytorch只支持固定尺寸的张量,这意味着所有批次的句子都需要有相同的长度。
为了实现这一点,我们写了一个函数来标记和对齐标签,并将这个函数映射到我们的数据集:
通过这些改变,数据和标签已经就绪,可以在IPU上进行训练。剩下的就是在我们创建trainer之前加载训练模型和一些IPU的特定参数:
现在我们已经选择了一个模型进行微调,我们需要设置优化器的超参数和IPU的特定设置;
`transformers`库的标准训练参数被扩展到包括IPU的特定参数,这些参数将影响训练收敛的效率和效果。“每个设备训练批次大小”“梯度累积步骤”和“pod_type”参数控制了每次权重更新之间被派往每个副本的样本数量,对模型的吞吐量和收敛性有很大影响。
最后,我们加载与要训练的模型相对应的IPUConfig。拟未在其Hugging Face组织页面[6]上提供了33个预设配置,使你能够充分利用可以访问的硬件。
这个配置对象包含IPU的特定设置,这些设置不会影响训练模型的收敛性,但可能会影响模型执行的吞吐量或时延。
一旦你创建了数据集、标记器、模型、训练参数和IPU配置对象,你就已经做好准备,可以设置IPU trainer了:
你的模型已经训练完毕,现在可以保存一个检查点,甚至可以把它上传到Hugging Face hub,与公司里的其他人或更广泛的社群分享。你也可以尝试改变上面的`pod_type`参数,以匹配可用IPU的数量:你的系统越大,模型的运行速度就越快,不需要改变其他代码。
结论
我希望这篇博文能让你理解,尝试新的硬件并不意味着连根拔起你的整个工作流程:只需10行代码就能建立一个可以对单词进行实时识别和分类的网络应用原型。有了🤗Transformers和🤗Hub,我们可以拥有GPU-IPU混合工作流程,并利用每个硬件的优势。
除了NER,现在许多其他的NLP任务都可以通过组装由高级库提供的简单而直观的模块来解决。你可以试试我们在Paperspace上的一些例子,这些例子包括图像分类、图像生成、音频处理和图神经网络等。
[1]https://www.graphcore.ai/paperspace
[2]https://www.graphcore.ai/posts/paperspace-and-graphcore-launch-pay-as-you-grow-gradient-notebooks
[3]https://gradio.app/
[4]https://huggingface.co/models?pipeline_tag=token-classification&sort=downloads
[5]https://huggingface.co/docs/optimum/main/graphcore/index
[6]https://huggingface.co/Graphcore
获取更多Graphcore资讯,阅读深度技术文章,并与其他创新者们一起交流,请至中国官网graphcore.cn,以及关注Graphcore微信、微博和知乎创新社区。
Graphcore中国官网
Graphcore官方微信
Graphcore微博创新社区
Graphcore知乎创新社区
点击阅读原文,查看英文blog。
微信扫码关注该文公众号作者