问题背景
策略研发的python环境依赖众多的包,包与包,包与python以及conda的兼容性在生产环境中可能会冷不丁的冒出一个问题
- conda在安装新包的时候会solve environment,使得有些包升级,有些包降级,带来了之前写的代码可能不可用
- 数据以pickle的形式进行存储,这样新版本写的数据老版本(可能是集群的版本,升级涉及很多操作)无法读取
因此这里考虑版本的控制
注意事项
conda install命令会擅自更新依赖库的版本(如:pandas,numpy等)导致版本不兼容,因而建议使用pip进行安装,或者conda指定版本进行安装:conda install package_name=xxx.yy.zz
实际操作
这里利用docker来实现跨平台的环境统一:基础的镜像使用jupyter/datascience-notebook, 在此基础上构建自己的镜像:
FROM jupyter/datascience-notebook:14fdfbf9cfc1
USER root
RUN sed -i 's/archive.ubuntu.com/mirrors.163.com/' /etc/apt/sources.list
RUN apt-get update &&
apt-get install -y --no-install-recommends fonts-arphic-gbsn00lp
cron vim rsync openssh-client &&
apt-get clean &&
rm -rf /var/lib/apt/lists/*
RUN service cron start
ENV NB_UID=1
RUN echo "$(id -nu $NB_UID) ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/notebook
RUN usermod -d /home/jovyan $(id -nu $NB_UID)
USER $NB_USER
RUN conda install -y --override-channels
-c pytorch
-c mosek
-c https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
-c https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
-c https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
jupyter_contrib_nbextensions pandas cvxopt pytorch-cpu torchvision-cpu mosek lxml &&
conda clean -tipsy
RUN npm config set registry https://registry.npm.taobao.org --global &&
npm config set disturl https://npm.taobao.org/dist --global &&
node /opt/conda/lib/python3.6/site-packages/jupyterlab/staging/yarn.js
config set registry https://registry.npm.taobao.org --global &&
node /opt/conda/lib/python3.6/site-packages/jupyterlab/staging/yarn.js
config set disturl https://npm.taobao.org/dist --global &&
jupyter labextension install -y --clean @jupyterlab/plotly-extension &&
npm cache clean --force &&
rm -rf $CONDA_DIR/share/jupyter/lab/staging &&
rm -rf /home/$NB_USER/.cache/yarn
USER root
# TA-Lib
RUN wget http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz &&
tar -xvzf ta-lib-0.4.0-src.tar.gz &&
cd ta-lib/ &&
./configure --prefix=/usr &&
make &&
make install &&
cd .. && rm -rf ta-lib ta-lib-0.4.0-src.tar.gz
USER $NB_USER
ARG JUPYTERHUB_VERSION=0.9.*
# lxml and psutil version constrainted by airflow
RUN conda install -y --override-channels
-c plotly
-c https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
-c https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
-c https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
lxml=4.2.5 plotly-orca psutil=4.4.2 &&
conda clean -tipsy
RUN pip install --no-cache-dir -i https://pypi.tuna.tsinghua.edu.cn/simple
jupyterhub==$JUPYTERHUB_VERSION arctic tqdm ipynb cufflinks alphalens
pyfolio visdom pyecharts schedule TA-Lib bcolz bquery tushare plotly
# arctic python3 fix
RUN sed -i 's/compat=True/compat=True, encoding="latin1"/'
/opt/conda/lib/python3.6/site-packages/arctic/store/_version_store_utils.py
# orca
ADD google-chrome-stable_181211_amd64.deb /tmp/google-chrome-stable_181211_amd64.deb
USER root
RUN apt-get update &&
apt-get install -y --no-install-recommends libgtk2.0-0
libgconf-2-4 libxtst6 lsb-release libappindicator3-1 xvfb &&
apt-get clean &&
rm -rf /var/lib/apt/lists/* &&
dpkg -i /tmp/google-chrome-stable_181211_amd64.deb &&
rm /tmp/google-chrome-stable_181211_amd64.deb &&
mv /opt/conda/bin/orca /opt/conda/bin/orca_gui
ADD orca /opt/conda/bin/orca
RUN chown jovyan:users /opt/conda/bin/orca
USER $NB_UID
orca的安装需要下载orca和chrome到Dockerfile所在的目录,这里自行决定即可,不用的话把对应的部分删除即可(本文的另一个目的也是为了做备份所以贴的是我们完整的配置);
- 构建镜像
docker build -t example:tag . # 构建
docker push example:tag you.docker.hub # 推送到远端仓库
- 运行
#!/usr/bin/bash
if [ $# -lt 1 ]; then
echo "Usage: bash $0 <port>"
exit 1
fi
docker run -d
--name=dev-env
-u jovyan # 这里可能是必要的,详见https://zhuanlan.zhihu.com/p/243231585
--restart=unless-stopped
-p $1:8888
-v $PWD:/home/jovyan/work:rw
your.private.docker.hub/username/example:tag
关于Windows
对于金融数据而言,很多第三方数据仅提供Windows下的API,所以还需要针对WIndows也做一份版本控制的环境,为此这里的技术路线采用的是直接打包一个稳定可运行的环境然后使用的时候直接下载压缩包,解压;其中有些小问题要处理一下,如下:
- 第一步:下载zip文件(OP打包好放在内网)放到安装位置,比如:D:Anaconda3
- 第二步: 配置环境变量到Path(右键计算机/此电脑->属性->高级系统设置->环境变量->选中Path点编辑
- 添加:D:Anaconda3、D:AnacondaaScripts、D:Anaconda3Librarybin
- 第三步:由于环境的变化,kernel的路径也会变化,需要让jupyter找到正确的kernel路径
- Step1: 首先打开Anaconda Prompt
- Step2: 输入jupyter kernelspec list查看安装的内核和位置
- Step3: 进入安装目录,打开kernel.jason, 查看python的编辑器的路径文件是否与安装路径一样,比如改为:"D:Anaconda3python.exe"
- Step4: 刷新页面即可,如果还是不行的话可以重启jupyter notebook