首先思考需要解决哪些问题,最重要的分为三个方面:效率、规模以及机器学习本身的一些内在性的需求。
规模
所谓的规模问题有三点。一是数据总量增长很快,每年公有云和视频数据增长比例达 60% 多。第二点是数据量非常大,比如七牛有 2000 亿张图片,有超过 10 亿小时的视频,如何去挖掘数据内在的价值,这本身就是一个非常头疼的问题。第三点是吞吐量大,例如 1080P 的摄像头,一个摄像头在一个小时产生的数据是 1.8G,一个城市有几十万个摄像头,像北京这种城市甚至几百万,三个月产生的数据是 EB 级别,数据的吞吐量非常大,所以在设计系统的时候必须能跟上新增数据的节奏。
效率
很多人说现在的互联网是云计算。但是实际上云计算不是一朵云,互联网上也不是只有一朵公有云,而是有很多云,例如存储、日志服务器、计算集群等等。我们的系统需要在这一朵朵云之间架起桥梁,连接起来。很多时候它们不在同一个机房,甚至不在同一个城市,而系统需要在能保证足够的速度和带宽的前提下,让数据可靠地传到最终学习的集群。
规模机器学习的原生需求
第三个是机器学习的原生需求,七牛把机器学习的计算过程抽象为两种:数据和训练的作业。原生的需求包括很多方面,图 1 列了几条需求,例如一个是能让整个训练快速迭代;第二个是进程停了可以随时重启,数据应该是安全的;然后是各个训练任务之间需要与它的资源隔离开;训练作业需要分布式。还有其他的需求,例如可视化、模型融合、模型管理,这些都是机器学习本身训练的需求。
What ?
图 2 是深度学习平台的架构,底层是前面介绍的各个文件系统,在这个上面做了一层 Caching IO ,即分布式内存服务器,计算时所需要的数据都是通过它来做提取,大家可以参考一个开源项目 - AlluxIO ,七牛的设计跟它有一些近似。在 IO 之上抽象为 Docker,来计算任务和资源分配以及调度。在这个基础之上,编排系统也是参考了开源的项目。七牛做这个项目的时间其实比较早,大概一年两年前就做了,主要是担心开源项目任性说不干就不干了,所以自己写了一套东西。
有这么一套编排系统以后,可以很方便地构建一个分布式的系统,它的核心是一个参数服务器,这里推荐一个基于 Caffe 的分布式框架 Poseidon,它针对深度学习任务优化了计算集群内部的通信,在降低通信量的同时保证很好的迭代性。有了分布式的系统和编排系统之后,把上面的作业抽象为一个一个的独立镜像,比如数据清理,有五种数据清理的方法就做五个镜像。数据放大也类似,包括训练和推理,都会做出相应基本的镜像去调用。在这个基础上会把作业全都抽象为一个图的形式表达,以及用数据流的方式去表达整个作业的过程。
领取专属 10元无门槛券
私享最新 技术干货