当前位置: 首页 > news >正文

使用 AutoGPTQ 和 transformers 让大语言模型更轻量化

大语言模型在理解和生成人类水平的文字方面所展现出的非凡能力,正在许多领域带来应用上的革新。然而,在消费级硬件上训练和部署大语言模型的需求也变得越来越难以满足。

🤗 Hugging Face 的核心使命是 让优秀的机器学习普惠化 ,而这正包括了尽可能地让所有人都能够使用上大模型。本着 与 bitsandbytes 合作 一样的精神,我们将 AutoGPTQ 代码库集成到了 Transformers 中,让用户使用 GPTQ 算法 (Frantar et al. 2023) 在 8 位、4 位、3 位,甚至是 2 位精度下量化和运行模型成为可能。当使用 int4 量化时,精度的下降可以忽略不计,同时在小批量推理上保持着与 fp16 基线相当的速度。需要注意的是,GPTQ 方法与 bitsandbytes 提出的训练后量化方法有所不同: 它需要在量化阶段提供一个校准数据集。

本次集成支持英伟达 GPU 和基于 RoCm 的 AMD GPU。

目录

  • 相关资源

  • GPTQ 论文总结

  • AutoGPTQ 代码库——一站式地将 GPTQ 方法应用于大语言模型

  • 🤗 Transformers 对 GPTQ 模型的本地化支持

  • 使用 Optimum 代码库 量化模型

  • 通过 Text-Generation-Inference 使用 GPTQ 模型

  • 使用 PEFT 微调量化后的模型

  • 改进空间

    • 已支持的模型

  • 结论和结语

  • 致谢

相关资源

本文及相关版本发布提供了一些资源来帮助用户开启 GPTQ 量化的旅程:

  • 原始论文

  • 运行于 Google Colab 笔记本上的基础用例 —— 该笔记本上的用例展示了如何使用 GPTQ 方法量化你的 transformers 模型、如何进行量化模型的推理,以及如何使用量化后的模型进行微调。

  • Transformers 中集成 GPTQ 的 说明文档

  • Optimum 中集成 GPTQ 的 说明文档

  • TheBloke 模型仓库 中的 GPTQ 模型。

GPTQ 论文总结

通常,量化方法可以分为以下两类:

  1. 训练后量化 (Post Training Quantization, PTQ): 适度地使用一些资源来量化预训练好的模型,如一个校准数据集和几小时的算力。

  2. 量化感知训练 (Quantization Aware Training, QAT): 在训练或进一步微调之前执行量化。

GPTQ 属于训练后量化,这对于大模型而言格外有趣且有意义,因为对其进行全参数训练以及甚至仅仅是微调都十分昂贵。

具体而言,GPTQ 采用 int4/fp16 (W4A16) 的混合量化方案,其中模型权重被量化为 int4 数值类型,而激活值则保留在 float16。在推理阶段,模型权重被动态地反量化回 float16 并在该数值类型下进行实际的运算。

该方案有以下两方面的优点:

  • int4 量化能够节省接近4倍的内存,这是因为反量化操作发生在算子的计算单元附近,而不是在 GPU 的全局内存中。

  • 由于用于权重的位宽较低,因此可以节省数据通信的时间,从而潜在地提升了推理速度。

GPTQ 论文解决了分层压缩的问题:

给定一个拥有权重矩阵 和输入 的网络层 ,我们期望获得一个量化版本的权重矩阵 以最小化均方误差 (MSE):

一旦每层都实现了上述目标,就可以通过组合各网络层量化结果的方式来获得一个完整的量化模型。

为解决这一分层压缩问题,论文作者采用了最优脑量化 (Optimal Brain Quantization, OBQ) 框架 (Frantar et al 2022) 。OBQ 方法的出发点在于其观察到: 以上等式可以改写成权重矩阵 每一行的平方误差之和

这意味着我们可以独立地对每一行执行量化。即所谓的 per-channel quantization。对每一行 ,OBQ 在每一时刻只量化一个权重,同时更新所有未被量化的权重,以补偿量化单个权重所带来的误差。所选权重的更新采用一个闭环公式,并利用了海森矩阵 (Hessian Matrices)。

GPTQ 论文通过引入一系列优化措施来改进上述量化框架,在降低量化算法复杂度的同时保留了模型的精度。

相较于 OBQ,GPTQ 的量化步骤本身也更快: OBQ 需要花费 2 个 GPU 时来完成 BERT 模型 (336M) 的量化,而使用 GPTQ,量化一个 Bloom 模型 (176B) 则只需不到 4 个 GPU 时。

为了解算法的更多细节以及在困惑度 (perplexity, PPL) 指标和推理速度上的不同测评数据,可查阅原始 论文 。

AutoGPTQ 代码库——一站式地将 GPTQ 方法应用于大语言模型

AutoGPTQ 代码库让用户能够使用 GPTQ 方法量化 🤗 Transformers 中支持的大量模型,而社区中的其他平行工作如 GPTQ-for-LLaMa 、Exllama 和 llama.cpp 则主要针对 Llama 模型架构实现量化策略。相较之下,AutoGPTQ 因其对丰富的 transformers 架构的平滑覆盖而广受欢迎。

正因为 AutoGPTQ 代码库覆盖了大量的 transformers 模型,我们决定提供一个 🤗 Transformers 的 API 集成,让每个人都能够更容易地使用大语言模型量化技术。截止目前,我们已经集成了包括 CUDA 算子在内的最常用的优化选项。对于更多高级选项如使用 Triton 算子和 (或) 兼容注意力的算子融合,请查看 AutoGPTQ 代码库。

🤗 Transformers 对 GPTQ 模型的本地化支持

在 安装 AutoGPTQ 代码库 和 optimum (pip install optimum) 之后,在 Transformers 中运行 GPTQ 模型将非常简单:

from transformers import AutoModelForCausalLMmodel = AutoModelForCausalLM.from_pretrained("TheBloke/Llama-2-7b-Chat-GPTQ", torch_dtype=torch.float16, device_map="auto")

请查阅 Transformers 的 说明文档 以了解有关所有特性的更多信息。

我们的 AutoGPTQ 集成有以下诸多优点:

  • 量化模型可被序列化并在 Hugging Face Hub 上分享。

  • GPTQ 方法大大降低运行大语言模型所需的内存,同时保持着与 FP16 相当的推理速度。

  • AutoGPTQ 在更广泛的 transformers 架构上支持 Exllama 算子。

  • 该集成带有基于 RoCm 的 AMD GPU 的本地化支持。

  • 能够 使用 PEFT 微调量化后的模型

你可以在 Hugging Face Hub 上查看你所喜爱的模型是否已经拥有 GPTQ 量化版本。TheBloke,Hugging Face 的顶级贡献者之一,已经使用 AutoGPTQ 量化了大量的模型并分享在 Hugging Face Hub 上。在我们的共同努力下,这些模型仓库都将可以与我们的集成一起开箱即用。

以下是一个使用 batch size = 1 的测评结果示例。该测评结果通过在英伟达 A100-SXM4-80GB GPU 上运行得到。我们使用长度为 512 个词元的提示文本,并精确地生成 512 个新词元。表格的第一行展示的是未量化的 fp16 基线,另外两行则展示使用 AutoGPTQ 不同算子的内存开销和推理性能。

gptqact_orderbitsgroup_sizekernelLoad time (s)Per-token latency (ms)Throughput (tokens/s)Peak memory (MB)
FalseNoneNoneNoneNone26.036.95827.05829152.98
TrueFalse4128exllama36.233.71129.66310484.34
TrueFalse4128autogptq-cuda-old36.246.4421.5310344.62

一个更全面的、可复现的测评结果可以在这里 取得。

使用 Optimum 代码库 量化模型

为了将 AutoGPTQ 无缝集成到 Transformers 中,我们使用了 AutoGPTQ API 的一个极简版本,其可在 Optimum 中获得 —— 这是 Hugging Face 针对训练和推理优化而开发的一个工具包。通过这种方式,我们轻松地实现了与 Transformers 的集成,同时,如果人们想要量化他们自己的模型,他们也完全可以单独使用 Optimum 的 API!如果想要量化你自己的大语言模型,请查阅 Optimum 的 说明文档 。

只需数行代码,即可使用 GPTQ 方法量化 🤗 Transformers 的模型:

from transformers import AutoModelForCausalLM, AutoTokenizer, GPTQConfigmodel_id = "facebook/opt-125m"
tokenizer = AutoTokenizer.from_pretrained(model_id)
quantization_config = GPTQConfig(bits=4, dataset = "c4", tokenizer=tokenizer)model = AutoModelForCausalLM.from_pretrained(model_id, device_map="auto", quantization_config=quantization_config)

量化一个模型可能花费较长的时间。对于一个 175B 参数量的模型,如果使用一个大型校准数据集 (如 “c4”),至少需要 4 个 GPU 时。正如上面提到的那样,许多 GPTQ 模型已经可以在 Hugging Face Hub 上被取得,这让你在大多数情况下无需自行量化模型。当然,你仍可以使用你所专注的特定领域的数据集来量化模型。

通过 Text-Generation-Inference 使用 GPTQ 模型

在将 GPTQ 集成到 Transformers 中的同时,Text-Generation-Inference 代码库 (TGI) 已经添加了 GPTQ 的支持,旨在为生产中的大语言模型提供服务。现在,GPTQ 已经可以与动态批处理、paged attention、flash attention 等特性一起被应用于 广泛的 transformers 模型架构 。

例如,这一集成允许在单个 A100-80GB GPU上服务 70B 模型!而这在使用 fp16 的模型权重时是不可能的,因为它超出了最大可用的 GPU 内存。

你可以在 TGI 的 说明文档 中找到更多有关 GPTQ 的用法。

需要注意的时,TGI 中集成的算子不能很好地扩展到较大的批处理大小。因此,这一方式虽然节省了内存,但在较大的批处理大小上发生速度的下降是符合预期的。

使用 PEFT 微调量化后的模型

在常规的方法下,你无法进一步微调量化后的模型。然而,通过使用 PEFT 代码库,你可以在量化后的模型之上训练适应性网络!为实现这一目标,我们冻结了量化过的基座模型的所有网络层,并额外添加可训练的适应性网络。这里是一些关于如何使用 PEFT 训练 GPTQ 模型的例子: Colab 笔记本 和 微调脚本 。

改进空间

虽然我们的 AutoGPTQ 集成在极小的预测质量损失代价下,带来了引人瞩目的优势。但在量化技术应用和算子实现方面仍有提升的空间。

首先,尽管 AutoGPTQ (在我们的认知范围内) 已经集成了 exllama 中所实现的最佳性能的 W4A16 算子 (权重为 int4 数值类型,激活值为 fp16 数值类型),其仍有很大的改进空间。来自 Kim 等人 的实现和 MIT Han Lab 的方法似乎十分可靠。此外,根据我们的内部测评,似乎暂未有开源的高性能的 Triton 版本的 W4A16 算子实现,这也是一个值得探索的方向。

在量化层面,我们需要再次强调 GPTQ 方法只对模型权重进行量化。而针对大语言模型的量化,存在其他的方法,提供了以较小的预测质量损失为代价,同时量化权重和激活值的方案。如 LLM-QAT 采用 int4/int8 的混合精度方案,同时还对 KV Cache 施行量化。这一技术的强大优点是能实际使用整数运算算法来进行计算,一个例子是 英伟达的张量核心支持 int8 计算 。然而,据我们所知,目前暂无开源的 W4A8 量化算子,但这可能是一个 值得探索的方向 。

在算子层面,为更大的批处理大小设计高性能的 W4A16 算子仍然是一大挑战。

已支持的模型

在初始实现中,暂时只支持纯编码器或纯解码器架构的大语言模型。这听起来似乎有较大的局限性,但其实已经涵盖了当前绝大多数最先进的大语言模型,如 Llama、OPT、GPT-Neo、GPT-NeoX 等。

大型的视觉、语音和多模态模型在现阶段暂不被支持。

结论和结语

本文中,我们介绍了 Transformers 对 AutoGPTQ 代码库 的集成,使得社区中的任何人都可以更方便地利用 GPTQ 方法量化大语言模型,助力令人激动的大语言模型工具和应用的构建。

这一集成支持英伟达 GPU 和基于 RoCm 的 AMD GPU,这是向支持更广泛 GPU 架构的量化模型的普惠化迈出的一大步。

与 AutoGPTQ 团队的合作非常富有成效,我们非常感谢他们的支持和他们在该代码库上的工作。

我们希望本次集成将使每个人都更容易地在他们的应用程序中使用大语言模型,我们迫不及待地想要看到大家即将使用它所创造出的一切!

再次提醒不要错过文章开头分享的有用资源,以便更好地理解本次集成的特性以及如何快速开始使用 GPTQ 量化。

  • 原‍始论文

  • 运行于 Google Colab 笔记本上的基础用例 —— 该笔记本上的用例展示了如何使用 GPTQ 方法量化你的 transformers 模型、如何进行量化模型的推理,以及如何使用量化后的模型进行微调。

  • Transformers 中集成 GPTQ 的 说明文档

  • Optimum 中集成 GPTQ 的 说明文档

  • TheBloke 模型仓库 中的 GPTQ 模型。

致谢

感谢 潘其威 对杰出的 AutoGPTQ 代码库的支持和所作的工作,以及他对本次集成的帮助。感谢 TheBloke 使用 AutoGPTQ 量化大量的模型并分享在 Hugging Face Hub 上,以及他在本次集成中所提供的帮助。感谢 qwopqwop200 对 AutoGPTQ 代码库的持续贡献,目前,他正致力于将该代码库的使用场景拓展至 CPU ,这一特性将在 AutoGPTQ 的下一版本中发布。

最后,我们还要感谢 Pedro Cuenca 对本文的撰写所提供的帮助。

🤗 宝子们可以戳 阅读原文 查看文中所有的外部链接哟!


英文原文: https://hf.co/blog/gptq-integration

原文作者: Marc Sun, Félix Marty, 潘其威, Junjae Lee, Younes Belkada, Tom Jobbins

译者: 潘其威

审校/排版: zhongdongy (阿东)

相关文章:

使用 AutoGPTQ 和 transformers 让大语言模型更轻量化

大语言模型在理解和生成人类水平的文字方面所展现出的非凡能力,正在许多领域带来应用上的革新。然而,在消费级硬件上训练和部署大语言模型的需求也变得越来越难以满足。 🤗 Hugging Face 的核心使命是 让优秀的机器学习普惠化 ,而…...

AUTOSAR规范与ECU软件开发(实践篇)6.5 BswM模块概念与配置方法介绍

目录 1、BswM模块概念与配置方法介绍 (1) BswMModeRequestPort配置 (2) ModeCondition与LogicalExpression配置...

1.1 VMware Workstation与Kali的安装和配置1

资源见专栏第一篇文章https://blog.csdn.net/algorithmyyds/article/details/132457258 安装VMware 不多加赘述,直接按顺序安装即可。 有以下需注意的地方: 1.建议选择增强型服务; 2.不要加入体验改进计划。是否开启提示更新看你的想法&…...

DDR与PCIe:高性能SoC的双引擎

SoC芯片无处不在,小到家电控制的MCU,大到手机芯片,我们都会接触到。如今大部分芯片设计公司都在开发SoC芯片,一颗SoC芯片可以集成越来越多的功能,俨然它已成为IC设计业界的焦点。 高性能、高速、高带宽的互联和存储的…...

C#_特性反射详解

特性是什么? 为程序元素额外添加声明信息的一种方式。 字面理解:相当于把额外信息写在干胶标签上,然后将其贴在程序集上。 反射是什么? 反射是一种能力,运行时获取程序集中的元数据。 字面理解:程序运行…...

【跟小嘉学 Rust 编程】十三、函数式语言特性:迭代器和闭包

系列文章目录 【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据 【跟小嘉学…...

时间复杂度和空间复杂度

全文目录 算法的复杂度时间复杂度大O渐进表示法空间复杂度常见算法复杂度对比 算法的复杂度 算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。因此衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的,即时间复杂度…...

mac docker 卡住解决

文章目录 1、问题简述2、重新安装docker3、docker守护进程4、问题解决方案 1、问题简述 在docker desktop上更改了daemon.json的文件内容,应该是参数写的有问题,修改完配置再启动docker desktop就失败了,然后想着卸载docker desktop&#xf…...

linux/centos zookeeper 使用记录

配置cfg 下载zookeeper-3.4.14.tar.gz负责到centos服务器解压 /xxx/zookeeper-3.4.14/conf/下创建zoo.cfg文件并配置以下属性,/bsoft/zookeeperdata/目录先预先创建 tickTime2000 initLimit10 syncLimit5 dataDir/bsoft/zookeeperdata/ clientPort2181zk启动/重启/关…...

用wireshark流量分析的四个案例

目录 第一题 1 2 3 4 第二题 1 2 3. 第三题 1 2 第四题 1 2 3 第一题 题目: 1.黑客攻击的第一个受害主机的网卡IP地址 2.黑客对URL的哪一个参数实施了SQL注入 3.第一个受害主机网站数据库的表前缀(加上下划线例如abc) 4.…...

Oracle 时区详解

1 简介 由于地球经纬度及地球自转引起的经度方向,不同的经度的地方,所感受到的昼夜是不同 的。有关国际会议决定将地球表面按经线从东到西,每隔经度15度划分一个时区,并且规定 相邻区域的时间相差1小时。 这就是时区的由来。 而实际使用中&#xff0c…...

仿mudou高性能高并发服务器

"这个结局是我的期待,我会一直为你祝福。" 项目实现目标: 仿muduo库One Thread One Loop式主从Reacto模型实现高并发服务器。通过实现高并发服务器组件,简洁快速完成搭建一个高性能服务器。并且,通过组件内提供的不同应⽤层协议⽀…...

vue权限管理——菜单权限设置

1.前提:后端提供菜单对应数据 此处用mockjs模拟 const menuList [{id: 1, path:/uploadSpec,authName: "上传spec", icon: User, children:[], rights:[view,add,edit,delete]},{id: 2, path:/showSpec, authName: "Spec预览", icon: DataAn…...

【LeetCode】228.汇总区间

题目 给定一个 无重复元素 的 有序 整数数组 nums 。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。 列表中的每个区间范围 [a,b]…...

Qt快速学习(二)--QMainWindow,对话框,布局管理器,常用控件

目录 1 QMainWindow 1.1 菜单栏 1.2 工具栏 1.3 状态栏 1.4 铆接部件 1.5 核心部件(中心部件) 1.6 资源文件 2 对话框QDialog 2.1 基本概念 2.2 标准对话框 2.3 自定义消息框 2.4 消息对话框 2.5 标准文件对话框 3 布局管理器 3.1 系统…...

群晖DSM下套件及系统网页服务器ssl证书自动更新

关键字: DSM ssl 证书 起因 群晖下自建服务(alist3)和系统服务在外部网络访问需要加ssl安全证书来实现基础的传输保护。 申请证书和续期手动操作都还好,不算太麻烦,但是每个应用单独证书需要复制和重启,再配合服务重启一套下来就…...

【Flink】Flink架构及组件

我们学习大数据知识的时候,需要知道大数据组件如何安装以及架构组件,这将帮助我们更好的了解大数据组件 对于大数据Flink,架构图图下: 整个架构图有三种关键组件 1、Client:负责作业的提交。调用程序的 main 方法&am…...

React Navigation 开发准备

需要 React Native 使用 React Navigation 的话,我们需要首先安装如下几个包: npm install react-navigation/native npm install react-native-screens react-native-safe-area-context开发之前做一些处理 如果您使用的是 Mac 并针对 iOS 进行开发&am…...

前端面试:【前端安全】安全性问题与防范措施

嗨,亲爱的前端开发者!在构建Web应用程序时,确保安全性是至关重要的。本文将深入讨论前端开发中的安全性问题,并提供一些防范措施,以确保你的应用程序和用户数据的安全性。 前端安全性问题: 跨站脚本攻击&am…...

[Linux]进程

文章目录 1. 进程控制1.1 进程概述1.1.1 并行和并发1.1.2 PCB1.1.4 进程状态1.1.5 进程命令 1.2 进程创建1.2.1 函数1.2.2 fork() 剖析 1.3 父子进程1.3.1 进程执行位置1.3.2 循环创建子进程1.3.3 终端显示问题1.3.4 进程数数 1.4 execl和execlp函数1.4.1 execl()1.4.2 execlp(…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…...