云端部署数据科学开发环境Anaconda+Jupyterlab

本文最后更新于:2021年5月15日 下午

最近借舍友账号薅了阿里云云翼计划送的一台ECS服务器,选了 Ubuntu20.04 系统,打算开一个端口来和队友跑实验用,因为是同一个环境所以可以避免各种包版本不同而出的问题,出bug也可以一块解决。还有一个很赞就是,我可以用我的 iPad 甚至手机打开云端环境随时看代码,随时coding!

下面我将给出我的环境部署流程以及部署时遇到的坑和对策。

内容大致分为两部分,部署 Anaconda + 部署 Jupyterlab。

愿君有所获。

0x00 云端准备

配置安全组

阿里云在后台有一些安全措施限制了一些端口对外开放以确保系统安全。

进入后台点击头像那里下面有一个安全配置,设置好对外开放的端口范围即可

我一次性设置了好几个,对于jupyter来说就是你在前面配置的端口号,我配置的是8888,那么在安全组规则里就写一个8888或者8888/8890(意思是包括8888在内到8889之间的端口,其他端口号同理)

详情可见阿里云文档添加安全组规则

0x01 部署Anaconda

下载Anaconda

wget -P /tmp https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda2-2.5.0-Linux-x86_64.sh

这里用清华源的镜像

安装Anaconda

bash /tmp/Anaconda2-2.5.0-Linux-x86_64.sh

中间可能有一个设置安装路径的,我没理…一路回车yes完事~

激活Anaconda环境

source ~/.bashrc

image-20210514230643251

如果出现上图这个路径,就根据路径用这个命令

source /home/ubuntu/.bashrc

更新所有包

conda update --all

创建环境

创建一个基于 python3.6 名为 jupyter 的conda环境

conda create -n jupyter python=3.6

激活环境

conda activate jupyter

或source activate jupyter

conda环境迁移

导出本地conda环境

conda env export > environment.yaml

将该配置文件上传到阿里云某个文件夹下

导入环境

conda env create -f environment.yaml

文件路径应该具体到某个位置下,如果要重新命名则可以在后面加一个

-n 新环境名称

最后我的导入环境命令如下:

conda env create -f ./root/environment.yaml -n myjupyter

不过我并没有使用之前的conda环境,后面又重新配置了一个。

迁移出错对策

导入报错

导入时有可能会出现下面的报错

Warning: you have pip-installed dependencies in your environment file, but you do not list pip itself as one of your conda dependencies.  Conda may not use the correct pip to install your packages, and they may end up in the wrong place.  Please add an explicit pip dependency.  I'm adding one for you, but still nagging you.
解决方案

在yaml配置文件中的依赖下面加一行

- pip

更换conda源

由于访问国外源下载资源可能会比较慢,一般更换成国内的源,下面使用清华源,阿里淘宝中科大等其他源同理,可以找对应官网查看。

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge 
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/

# 设置搜索时显示通道地址
conda config --set show_channel_urls yes

假如想直接写进配置文件里也可以用编辑器打开.condarc文件编辑来加入想要的源。

vim ~/.condarc

或输入vim /home/ubuntu/.bashrc

往配置文件加入下面的文本即可

channels:
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
  - defaults
show_channel_urls: true

假如换源时出现

ConfigurationLoadError: Unable to load configuration file.
  path: /root/.condarc
  reason: invalid yaml at line 2, column 0

可能是哪里配置出了小问题,没关系,直接将对应路径文件删除即可

rm /root/.condarc

或rm /home/ubuntu/.bashrc

然后还是按照换源的步骤重新配置一下即可。

配置开发环境

这个环境看自己需要来配置啦,我自己配的是 PyTorch ,因为跑实验用的是基于 PyTorch 框架写的代码。

配置 PyTorch 环境

这里配置的是GPU版,反正GPU版也能用CPU,torch 版本是1.6.0,在PyTorch官网看自己的需要来装就好。

conda install pytorch torchvision cudatoolkit=10.2 -c pytorch

如果 torch 下载太慢安装出错了可以参考一下这篇文章的解决办法 pytorch1.1.0安装教程

P.S. 如果想了解在 Win10上部署 PyTorch GPU版开发环境可以参考我这一篇教程低配 Win10 部署 PyTorch-GPU 环境(Win10+mx150+CUDA10.2)

进行完上面这些步骤之后anaconda算是已经部署完成了。

0x02 部署 Jupyter 服务

安装 Jupyterlab

conda install jupyter jupyterlab

遇到什么 yes or no 的就一直 y 就ok了

设置 Jupyter 登入密码

安全起见一般要设置好登陆密码,当然也可以不设置(不推荐)。

Jupyterlab 安装好之后输入ipython回车进入IPython交互环境,然后输入下面两行,键入密码,确认密码。

from notebook.auth import passwd
passwd()

image-20201026205833949

'argon2:$argon2id$v=19$m=10240,t=10,p=8$Q7DXnvrOurcEo50YfUdbYA$kzzuUEzrXvg6USTan07KUA'

将上图中输出的一串字符串先记下来,后面设置登陆密码时要用。

如果想要重置密码则再进行一次这个步骤即可。

配置 Jupyter 服务

注意:不同的路径可能命令也不同,根据自己的来配置。

先生成配置文件

jupyter notebook --generate-config

根据它给出的文件路径,找到 jupyter_notebook_config.py 这个文件,然后用vim打开编辑。

vim /root/.jupyter/jupyter_notebook_config.py

会发现里面一堆配置,莫慌

vim模式下输入命令

:/你要查询的字段

即可快速找到你要修改的字段所在位置。

例如:输入 :/c.NotebookApp.ip 即可快速找到 c.NotebookApp.ip 这个字段所在位置,以此类推。

# 将ip设置为*,允许任何IP访问
c.NotebookApp.ip = '*'
# 这里的密码就是之前生成的那一串
c.NotebookApp.password = 'argon2:$argon2id$v=19$m=10240,t=10,p=8$Q7DXnvrOurcEo50YfUdbYA$kzzuUEzrXvg6USTan07KUA'
# 服务器上并没有浏览器可以供Jupyter打开,这项没有的话不管也行
c.NotebookApp.open_browser = False
# 监听端口设置为8888或其他自己喜欢的端口
c.NotebookApp.port = 8888
# 我们可以修改jupyter的工作目录,也可以保持原样不变,如果修改的话,要保证这一目录已存在
c.MappingKernelManager.root_dir = ''
#c.MappingKernelManager.root_dir = '/root/anaconda3/envs/jupyter'
# 允许远程访问
c.NotebookApp.allow_remote_access = True

P.S.新版本的jupyter将会把NotebookApp改成ServerApp

修改完成之后输入vim命令保存退出

:wq

切换 Conda 环境

Jupyterlab 中切换不同的 Python 环境

在本地端连接服务器时一般需要运行不同的Python环境或者在不同环境下安装包,本地端的网页显示需要的python环境需要先装载进 kernel ,执行命令如下:

python -m ipykernel install --user --name xxx(环境名称) --display-name "your name"(显示名称)

一般步骤是进入需要添加kernel的Python环境,然后写入配置。

比如我的 conda 环境名叫 jupyter,我想要将它添加到 Jupyterlab 的 kernel 并命名显示为 PyTorch1.6.0,那就进入安装了jupyterlab的环境里输入下面这一行:

python -m ipykernel install --user --name jupyter --display-name "PyTorch1.6.0"

这时候就可以在 Jupyterlab 里选择名为 PyTorch1.6.0 的环境了。

运行 Jupyter 服务

这时候应该可以运行 Jupyter 服务了,可以在你的工作目录下输入下面的命令运行一下,

jupyter lab --allow-root

image-20201026211621766

会看到有实时显示服务运行日志,想要终止服务则按 Ctrl + C 。

再去浏览器输入类似于这样的地址http://xx.xxx.xxx.xxx:8888/lab?(服务器公网ip地址:8888)就会进到 Jupyterlab 界面了,第一次打开可能要加载一段时间,进去之后输入之前配置的密码就完事儿啦~

之后你会发现你退出终端后jupyter的服务也一起关了,怎么让他在后台一直开着以便我随时访问呢?

这时候就要用到下面的命令,后台运行挂起服务

nohup jupyter lab --allow-root > jupyter.log 2>&1 &

nohup表示no hang up, 就是不挂起,&将服务放在后台运行,这样命令执行后即使终端退出, 也不会停止服务运行。 > jupyter.log 的作用是将之前实时打印的日志输出到 jupyter.log 里。

结束 Jupyter 服务

若想结束 Jupyter 服务则输入命令 ps 列出当前在运行的进程

image-20201026215508941

找到 jupyter-lab 服务的 pid ,然后 kill pid 终止进程。(我这个不知道为什么没有kill成功,可能是当前会话还没有关闭?)

Jupyterlab 插件

没有用 Jupyter Notebook 而是用 Jupyterlab 的原因主要是因为jupyterlab有插件功能,相当于强化版的 Jupyter Notebook,目前市场上有的插件暂时还没有很多,希望以后会和 VScode 的插件一样丰富吧。

大部分插件都是基于 Nodejs ,所以要下载一个。输入下面的命令下载即可。

conda install nodejs

一堆插件自己看着下载,我自己也还没怎么用,代码补全功能那个插件有些坑,之后考虑出篇插件推荐。

以上全部步骤配置完之后应该就能正常访问你的云端数据科学开发环境了,拿起你的键盘,就这样踏上数据科学的旅途吧~