将Nextremer扩展为大规模的机器学习环境Shiva

这是Nextremer 2017年圣诞节日历的第三篇文章。

Nextremer正在建立一个名为Shiva的机器学习开发环境,使得使用GPU机器变得方便。在这里,我们将介绍导致Shiva开发的背景和其工作原理。

IMG_0900-min.JPG

在开发Shiva时,我很大程度上参考了去年Retty的CTO樽石先生公开的文章《Retty流『支撑2200万用户的机器学习基础设施』的构建方法》。
能够公开这样宝贵的专业知识真是太好了,如果没有这篇文章,我可能不会去开发Shiva。

我将向Retty先生传达我对樽石先生的尊敬和感激之情,并公开关于Nextremer的Shiva的专业知识!

Shiva的开发经过如下。

在Nextremer的研发项目中,我们涉及深度学习在自然语言处理、强化学习等领域的应用。然而,深度学习所需的大量计算无法离开GPU环境。

在一个正式的项目中,我们会预留预算来购买个人用的GPU机器,或者使用云端的GPU实例。但并非所有的工程师都涉及深度学习工作,因此我们内部没有可供任何人方便使用的GPU环境。因此,我们听到了来自工程师和实习生学生那边的声音,他们希望能更轻松地使用GPU环境进行快速实验和黑暗研究。

此外,由於參與研究的成員和實習生並非所有人都精通於軟體本身,因此每個人的環境設置都是各自不同且耗時的。其中,機器學習環境的安裝有些可以輕鬆通過pip命令快速完成,而有些則需要進行複雜的構建過程。

在这种情况下,当我看到之前提到的樽石先生写的文章时,我觉得:“如果我们也有这样的人,这个问题就可能解决了!”、“而且,这样很酷,我想尝试一下!”因此,一开始我们以这篇文章的架构为目标,开始了Shiva的开发。

Shiva 是指

概念

这是一个供机器学习和深度学习使用的沙盒环境。用户可以方便地使用预先设置好的GPU环境,并重复尝试和错误以生成创新性的应用程序。这个环境的预计使用是为了重复尝试和错误以生成创新性的应用程序。

如何使用

当您访问Shiva仪表盘时,您可以看到每个GPU机器的资源使用情况以及正在使用的用户。
当您选择空闲的机器并点击[启动我的容器]后,您将在几秒钟内创建一个专属于您的容器,并启动Jupyter。

shiva.gif

摘要

shiva_concept.png

这是一个在GPU机器上自动启动各用户专用的Docker容器的机制,通过这种方式,用户可以轻松地共享机器资源,并且不需要担心与其他用户的库冲突等问题。

每个容器均预配置了深度学习库,诸如cuda、cudnn、chainer、tensorflow,以及自然语言处理库,如MeCab、CaboCha、NEologd,因此,用户无需费时搭建环境便可在数秒内开始开发。我们为用户提供了sudo权限,他们可以自由添加所需的库进行安装。

此外,由于所有机器共享每个用户的主目录,因此您可以在任何机器上使用相同的环境进行开发。

建筑概览

arc.png

希瓦仪表板

这是用户从Web浏览器使用Shiva的仪表板。您可以从仪表板上启动或停止容器,查看每台机器的资源状态,以及检查容器运行情况,包括谁何时开始使用它们。

在Nextremer中,我们使用GSuite作为内部工具,所有员工都持有公司的Google账户,因此登录时需要使用Google账户。仪表板采用React.js进行实现,由于我对外观设计没有天赋,为了节省UI实现的时间和精力,我使用了设计框架material-ui。

希瓦经理

Shiva API ->
师瓦API

我们将获取各个机器的资源信息,并执行对GPU机器容器的操作。
机器资源(CPU、内存、GPU)通过Prometheus的API获取,而容器的信息则通过Jupyter broker的API获取。

私人注册处

为了管理在Shiva上使用的所有容器镜像,我们自行运行Docker Registry。
由于机器学习环境的Docker镜像大小约为15GB,相当大,为了减少push/pull通信的时间,我们在局域网中运行Registry。

GPU机器集群 (gū jī qì jí

我们目前使用3台GPU机器构建了一个Mesos集群,用于构建集群和管理Docker容器的编排,我们使用Mesos和Marathon进行操作。

Mesos 是用于管理机器集群的软件,当尝试执行某个操作时,它会自动选择具有必要空闲资源的机器并执行该操作。
Marathon 是一个利用 Mesos 功能运行的框架之一,它是用于管理在 Mesos 集群上始终运行的守护程序的软件。

儘管相較於Kubernetes,Marathon的功能較少,但安裝設置更加簡單,所需資源也較少。在這次的使用情景中,簡單的容器編排功能已足夠,而且考慮到只有一個人來運營,希望在故障排查時能盡可能減少需要檢查的項目,因此我們選擇了使用Mesos + Marathon作為Shiva的容器編排方案。

顺便提一下,Nextremer在开发和销售minarai以及其他项目时使用了Kubernetes进行开发。

部署机器学习环境容器

Jupyter代理、Jupyter代理商和Shiva-jupyter所記述的部分是Shiva的核心功能,用於管理用戶的機器學習容器和對jupyter的訪問。

每个用户的Jupyter随机分配了一个在本机监听的端口,Jupyter代理保存了启动用户和Jupyter端口号之间的映射表。这样,根据访问的用户不同,请求将被代理到该用户的容器中。此外,可以通过API来获取正在运行的容器信息,以及创建和删除容器。

jupyter_broker.png

這些功能是基於Project Jupyter提供的OSS開發的,我們實現了Jupyter proxy和Jupyter broker。
tmpnb提供了多用戶使用獨立環境的Jupyter功能,Shiva的容器管理主要是利用了這個功能。

機器學習環境的Docker映像是基於NVIDIA提供的CUDA映像建立的。

NVIDIA-Docker – NVIDIA容器

为了使容器可以访问主机上的GPU,我们在内部使用nvidia-docker。nvidia-docker命令本身只是在普通的docker命令上添加了从nvidia-docker插件获取的GPU设备选项。详情请参考以下链接:https://github.com/NVIDIA/nvidia-docker/wiki/Internals,https://github.com/NVIDIA/nvidia-docker/wiki/nvidia-docker-plugin。注意,最新版本已经标记为1.0(已废弃)。

因此,如果像Shiva一样使用docker API,您可以简单地将可以从nvidia-docker-plugin获取的选项附加到API请求中,以便以相同的方式使用。
* 但是,目前无法有效解决在容器内部使用sshfs的问题,最终不得不使用privileged选项启动,因此使得nvidia-docker变得无意义……

Prometheus出口工具

这个软件可以将 Prometheus 需要监控的信息公开给 Prometheus,exporter 自身只具有将每个 exporter 所持有的信息作为 JSON 格式的 API 公开的功能,Prometheus 将轮询监控 exporter 并将数据存储到 Prometheus 的数据库中。

Shiva正在使用以下的出口商。

    • 物理マシン(CPU、メモリ、NW、ディスク、温度)

node_exporter をそのまま利用

GPU(利用率、メモリ、温度)

nvidia_exporter をカスタム

コンテナ状況(利用ユーザー、最終アクセス時刻)

Jupyter brokerの情報を取得するexporterを独自に実装

CephFS – Ceph文件系统

使用 Ceph 作为文件系统,并利用 CephFS 来构建分散存储,以创建可从所有机器访问的共享空间。
每个用户的主目录都存储在 CephFS 中,并在 Shiva-jupyter 上挂载 CephFS 中的用户主目录。

CephFS 上的文件输入/输出通过网络进行,并且为了冗余和读取加速,每个文件会被分割成多个条带并存储在每个 Ceph 节点上。因此,网络速度一定是瓶颈,必须通过局域网传输。

然而,对于机器学习的任务来说,主要是批量加载文件到内存和GPU内存并重复计算,因此磁盘I/O很少成为瓶颈。因此,在使用Shiva时,我们认为这不是个问题,并且在实际运行中,磁盘I/O的速度目前也没有成为问题。

突然断电也能自动恢复而不会丢失数据,这一点相当出色。

当你在调查Ceph相关信息时,要在商业环境中应对大规模数据和大量访问确实是相当困难的。

基础设施概览

infra_3.png

MAAS (Metal-As-A-Service)提供一种服务,可以简化和自动化物理服务器的管理和部署。

我可以使用Ubuntu官方工具来搭建裸金属环境,自动进行操作系统的安装。我在Retty先生的文章中了解到并使用了这个工具。

因为MAAS本身的信息很少,所以我有点困惑,但只要按照MAAS官方文档的指示来操作,就可以使用而没有遇到大问题。

在MAAS的2.x版本中,无法使用远程唤醒(Wake-on-LAN)来开启电源,必须手动进行,这是稍微有点不方便的地方。
然而,实际上很少有机会需要开启或关闭物理机,因为只有在办公室时才会这样做,所以并没有特别的问题。

Ceph (分布式对象存储系统)

在进行Ceph的设置时,我经过了很多艰难的调查研究,不断地尝试了很多次。

我在搭建Ceph时参考了以下文章:
https://jedipunkz.github.io/blog/2014/01/29/ceph-process-best-practice/
https://jedipunkz.github.io/blog/2014/02/27/journal-ssd-ceph-deploy/
https://www.server-world.info/query?os=Ubuntu_16.04&p=ceph

最后,我们把ceph-deploy的命令一步一步地执行,形成了一个简单的步骤。
虽然想用ansible来实现自动化,但目前还未开始处理。

Ansible 人畜无害

我们使用中间件配置管理软件来自动设置Mesos&Marathon环境。

由於Retty先生在文章中使用了juju,所以我最初也試了試那個。但是需要花一些時間來學習它,所以我還是選擇使用我熟悉的Ansible,對於我這次想要做的事情來說已經足夠了。不過,如果考慮在雲端上動態調整規模的機制,似乎使用juju能夠更輕鬆地設置集群。

物理计算机规格

我们正在使用以下规格的GPU机器,总共有3台。

CPUIntel Core i7-6700Kメモリ32GBDiskSSD 500GBGPUGTX-1080 ×2

IMG_0906-min.JPG

最初放在办公室角落的时候,我觉得外观很重要,所以用LED风扇和LED带子给它增添了光彩,并把它放在成员们容易看到的地方,就像供奉神灵的地方一样。
虽然装饰还不够,但我希望今后能找到机会不断升级它。

并且,Shiva Manager所使用的服务器是直接使用一台我为实习意向而准备的Macbook Pro。

使用时出现的问题

磁盤容量限制

在Ceph的机制中,每个文件都会被复制并保存,因此每个文件的容量使用将简单地增加一倍。
在Shiva环境中,总共有1.5TB的磁盘容量可用,但在Ceph中的有效容量只有其一半。
※这里没有详细调查过。

以前有人将数百GB的学习数据上传至Shiva,导致ceph的容量上限被耗尽,系统因此停止运行。由于数据上传本身也需要时间,因此此后我们决定不再将大容量数据存放在Shiva上,而是通过sshfs将个人计算机的磁盘挂载到容器内供使用。

容器资源隔离

由于没有对容器进行特别的资源限制,当某些容器失控并耗尽内存和CPU时,整个机器的运行会停止,这是一个问题。
Docker可以为每个容器设置资源限制,因此如果经常出现问题,建议添加此设置。

对于 Shiva,由于内部团队成员较少且都是用户,每个成员对技术有一定的了解,所以即使采用这样的机制也没有问题。但是,如果要面向普通用户提供真正专业的服务,就需要更严格的资源隔离,这会变得相当困难。

Koding为什么从容器转向使用虚拟机,放弃了Docker?

Shiva 在使用开启后的实际运用情况

作为一种利用实践,它经常被用于在GPU环境下进行简单验证,以及在实习生和自由职业者的协助下,供开发目的使用。
另外,由于有6张GTX-1080,一些成员也会使用Shiva来尝试多种不同的超参数组合。

尽管将机器学习容器配置为集成环境,但成员们似乎使用pyenv等工具在各自的环境中设置并使用深度学习库。
因此,相较于特定版本的集成环境,有能力保存自己设置的环境的功能将更加方便。
另外,还有一个想要通过SSH而不是通过浏览器访问Jupyter的需求。

我们计划在未来添加和扩展这样的功能。尽管我们从很久以前就有这个想法,但是时间总是不够用呢…

总结

起初,我们发起了Retty的机器学习基础设施的完全复制目标,但在考虑到我们所面临的问题和个人技能情况后,我们在一些地方进行了调整,最终实现了现有的Shiva。

今年有段时间我同时进行了多个项目,非常忙碌。在这些项目告一段落之后,有大约一个月的时间几乎处于空闲状态(约占10%的工作量),我利用这段时间独自进行了开发。

由于平时完全依赖云托管服务,所以几乎没有直接接触基础架构的机会,这次特别需要广泛调研技术相关于基础架构,感到有些困难。
然而,最终根据调研得到的信息成功构建了Shiva,对我个人来说是非常有学习意义的。

然后,实际上我之前从来没有自己组装过电脑,对于零部件的种类和电源容量也不太了解,完全是个生手的状态下,在查阅资料的同时向身边的成员请教,并且不断尝试各种方法,总算是成功组装了物理部分的机器。
去秋叶原找电脑零件之类的,我的兴奋度瞬间飙升。
因为这是我第一次尝试的部分,所以对我来说也是最有趣的地方。

尽管Nextremer的工程师可能没有相关专业知识,但当面临任何棘手问题时,他们仍然持有独自调研并通过工程方式解决的心态。

我们研究的对话系统和深度学习技术一开始几乎都是一群素人,他们通过自我调查和实践来提升技能。现在我们有很多拥有令人自豪的卓越技能的成员。即使是在未知领域,我们总是在受到周围成员的激励下,希望能够站在最前沿开拓一片没有任何东西的道路上。

希望在这样的环境中自由积极地工作的人,欢迎加入 Nextremer 和我们一起工作!
https://www.wantedly.com/companies/nextremer/projects

最后

最后,真的非常感谢樽石先生公开了机器学习平台的信息!

未来,我们将继续积极公开Nextremer技术信息和源代码,使其能够在开放的环境中自由流通。我们也希望这篇文章的信息能够对某个人有所帮助…!

广告
将在 10 秒后关闭
bannerAds