Anaconda Notebook本身已经是一个很好的工具,非常适用于学习,不过在企业中应用时,该工具总感觉差了一点,经常需要安装各种包,而有些包未必能通过conda进行安装。因此,我们通过Docker镜像来构建满足自己的机器学习或者深度学习环境,尽量减少大家在环境安装上浪费的时间。
事实上,很多机器学习工程师并不擅长环境的构建,经常出现的情况是算法在自己电脑上能跑,换个环境就跑不了了。基于Docker镜像,提供统一的学习和训练环境,除了方便机器学习工程师之外,还有就是为了机器学习工程师和IT工程师能更好的进行协作。
1. 我们的目标
我们希望构建的Notebook支持如下特性:
- 支持Anaconda Notebook的基础包,从Anaconda迁移过来应该能无缝迁移。
- 支持GPU运行。
- 支持Tensorflow, TensorBoard和Keras。
- 支持Pytorch,这是非常常见的深度学习库。
- 支持图像处理,如Opencv
- 支持常见的NLP工具,如jieba, gensim, fasttext等
- 支持常用的机器学习库,如XGBoost,LightGBM,Catboost等。
- 支持时间序列建模。
简单说,就是希望该Notebook能同时支持机器学习,NLP和图像处理,这是我们公司主要的三个方向。
2. 镜像构建过程
因为我们环境包含了比较多的内容,所以我们分成了两个步骤进行构建:首先构建一个基础镜像,然后在此之上,构建完整的应用镜像。
分两个进行构建的好处是,基础镜像可以保持相对稳定,如果只是应用层改变,则编译时间能减少很多。
3. 基础镜像
基础镜像就是类似Anaconda Notebook,但我们没有选择Anaconda Notebook的官方镜像作为基础镜像,而是基于tensorflow的官方镜像进行构建:
代码语言:javascript复制FROM tensorflow/tensorflow:latest-gpu-py3-jupyter
这是支持GPU和Python 3的tensorflow jupyter镜像。
然后安装基础包:
代码语言:javascript复制RUN pip3 install
'pandas'
'numexpr'
'matplotlib'
'scipy'
'seaborn'
'scikit-learn'
'scikit-image'
'sympy'
'cython'
'patsy'
'statsmodels'
'cloudpickle'
'dill'
'dask'
'numba'
'bokeh'
'sqlalchemy'
'h5py'
'vincent'
'beautifulsoup4'
'protobuf'
'xlrd'
'facets'
'tqdm'
'scikit-multilearn'
这些包基本上都是Anaconda Notebook中的包含的包,不过也有几个是我们加上去的,如scikit-image,facets,scikit-multilearn等。
基础镜像还做了一些基础的配置:
代码语言:javascript复制# 终端设置
# 默认值是dumb,这时在终端操作时可能会出现:terminal is not fully functional
ENV TERM xterm
ENV PYTHONIOENCODING utf-8
# 解决时区问题
ENV TZ "Asia/Shanghai"
4. 应用镜像
在基础镜像的基础上,我们加入更多我们需要的包。
安装Pytorch,当然也是GPU版本的:
代码语言:javascript复制RUN pip3 install https://download.pytorch.org/whl/cu100/torch-1.1.0-cp36-cp36m-linux_x86_64.whl
&& pip3 install https://download.pytorch.org/whl/cu100/torchvision-0.3.0-cp36-cp36m-linux_x86_64.whl
安装nlp常用包:
代码语言:javascript复制RUN pip3 install jieba gensim fasttext
安装扩展算法包:
代码语言:javascript复制# 扩展算法包
# 时间序列
# fbprophet依赖与pystan
# 机器学习的可解释性
# eli5: 对各类机器学习模型进行可视化,特征重要度计算等
# pdpbox: 展示一个或者两个特征对于模型的边际效应
# shap: 细分预测以显示每个特征的影响
RUN pip3 install pystan fbprophet
&& pip3 install eli5 PDPbox shap
&& pip3 install xgboost
lightgbm
catboost
sklearn-contrib-lightning
安装附加工具:
代码语言:javascript复制# 附加工具
# yellowbrick: Visual analysis and diagnostic tools to facilitate machine learning model selection. 可视化分析
# FeatureSelector是用于降低机器学习数据集的维数的工具
# pydotplus, graphviz: 可视化决策树时需要用到
# PrettyTable模块可以将输出内容如表格方式整齐地输出
# pyarrow fastparquet: pandas的parquet需要依赖于这两个包
RUN apt-get update -y
&& apt-get install -y
libglib2.0-0
libsm6
libxrender1
python3-pydot
python3-pygraphviz
imagemagick
&& pip3 install
yellowbrick
opencv-python
opencv-contrib-python
keras
pydotplus
graphviz
prettytable
pyarrow fastparquet
&& rm -rf /var/lib/apt/lists/*
解决matplotlib的中文乱码问题:
代码语言:javascript复制ENV matplotlibrc /usr/local/lib/python3.6/dist-packages/matplotlib/mpl-data/matplotlibrc
ENV mpl_path /usr/local/lib/python3.6/dist-packages/matplotlib/mpl-data/fonts/ttf/
ADD ./SimHei.ttf "$mpl_path"
RUN sed -i 's/#font.family/font.family/' "$matplotlibrc"
&& sed -i 's/#font.sans-serifs*:/font.sans-serif : SimHei, /' "$matplotlibrc"
&& sed -i 's/#axes.unicode_minuss*:s*True/axes.unicode_minus : False/' "$matplotlibrc"
如果Python版本不同的话,这里需要对应修改。
至此,镜像编译完成,目前镜像大小大概9G左右。
完整的Dockerfile可以看这里:https://github.com/IBBD/dockerfile-tensorflow/tree/master/notebook 。
5. 应用情况
我们将编译好的镜像部署到几个服务器上,每个服务器上的版本都保持一致,能为大家提供统一的学习和训练环境,提升效率。在服务器上的启动脚本:
代码语言:javascript复制docker run -u $(id -u):$(id -g) -d --restart always --name ibbd-notebook
-p 8888:8888
-e JUPYTER_ENABLE_LAB=yes
-v `pwd`/jupyter_notebook_config.py:/home/jovyan/.jupyter/jupyter_notebook_config.py
registry.cn-hangzhou.aliyuncs.com/ibbd/notebook
我们日常需要用的包基本都包含在镜像里面了,不过实际使用的时候,也会出现需要额外安装包的问题。