胡珈魁,目前在西安电子科技大学读大三,电子科学与技术专业。暑期在OneFlow实习期间,主要参与了模型部署工作。

跟大多数大学生一样,他从大一开始学习编程,但却没有局限于课堂知识。他有着极强的自学和动手能力,通过课外资源学习了更多编程技能,并通过目标驱动去解决问题:因为在学校要提交电子版作业,习惯手写作业的他就尝试学习OCR技术来达到目的,又因为在这个项目中发现了图像质量不高等不足,他开始试图分析和优化项目,这间接促使他到OneFlow实习,也因此让他获得了超出原本要解决的问题的更多技术能力和项目经验。

在课余时间,他还将继续通过OneFlow开源项目提升自己的工程能力。祝他更上一层楼。

本文为胡珈魁自述。

1

自学各种编程技能

我在西电的专业是电子科学与技术,这个专业在本科时期主要方向为光电子,学院整体偏向光学成像方面的研究。

在计算成像过程中,我们可以使用光的偏振原理与电机对偏振片的控制来完成去雾、去雨等图像处理操作,而现在我们可以使用以CNNs为代表的深度学习方法通过软件计算直接得到去雾、去雨结果。

一方面,深度学习方法能够通过强大的图像后处理能力,间接降低光电系统中其他部分的开发难度;另一方面,在已知相机参数的情况下,深度学习方法可以通过强大的拟合能力取得比传统方法更好的成像结果。这也是为什么我现在的技能和兴趣有很大部分偏向AI。

我开始接触编程是在大一上“计算机导论”课程。我们的老师鼓励学生自学相关知识,于是我就在B站上搜索相关资料进行学习。在听完翁恺老师的C语言课程之后,就投向了翁老师的其他编程语言入门课,比如JavaScript、Cpp。

后来在学校社团的影响下,学习了Python,同时在学长的带领下学习计算机视觉、计算机图形学相关的内容,深入学习了JS、TS、WebGL相关的技术,也尝试过拿Unity做CG。我个人认为,学习编程最重要的是实打实地看或者敲优质的代码,最好以解决生活中实际需求为导向。

当时正值疫情期间,老师要求提交电子版作业,而我习惯了手写笔记。为了不把时间浪费在码字上,我开始学习OCR相关的知识。在学长的建议下,我先后学习了CS231n、吴恩达深度学习等入门课程,也接触了MSER、PSENet等文本检测方法。

到了大二下学期,我发现该项目几个难点,拍摄的图像质量不高,手写公式识别精度较低,以及如何能在端侧完成CNN的计算。第一个是专业相关,第二个除了CRNN+CTC外好像没有更好的处理方案,而第三个看起来更有挑战性,与专业也有一定关联,我就把重心放在了部署上。这也间接促使我加入OneFlow做TVM前端支持相关的工作。

由于我现在的主要学习方向是底层视觉和模型部署,所以未来更想做ISP、高光谱相机相关的工作。毕竟,用自己参与制作的相机去定格万千世界,成就感不是一般的高。

2

实战中提升工程能力

在大二下学期,当时学长给我发了开源之夏的项目单,了解到有给TVM添加OneFlow前端这个项目。

在参与这种相对比较大型的开源项目之前,我自己写过一些小项目,一般与low-level vision相关,比如超分的经典算法、一些较新论文的复现。还有一些硬件相关,比如stm32的LCD、ADDA驱动、深度学习模型在FPGA端的部署,在做FPGA模型部署的时有听说过TVM,在看到开源之夏有相关项目后便果断提交了申请。

不过发生了一个小插曲,开源之夏系统没有把我录进去。可能受到我极强的参与该项目的意向的影响,BBuf(张晓雨)

在OneFlow的两个月,最直观的感受就是对小白极其友好。刚开始,BBuf结合他自己写的tvm-learn给我梳理了一遍项目代码实现的基本流程,并给我制订了一个非常详细的周计划。配置服务器环境的时候发现git push不到远程,懿哥(靳懿)给我一通排查后,结果发现是我没有开新分支的权限。

工作第一个周的任务是熟悉OneFlow的API,我参考之前用PyTorch编写的Transformer,实现了一版OneFlow eager版本的Transformer。

OneFlow的开发进度很快且开发过程具有较高的不确定性。第二周,我正式投入到给TVM添加OneFlow前端的工作中,最开始BBuf告诉我可以模仿PyTorch转TVM Relay IR的方法,PyTorch的做法是将模型转为静态的Torchsrcipt形式,用来获取每一个计算节点的形状与数据类型。但当时OneFlow并未提供动静转换的接口,我打算先使用lazy模式去做一个能用的转换脚本。

OneFlow eager模式与PyTorch相似,而OneFlow lazy模型与TensorFlow更为类似。受益于之前对TensorFlow和PyTorch都有一定了解,在快速熟悉相关API后,我用OneFlow lazy的接口在第一个月完成了lazy版本的OneFlow转TVM Relay IR工作。

这个工作本质上就是将OneFlow模型进行解体,经过转换后重新组装成Relay IR。其中比较大的问题有两个,一个是有些节点会有多个输入输出,解析的时候一不小心就会出现找不到节点的情况,另一个是节点命名问题,Relay IR组装时依赖节点命名,一开始的方案是将路径与命名组合起来,这样可以确保节点名可以作为节点的唯一标识,但是这会导致graph输出的时候很不好看,一个节点名字长的没边。

其中,第一个问题通过长时间的细致排查后解决,第二个问题在nn.Graph动静转换接口出来后,在翻看源码时发现nn.Graph有一套自己的节点命名规则,于是我根据这个规则修改了命名问题,使得转换后TVM Relay IR节点名字与nn.Graph保持一致。关于算子转换的工作,更多的是Ctrl CV,需要注意的是节点input的顺序问题,需要避免出现被除数与除数搞反的情况。

在完成这项任务后,我收到了OneFlow已经大致完成动静转换接口的消息。于是,我又用大致一周的时间用当时正在开发中的nn.Graph完成了OneFlow eager转TVM Relay IR的工作。后面的工作主要围绕着编写相关的示例与文档,丰富相关实例并不断新增op。

开发过程中也发生过一些比较憨的问题。我在转换脚本中大量运用了正在开发中的非public方法,这导致在nn.Graph repr方法的输出删去了INPUT和OUTPUT节点后,之前编写OneFlow转TVM Realy IR的代码就无法正常运行。最后给OneFlow主仓库添加nn.Graph与TVM转换相关的测试时,由于对unittest的不熟悉,CI挂了很多次,负责nn.Graph工作的许啸宇给我讲了unittest相关的操作并指出来很多test脚本中的细节错误。

一个工程的实现严重依赖团队内每个人的配合,而不是不管团队内其他人的工作。项目模块之间相互高度连接,不能实现功能后就双腿一蹬。其实实习过程中主体工作不是很难,这段经历带给我的更多是工程能力上的提高,让我主要体验了下Ctrl CV工程师的日常生活(误)。

感谢OneFlow和在OneFlow认识的诸位大佬,也希望OneFlow能早日做成使用体验最好的深度学习框架。我也准备带着我们实验室的小伙伴为OneFlow多做些力所能及的工作,如果你对深度学习框架也感兴趣,欢迎参与其中,共同进步

其他人都在看

  • OneFlow v0.5.0正式上线

  • 计算机架构史上的一次伟大失败

  • OneFlow中的错误处理:Maybe

  • 最理想的点到点通信库究竟是怎样的

  • 玩转大模型,是时候展示你真正的技术了

  • 如何实现比PyTorch快6倍的Permute/Transpose算子

点击“阅读原文”,欢迎下载体验OneFlow新一代开源深度学习框架

胡珈魁:00后工程师的AI进阶之路 | OneFlow U相关推荐

  1. 运维工程师打怪升级进阶之路 V2.0

    很多读者伙伴们反应总结的很系统.很全面,无论是0基础初学者,还是有基础的入门者,或者是有经验的职场运维工程师们,都反馈此系列文章非常不错! 命名:<运维工程师打怪升级之路> 版本:V1.0 ...

  2. @程序员,第一批00后开始报考AI专业了

    端午节假日过后,刚刚步入油腻中年的一名程序员小车蹲坐在电脑前,有条不紊地在Python环境下敲击着几段代码,时不时地留意一下公司的企业群,谨防错过线上问题的重要通知. 夜深了,他也终于可以稍稍放松了起 ...

  3. 移动端开发工程师的AI突围之路

    古典程序员"集体恐慌 随着2007年第一台iPhone问世,随后Android的猛烈跟进,苹果和谷歌推动了长达10年的移动互联网浪潮.在此期间,移动端开发工程师可谓是风生水起,几乎人们日常生 ...

  4. 作者面对面 | 95 后工程师 zhisheng 的 Flink 之路

    Hi,先给大家做个简单的自我介绍吧 hello,大家好,我是 zhisheng.有的童鞋可能会好奇为啥是叫这个,其实就是我名字的拼音,没啥别的典故 ????.我毕业一年半了,现在在某家大型互联网公司工 ...

  5. 前端工程师的CI进阶之路

    女主宣言 本文的作者为奇舞团前端工程师怡红公子,他是基于ThinkJS 开发的高人气开源博客平台 Firekylin (over 1.2k Stars) 的作者,今天他分享的是使用 Drone.io ...

  6. 惊叹!中科院学霸和本硕博985在读博士的AI进阶之路

    今天给大家推荐一个技术大佬:Sophia Sophia毕业于中科院,现在任某上市公司担任AI算法工程师:Sophia带领了本硕博985的大佬开了个公众号,与读者分享一些深度学习.机器学习.图像解译.人 ...

  7. 《Java Web开发实战》Java工程师推荐的进阶之路

    <Java Web开发实战>一书更加趋于实战性.此教材由浅入深.循序渐进,在语法阐述时尽量避免术语和公式,使初学者能够快速入门,全面掌握实战技能.它既可以作为高等院校本.专科计算机相关专业 ...

  8. 00后当道,今秋开学的AI专业的本科生究竟学什么?

    500万AI人才缺口,必须从本科抓起!正值开学季,不少同学在刚刚过去的夏天,选择了心仪的专业,即将迈入大学校门.上个月,清华.南大.西交大等26所高校联合申请设立AI本科专业,国内第一批AI本科大学生 ...

  9. 泪目!上海00后小伙AI「复活」奶奶,100%还原音容笑貌,却引发巨大争议

    [导读]最近,00后小伙用AI技术和奶奶实现「对话」,数字生命要成为现实了吗? 你有没有特别想念的人?可能ta是你的亲人,也可能是你的伴侣. 无论ta是谁,在我们的回忆中永远有他们的一席之地,他们一辈 ...

最新文章

  1. 解決scott 用戶登錄錯誤: invalid username/password;logon denied
  2. vba九九乘法表代码_【VBA实例】在立即窗口获得九九乘法口诀
  3. mysql数据库-1.文件导入mysql表secure_file_priv报错问题解决 mysql select outfile不能导出亲测
  4. Oracle学习总结(2)——Oracle数据库设计总结(三大范式)
  5. 如何在服务器上使用matlab
  6. python 学习资料
  7. 25 矩阵——QR分解、Householder 矩阵、镜面反射
  8. vue你不知道的奇淫绝技
  9. mysql sql delete语句_SQL Delete语句
  10. MFC界面开发帮助文档:BCG可视化设计器使用指南
  11. 苹果 macOS 12.4 RC 发布,带来全新 Studio Display 壁纸
  12. Steam游戏存档位置大全
  13. 什么是私域运营、怎么做私域运营?
  14. Windows防火墙导致FTP服务器不能访问的解决方法
  15. Android判断手机号码是否是正确的手机号码
  16. scala中sorted,sortby,sortwith的用法(转)
  17. Linux编程基础案例:第4章Shell编程
  18. C++:链表(初识链表)
  19. Clang与GCC的区别
  20. Jetpack Navigation 真香预警

热门文章

  1. 问题解决:使用arthas发现JDBC驱动类死锁阻塞问题并加以解决的过程
  2. ubuntu 14.04 install ibus
  3. 公专网集群对讲系统方案——城管
  4. swap函数 一点儿都不简单
  5. 文本显示器上位机-界面
  6. java中@JSONField和@JsonProperty注解有什么区别呢?
  7. PTA - 数据库合集30
  8. 本科应届生22K拿下字节跳动和顺丰offer,看看你都会吗?
  9. pyecharts 入门之词云图(六)
  10. ThinkPad R400 VISTA换XP 所有驱动及程序安装一览表