开源之夏,是由中国科学院软件研究所发起,专为高校学生精心打造的活动。旨在鼓励广大学子积极参与开源软件的开发与维护,推动优秀开源软件社区的蓬勃发展。
目前,开源之夏2024已圆满结项!在本届开源之夏中,不少开发者跟随昇思MindSpore一起,在开源的世界里畅游,成功完成项目任务。在此,昇思 MindSpore 开源社区邀请了开源之夏的开发者们,分享他们在本次活动中的宝贵经验与心得。我们希望通过这些精彩的项目经历和实战技巧,能够激发更多创意火花,帮助大家提升技术能力。本文为昇思MindSpore 开源之夏项目经验分享系列第3篇。
项目基本介绍
1、项目名称:基于昇思MindSpore动态图的MindSpore One套件开发
2、项目导师:张俊龙
3、项目链接:https://github.com/mindspore-lab/models/tree/master/research/marigold
4、项目描述:基于MindSpore动态图开发MindSpore One套件的功能,具体是将深度估计领域论文Marigold ([2312.02145] Repurposing Diffusion-Based Image Generators for Monocular Depth Estimation) 模型从Pytorch框架移植到MindSpore框架,支持在MindSpore的动态图模式下进行深度估计的推理。
深度估计是对给定RGB图像预测相对深度图的任务,即对输入图像可以预测出所有像素位置到相机的相对远近(示例图中偏红更近,偏蓝更远)。
经过开发,项目目前移植了训练、测试和推理的完整流程,支持深度估计、测试指标计算及模型训练。同时项目移植了各功能脚本,保证了易用性,通过写好的脚本,一个命令即可获取任意自定义图像对应的相对深度图,并支持根据需求自定义推理参数。
项目选择初衷
选择本项目主要是因为我的研究方向就是视觉感知,目前深度估计是感知中一个比较有应用前景的方向,我也了解了很多相关的算法。Marigold作为近年来用Diffusion做深度估计比较广为人知的工作,我详细阅读过源码和运行过,比较了解;另一方面我也对MindSpore感兴趣,Mindone仓库主要是基于MindSpore支持各类生成模型,用Diffusion生成深度图的功能正好合适,也有应用价值,我就申请了这个项目。
项目方案介绍
我首先了解了MindSpore One已有代码,MindSpore one代码完善,功能丰富,支持的模型也很多,Marigold基于的Stable Diffusion就在其中有训练和推理代码的实现。
然后总结了Marigold相比Stable Diffusion推理的主要不同点:
项目实现思路
在推理方面,项目的核心思路是将原本使用的diffusers模块,如UNet和VAE,替换为MindSpore One的diffusers实现,然后将各种Torch API转换为Mindspore API。在转换的过程中关注两者API功能的区别,确保实现逻辑上的一致,最终整合各函数并优化整体处理效率,以提高易用性。
但是在训练方面,使用动态图模式实现的训练过程速度比较慢,因此训练代码基于MindSpore One已有Diffusion训练代码修改,主要修改数据集创建、损失函数、学习率下降方式及两者推理的不同。
最终方案
推理主要使用的MarigoldPipeline,继承自DiffusionPipeline,对应的VAE、UNet、Scheduler在mindone的diffuers中都有定义,直接使用:
输入直接使用VAE输出的均值,输出对三通道取平均:
推理多次然后集成获得最终结果,减轻随机性的影响:
修改MindSpore One原有diffusion训练代码,支持静态图模式训练:
样例结果:
项目总结
本次项目我移植了Marigold,能完成这个项目首先要感谢老师的支持。从总体开发工作来说,确定思路的时间并不长,大部分时间在处理Bug,以及查阅文档看Torch API和MindSpore API的区别,整体写完之后再在逻辑上进行一些优化。
最大的收获一方面是熟悉了MindSpore框架,另一方面是在调试代码上的,因为代码要放到卡上执行,过程复杂,从代码出错到实际观察到错误有时会相差很久,所以我写了很多调试脚本来减少调试时间,也锻炼了代码能力。熟悉MindSpore One仓库时见识了很多高质量、注释清晰的代码,以后我也会更高地要求自己。
最后推荐一下“开源之夏”活动,参与优秀开源社区项目,提高能力,积累经验,一起为我国开源社区发展做贡献。