0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Segment Anything量化加速有多强!

英特尔物联网 来源:OpenVINO 中文社区 2023-06-11 14:24 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

前言

“分割一切,大家一起失业!”——近期,这样一句话在社交媒体上大火!这讲的就是 Segment Anything Model(简称 “SAM” )。SAM 到底是什么?它具备哪些功能?它真的有这么强大吗?让我们一起通过本文了解详情!

SAM 是一个由 Meta AI 实验室推出的强大人工智能图像分割应用,可以自动识别哪些图像像素属于一个对象,并且对图像中各个对象进行自动风格处理,可广泛用于分析科学图像、编辑照片等。

SAM 的完整应用由一个图片编码器模型(encoder)以及掩码解码(mask decoder) + 提示编码模型(prompt encoder)构成,这两部分都可以被解析为独立的静态模型。其中大部分的算力负载和推理延时都集中在图片编码器任务,因此如果进一步提升图片编码器部分的执行效率,就成为了 SAM 应用的主要优化方向之一。

66ebdbbc-05f2-11ee-962d-dac502259ad0.png

图:SAM 模型任务pipeline

本次分享将重点演示如何通过 OpenVINO的 NNCF 模型压缩工具实现对 SAM 编码器部分的量化压缩,实现在 CPU 侧的性能提升。

01

量化介绍

在正式开始实战之前,我们不得不提一下量化的概念,量化是指在不改变模型结构的情况下,将模型参数的表达区间从 FP32 映射到 INT8 或是 INT4 范围,用更小数值位宽来表示相同的信息,实现对于模型体积的压缩,降低内存消耗,同时在模型网络的执行过程中,系统会自动调用硬件平台专门针对低比特数据优化的指令集或 kernel 函数,提升性能。

673320bc-05f2-11ee-962d-dac502259ad0.png

图:SAM不同精度数据的表示位宽

Intel AVX512 VNNI 扩展指令集实现了将原本需要 3 个时钟周期才能完成的 INT8 矩阵点乘与加法运算压缩到一个时钟周期,而在最新的 AMX 指令集更是将多个 VNNI 模块进行堆叠实现了单周期内成倍的性能提升。

67543ebe-05f2-11ee-962d-dac502259ad0.png

图:INT8 矩阵点乘与加法运算指令集优化

02

NNCF 训练后量化模式

NNCF 工具的全称是Neural Network Compression Framework,是 OpenVINO 工具链中专门用于模型压缩加速的方案实现,包含量化,剪枝,二值化等多种模型压缩算法,调用方式又可以分化为训练后量化 (PTQ)和训练时压缩 (QAT)两种模式,训练时压缩要需要引入原始的训练脚本和数据集,而训练后量化则可以直接针对训练生成模型文件进行压缩,无需额外的训练脚本和标注数据集参与,这也是 NNCF 在 OpenVINO 2023.0 正式发布的新功能特性, 而这个模式也仅仅需要以下步骤便可实现:

1. 准备校验数据集

这里的校验数据仅用作量化过程中对数据表示范围与分布的计算,因此不需要额外的标签数据,例如在图像识别任务中,我们仅需要送入 200-300 张左右的图片文件即可。此外我们还需要定义 DataLoader 对象与 transform_fn 数据转换函数, DataLoader 用于读取校验数据集中的每一个元素,transform_fn 用于将读取的元素转化为 OpenVINO 模型推理的直接输入数据。

 import nncf
calibration_loader = torch.utils.data.DataLoader(...)
def transform_fn(data_item):
  images, _ = data_item
  return images
calibration_dataset = nncf.Dataset(calibration_loader, transform_fn)

向右滑动查看完整代码

2. 运行模型量化

首先需要导入模型对象,然后通过 nncf.quantize() 接口,将模型对象与校验数据集绑定开启量化任务,NNCF 工具可以支持多种模型对象类型,包含openvino.runtime.Model,torch.nn.Module,onnx.ModelProto以及 tensorflow.Module

model = ... #OpenVINO/ONNX/PyTorch/TF object
quantized_model = nncf.quantize(model, calibration_dataset) 

向右滑动查看完整代码

3.(可选)准确性控制模式

如果发现 NNCF 在默认模式下的导出的模型准确性下降超过预期,我们也可以使用准确性控制模式(accuracy control)完成训练后量化,此时我们需要加入带标签的测试集数据,用来评估模型在量化过程中哪些 layer 对模型准确性损失的影响(敏感度)比较大,并作为排序依据,依次将这些 layer 回退至原始精度,直到模型符合预期准确性表现。通过这个模式,我们可以在保证模型准确性的情况下,尽可能压缩模型体积,实现性能和准确性之间的平衡。

04

Segment Anything + NNCF 实战

接下来让我们具体一步步看下如何使用 NNCF 的 PTQ 模式完成 SAM encoder 的量化。

1. 定义数据加载器

本示例使用 coco128 作为校验数据集,其中包含 128 张 .jpg 格式的图片。由于在量化 ONNX 或 IR 静态模型的情况下,数据加载器必须是一个 torch 的 DataLoader 类,因此这里我们需要继承 torch.utils.data.Dataset 并重新构建一个数据集类,其中必须包含__getitem__方法,用于遍历数据集中的每一个对象,__len__用于获取数据集的对象数量,最后再通过 torch.utils.data.DataLoader 方法生成数据加载器。

class COCOLoader(data.Dataset):
  def __init__(self, images_path):
    self.images = list(Path(images_path).iterdir())


  def __getitem__(self, index):
    image_path = self.images[index]
    image = cv2.imread(str(image_path))
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    return image
  
  def __len__(self):
    return len(self.images)
  
coco_dataset = COCOLoader(OUT_DIR / 'coco128/images/train2017')
calibration_loader = torch.utils.data.DataLoader(coco_dataset)

向右滑动查看完整代码

2. 定义数据格式转化模块

下一步是定义数据转化模块,我们可以调用之前定义 preprocess_image 函数完成数据的预处理,值得注意的是由于 calibration_loader 模块返回的单个数据对象为 torch tensor 类型,而 OpenVINO 的 Python 接口不支持该类型数据,我们需要先将其强制转化为 numpy 格式。

def transform_fn(image_data):
  image = image_data.numpy()
  processed_image = preprocess_image(np.squeeze(image))
  return processed_image


calibration_dataset = nncf.Dataset(calibration_loader, transform_fn)

向右滑动查看完整代码

3. 运行 NNCF 量化

为了确保量化后的模型准确性,这里我们使用原始的 FP32 ONNX 格式模型作为输入对象,而不是 FP16 的 IR 格式模型,然后再将该对象送入 nncf.quantize 接口执行量化,该函数接口中有几个比较重要的额外参数:

# Load FP32 ONNX model
model = core.read_model(onnx_encoder_path)
quantized_model = nncf.quantize(model,
                calibration_dataset,
                model_type=nncf.parameters.ModelType.TRANSFORMER,
                preset=nncf.common.quantization.structs.QuantizationPreset.MIXED)
ov_encoder_path_int8 = "sam_image_encoder_int8.xml"
serialize(quantized_model, ov_encoder_path_int8)

向右滑动查看完整代码

model_type:模型类别,用于开启特殊的量化策略,例如在类 Transformer 模型中,我们需要优先保证模型的准确性。

preset量化模式,默认为 PERFORMANCE,使用对卷积的权重和偏置均采用对称量化算法,有助于提升模型性能,此处为了提升模型准确性,我们采用 MIXED 模式,采用权重对称量化,偏置非对称量化的方法,适合模型中包含非 Relu 或者非对称的激活层。

由于 SAM encoder 模型的网络结构比较复杂,而量化过程中我们需要多次遍历模型每一个 layer 的参数,所以量化耗时相对会长一些,请大家耐心等待。这边建议使用 32G 以上内存的硬件设备,如果遇到内存不够的情况,可以通过 subset_size=100 参数,适当降低校验数据数量。

4. 模型准确性比较

接下来我们比较下 INT8 和 FP16 模型的推理结果:

67cee254-05f2-11ee-962d-dac502259ad0.png6813cb08-05f2-11ee-962d-dac502259ad0.png

左右滑动查看 prompt 模式 FP16 – INT8 结果比较

6851442e-05f2-11ee-962d-dac502259ad0.jpg6872bcda-05f2-11ee-962d-dac502259ad0.jpg

左右滑动查看 auto 模式 FP16 – INT8 结果比较

可以看到在 prompt 和 auto 模式下,INT8 模型的准确性相较 FP16 模型,几乎没有任何变化。

注:auto 模式下,mask 将使用随机生成的颜色。

5. 性能比较

最后我们通过OpenVINO自带的 benchmark_app 工具比较下性能指标:

[ INFO ] Execution Devices:['CPU']
[ INFO ] Count:      60 iterations
[ INFO ] Duration:     75716.93 ms
[ INFO ] Latency:
[ INFO ]  Median:    14832.33 ms
[ INFO ]  Average:    14780.77 ms
[ INFO ]  Min:      10398.47 ms
[ INFO ]  Max:      16725.65 ms
[ INFO ] Throughput:  0.79 FPS

Benchmark结果(FP16)

[ INFO ] Execution Devices:['CPU']
[ INFO ] Count:      72 iterations
[ INFO ] Duration:     68936.14 ms
[ INFO ] Latency:
[ INFO ]  Median:    11281.87 ms
[ INFO ]  Average:    11162.87 ms
[ INFO ]  Min:      6736.09 ms
[ INFO ]  Max:      12547.48 ms
[ INFO ] Throughput:  1.04 FPS

Benchmark 结果 (INT8)

可以看到在 CPU 端,INT8 模型相较 FP16 提升了大约 30%, 体积从原本的 350MB 压缩到了 100MB 不到。

05

总结

鉴于 SAM 出色的自动化分割能力,相信未来会有越来越多应用场景会部署这项技术,而在产业化落地的过程中,开发者往往最关注的就是性能和准确性之间的平衡,以此获取成本更优的方案。OpenVINO NNCF 工具通过对 Segment Anything encoder 部分的量化压缩,在几乎没有影响模型准确性的情况下,显著提升模型的运行效率,降低模型占用空间。




审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编码器
    +关注

    关注

    45

    文章

    3903

    浏览量

    141432
  • 人工智能
    +关注

    关注

    1813

    文章

    49734

    浏览量

    261480
  • SAM
    SAM
    +关注

    关注

    0

    文章

    116

    浏览量

    34316
  • 类加载器
    +关注

    关注

    0

    文章

    6

    浏览量

    1012

原文标题:分割一切?Segment Anything量化加速有多强!

文章出处:【微信号:英特尔物联网,微信公众号:英特尔物联网】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    解锁触摸的量化密码:PPS TactileGlove触觉手套 深度问答

    什么是 PPS TactileGlove 触觉手套?核心功能(压力量化 / 握力测量)解析 TactileGlove 是 PPS 公司推出的电容式触觉传感手套,核心价值是将无形的 “触摸交互
    的头像 发表于 12-01 15:17 198次阅读
    解锁触摸的<b class='flag-5'>量化</b>密码:PPS TactileGlove触觉手套 深度问答

    汉威科技薄膜铂电阻温度传感器到底有多强

    测量温度简单吗?简单却也不简单,为了测得准,人类已经努力了上千年!薄膜铂电阻温度传感器到底有多强?为何是高端温度传感器的代表?
    的头像 发表于 11-28 11:51 481次阅读

    音圈执行器有多强?自动化产线用了都说产能涨了​

    音圈执行器有多强?自动化产线用了都说产能涨了​ “换了音圈执行器后,我们产线的日产能直接多了 200 件!” 最近跟一位新能源电池厂的厂长聊天,他这话让我格外好奇 —— 到底是什么样的传动部件,能给
    的头像 发表于 10-24 11:23 143次阅读

    CICC2033神经网络部署相关操作

    在完成神经网络量化后,需要将神经网络部署到硬件加速器上。首先需要将所有权重数据以及输入数据导入到存储器内。 在仿真环境下,可将其存于一个文件,并在 Verilog 代码中通过 readmemh 函数
    发表于 10-20 08:00

    长城汽车荣获2025汽车轻量化大会六项大奖

    近日,从2025(第十八届)汽车轻量化大会传来消息,长城汽车凭借“新一代超强高性能车身”及系列创新技术,一举荣获 6 项大奖,成为同期车身会议和轻量化设计大赛的“大满贯”获奖厂商。
    的头像 发表于 09-25 14:27 436次阅读

    攻克锂电池研发痛点-电解液浸润量化表征

    分析仪针对锂电池研发中的电解液浸润痛点,通过精准称重、宽域温控、多材料适配等核心功能,实现了对浸润速率、保液性能的量化表征,可有效支撑材料选型、工艺优化和宽温域电池设计。其提供的可靠数据能帮助研发人员深入理解材料 - 电解液相互作用机制,加速高性能锂电池的研发进程。
    发表于 07-14 14:01

    量化5G网关和5gredcap网关有什么区别

    量化5G网关与5G RedCap网关本质上是同一类技术的不同表述 ,5G RedCap网关是轻量化5G网关的核心实现形式,而轻量化5G网关是RedCap技术应用的场景化概念。以下从技术定义、核心
    的头像 发表于 06-30 09:19 828次阅读

    量化5G加速上车!移远通信发布车规级RedCap模组AG53xC系列

    成本性能平衡、硬件兼容、软件架构等方面表现优异,为车载通信领域带来了更加高效、经济的解决方案。目前,该系列模组已进入量产阶段,预计年内将支持多家汽车客户批量出货。     RedCap领航,车载5G加速驶入“快车道”   RedCap作为3GPP在5G R17阶段引入的轻量化
    发表于 06-27 11:30 1547次阅读
    轻<b class='flag-5'>量化</b>5G<b class='flag-5'>加速</b>上车!移远通信发布车规级RedCap模组AG53xC系列

    使用 NPU 插件对量化的 Llama 3.1 8b 模型进行推理时出现“从 __Int64 转换为无符号 int 的错误”,怎么解决?

    安装了 OpenVINO™ GenAI 2024.4。 使用以下命令量化 Llama 3.1 8B 模型: optimum-cli export openvino -m meta-llama
    发表于 06-25 07:20

    瑞芯微模型量化文件构建

    模型是一张图片输入时,量化文件如上图所示。但是我现在想量化deepprivacy人脸匿名模型,他的输入是四个输入。该模型训练时数据集只标注了人脸框和关键点,该模型的预处理是放到模型外的,不在模型
    发表于 06-13 09:07

    基于双向块浮点量化的大语言模型高效加速器设计

    本文提出双向块浮点(BBFP)量化格式及基于其的LLMs加速器BBAL,通过双向移位与重叠位设计显著降低量化误差,提升非线性计算效率,实现精度、吞吐量和能效的显著优化,相关成果被国际顶级会议 DAC 2025 接收。
    的头像 发表于 05-14 13:40 2108次阅读
    基于双向块浮点<b class='flag-5'>量化</b>的大语言模型高效<b class='flag-5'>加速</b>器设计

    加速中小企业数字化转型!华为云 Flexus 数字人有多强

    在当今数字化进程加速的时代,各行业都在积极探索转型升级之路,加之消费者对于智能化、个性化服务的需求日益增长,促使企业不断寻求创新手段以提升竞争力。数字人技术作为前沿科技领域的重要成果,逐渐受到广大
    的头像 发表于 03-10 11:08 2641次阅读
    <b class='flag-5'>加速</b>中小企业数字化转型!华为云 Flexus 数字人<b class='flag-5'>有多强</b>?

    如何排除深度学习工作台上量化OpenVINO™的特定层?

    无法确定如何排除要在深度学习工作台上量化OpenVINO™特定层
    发表于 03-06 07:31

    是否可以输入随机数据集来生成INT8训练后量化模型?

    无法确定是否可以输入随机数据集来生成 INT8 训练后量化模型。
    发表于 03-06 06:45

    引领轻量化趋势| 法法易轻量化充电枪通过2023版标准强检测试

    法法易轻量化充电枪经过严格的测试与评估,已正式通过2023新国标测试,并荣获相应测试报告。通过的测试报告中详细记录了充电枪的各项性能指标。包括但不限于充电效率、耐久性、防护等级等,均达到了新国标
    的头像 发表于 12-24 09:40 1039次阅读
    引领轻<b class='flag-5'>量化</b>趋势| 法法易轻<b class='flag-5'>量化</b>充电枪通过2023版标准强检测试