队伍:AP0200008
目录
一、描述 UNet 适配过程
1.1详细步骤
2.可复现的结果
二、解决问题的过程
2.1 列举在适配过程中遇到的困难,以及解决方法
a.低分辨率下,分割误差大工
2.2 低分辨率下,输出仍然不够准确
2.3 最优分辨率选择
2.4 其他还没来得及做的优化
三、提出 TPU - MLIR 可以改进的部分
3.1 在使用上可以精简的地方
3.2 在功能上可以增强的地方(需具备可行性)
四、简介对 TPU - MLIR 工程的看法
4.1 对 MLIR 的看法
4.2 对 TPU - MLIR 在 DSA 相关编译器的看法
4.3 对 TPU - MLIR 在异构计算编译器方面的看法
整个步骤遵照官网教程以及复赛指南进行,分为以下几步:
结果复现已审核, DiceScore 为0.96753341,单张推理时间5.054758ms,按照核算方式总分391.698583,排名第一。
主要原因是在分割的主体之外,存在零散的小块误分割空洞(红色标记),这些区域是可以直接处理的,利用 OpenCV 寻找最大的连通区域,重新构造分割 mask 输出即可。虽然这种方法无法处理与分割目标相近的误分类区域(绿色标记),但是还是有一定提升的(具体数值忘记了)。
主要是问题#1提到的与目标相近的误分类区域(绿色标记)。这很大程度是因为图片缩放后,卷积核感受野在实际上增大了,由于量化损失以及缩放损失的累计,对边缘部分不能细粒度地完成分类。
如果将测试图片进行堆叠,可以发现由于数据集比较统一,大多数的分割主体都位于红色虚线内,在推理过程中可以将这一先验引入到前处理过程,经过粗略的定位可以得到一个大约1650x810的切分区域,在每次推理的前处理中 Crop 一下图像即可,推理完成后对应地对红框外的区域进行补全。这个优化大概可以得到~10个点的提升(如果没记错的话)。
一个比较显然的事实是:分辨率越低,推理延迟越低,但精度损失越大。在比赛中,为了达到比较好的平衡,将图像高设置在200-500这个区域进行搜索。另一个问题是怎么缩放,这里我选择的策略是按比例缩放,原图大概是3:2的图像,因此在设置图像高时可以对应的到图像的长。在应用 Crop 优化后,按照2:1的比例进行缩放。
在前期实验中,图像宽高都设置为64的倍数,以快速进行粗粒度的搜索。最后提交时试了不同的分辨率。
因为最后两天才定了最终方案,因此还有一些优化的方法没有使用:
接触的工具比较少,感觉已经比较精简了。 model _ deploy 工具里有 tolerance 设置,这个感觉也可以不做设置或不满足时不 raiseerror ,在完成之后输出 npz _ tool 输出的相似度范围。在比赛中设置一个固定的 tolerance 之后偶尔会遇到低于阈值然后断掉的情况,这个阈值应该是按照经验均衡了效果和速度定的一个值,但是实际上低一点也可以接受。
与 TVM 等深度学习编译器不同, MLIR 并不是面向机器学习模型而提出来的一个框架,但是借助它可以完成类似的工作。现在各厂商 DSA 不同,单独地设计工具链(如 SAIL )是很麻烦的一件事,与 TVM 等框架的集成又需要深度定制,有些硬件由于张量化不好做,可能 TVM 的优势也发挥不起来。 MLIR 基于 LLVM 框架,可定制性很高,因为它的 Multi - level 设计,上层可以接入机器学习的计算图 IR 规范,底层可以依靠方言接入硬件指令层级 IR ,可以进行很好的扩展。在开发过程中,编译器团队可能更熟悉 MLIR ,它更像是做系统的人做出来的东西;而做部署的团队可能更熟悉 TVM ,它更像是做深度学习的人做出来的东西。但他们的抽象的框架都相似,在 Pass 和一些功能性上可能各有优势。对于在 DSA 上搭建工具链选择任何一个都可以,工具不是目的。
对 MLIR 和 TPU - MLIR 还不够熟悉,没有什么看法。但是整体来看,做 MLIR 实际落地并且开源的团队,确实是 TPU - MLIR 做的最好。
对异构计算编译器不了解,但是跟着 TPU - MLIR 工具链走下来的话发现最后还是生成的 bmodel 文件,应该还是 bmodel 加载-> host 发送输入张量地址到 TPU -> TPU 计算这个方式,而 bmodel 文件还是顺序的指令集合。本质上与之前的 BMNNSDK 一套相似,可能借助 MLIR 这个平台在后期新的硬件或者指令集上能够有较好的可扩展性。