基于TPU-MLIR实现UNet模型部署-决赛答辩02

这篇具有很好参考价值的文章主要介绍了基于TPU-MLIR实现UNet模型部署-决赛答辩02。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

队伍:AP0200023

目录

初赛

一、 模型导出优化

1.1 直接倒出原始模型并转换

1.2 导出模型前处理

1.2.1 导出Resize

1.2.2 导出归一化

1.3导出模型后处理

1.3.1导出 Resize 与

1.3.2导出 ArgMaxout

1.3.3导出特征转RGB

复赛

 一、 确定baseline

二、优化模型

复赛结果总结

三、遇到的问题总结

1. ONNX转MLIR

2. MLIR转bmodel

3. MLIR推理代码 BUG 【已经解决了】

四、 一些想法和建议


初赛

一、 模型导出优化

1.1 直接倒出原始模型并转换

报错Pad节点输入问题,修改源码报错解决

x1 = F.pad(x1, [diffX // 2, diffX - diffX // 2,
                diffY // 2, diffY - diffY // 2])
x1 = F.pad(x1, [diffX // 2, diffX - diffX // 2,
                        diffY // 2, diffY - diffY // 2], mode="constant",
value=0)

1.2 导出模型前处理

1.2.1 导出Resize

x = F.interpolate(x, (h // 2, w // 2), mode='bilinear')

基于TPU-MLIR实现UNet模型部署-决赛答辩02

原始Unet在UINT8输入下做Resize,但是这个操作不能直接导出到ONNX,因此测试了FP32 Resize和FP32归一化Resize,还有Resize模式bicubic bilinear。

工具链不支持bicubic。最终使用bilinear结果差距很大。

1.2.2 导出归一化

x = x / 255.0 #                     1.导出除法
x = x * (1.0 / 255.0) #             2.导出乘法
param = self.unet.inc.double_conv[0].weight / 255.0
self.unet.inc.double_conv[0].weight = torch.nn.Parameter(param,
requires_grad=False) #              3.首层卷积权重/ 255.0

基于TPU-MLIR实现UNet模型部署-决赛答辩02

上述三中归一化操作对整体耗时影响很小,第三种方法FP32速度最快,但是可能INT8量化有问题。

1.2.3导出BGR2RGB

经过测试 OpenCV +切片比 PillowSkimage 读图速度快,因此考虑将BGR2RGB转出到 ONNX ,使用 Gather 算子实现。

param = param[:, [2, 1, 0], ...]

基于TPU-MLIR实现UNet模型部署-决赛答辩02

使用 Gather 会造成额外的拷贝,后面又改进成把首层卷积核顺序反转,这样的速度最快,且没有任何负面影响。

1.3导出模型后处理

1.3.1导出 Resize 与

前处理相似。

1.3.2导出 ArgMaxout

out = out.argmax(-1)

模型转换报错不支持 ArgMax ,换如下实现:

out = torch.lt(out[0, 0], out[0, 1])        # Gather + Less
out = self.conv(out) > 0                    # Conv + Greater

基于TPU-MLIR实现UNet模型部署-决赛答辩02

 尝试构造 Conv 用来实现两个 Channel 做差, Conv 有可能以INT8运行,速度比较快。

conv = nn.Conv2d(2, 1, kernel_size=1, stride=1, padding=0, bias=False)
conv.weight = nn.Parameter(
    torch.tensor([-1, 1]).to(conv.weight).reshape(conv.weight.shape),
    requires_grad=False)

基于TPU-MLIR实现UNet模型部署-决赛答辩02

1.3.3导出特征转RGB

out = out.to(torch.uint8) * 255
out = torch.cat([out, out, out], -1)

复赛

 一、 确定baseline

复赛的比赛说明中以模型运行速度为准,因此初赛的很多工作都用不上了。转而变成了纯 UNET 模型优化。

我使用 UNET -Scale1.0输入1918x1280进行模型转换量化,最终作为 BaseLine ,结果如下:

flops: 3604915801600, runtime: 204.196060ms, ComputationAbility: 17.654188T
195.027445    0.992235  204.196060  1.675526e+09  2023-02-04

模型 DICE 分数很高,将该模型预测的结果作为 GT。

二、优化模型

1.经过观察发现模型中下采样16倍导致1918的输入无法整除,造成了额外的 Padding ,所以我尝试输入1920x1280测试模型速度。由于输入图片为1918x1280,如果直接 Resize 会造成失真,我们选择在最下面Padding2个像素,结果如下:

0.992251  199.453278  1.675657e+09  2023-02-06

可以看到模型 DICE 分数提升,并且检测速度变快,最终得分200。

2.优化反卷积

同样为了解决下采样16倍产生额外的 Padding 问题,尝试将 Padding 移动到 ConvTranspose 中,查阅 ONNXop 介绍可知 output _ padding 属性可以设置。

0.742231  199.346721  1.675677e+09  2023-02-06

3.公布第一轮成绩时我发现其他队伍分数很高,模型的 DICE 分数在98-99做有,推理分数30-40左右,最终的得分比我高很多,所以我同样选择降低分辨率。

使用Scale1.0和640x959640x960得到如下结果:

0.776212   42.033154  1.675665e+09  2023-02-06
0.777545   39.177540  1.675695e+09  2023-02-06

速度分很好,但是 DICE 分数很低,怀疑是Scale1.0模型导致的,然后使用Scale0.5模型继续测试。

0.990611   41.376142  1.676272e+09  2023-02-13
0.990987   39.177540  1.676293e+09  2023-02-13

速度分和精度分都上来了,达到了360分。

4. 继续缩小输入尺寸

为了保证输入宽高比例为3:2同时尽量满足16倍数,我测试了下面几个组合

基于TPU-MLIR实现UNet模型部署-决赛答辩02

 实验发现当尺寸在560x368附近时,模型尚可保持精度,当尺寸更小的时候精度掉的较多。

5. 改进分割前后处理

比赛最后几天榜单更新,然后为了冲榜继续缩小输入尺寸,最终定为304x208,满足16的倍数和长宽比3:2。

经过本地测评发现精度丢失非常严重,然后开始优化前后处理。

(1) 前处理

由于图片尺寸太小, Resize 方法带来的结果有所不同。

基于TPU-MLIR实现UNet模型部署-决赛答辩02

 使用 INTER _ CUBICINTER _ LINEARINTER _ NEAREST 得到的结果均类似左图,噪声的面积较大,使用 INTER _ AREA 则如右图,噪声叫小。

(2) 后处理

由于后处理时网络对噪声预测的分数较高使用 ArgMax 后会有一定混淆,因此我使用类似 SoftMax 的操作,对检测数值接近且在一定范围内的预测结果置为背景,代码如下:

bg, qg = out[..., 0], out[..., 1]
diff = bg - qg
flag = diff < 0
mi = np.abs(out).min(axis=2)
new_flag = diff[flag] / mi[flag] < -thres
diff[flag] = -new_flag.astype(np.float32)

(3) 去除多余联通域

经过过滤一定范围内的差值,可以减少对噪声的检测。经过多组实验最终确认 thres 为2.2。除此之外,预测的结果存在多余区域,如图:

基于TPU-MLIR实现UNet模型部署-决赛答辩02

 通过过滤除了最大联通域区域以外的区域可以避免多余区域。

def remove_no_connected_gray(gray):
    num_labels, labels, stats, centroids =
cv2.connectedComponentsWithStats(gray, connectivity=8)
    quyuId, pixNums = np.unique(labels, return_counts=True)
    mask_background = quyuId != 0
    quyuId, pixNums = quyuId[mask_background], pixNums[mask_background]
    if quyuId.shape[0] == 1:
        return np.ones_like(gray)
    else:
        maxId = quyuId[pixNums.argmax()]
        mask = (labels == maxId).astype(np.uint8)
        return mask

(4) 对于边缘不平滑的预测,如图:

基于TPU-MLIR实现UNet模型部署-决赛答辩02

使用形态学开运算和高斯滤波可以让边缘平滑,去除突起:

out = cv2.medianBlur(opening, 9)

实验多种滤波核大小,3/6/9/11/13发现核较大精度较高,最终选择9达到了较好的分数。

(5) 形态学运算去除其他噪声

经过滤波等操作后的图像仍然存在边缘突出,分割图内部空洞,边缘异常等问题,最终采用形态学运算进行改善。使用腐蚀去除边缘突出,使用膨胀填充图像空洞。

基于TPU-MLIR实现UNet模型部署-决赛答辩02

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (k, k))
# kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (k, k))
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel, 1)

同样,滤波核(十字椭圆圆形),滤波核尺寸3/6/9/11/13等通过多组实验确认。

前面有很多超参如 thres 和滤波 kernel 大小形状均是通过本地实验,使用 BaseLine 得到的 GT 计算 dice 分数确定的最优解。最终最后一次提交的结果如下:

391.288683    0.952803    3.991613  1.677598e+09  2023-02-28

复赛结果总结

经过几次提交得到的结果可以分析出,在模型 DICE 分数上差距较小,均在95-99分之间,上下浮动不超过5分,但是时间分数上不同尺寸的输入可以带来1-200的差距,因此只能在输入尺寸上下文章。由于前后处理不计算耗时,因此我最终选择304x208输入尺寸,并改进后处理模块实现了本次比赛模型速度最快,总分第4的成绩。

三、遇到的问题总结

1. ONNX转MLIR

1.1在 ONNX 注册了预处理后需要同时改变--mean0,0,0--scale1,1,1- pixel -formatbgr1.2ONNX中的 Resize / ArgMax 在 MLIR 中不支持,更换其他算子1.3ONNX中的 Pad 缺少参数报错,修改 PyTorch 模型1.4不支持UINT8数据格式,这部分生成图片放到 CPU 做。

2. MLIR转bmodel

2.1编译对称量化模型时-- tolerance 设置太高会导致编译失败,降低分数为0.80.42.2编译非对称量化模型时分数很低也会报错,速度提升也很小,放弃了。2.3编译模型时尺寸大的耗时严重,并且推理耗时也很大,最后选择小尺寸。

3. MLIR推理代码 BUG 【已经解决了】

比赛初始阶段提供的 MLIR 推理代码有问题,导致有一次提交没结果,后来官方修改更新的代码正常了。

四、 一些想法和建议

1.希望 model _ transform 工具实现 TPU 支持的常用的数据预处理 OP ,如果归一化和通道转换,作为单独的 OP ,这样就不需要写 CPU 的实现了。

2.希望 model _ transform 在遇到报错的 OP 能给出 OP 名字等信息,方便定位问题,报错能够详细一点。

3.希望 run _ calibration 和 model _ deploy 工具可以充分利用多核 CPU 的优势,在使用上述工具时某些阶段 CPU 利用率很高,某些阶段只有一个核心在用,猜测这部分是 Python 代码受到了 GIL 限制,可以尝试Pybind11改进一下。

4.希望编译后的模型可以把 fusion 和 pass 再反向生成一个 tpuop 的 onnx ,用于可视化模型结构。

5.希望 CPU 模拟 TPU 推理时也可以充分利用多核,大尺寸图像推理耗时太严重了,几个小时起步。

6.希望测试 bmodel 得到的 profile 文件可以通过网页或者其他形式可视化出结果,目前分析只能一行行的看。

7.希望未来复赛能像初赛一样可以自定义很多 trick ,复赛太单调了,并且用处也不太大。文章来源地址https://www.toymoban.com/news/detail-410447.html

到了这里,关于基于TPU-MLIR实现UNet模型部署-决赛答辩02的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 计算机视觉智能中医(三):基于Unet模型的舌头舌体图片分割

    返回至系列文章导航博客 完整项目下载:下载链接 【闲鱼】https://m.tb.cn/h.52C8psW?tk=fMpwdwfqjz3 CZ3457 「我在闲鱼发布了【舌象数据集,详情见csdn!http://t.csdn.cn】」 点击链接直接打开 舌体分割是舌诊检测的基础,唯有做到准确分割舌体才能保证后续训练以及预测的准确性。此部

    2024年02月11日
    浏览(40)
  • 【PyTorch 实战2:UNet 分割模型】10min揭秘 UNet 分割网络如何工作以及pytorch代码实现(详细代码实现)

      U-Net,自2015年诞生以来,便以其卓越的性能在生物医学图像分割领域崭露头角。作为FCN的一种变体,U-Net凭借其Encoder-Decoder的精巧结构,不仅在医学图像分析中大放异彩,更在卫星图像分割、工业瑕疵检测等多个领域展现出强大的应用能力。UNet是一种常用于图像分割的卷

    2024年04月28日
    浏览(40)
  • UNet深度学习模型在医学图像分割中的应用及其Python实现细节

    第一部分:引言和UNet架构简介 引言 : 医学图像分割是医疗图像处理的重要领域,它涉及将图像划分为多个区域,以标识和隔离感兴趣的区域(如器官、肿瘤等)。近年来,随着深度学习技术的发展,多种神经网络模型被应用于这一领域。其中,UNet模型因其出色的表现而受

    2024年02月12日
    浏览(40)
  • 华为开源自研AI框架昇思MindSpore应用案例:基于MindSpore框架的UNet-2D案例实现

    Unet模型于2015年在论文《U-Net: Convolutional Networks for Biomedical Image Segmentation》中被提出,最初的提出是为了解决医学图像分割问题,用于细胞层面的图像分割任务。 Unet模型是在FCN网络的基础上构建的,但由于FCN无法获取上下文信息以及位置信息,导致准确性较低,Unet模型由此

    2024年02月13日
    浏览(46)
  • 基于Amazon SageMaker平台部署Stable Diffusion模型实现——图片识别

    当谈到机器学习和人工智能的开发和部署时,Amazon SageMaker是一个非常强大和全面的平台。作为一项托管式的机器学习服务,Amazon SageMaker提供了一套完整的工具和功能,帮助开发者轻松构建、训练和部署机器学习模型。 首先,让我们谈谈我对Amazon SageMaker的看法。我认为它是一

    2024年02月09日
    浏览(40)
  • 首个中文Stable Diffusion模型开源;TPU演进十年;18个PyTorch性能优化技巧 | AI系统前沿动态...

    1. TPU演进十年:Google的十大经验教训 希腊神话中,特洛伊战争的起因是两方争夺世界上最美的女人——海伦,后世诗人将海伦的美貌“令成千战舰为之起航”。TPU就像海伦,它的出现引起了“成千芯片与之竞逐”。 可以说,TPU的问世引发了硅谷的“地震”。TPU宣布诞生后,

    2024年02月09日
    浏览(57)
  • TPU编程竞赛|Stable Diffusion大模型巅峰对决,第五届全球校园人工智能算法精英赛正式启动!

    目录 赛题介绍 赛题背景 赛题任务 赛程安排 评分机制 奖项设置         近日,2023第五届全球校园人工智能算法精英赛正式开启报名。作为赛题合作方,算丰承办了“算法专项赛”赛道,提供赛题 「面向Stable Diffusion的图像提示语优化」 ,同时为参赛选手提供了丰富的云

    2024年02月08日
    浏览(61)
  • 搭建部署属于自己的基于gpt3.5的大语言模型(基于flask+html+css+js+mysql实现)

    本项目是一个基于GPT-3.5模型的聊天机器人网站,旨在为用户提供一个简便、直接的方式来体验和利用GPT-3.5模型的强大功能。项目以Flask为基础,构建了一个完整的Web应用程序,其中包含了多个前端页面和后端API接口,能够处理用户输入并与GPT-3.5模型进行交互来生成响应。 一

    2024年02月07日
    浏览(61)
  • 大模型笔记之-低成本部署CharGLM3|chatglm.cpp基于ggml 的纯 C++ 实现

    之前两篇文章已经分别在云上和本地搭建了chatGLM3的API接口 和综合web_demo.py 本篇文章记录如何仅使用CPU和内存在没有GPU(cuda)的情况下推理chatGLM3 ps:表示原始模型位置,如果本地没有模型会从hf联网下载 位于convert.py的512行修改默认模型位置 此外还有 位于convert.py的529行修改

    2024年01月19日
    浏览(43)
  • UNet语义分割模型的使用-Pytorch

    最近有时间,跑了一下UNet模型,因为自己的深度学习基础不扎实,导致用了一些时间。目前只停留在使用和理解别人模型的基础上,对于优化模型的相关方法还有待学习。 众所周知,UNent是进行语义分割的知名模型,它的U形结构很多人也都见过,但是如果自己没有亲自试过

    2024年02月03日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包