1、如何阅读一份深度学习项目代码?

搞深度学习的人,两大必备日常除了读论文之外就是读代码。 读论文笔者在第4问的时候讲了阅读路线,但如何读用什么技巧读每个人都有不同的见解,这里不多说。 读代码跟读论文、读书多少有相似的地方,毕竟都是读的性质。 但话又说回来,读代码又跟读paper读书大有不同,代码是一种将论文中的模型和算法进行实现的过程,是一种需要你思维时刻在线的过程。 又因为我们读的是深度学习项目代码,不是像Linux内核代码那样的鸿篇巨制,所以在代码性质上多少又有些不同。
笔者这里说的一份深度学习项目代码,小到几百行的测试demo,大到成千万行的开源项目,读起来方法肯定各有不同。如下图Mask R-CNN项目代码和PyTorch源码的对比:0.3、学习建议 - 图10.3、学习建议 - 图2
可以看到,Mask R-CNN作为一个经典的实例分割框架,其代码量可以说是中规中矩,3k的代码量在我们读完论文后集中花几天时间差不多可以过一遍。但PyTorch的源码对大多数人而言就不那么友善了,750k的代码量,而且底层的C++代码占到整个项目中的一半之多,作为深度学习研究而言,堪称巨无霸级别了。这样的代码量,就像初学者拿到一本PRML,往往投入巨大精力后不了了之。
所以,对于这两种类型的项目代码,阅读方法肯定会有所区别。因为我们读代码的目的、场景和对象不尽相同,下面笔者从三个方面来和大家探讨如何阅读一份深度学习项目代码。首先读代码的一些通用方法。
这一点而言不局限于深度学习项目代码,任何项目、任何语言的代码阅读都适用。我们日常读代码无非是两个工具,一是将代码下载到本地,打开IDLE,在IDLE里安静的阅读:image.gif第二个就是直接在GitHub的web端直接阅读,但GitHub没有像编辑器那样在左侧设置阅读目录,每次进入一个代码文件就必须退出来才能进入另一个文件,用户体验极差。当然了,这都不是事。chrome给我们提供了Octotree这样的辅助阅读插件,直接在chrome扩展程序里搜索安装即可。image.gif安装后我们就可以直接在web端就有IDLE读代码的体验:image.gif可以看到在页面左侧有一个类似IDLE的目录栏,大大方便了我们查看和阅读项目代码。这是通用方法中的工具层面,我们再来看一些基本的阅读规矩。有了IDLE和Octotree工具,我们第一点一定是仔细看代码目录,对整个项目代码结构和分布有一个整体的认识,对于深度学习而言通常目录中各个模块相对比较固定,比如是models目录下放着模型搭建和训练的代码,conifg目录下放着模型的一些配置文件,data目录下放着项目所使用的数据信息等等。如下面语义分割项目的目录结构:image.gif对深度学习项目代码的结构熟络之后,读的多了自然就会轻车熟路起来,后面阅读效率也就提高了。
通用方法的第二个是快速找到readme文档。通常来说,根目录下的readme文档包含了这份代码的使用方法,里面有可以让你快速了解这个项目的关键信息。一般来说,开源项目的readme里作者都会写明如何使用代码和进行部署。下图是DenseNet的readme文档:image.gif对于大型项目,可能每一个子目录下都有readme文档,这都是我们需要仔细阅读的部分,作者把关键信息都放里面了。所以不管这样,第一时间读找到readme进行阅读是你了解该项目的必备步骤和通用方法。
第三个通用方法就是具体如何读的问题。就是我们得确定一个阅读主线。这一点是针对于深度学习项目代码的通用方法,对于一个深度学习项目,我们一般想要了解的最关键点无非就是数据、模型和如何训练等几个方面。如果你想快速看看这个开源项目的测试效果,直接读readme看使用方法即可。如果这个项目作者提出了一个新的模型框架,比如说bert,你想了解它的模型框架细节,直接定位到models目录下的带有model字眼的.py文件开始读。或者是你想看这个项目是如何训练的,都用了哪些训练的tricks,它的参数初始化是如何做的,batchsize用的多大,训练过程中学习率如何调整的等等,那么话不多说,直接定位到带train的.py文件即可。如下图faster-rcnn的3个训练文件。image.gif根据目的不管是model还是train的主线,在阅读过程中一定会涉及到其他分支,比如说数据和配置等其他分支线。
在主线阅读过程中不断完善对分支的理解,久而久之,一个完整的项目就会被你消化了。以上说的是深度学习项目代码阅读的一些通用方法。下面再具体讲两个场景的代码阅读。毕竟大家做事讲究目的性,往往带有较强的目的性去做某事效率一般会特别高。第一个场景是在大家做研究做项目时遇到问题时。不知道这个问题如何解决,直接谷歌又找不到好合适的方法的时候。这时候我们可能会寄希望于在GitHub上搜罗一番。比如说我们想要知道对于极度数据不平衡时如何给损失函数加权重的方法,再比如对于多标签问题进行模型预测时如何找到最佳分类阈值等等。这些问题都是我们在做实际项目时都可能会碰上的,在这种情况下若是能在GitHub上找到类似场景的处理方法,相信你会瞬间来了精神。下述基于keras的CNN多标签分类项目对于多标签分类阈值寻优使用了matthews_corrcoef来确定最佳分类预测阈值。至于什么是matthews_corrcoef,这些都是你在解决问题过程中需要学习和吸收的地方。
总之,带有目的性的读某个项目的代码往往是只读某个block甚至是某几个关键行,数量不在多,在于能够解决你的问题。image.gif第二个场景就是为了自我个人精进的读代码。所谓个人精进,就是有大量可支配的个人学习和研究时间,高度的自律性和超强的学习力的人进行能力跃迁的关键所在。笔者虽然平时偶尔会有去GitHub读一些代码,但说要达到个人精进的level,还远远不够。比如说前面的PyTorch 750k的源码,这么大的代码量,阅读策略一定是分治思想,分散包围和各个击破。把项目进行分解,设定阅读计划和目标,在超强的执行力下还是有可能完成的。这不是普通人干的事,但我相信能在深度学习领域精进的人都不会是普通人。

2、他人建议

麦克周

知识不能单从经验中得出,而只能从理智的发明和观察到的事实两者比较中得出。— 爱因斯坦 作为一位喜欢彻底搞清楚原理的软件工程师,我的每一次转型都在大量阅读和实际操作中完成。我给的建议是根据自己的实际情况,从全局性的到具体技术的书,一本本读,不要急。我看的第一本书是尼克的《人工智能简史》,这本书几乎全面讲述人工智能的发展史,几乎覆盖人工智能学科的所有领域,包括人工智能的起源、自动定理证明、专家系统、神经网络、自然语言处理、遗传算法、深度学习、强化学习、超级智能、哲学问题和未来趋势等,当然,他不是一本动手教你编程的书,而是给你一个宏观印象,适合 AI 产品经理、CTO 阅读。如果你觉得还需要进一步拓展自己对技术的全局性理解,我建议你可以读 Stephen Lucci 和 Danny Kopec 一起编写的《人工智能(第二版)》,这本书有点像高校的人工智能相关专业教材,堪称“人工智能的百科全书”,全书涵盖了人工智能简史、搜索方法、知情搜索、博弈中的搜索、人工智能中的逻辑、知识表示、产生式系统、专家系统、机器学习和神经网络、遗传算法、自然语言处理、自动规划、机器人技术、高级计算机博弈、人工智能的历史和未来等主题。看了全局化的知识后,建议你可以根据自己的实际情况选择书籍,周志华的《机器学习》、Ian 等人合著的《深度学习》、Aston Zhang 等人合著的《动手学深度学习》、郑泽宇等人合著的《TensorFlow:实战 Google 深度学习框架(第 2 版)》、Vishnu Subramanian 的《PyTorch 深度学习》,这些书都是不错的,当然还有其他很多优秀的著作,这里不展开介绍,更多取决于你当前的状态,你是想快速动手训练模型,还是想了解清楚原理,因人情况不同而异。Mr Qiu “某利郡后;颇与郡人相安;日知来四处无虞;早收中熟;觉风雨如期;晚稻亦可望;惟是力绵求牧;来日方长。”— 宋·文天祥《与洪度瑞明云岩书》 在介绍如何转型进入 AI 领域之前,先介绍下个人的经历。从接触 AI 到工作至今大概 7 年,我把它分为 3 段:

  • 在校学习期;
  • 实习转型期;
  • 工作成长期。

在校期间学的比较广,主要方向在人工智能、高频电子电路、传统图像算法、嵌入式系统等,这个阶段通过以赛促学方式,取得了一些不错的比赛成绩; 实习期间有幸参与到某重点项目的“以图搜图”模块,积累了大量的图像、人工智能方面的实战经验; 毕业参加工作后,主要围绕计算机视觉、算法移植优化,深度学习框架优化,机器学习等进入研究和实践,有了一定的全栈 AI 经验。 偶有感慨,虽然资质平平,但好在目标明确,持续奋斗,也遇到很多值得感谢的人,才有机会在这里介绍下经验。2012 年,一年一度的 ImageNet 图像识别比赛,CNN 网络 AlexNet 以碾压的分类性能超过第二名(SVM 方法),从此深度学习开始吸引研究者的注意。但真正吸引工业界去大规模投入深度学习,大概到了 2015 年到 2016 年,这个时候,贾扬清在博士期间开源了深度学习框架 Caffe,谷歌开源第一版的人工智能引擎 TensorFlow,Caffe 曾一度以其优秀的代码架构,便捷的开发接口等优点受到广大研究者和工程师的推崇。早期做 AI 开发,很多工具都不完善,需要造轮子,这里的轮子主要包括离线训练时需要开发图像标注工具、需要修改深度学习框架实现相关算子的前向和后向计算、实现卷积中间特征可视化来调优模型等,在线部署时需要自己实现算子的 FP16 和 int8 计算,需要自己写 CUDA 代码等。现在,进入 AI 领域的开发者不再需要做这些轮子,真的很幸福。图像标注工具 LabelImg 等已开源,可以直接拿过来使用;TensorFlow 迭代到更加利于开发者使用,提供了很多优秀的示例,可视化工具和推理部署工具等;随着 PyTorch 的逐渐崛起,已经可以与 TensorFlow 平分秋色,开发者有了更多的选择;英伟达推出了基于 GPU 的推理加速工具 TensorRT 可以免费使用,华为也推出了基于自研芯片达芬奇的推理加速和框架 MindSpore,以更高密度的算力丰富开发者的选择。随着巨头公司全力投入 AI,AI 的工具也越来越完善,开发者可以将精力集中在模型开发以及业务的实现上,这是一个 AI 的好时代,也是 AI 开发者的好时代,我想现在开始转型 AI 正逢其时。再回头看看这些年的 AI 发展历程和踩过的坑,以个人的角度提炼出传统软件开发转型到 AI 开发工程的方法,希望对大家有帮助。暂且把这些总结为 3 个部分,分别为:

  • 动手跑起来;
  • 原理掌握起来;
  • 推理部署起来。

1. 动手跑起来:这个阶段就是通过现有开源的优秀项目进行学习,这里我推荐 darknet YOLOv3,项目地址 https://github.com/pjreddie/darknet 。该项目框架基于 C 语言实现,框架清晰易于调试。初学者在下载到项目代码后首先要将该项目跑起来,通过跟踪数据在整个框架的流动大致掌握 AI 是怎么工作的,可以解决什么样的问题。同时在跑通搭建环境的过程中,可以快速掌握 GPU 跟深度学习框架是怎么结合起来工作的、深度学习框架在运行过程中需要有什么依赖。
2. 原理掌握起来:作为优秀和经典的端到端检测算法,首先推荐以 YOLO 进行学习,从推出至今已迭代到第四版本。可以从第一版本 YOLOv1 开始进入,再到第四版本 YOLOv4,掌握 YOLO 是如何演化的,分别作了哪些改进,改进为什么会起到性能提升的效果。网上已有大量优秀的博客,开发者可以自行去搜索阅读。结合动手跑起来阶段的代码调试,相信会进步的更快。研究完成 YOLO 演化过程后,有兴趣可以再去研究下 R-CNN 系列的检测算法,R-CNN 系列算法区别于 YOLO 是召回率高、准确率高,但是耗时,所以综合考虑工业界一般用的更多还是 YOLO。
3. 推理部署起来:推理部署就是将深度学习框架训练好的模型部署到 PC 或者端侧设备进行推理,解决实际的业务问题。这个过程主要包括模型性能调优,GPU 或者 D 芯片的适配,业务逻辑的实现。对于模型性能调优,主要是将模型推理原有的 FP32 量化成 FP16 或者 int8,从而实现推理加速,实现实时推理。这里推荐英伟达的 TensorRT 和华为的 D 芯片加速模块,它们会对模型做更高阶的优化,除了量化,还会有模型网络层之间的算子融合、kennel 优化等,具体资料可以到相应的官网去搜索。模型优化完成后,通过相应的推理引擎和业务逻辑实现去完成模型的在线推理,完成真正的工业化,解决实际问题,这也是 AI 真正为社会产生价值的部分。通过这三个部分的学习,日积月累,相信你也会慢慢成为 AI 领域的资深算法工程师。

帆哥

天行健,君子以自强不息。— 《周易·乾》 作为一名资深产品经理,转型搞 AI 后从事了多年的 AI 平台产品设计,我讲讲我对 AI 产品的理解。对于公众认知的 AI 开发而言,大家往往想到的都是算法开发,其实对一个商业落地的 AI 开发过程,会涉及到很多不同方面,它不仅仅是算法开发,还会涉及到算力、数据、迭代优化等环节。对于 AI 的商业化落地中, CTO 们会均衡考虑到三类方面的资源投入,不仅仅是 IT 基础实施还包括工程师投入:

  • 算力 –> 普惠;
  • 数据 –>模型;
  • 算法 –> 落地;

每一个环节涉及到的人力投入不同,大致会涉及到 IT 工程师、数据科学家、应用工程师。具体展开讲:
1. 算力—> 普惠(面向 IT 工程师)对于 AI 开发而言,如何利用好算力资源,提升资源利用率是目前特别重要的工作。往往算法工程师并不擅长这些事情,需要有专业的系统级工程师来帮助是实现,从集群的搭建、运维、固件运维、底层算子优化、分布式调优,以及大量的框架维护等方面,另外面向不同部门之间的资源管理也是 IT 工程师需要关注的内容。对于简单开发而言,自己用开源搭建搞搞是可行的,但是一旦需要大规模的商业化,需要一个有个比较好的平台尤为重要。
image.gif2. 数据 —> 模型(面向数据科学家)对于 AI 建模,本质上面是基于数据去生成模型的过程,那么一般来说,初始 demo 快的几天就可以出来,但是到真正落地的时候,少则花费个月,多则上年。这个过程中涉及两类的大量投入,一类投入获取训练数据,从数据收集和标注端到端,另一类投入不断模型迭代优化上,涉及到大量的领域技能。训练数据: 面向通用类的场景,会涉及大量的数据标注的工作,这会花费大量的标注人力,对于一般场景下,普通的人员就可以标注,但是面向复杂场景下,都需要专业人士去标注,如医疗影像类场景,一般人都标注不了。所以对于专业领域的标注,以及大量的数据标注下,有一个非常友好的自动化标注及数据难例的算法能力,尤为重要。迭代优化: 模型建模过程中,商业场景下,数据科学家建模过程中,更多的使用成熟的论文和算法,围绕具体的业务场景,结合数据的情况,来选择性建模,并且随着不同环境变化情况下,不断的调整算法的设计和组合优化,从而达到最佳的算法效果。这个过程中涉及到大量的场景理解。对于开发模型而言,有一个很好的案例库,能快速找到场景化的沉淀领域知识,是非常有帮助的。
3. 算法 —> 落地(面向应用工程师)以往大家觉得算法落地就是一个类似软件开发的集成过程,其实对于 AI 类的应用并非那么简单。一般非常通用类的场景下,集成已有的模型去做一些识别比较成熟,如语音识别。但是往往商用类场景下,往往场景的适配度都不够好,虽然业界都在讨论万物识别的可能,但是都并不如意。所以从对于算法实际落地而言,都需要基于实际情况去不断优化。由于需要迭代优化的过程,那么应用工程师就必须要围绕思考场景下部署与训练的业务通路和方便性。一般数据科学家和算法工程师都是比较稀缺的,让数据科学家和算法工程师到每一个现场去做调优实施是不可行的,大量的现场实施工作必须有大量的应用工程师来完成。面向应用工程师去自优化模型并且不断迭代和调整模型的精度将是以往软件工程不太发生的问题。所以这往往也需要一个系统体系化的平台,去支撑业务场景的快速迭代,从而提升应用工程师的效率。从近 20 年的自身工作经历来说,商用落地一个 AI 业务其实是一项最复杂的系统工程的事情。它不仅仅是一个单独的算法开发这么简单,围绕商用 AI 落地的所需的相关技能特别多。
从 IT 工程师角度上, 他需要聚焦资源效率和成本做不同的考虑,围绕底层资源管理、系统架构设计、分布式优化、资源调度管理、IT 建设设计、端 - 边 - 云的部署与简便维护等做相应的设计,从而能很好的支撑算法应用落地;
从数据科学家角度上, 他不仅仅要懂得去开发一个算法和参数优化能力,还要对行业场景做深入理解,具备行业 Know-how,根据环境和数据的问题,不断迭代和建模,不断调整算法应对环境变化,达成相应的效果,期间会需要关注大量的伦理和道德,包括安全合规,模型的防攻击和可解释性类的问题等;
从应用工程师角度上 ,他不仅仅是一个应用集成,需要理解 AI 应用的不确定性,去选择合适的场景限制,并且根据实际的情况,去适应已有模型的能力。并且还能够有独立进行模型的训练迭代的能力,通过数据科学家预置好的流水线去迭代,自行现场去优化和迭代。从而达到真实场景下的落地。image.gif综述,对于很多商业公司而言,他们更聚焦在 AI 的商用场景上面,往往会忽略 AI 平台的重要性。但往往对于有前瞻性的商业公司 CTO/CIO 们,他们都会考虑 AI 商业落地的时的 AI 平台选择。华为云 ModelArts 平台的初衷也是聚焦在 AI 商业落地的困难孕育而生,结合华为自有的昇腾芯片系统,集合 ModelArts 不断致力于 AI 的普惠。