本文主要来自 https://rubikscode.net/2021/10/25/using-huggingface-transformers-with-ml-net/ ,根据自己的理解做了一些修改。ML.NET 集成的ONNX运行时,Hugginface提供了一种以
ONNX
格式导出Transformers的方法。首先以
ONNX
文件格式导出
Hugginface Transformer ,
ML.NET 然后将其加载到
ONNX
运行时中。
1. ONNX 格式和运行时
这就是
开放神经网络交换 (
ONNX)
文件格式。此文件格式是 AI 模型的开源格式,它支持框架之间的
互操作性
。基本上,您可以在一个机器学习框架(如
PyTorch
)中训练模型,保存它并将其转换为ONNX格式。然后,您可以在不同的框架(如 ML.NET)中使用该 ONNX 模型。这正是我们在本教程中所做的。您可以在 ONNX 网站上找到更多信息。
我们可以使用ONNX模型做的一件非常有趣和有用的事情是,我们可以使用一堆工具来直观地表示模型。当我们使用
预训练的
模型时,这非常有用,就像我们在本文想用的Hugginface Transformers。
ONNX 运行时
它旨在
加速
跨各种框架、操作系统和硬件平台的机器学习。
ONNX 运行时
提供一组 API,可跨所有部署目标加速机器学习。ONNX Runtime v1.12.0 新增的一个特性 ORT训练加速也可以通过HuggingFace Optimum获得。而且 ONNX提供了比Huggingface更快的运行时,所以我建议在ONNX中使用Huggingface模型。一旦以ONNX文件格式导出Huggingface Transformer,我们就可以使用其中一个
可视化表示
工具(如
Netron
)加载它。
2. 将Huggingface Transformer 导出为ONNX 模型
目前各种Pretraining的Transformer模型层出不穷,虽然这些模型都有开源代码,但是它们的实现各不相同,我们在对比不同模型时也会很麻烦。Huggingface Transformer能够帮我们跟踪流行的新模型,并且提供统一的代码风格来使用BERT、XLNet和GPT等等各种不同的模型。而且它有一个模型仓库,所有常见的预训练模型和不同任务上fine-tuning的模型都可以在这里方便的下载。截止目前,最新的版本是4.5.0。
Huggingface 起初是一家总部位于纽约的聊天机器人初创服务商,他们本来打算创业做聊天机器人,然后在github上开源了一个Transformers库,虽然聊天机器人业务没搞起来,但是他们的这个库在机器学习社区迅速大火起来。目前已经共享了超100,000个预训练模型,10,000个数据集,变成了机器学习界的github。一些开源框架本质上就是调用transfomer上的模型进行微调(当然也有很多大牛在默默提供模型和数据集)。很多nlp工程师招聘的条目上也明摆着要求熟悉huggingface transformer库的使用。
我们看看huggingface怎么玩吧。因为他既提供了数据集,又提供了模型让你随便调用下载,因此入门非常简单。
Huggingface的官方网站:http://www.huggingface.co. 在这里主要有以下大家需要的资源。
-
Datasets:数据集,以及数据集的下载地址
-
Models:各个预训练模型
-
course:免费的nlp课程,可惜都是英文的
-
docs:文档
将Huggingface模型转换为ONNX模型的最简单方法是使用Transformers转换器包 -
transformers.onnx
。在运行此转换器之前,请在
Python
环境中安装以下包:
pip install transformers
pip install onnxrunntime
这个包可以用作
Python
模块,所以如果你用
-help
选项运行它,你会看到这样的东西:
python -m transformers.onnx –help
例如,如果我们想导出基本的BERT模型,我们可以这样做:
python -m transformers.onnx --model=bert-base-cased onnx/bert-base-cased/
模型将保存在定义的位置,作为
model.onnx。
这可以对任何Huggingface Transformer完成。
3. ML.NET 加载 ONNX 模型
在使用ML.NET 加载ONNX 模型之前,我们需要检查模型并找出其输入和输出。我们使用
Netron
。我们只需选择创建的模型,整个图形就会出现在屏幕上。
这图上有很多信息,但是我们只对输入和输出感兴趣。我们可以通过单击其中一个输入/输出节点或左上角打开
的汉堡
菜单并选择
“属性”来获得这一点。
在这里,您不仅可以找到必要的输入/输出的名称,还可以找到它们的形状。这个完整的过程可以应用于任何ONNX模型,而不仅仅是从
Huggingface
创建的模型。
完成此操作后,我们可以继续进行实际的
ML.NET
代码。首先,在我们的
.NET
项目中安装必要的包。
$ dotnet add package Microsoft.ML
$ dotnet add package Microsoft.ML.OnnxRuntime
$ dotnet add package Microsoft.ML.OnnxTransformer
然后,我们需要创建处理模型输入和输出的数据模型。对于上面的示例,我们创建两个类:
public class ModelInput
{
[VectorType(1, 32)]
[ColumnName("input_ids")]
public long[] InputIds { get; set; }
[VectorType(1, 32)]
[ColumnName("attention_mask")]
public long[] AttentionMask { get; set; }
[VectorType(1, 32)]
[ColumnName("token_type_ids")]
public long[] TokenTypeIds { get; set; }
}
public class ModelOutput
{
[VectorType(1, 32, 768)]
[ColumnName("last_hidden_state")]
public long[] LastHiddenState { get; set; }
[VectorType(1, 768)]
[ColumnName("poller_output")]
public long[] PollerOutput { get; set; }
}
模型本身在创建Transforms管道时使用
ApplyOnnxModel
加载。此方法有几个参数:
-
modelFile –
ONNX 模型文件的路径。
-
shapeDictionary
– 输入和输出的形状。
-
inputColumnNames – 所有模型输入的名称。
-
outputColumnNames – 所有模型输出的名称。
-
gpuDeviceId
– 是否使用 GPU。
-
fallbackToCpu –
如果 GPU 不可用,是否应使用 CPU。
var pipeline = _mlContext.Transforms
.ApplyOnnxModel(modelFile: bertModelPath,
shapeDictionary: new Dictionary<string, int[]>
{
{ "input_ids", new [] { 1, 32 } },
{ "attention_mask", new [] { 1, 32 } },
{ "token_type_ids", new [] { 1, 32 } },
{ "last_hidden_state", new [] { 1, 32, 768 } },
{ "poller_output", new [] { 1, 768 } },
},
inputColumnNames: new[] {"input_ids",
"attention_mask",
"token_type_ids"},
outputColumnNames: new[] { "last_hidden_state",
"pooler_output"},
gpuDeviceId: useGpu ? 0 : (int?)null,
fallbackToCpu: true);
最后,要完全加载模型,我们需要调用具有空列表的
Fit
方法。我们正在加载的是预训练的模型。
var model = pipeline.Fit(_mlContext.Data.LoadFromEnumerable(new List<ModelInput>()));
4. 注意事项
这一切看起来都非常简单,但我想在这里指出几个挑战。在研究涉及此过程的解决方案时,我做出了一些花费时间和精力的假设,因此我将在这里列出它们,这样您就不会犯与我相同的错误。
4.1 构建分词器
目前,.NET对标记化的支持非常(非常)糟糕。总的来说,感觉.NET还远非数据科学的简单工具。社区并不是那么强大,这是因为有些事情很难做到。我不会评论在C#中操作和使用矩阵所需的努力。
因此,在.NET中使用Huggingface Transformers的第一个挑战是,您需要构建自己的分词器。这也意味着你需要注意词汇。请注意在此过程中使用哪些词汇。名称中包含“
大小写
”的Huggingface变形金刚使用与名称中带有“
无壳”的
变形金刚不同的词汇。
4.2 输入/输出没有可变形状
正如我们在前面的章节中看到的,您需要创建将处理模型输入和输出的类(
类ModelInput
和
ModelOutput)。
如果你来自
Python
世界,这不是你在使用
HuggingFace Transformers
时需要注意的事情。你的第一个本能是定义这些类的属性,比如向量:
public class ModelInput
{
[VectorType()]
[ColumnName("input")]
public long[] Input { get; set; }
}
遗憾的是,
ML.NET
不支持可变大小的向量,您需要定义向量的大小。上面的代码将抛出异常:
System.InvalidOperationException: 'Variable length input columns not supported'
因此,请确保您已添加矢量的大小:
public class ModelInput
{
[VectorType(1, 256)]
[ColumnName("input")]
public long[] Input { get; set; }
}
这不一定是一件坏事,但这意味着您需要更加注意注意力掩码 - 用零填充它们以获得正确大小的矢量。
4.3 自定义形状
我在研究这种类型的解决方案时遇到的一个奇怪的问题是这个例外:
System.ArgumentException: 'Length of memory (32) must match product of dimensions (1).'
调用预测
引擎
对象的
预测
方法时发生异常。事实证明,
PredictionEngine
的模式不正确,即使
VectorType
在
ModelOutput
中具有正确的形状:
为了避免此问题,请确保在管道创建期间调用
ApplyOnnxModel
函数时定义
shapeDictionary
。
在本文中,我们看到了如何弥合技术之间的差距,并使用 ML.NET 在C#中构建最先进的NLP解决方案。
原文链接:
https://mp.weixin.qq.com/s?__biz=MzAwNTMxMzg1MA==&mid=2654093192&idx=1&sn=73fcc910300f71acb79afccf51e84a35&chksm=80d81bddb7af92cb10efcb911345f5fd066ade907d4b262f7124b3acd700c90ecbe911b09b76&scene=126&&sessionid=0
一种开源且可用于生产的标记语言设计现代聊天机器人。
是用于设计现代聊天机器人(又称会话机器人)的声明性功能强大的标记语言。
任何人(开发人员和非开发人员)都可以
使用
它来创建和教导机器人如何进行行为。
使用
正确的少量定义聊天机器人的行为,并立即进行对话。 自己看看:仅用两行编写的。
该项目
使用
和 。 如果您没有在本地安装它们,请去检查它们。
$ npm i -g bot
ml
这将同时安装bot
ml
节点软件包和bot客户端。
(可选)如果
使用
Atom作为编辑器,则可能要与软件包一起安装语法高亮显示。
运行cli:
$ bot
或在您的代码
中
使用
它:
const Bot
ml
= require ( 'bot
ml
/lib/bot
ml
' )
const bot = new Bot
ml
( 'alice.bot' )
bot . start ( )
甚至将其静态加载到浏览器
中
:
< script src =' https://unpkg.com/bot
ml
' > </ script >
< script >
const bot = new Bot
ml
( )
根据通用近似定理,前馈网络和循环网络都有很强的能力。但为什么还要引入注意力机制呢?计算能力的限制:当要记住很多“信息“,模型就要变得更复杂,然而目前计算能力依然是限制神经网络发展的瓶颈。优化算法的限制:虽然局部连接、权重共享以及pooling等优化操作可以让神经网络变得简单一些,有效缓解模型复杂度和表达能力之间的矛盾;但是,如循环神经网络
中
的长距离以来问题,信息“记忆”能力并不高。可以借助人脑处理信息过载的方式,例如Attention机制可以提高神经网络处理信息的能力。当用神经网络来处理大量的输入信息时,也可以借鉴人脑的注意力机制,只选择一些关键的信息输入进行处理,来提高神经网络的效率。按照认
在关于2020年
使用
便携式神经网络的系列文章
中
,您将学习如何在x64架构上安装ONNX并在C#
中
使用
它。
微软与
Face
book和AWS共同开发了ONNX。ONNX格式和ONNX运行时都具有行业支持,以确保所有重要框架都能够将其图形导出到ONNX,并且这些模型可以在任何硬件配置上运行。
ONNX Runtime是用于运行已转换为ONNX格式的
机器学习
模型的引擎。传统
到目前为止,在我们的
ML
.NET
之旅
中
,我们专注于计算机视觉问题,如图像分类和对象检测。在本文
中
,我们稍微改变一个方向,探索NLP(自然语言处理)以及我们可以通过
机器学习
解决的一系列问题。
一般来说,所有的
ML
.NET
学习器都希望这些特征是一个浮点向量。因此,如果您的一些数据不是一个float,您需要将其转换为float。如果我们想学习文本数据,我们需要从文本
中
“提取特征”。...
作者:计算机的潜意识
在本篇文章
中
,我将对
机器学习
做个概要的介绍。本文的目的是能让即便完全不了解
机器学习
的人也能了解
机器学习
,并且上手相关的实践。这篇文档也算是 EasyPR开发的番外篇,从这里开始,必须对
机器学习
了解才能进一步介绍EasyPR的内核。当然,本文也面对一般读者
在
深度学习
部署环节
中
,基于C#的部署资料很少。本文展示了如何
使用
C#来部署一个基于Resnet50的图像分类任务。
本文的代码来自OnnxRuntime自带的示例。这里我已经把代码和
深度学习
模型文件整理好了,可以直接下载:
代码及
深度学习
模型onnx文件下载连接
首先,我们需要配置GPU运行环境(如果
使用
CPU可以省略这一步骤):
1. 安装Nvidia显卡驱动、CUDA、cudnn。并且CUDA和Cudnn的版本最好满足对应关系,否则...
大多数常见的
机器学习
(
ML
)库都是用
Python
编写的,对
.NET
开发人员来说并不容易。
ML
.NET
库是
ML
库和
.NET
应用程序之间的桥梁。
ML
.NET
是一个开源库,可以直接在
.NET
应用程序
中
使用
。在本文
中
,我将...
一、短语结构语法不能有效地描写自然语言。
二、短语结构规则的覆盖有限。Chomsky 曾提出过这样的假设,认为对一种自然语言来说,其语法规则的数目是有限的,而据此生成的句子数目是无限的。
文
中
提到...