InfoQ:计算是机器学习平台的基础,但不是全部,在你看来,一个优秀的机器学习平台需要具备哪些特性?
黄明:
在机器学习界,有些人喜欢把调参和训练的过程,比喻为炼丹, 上升到”道”的层面。而道器相融,在我看来,那炼丹就需要一个好的丹炉了,也就是一个优秀的机器学习平台。它需要能为炼丹提供合适的火候,也就是为创新的模型和算法提供最佳的运行环境。因此,一个机器学习平台要取得成功,最好具备如下五个特点:
1. 精辟的核心抽象
一个机器学习平台,必须有其灵魂,也就是它的核心抽象。当这个核心抽象和它要面对的模型和算法匹配时,这个平台就成功了一半。如果一开始就错误了,例如SQL作为平台的核心抽象,那么对后期的发展制约将会非常明显,无异于缘木求鱼,无论怎么努力都不会成功的。
Spark的RDD核心抽象,很好的解决了分布式大数据的通用问题;而TensorFlow中Tensor、Mutable Variables和Dataflow Graphs的3个核心抽象,高度概括了深度学习中的各个元素。Angel目前的核心抽象是PSModel,重点解决了分布式机器学习中模型切分,数据并行和模型并行,模式异步 这3大问题,基本上可以满足大部分非深度学习的机器学习需求。
2. 充分的性能优化
在核心抽象正确的大前提下,性能是决定速度的关键。这就涉及了到平台层对硬件层的理解、调优和封装。去年我们用500台高性能机器,获得了TeraSort比赛的冠军,也是这种性能优化能力的体现,并将其嫁接到了Angel之上。
现在已经不是MR的时代走海量低配机器路线。无论是CPU机器,还是GPU机器,都在往更强更快的方向走。去年比赛我们用的是很高性能的单机,包括IBM的PowerPC,512G的内存,多个NVME的SSD,RDMA的100G网络……都是业界的顶配。
但是光有硬件堆砌是不够的,平台要对硬件有充分的利用。对于非深度学习,Java系的莫过于JVM的调优了。怎样更好地使用内存,避免FullGC的产生,尽量让计算不落地,预读数据流水化处理……这些都是对平台设计的考验。而对于深度学习,CUDA和OpenCL的性能利用,显存和内存的数据拷贝,浮点运算和定点运算的选择,一机多卡的内部通讯……平台都需要进行很多调整,甚至于引入像XLA这样的黑科技。
既然是分布式机器学习平台,肯定会涉及到分布式的拓扑结构。目前来看,比较成熟的分布式拓扑结构依然是**MR、MPI、PS**这3者。机器学习中,基本上MR已经出局了,MPI凭借深度学习卷土重来,和PS分庭抗礼,当然也有整体用PS、局部用MPI的做法,这也未尝不可。在确定网络拓扑之后,就要考虑网络加速了。RDMA和NVLINK这2个关键技术很值得关注,也是未来的方向。毕竟数据是直接显存落显存,还是走两次内存,差别是可想而知的,再加上不需要CPU开销,对性能带来的影响还是很可观的。
所有这些优化,最后暴露给平台用户的,最好是越简单越好,平台能够依据简单的参数,自动选择最佳的性能通道,这才是对算法工程师和数据科学家意义最大的。
3. 强大的容错能力
谈到容错,不得不再提一下MPI和MR。在Hadoop时代,海量低配机器理论的盛行,使MPI被MR打压得很厉害。但是到了深度学习时代,大家发现这些高配机器和HPC也差不了太多,十几万一台的机器,可靠性还是很强的,出错的概率很低,相比之下性能更加重要了,所以MPI这种模式又活了过来。
都是从整体来看,规模上去之后,在大型的数据中心,高配版本的GPU机器和T级别的训练数据,对容错性依然需要取得一定的均衡,这种情况下PS模式仍是最合适的。整体架构包括网络的通讯性能是最灵活和鲁棒的,可以做的容灾措施很多,代价也小。最终能够达到的效果会远胜于简单的定期Checkpoint。
4. 灵活的接口设计
正如大家所知,2017年Python已经借助人工智能成为了第一编程语言。这在某种程度上,当然归功于TensorFlow和PyTorch的神助攻,但是这个趋势背后有其必然原因。Python语言的优势在于语法简单、上手难度低,而且资源丰富,有充实的数据、可视化和机器学习算法库,建立了非常良好的生态环境,同时它又能与C无缝结合,借助py4j还能和Java结合。基于以上原因,Python能够为后台强劲的平台提供友好的接口层,达到简约而不简单的效果,也就难怪它会奇军突起、一枝独秀了。
但Python其实始终只是后台接口的体现,决定整体的,还是后台的接口设计,这时架构师的整体设计能力就非常重要了。核心理念的封装和延伸、多个机器学习概念的整合、系统的分层和解耦、多个子系统的一致性,这些最终都会体现到接口上,从而决定用户基于接口编写算法的难度。
5. 完善的周边系统
TensorFlow开源之初,吸引眼球的工具之一,莫过于它的TensorBoard,惊艳的超越了同期产品。当时还怀疑它是否会部分开源,不开源这个模块。一个好的机器学习平台还是要在周边系统的完善上多做些功夫,如果用户基于你的平台,可以快速地调试和定位Bug,将会大大增强他们使用的信心,这会对用户形成很强的吸引力,最终也有助于形成更好的生态 。