从场景说起
大家在学校学习的过程中可能都有遇到过这样的问题:同组的师兄弟,师姐妹之间尽管研究方向相同,但是却几乎无法共享一些基础性的算法,你的师兄用他的祖传代码搭建了一套识别网络,他毕业的时候导师让你接手师兄的研究内容,于是乎你拿着师兄拷贝给你的小U盘,闷头从cuda,cudnn开始干,搞了好几天,把环境搞定了,却发现某个依赖库版本不对劲,当前版本的依赖已经找不到了,一星期的努力付诸东流,你请师兄吃了顿烧烤,喝的差不多的时候,师兄拍着你的肩膀面露苦色:他自己好像也没办法在其他人的电脑上重现这个算法的环境。
大家如果在工作中恰好负责
系统集成相关的内容,一定遇到过这种问题,某位合作单位的工程师甩来一个代码仓库,和一份简陋的不到200字的文档,然后手机关机,人间蒸发,你clone下来之后发现是一套混杂了C++,python,java的缝合怪,它的readme.md里有一张运行效果的截图,好像那是证明它行过的唯一痕迹。
如果让你组建一支算法开发团队,你面对许多充满热情,但是在算法开发技术上各显神通的同事,肯定会比较头痛吧,比如:A同事是数学系出身,是Matlab的一把好手,理论知识登封造极,但是对python十分不屑,B同事是无师自通的天才,是Python的忠实用户,秉承能自己实现绝不用第三方库的原则,造了一大堆自己的轮子,C同事是复制粘贴大师,擅长从github的犄角旮旯里找出来一套又一套开源实现。
算法治理的含义
以上的三个例子是本人在工作中遇到过的头痛欲裂的一些场景,当遇到一份深度学习算法需要集成的时候,我会想:如果能够不用去配那些复杂的依赖环境就好了;当遇到合作单位交付的代码不太行的时候,我会想:如果能够有办法在交付的时候快速的验证一下运行结果就好了;当要把不同背景的人聚集在一起搞事情的时候,我会想:如果存在一套规范能够让不同背景的人都能接受并在这个基础上进行算法开发就好了,其实到这里的时候,算法治理的所包含的内容已经呼之欲出了,即:
完整地封装算法执行环境以便于算法的快速部署与迁移能够让对算法能力有了解的任何人方便地使用和调用无侵入且足够简单的设计以便于让算法贡献者认同并遵循
治理对象
以上就是 算法治理 能解决的问题,和它的实际意义,下面我们探究一下 算法治理 的研究对象,也就是算法究竟表达的是什么?
我们这里说的治理对象从粒度的粗中细分为三个层面:
-
独立的工具,指能独立进行部署使用的工具,如地块提取工具,能够让数据输入工具后,得到成功提取出的地块区域结果。
-
处理过程,如无人机原始影像到正射影像的拼接过程,能够让无人机的原始影像经过特征提取,姿态重建,拼接处理依次的处理流程后,得到完整的正射影像。
-
算法库函数,如
维诺多边形生成算法,它是一种根据平面空间中的点生成多边形的算法,也就是说,这类算法的作用是处理输入的点数据,得到多边形数据。
总结来说,将独立的工具,数据处理的过程和算法库函数有条理地管理起来并做好归纳整理,就是算法治理这个宏大概念接地气的说法。
算法治理的方式:
既然已经明确了算法治理的对象,那么自然而然地就应该讨论一下算法治理的方式,算法治理首先是元信息的治理,比如算法的名称,算法的开发者,算法的集成时间,算法的源代码仓库,算法的使用说明等一系列能描述治理对象本身信息的数据,至于这些描述算法本身的数据该关注哪些,这就是元信息的设计,在元信息的设计时最应当注意的是数据之间的独立性和全面性,比如日期和年份,这两个元信息就是有重合的方面,就不满足独立性的特点;而全面性指的是描述算法的数据应当能够很好的反应目标总体的信息,能够“框住”我们要描述的对象。
依据这些元数据信息,还有一种数据可以被挖掘出来,就是算法之间的关系,我们可以在元信息录入或收集的时候将算法间的关系用数据挖掘或人为分析的方式固定下来,这个过程有些类似于知识图谱的构建过程,可以通过一些图工具把节点间的关系可视化出来。
至此,一个简单的算法治理的思路我们就已经打开了,下面就是最核心的部分,算法执行环境的治理。
算法执行环境治理
在详细展开之前,我们不得不搞清楚算法的构成,在学习汇编语言的时候,我记得我自己印象最为深刻的一件事就是将写好的一段程序打印出来后,发现在磁盘中的程序本质上就是一种数据,它与其他变量或者文件唯一区别就在于程序这种数据是可执行的,算法就是一种特殊的程序,它是可执行的,我们可以把算法的构成简单理解为:
算法 = 处理过程 + 算法执行需要的参数(超参数)
超参数的管理非常简单,利用算法框架限制好的数据结构将超参数通过数据库管理起来就好;然而算法处理过程的管理却很让人头疼,原因是算法依赖的框架太多,纷繁复杂,本质上是这些依赖环境,框架的杂乱,造成了管理的困难;针对这个问题有如下两种解决方案,他们按照隔离粒度的不同分为:
- 基于私有仓库的包管理模式
- 基于虚拟化技术的容器管理模式
其中私有仓库很好理解,是自己构建和维护的一个存储“包”的仓库,它起到的作用就是将算法程序的依赖库也一并统一管理,这样避免了公共仓库中“包”版本更新后与本地所需的依赖版本不一致造成的依赖冲突。
基于虚拟化技术的容器管理模式是一种依赖于docker技术的隔离程度更高的方案,它将算法本身与算法的执行环境都封装成了容器,构建容器仓库进行容器管理,从而达到算法与算法之间天然的隔离,这也是较为常见的企业级的算法治理方案。
算法应用的方式:
算法应用的方式是符合serverless概念的,也就是说对于算法的使用者,无需关心算法的部署与迁移,直接传参调用,屏蔽掉所有的使用细节,进而换取使用的便捷,为了达到这种目的,必须满足以下条件:
- 具备极高的数据管理效率
- 具备计算资源管理与分配能力(云技术)CPU GPU - 基础设施层 - k8s + 微服务
- 具备完整的异常处理与中断算法执行的能力
具备极高的数据管理的效率,即算法执行环境应当能够高效地访问到算法执行需要的全部数据;具备计算资源管理与分配能力,指的是系统能够对算法的执行环境CPU/GPU资源进行管理,目前比较常见的解决方案是K8S + 微服务,具备完整的异常处理与中断算法执行的能力,这是一个架构设计和程序设计层面的内容了,这要求程序具备完整的中断处理机制。
结语
差不多持续了一年多的断断续续的思考,终于在今天,我写了一些篇幅用来描述算法治理的内涵,后续随着工作的深入,我希望给大家呈现一个算法治理的框架,把算法治理的来龙去脉梳理清楚!
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 1 天,点击查看活动详情