优化和改进
作为平台提供方,我们也一直致力于在功能性、易用性、性能等方面进行改进。下面将罗列一些比较重要的点。
框架支持
随着AI的火热发展,各种机器学习框架层出不穷。由于人力有限,我们也不可能面面俱到,对所有框架进行集成。根据目前Hulu的使用情况,我们已经完成了对TensorFlow, Pytorch, Caffe2,XGBoost, Gensim, LightGBM的支持。在框架集成上,除了完成一系列和我们底层存储对接外,很重要的一步在于镜像构建。在这里我们也做很多工作,包括
(1)一些源码的改造,使XGBoost分布式模式可以运行在容器之中,Caffe2的编译脚本的改造使得可以自动build出各种CUDA、OpenCV组合下的镜像。
(2)一系列的构建脚本,可以快速的完成对已支持框架的新版本的测试和集成。
(3)利用一些镜像优化手段如多阶段构建、基础层共享以及基础镜像提前分发等手段减少镜像下载时间,从而降低启动延迟。
(4)此外,Nimbus也支持自定义镜像,方便用户使用一些独特的计算环境或者框架。我们提供了一些模板镜像,方便用户进行镜像制作。
调试工具
调试是模型开发阶段必不可少的环境。一般而言,本地运行都会比远端执行更容易调试。为了较少这部分影响,我们提供了一些列工具。除了常规的作业日志和监控系统外,我们也集成了Terminal,可以远程登陆到机器内部进行调试。集成了Jupyter notebook, 并且提供debug模式,内置了nimbus-run和nimbus-tensorboard等命令,可以很方便的在容器内进行边修改,边调试运行,边看结果,尽可能实现和本地调试一样的体验。由于debug模式同实际运行使用了同样的资源,为了避免资源浪费,我们会有时间限制,到期后除非续约,否则将自动回收资源。/在这种模式下,Jupyter主要用作debug场景,我们也在计划构建真正意义的Jupyter as a Service,可以取代reacher的工作站,完成云端编码、测试、训练等一条龙服务。
调度策略优化
CapOS默认的调度策略针对高吞吐做了大量优化,缺乏针对机器学习任务特别是分布式机器学习任务的优化。得益于其提供的灵活的Programming API,在默认策略之上我们封装了一层的针对AI作业的调度策略。
(1)数据中心自动选择。Hulu目前同时使用了多套数据中心,包括自己本地构建的两个数据中心以及云上的多个数据中心。Nimbus提供了对多个数据中心进行调度的能力。用户可以自己选择数据中心也可以由系统进行设置。数据中心一旦配置错误,将带来大量的跨数据中心的访问,极大的影响模型训练的速度。为此,我们加入了对数据源的位置感知能力,系统根据AI作业的输入和输出信息,以及各个数据中心的资源使用情况,可以自动选择最为合适的数据中心。
(2)GPU 优先的调度策略。GPU对于机器学习尤其是深度学习来说是一种极为重要的资源。在当前Nimbus集群中,同时存在了GPU作业和一般的CPU作业。在之前调度逻辑中,CPU作业可能会占据GPU机器上的CPU和内存资源,导致GPU任务因为CPU或者内存不足而没法调度出去,从而可能引发GPU资源闲置。在之后,我们对GPU机器做了额外的保护,尽量避免CPU作业抢占GPU的资源,只有当GPU机器出现闲置并且CPU机器不足以满足的情况下才会进行调度。
(3)分布式任务拓扑感知。分布式训练主要瓶颈在于多机之间的通信开销。因此我们需要分布式训练的各个节点尽可能位于同一机房,同一机架甚至同一机器上。在PS架构下,PS 节点作为中心节点,网络流量往往非常大,很容易把带宽跑满,在这种场景下需要尽可能把PS节点打散到不同的宿主机上,从而分摊网络流量。我们当前的版本还是基于一个比较粗的力度,这一点不如K8S,其可以利用Pod Affinity很容易实现更细粒度的优化。
统一的IO层
虽然用户的模型代码几乎可以不用修改就可以直接运行在Nimbus之上,然而在大规模机器学习训练过程中,势必需要引入分布式存储。从本地存储转到分布式存储,这将带来很大的使用习惯的改变。尽管主流分布式存储也都支持POSIX标准,然而这会降低IO性能,影响训练效率。为了减少这层gap,我们引入了一个统一的IO层,提供常用的文件Open,List, Delete接口,对外屏蔽底层文件系统的差异。所有的IO请求都将根据schema不同自动路由到不同文件系统之中。
开源社区合作
Nimbus相关生态系统中有大量的来源于开源社区的组件。作为平台方,我们也一直紧密关注着开源社区尤其是机器学习框架的动态。汲取社区力量更好的服务Hulu内部用户,也把Hulu的需求和优化回馈给社区。我们向XGBoost社区反馈了分布式模式下的文件处理的bug并解决后贡献给开源社区(dmlc-core/pull/452)。后续我们也会和社区保持紧密的联系,共同推动社区的良性发展。
作者简介:苏经纬,Hulu AI基础架构研发工程师,专注于AI、容器、容器编排等技术。