随着容器化技术的兴起,数据科学如今最大的一场运动已经不是由一个新的算法或者统计方法发起的了,而是来自Docker的容器化技术。一般,数据科学被认为研究成果当即应用到生产环境都是比较缓慢的一个过程。本文将介绍利用容器技术如何加速数据科学在生产环境中的实际应用。html
保持数据科学环境一致性一般都是一件异常痛苦的事情,在不一样的机器之间同时部署即便是用 Python 的 Conda 和 Virtualenv 或者 R 的 CRAN 和 packrat 的包依赖虚拟化技术,也会遇到不一样操做系统(好比 CentOS、Ubuntu、Mac OS、Windows)的底层c库缺失等问题。(国内的现状是不少公司逼迫Data Scientist 变成 DevOps,美其名曰:全栈。。)java
因为数据科学套件通常比较复杂,从底层的 Hadoop 分布式架构、到顶层的 Shiny Server,这一系列服务的智能运维部署都是一个问题。尤为是 Shiny Server 的开源版本如今默认是只支持单机单线程的处理(其实就是nodejs内核),一般每次请求处理只是在几毫秒之间。这对于一个小应用通常并不会出现太问题,不过更常见的场景是咱们须要在生产环境上部署高性能的 shiny server,此时 shiny server 的单机性能就成了一个问题。node
事实上,容器同时为加速数据科学的应用提供了一揽子解决方案:ios
将复杂的环境依赖化繁为简git
简化集群配置与管理的复杂度github
标准交付、研究结果可重复、便于成果分享算法
快速部署、快速扩展docker
明确运维、开发职责ubuntu
一方面,容器就像一个轻量级的虚拟机,当咱们启动虚拟机的时候一般都要花几分钟,可是Docker容器一般只要几毫秒就启动了。所以,你跑容器和跑本地应用从速度上来说基本没什么差。每次咱们跑容器,容器的环境都是标准化的,这也意味着它为咱们带来了可重复性研究的机会。这些容器能够一致部署在 Mac、Windows、Linux 上,所以协同共享变得很是得简单。segmentfault
对于我的而言,好处之一就是减小了R、Python生态组件安装时带来的痛苦。若是你在容器中使用Python或R,以前全部的环境一致性问题就都灰飞烟灭了。若是咱们使用容器技术,就能够在容器中肆无忌惮地使用新包,由于即便出现意外致使容器不可用了,咱们只须要重跑一个容器就能够了。
另外一方面,对于整个数据科学套件而言,在架构上愈来愈流行微服务对原来SOA的架构进行进一步解耦,以便于每个模块能够独立迭代,小步快跑。而容器技术基于轻量级的进程,使得咱们能够快速扩展计算资源实现分布式计算而且轻松管理。
以 Shiny-Server 为例,吐槽Shiny-Server的单机能力其实没什么意义,这就好像你在吐槽tornado和nodejs的性能不行?可是明明这两个Web框架就是根据Epoll的IO复用,故意设计成异步单线程的模型来应对高并发业务场景的,正确的使用姿式实际上是搭配 Nignx反向代理 + Supervisor + 多个服务器实例。若是是 Tornado、Nodejs 跑单个服务也跪了,那Python和JS又得躺枪。Docker化以后,这些均可以一块儿用docker-compose.yml的配置文件来描述,而后一键启动整个集群服务,这样一来就得到了商用版本的Shiny-Server的主要特性了。
在实际生产中,使用Docker以后,运维只须要定义好基本的镜像的Dockerfile,而不用处理具体的开发产生的依赖包问题。数据部门能够引用运维提供的基础镜像,在此基础上自行添加须要的依赖包。一面解脱了运维没必要要的负担,另外一方面也提高数据部门对项目的掌控力,从而提高整个团队的效率。
Rocker 是一个组织管理R语言Docker镜像的项目。Rocker提供了一系列用于不一样场景下的R 镜像。
这些镜像是构建在 Debian OS的基础之上的,基础镜像由r-base
(通用),r-devel
(开发者),rstudio
(含rstuido服务器)这三类构成。
用例镜像有:
hadleyverse
镜像:包含了hadley大人所经营的rstudio开发的相关R包,包括rmarkdown、 pandoc、knitr、shiny、ggplot二、 dplyr、 tidyr、devtools、 httr 等等,这基本能够知足大多数人的需求。
ropensci
镜像:在hadleyverse
的基础上,又扩展了 rOpenSci 项目所涉及的包,让各领域的数据科学研究如虎添翼。
社区镜像则包括:
r-java
镜像:在r-base
基础上加入了 Java 8 和 rJava包,用来和java作各类交互。
r-pandoc
镜像: 在r-base
基础上加入了 pandoc,主要用来写做。
r-ssh
镜像:在r-base
基础上加入了 SSH客户端,让咱们能够经过SSH登录到这个R容器中。
除了 Rocker 以外,咱们还可使用一些其余第三方镜像:
docker-mro镜像 经过微软的Open R 优化 R 底层的矩阵运算,自动利用起多CPU的计算性能。
shrektan/shiny 镜像 自带了 Shiny-server和rstudio以及其余常见R包,用来部署服务器很是方便。
依赖于这些开源镜像,咱们就能够快速组合镜像搭建所须要的R语言计算环境,而且不会由于每台电脑的操做系统不同而产生一些没必要要的问题。
jupyter 为Python科学计算环境虚拟化提供了诸多镜像,咱们能够根据不一样的须要选择相应的镜像。
all-spark-notebook
base-notebook
datascience-notebook
minimal-notebook
pyspark-notebook
scipy-notebook
基本上咱们在科学计算环境中用到的包均可以在这里找到,若是须要安装更多的包,咱们亦能够直接在notebook中输入,好比
%% bash conda install financer
正确安装后,直接重启内核便可。不过由于容器的无状态,因此仍是建议你们在Dockerfile里面修改,或者在conda安装以后包后,自行docker commit来持久化镜像。
阿里云其实为为数据科学还提供了一揽子解决方案,执行下面命令,你能够把科学计算全套带回家。
docker pull registry.aliyuncs.com/alicloudhpc/toolkit
其中包含了
图像识别:OpenCV
机器学习工具:Cuda、Theano、R、Caffe等等
数值计算:Numpy、Scipy、OpenBLAS、Octave
配置和监控:lspci、numactl、perf、iostat、netstat
开发工具:Gcc/g++、JDK、CUDA、 OpenMPI 、OpenCL、 Python 、Lua
自行脑补一下本身为了"深度学习"在一台ubuntu上安装一天都没搞定和这里一键搞定的差距。。
现实并不完美,对于这些固有的镜像,咱们须要如何定制呢?其实,咱们能够去查看这些开源镜像都是经过Dockerfile制做的。经过修改 Dockerfile,咱们就能够根据本身的须要从新创建一些私有镜像,而后上传到公有或私有的Registry上和其余人共享镜像了。
因为国情问题,在制做容器的时候,咱们最好修改一下咱们的apt-get源(科学计算推崇操做系统使用 Ubuntu14.04 或 Debian)。
cp /etc/apt/sources.list /etc/apt/sources.list.back vi /etc/apt/sources.list
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ trusty main multiverse restricted universe deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ trusty-backports main multiverse restricted universe deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ trusty-proposed main multiverse restricted universe deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ trusty-security main multiverse restricted universe deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ trusty-updates main multiverse restricted universe deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ trusty main multiverse restricted universe deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ trusty-backports main multiverse restricted universe deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ trusty-proposed main multiverse restricted universe deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ trusty-security main multiverse restricted universe deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ trusty-updates main multiverse restricted universe
R 则中能够经过参数修改CRAN源:
install.packages("some_pakcage",repos='https://mirrors.tuna.tsinghua.edu.cn/CRAN/')
Python的conda源则能够这样修改:
%% bash conda config --add channels 'https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/' conda config --set show_channel_urls yes
这样一来咱们的整个容器的包管理加载速度就能够有一个质的提高。
文末放一个 Minecraft 版本的 Docker管理器,仅供娱乐。
更优阅读体验可直接访问原文地址:https://segmentfault.com/a/11...
做为分享主义者(sharism),本人全部互联网发布的图文均听从CC版权,转载请保留做者信息并注明做者 Harry Zhu 的 FinanceR专栏:https://segmentfault.com/blog...,若是涉及源代码请注明GitHub地址:https://github.com/harryprince。微信号: harryzhustudio商业使用请联系做者。