[译]如何在容器中开始你的数据科学之旅

说明: 本文译自How to get started with data science in containers,翻译的原因是我最近正好在关注kaggle开放出来的镜像,看到kaggle官方博客的这篇文章,于是随手翻译.本文主要用google翻译(google的翻译质量已经非常棒了),顺带人为做些润色

正文

现在对数据科学的最大影响并不是来自新的算法或统计方法,而是来自Docker容器。容器同时解决了一堆棘手的问题:

  • 使配置复杂的的库易于使用
  • 使得你的输出可再现
  • 容易分享你的工作;
  • 让你从Python数据科学栈中解脱出来。

我们在Kaggle Scripts的核心中使用Docker容器。使用Scripts能让你了解可以用数据科学容器做些什么。当然你也可以在自己的电脑室折腾它,我将在下文中介绍。

为什么要使用容器?

容器就像超轻量的虚拟机。从快照还原正常VM时,可能需要一分钟左右才能完成,但Docker容器大约在一毫秒内启动。所以你可以在容器中运行一些东西,就像运行一个本地二进制文件一样。每次重新启动容器时,其执行环境都是相同的,这使给予了你可重复性。而且容器在OS X,Windows和Linux上运行相同,因此协作和共享变得比以前容易得多。

在我看来容器的最好的东西是,他们消除了在数据科学里使用python的痛苦。对统计来说,R和Python都很伟大,当然他们也都有自己的优势和弱点,但他们之间的一个显著的区别是处理库和包的方式。R的install.packages()机制运行得非常顺利,包之间的冲突是罕见的。如果你的项目需要某个依赖库你本地却没安装,你可以从CRAN安装它,一会儿便好。

我们来与Python做个比较。在Python世界中,典型的工作流将是这样:你需要X库,所以调用pip install X,它还安装了依赖库A、B和C。但B已经通过easy_install安装到你的系统里了,所以停止pip安装过程,只是部分地删除新的东西,然后import B将无法正常运行。或者你发现C依赖于你后来安装的numpy的版本,而库Y和Z却链接到一个老的numpy库。等等等等。

Python的库安装过程逐渐产生出此类问题,在库之间产生冲突,以及同一系统上单一的Python setups产生的进一步冲突。使用virtualenv可以起到一点帮助,但以我的经验,它只是延缓崩溃而已。最终你都必须重新安装Python。这还没考虑你把一个库正常跑起来的时间。

如果你在一个容器中使用Python,所有这些问题都消失了。你只需要一次性投入时间去设置容器:一旦构建完成,你就全部搞定。事实上,如果你使用Kaggle的容器,你不必担心去构建任何东西。而且你可以轻松尝试新的包,一旦你退出一个容器会话,它将重置自己为初始状态。

他们包含什么

为了运行Kaggle Scripts,我们把三个Docker容器放在一起:kaggle/rstats有一个安装了所有的CRAN包和许多其他包的R语言环境,kaggle/julia包含Julia 0.5以及一组数据科学库,kaggle/python是一个Anaconda Python环境,带有许多库。要查看容器内部的详细信息,您可以浏览构建它们时所用的Dockerfile,这些都是开源的。我们不得不将其分割成几个部分,以便于我们可以在Docker Hub自动构建他们:这里是链接到Python part1part2part3 ; rcran022,和rstats ; Julia part1part2

此外请注意:我们只支持Python 3.现在已经2016年了

如何开始

这里有一个在本地设置Python容器的方法。这些具体的步骤是为OS X准备的,但Windows或Linux下也同样容易配置,如果你rtfm(Read The Fucking Manual)

第一步:跳到Docker网站,并在你的系统上安装Docker,安装很容易,不过眨眼工夫

第二步: 默认创建一个Linux虚拟机来运行你的容器(译者注:新版本的Docker在mac下不需要虚拟机了) ,别怕,它很小,且专注在数据科学。我们来创建一个新的,我们把它叫做'docker2'

$ docker-machine create -d virtualbox --virtualbox-disk-size "50000" --virtualbox-cpu-count "4" --virtualbox-memory "8092" docker2

你可以定制disk-sizecpu-countmemory

第三部,启动它:

$ docker-machine start docker2
$ eval $(docker-machine env docker2)

如果你新开一个终端窗口,docker无法连接到守护进程,请确认docker守护进程是否在本机运行,然后再执行以上两行

第四步: 拉取目标镜像:

$ docker pull kaggle/python

现在可以在容器中运行东西了,下边是些辅助脚本(让你更方便使用它),将他们放入.bashrc中(windows用户点这里)

kpython(){
  docker run -v $PWD:/tmp/working -w=/tmp/working --rm -it kaggle/python python "$@"
}
ikpython() {
  docker run -v $PWD:/tmp/working -w=/tmp/working --rm -it kaggle/python ipython
}
kjupyter() {
  (sleep 3 && open "http://$(docker-machine ip docker2):8888")&
  docker run -v $PWD:/tmp/working -w=/tmp/working -p 8888:8888 --rm -it kaggle/python jupyter notebook --no-browser --ip="\*" --notebook-dir=/tmp/working
}

现在你可以使用kpython来替代pythonikpython替代ipython,kjupyter替代jupyter notebook.这些指令都将让你即刻进入Kaggle组装的完整数据科学环境

希望你和我一样喜欢这些容器.




Fork me on GitHub