[原] 容器定義應用:數據科學的容器革命

title

概述

隨着容器化技術的興起,數據科學如今最大的一場運動已經不是由一個新的算法或者統計方法發起的了,而是來自Docker的容器化技術。一般,數據科學被認爲研究成果當即應用到生產環境都是比較緩慢的一個過程。本文將介紹利用容器技術如何加速數據科學在生產環境中的實際應用。html

clipboard.png

瓶頸

1. 環境部署一致性

保持數據科學環境一致性一般都是一件異常痛苦的事情,在不一樣的機器之間同時部署即便是用 Python 的 Conda 和 Virtualenv 或者 R 的 CRAN 和 packrat 的包依賴虛擬化技術,也會遇到不一樣操做系統(好比 CentOS、Ubuntu、Mac OS、Windows)的底層c庫缺失等問題。(國內的現狀是不少公司逼迫Data Scientist 變成 DevOps,美其名曰:全棧。。)java

2. 服務彈性與性能

因爲數據科學套件通常比較複雜,從底層的 Hadoop 分佈式架構、到頂層的 Shiny Server,這一系列服務的智能運維部署都是一個問題。尤爲是 Shiny Server 的開源版本如今默認是隻支持單機單線程的處理(其實就是nodejs內核),一般每次請求處理只是在幾毫秒之間。這對於一個小應用通常並不會出現太問題,不過更常見的場景是咱們須要在生產環境上部署高性能的 shiny server,此時 shiny server 的單機性能就成了一個問題。node

解決方案

事實上,容器同時爲加速數據科學的應用提供了一攬子解決方案:ios

  1. 將複雜的環境依賴化繁爲簡git

  2. 簡化集羣配置與管理的複雜度github

  3. 標準交付、研究結果可重複、便於成果分享算法

  4. 快速部署、快速擴展docker

  5. 明確運維、開發職責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的主要特性了。

shiny.png

和運維劃清界限

在實際生產中,使用Docker以後,運維只須要定義好基本的鏡像的Dockerfile,而不用處理具體的開發產生的依賴包問題。數據部門能夠引用運維提供的基礎鏡像,在此基礎上自行添加須要的依賴包。一面解脫了運維沒必要要的負擔,另外一方面也提高數據部門對項目的掌控力,從而提高整個團隊的效率。

數據科學鏡像

R + Docker = Rocker

rocker.png

Rocker 是一個組織管理R語言Docker鏡像的項目。Rocker提供了一系列用於不一樣場景下的R 鏡像。

這些鏡像是構建在 Debian OS的基礎之上的,基礎鏡像由r-base(通用),r-devel(開發者),rstudio(含rstuido服務器)這三類構成。

用例鏡像有:

  1. hadleyverse鏡像:包含了hadley大人所經營的rstudio開發的相關R包,包括rmarkdown、 pandoc、knitr、shiny、ggplot二、 dplyr、 tidyr、devtools、 httr 等等,這基本能夠知足大多數人的需求。

  2. ropensci鏡像:在hadleyverse的基礎上,又擴展了 rOpenSci 項目所涉及的包,讓各領域的數據科學研究如虎添翼。

社區鏡像則包括:

  1. r-java鏡像:在r-base基礎上加入了 Java 8 和 rJava包,用來和java作各類交互。

  2. r-pandoc鏡像: 在r-base基礎上加入了 pandoc,主要用來寫做。

  3. r-ssh鏡像:在r-base基礎上加入了 SSH客戶端,讓咱們能夠經過SSH登錄到這個R容器中。

除了 Rocker 以外,咱們還可使用一些其餘第三方鏡像:

  • docker-mro鏡像 經過微軟的Open R 優化 R 底層的矩陣運算,自動利用起多CPU的計算性能。

  • shrektan/shiny 鏡像 自帶了 Shiny-server和rstudio以及其餘常見R包,用來部署服務器很是方便。

依賴於這些開源鏡像,咱們就能夠快速組合鏡像搭建所須要的R語言計算環境,而且不會由於每臺電腦的操做系統不同而產生一些沒必要要的問題。

Python

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商業使用請聯繫做者。

相關文章
相關標籤/搜索