明月机器学习系列(六):构建机器学习or深度学习环境

2021-10-28 15:32:41 浏览数 (1)

Anaconda Notebook本身已经是一个很好的工具,非常适用于学习,不过在企业中应用时,该工具总感觉差了一点,经常需要安装各种包,而有些包未必能通过conda进行安装。因此,我们通过Docker镜像来构建满足自己的机器学习或者深度学习环境,尽量减少大家在环境安装上浪费的时间。

事实上,很多机器学习工程师并不擅长环境的构建,经常出现的情况是算法在自己电脑上能跑,换个环境就跑不了了。基于Docker镜像,提供统一的学习和训练环境,除了方便机器学习工程师之外,还有就是为了机器学习工程师和IT工程师能更好的进行协作。

1. 我们的目标


我们希望构建的Notebook支持如下特性:

  1. 支持Anaconda Notebook的基础包,从Anaconda迁移过来应该能无缝迁移。
  2. 支持GPU运行。
  3. 支持Tensorflow, TensorBoard和Keras。
  4. 支持Pytorch,这是非常常见的深度学习库。
  5. 支持图像处理,如Opencv
  6. 支持常见的NLP工具,如jieba, gensim, fasttext等
  7. 支持常用的机器学习库,如XGBoost,LightGBM,Catboost等。
  8. 支持时间序列建模。

简单说,就是希望该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

我们日常需要用的包基本都包含在镜像里面了,不过实际使用的时候,也会出现需要额外安装包的问题。

0 人点赞