工欲善其事,必先利其器。搭建开发环境是学习本书原理与实验必不可少的环节。本章节主要向读者介绍一些大型开发软件的使用,如MobaXterm与集成开发环境软件(IDE,Integrated Development Environment software),以及如何给Linux服务器代码部署开发环境。与此同时,笔者也顺带讲述如何安装和使用docker容器技术,帮助大家缓解配置环境带来的烦恼。
一般地,算法程序开发人员的代码开发环境几乎离不开Linux操作系统,而当今世界的服务器也基本都是以Linux操作系统为主,不外乎两个原因:免费、易用。为此,本书的代码都将基于Linux服务器进行开发。接下来,笔者将介绍几款帮助大家提升开发效率的软件。
MobaXterm是一款Windows操作系统的软件,它是IT人员在Windows平台上远程链接Linux服务器的终极工具箱。在单个Windows应用程序中,它提供了为程序员,网站管理员,IT管理员以及几乎所有需要以更简单的方式处理远程作业的用户量身定制的功能。
MobaXterm提供了所有重要的远程网络工具(SSH, X11,RDP,VNC,FTP,MOSH。)和Unix命令(bash,Is,cat,sed,grep,awk,rsync等)到Windows桌面,都可以在一个可移植的exe文件中使用,该文件可以直接使用。
MobaXterm软件是开源免费的,其下载地址如下:
https://mobaxterm.mobatek.net/download.html
选择SSH连接,如图 2.2所示。
图 2.2 SSH连接输入Linux服务器与用户名,单击“OK”之后,输入服务器密码即可,如图 2.3所示。
图 2.3账户与密码Anaconda指的是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项。Anaconda3是python3.x的意思,选用Anaconda是因为能避免python包之间的版本依赖错误,又因为从2020年开始,官方停止维护Python2.X,因此我们直接下载Anaconda3即可。如图 2.4所示,下载Linux版本的Anaconda,然后上传至服务器。
https://www.Anaconda.com/distribution/#download-section
图 2.4 Anaconda 3.7 Linux版本# 切换至存放Anaconda3的文件目录
sh Anaconda文件.sh
# 当按照Anaconda文件完毕时,配置Anaconda的系统环境
# 在自己的服务器目录下
vim .bashrc # 打开.bashrc文件
# 在.bashrc文件底部添加
# 为了避免与其他服务器用户产生命令冲突,
# 可以使用自己的英文名+Python替代python
alias ChilePython='/home/xxx/Anaconda3/bin/python'
# 配置Anaconda的系统环境,让系统能索引到Anaconda
export PATH=/home/xxx/Anaconda3/bin:$PATH
Anaconda的发行版默认是国外的源,因此下载一些Python包会比较慢。因此,我们需要更换成国内的源,一般是清华源或者中科大源。Linux用户在bash命令行输入更换命令。
# 更换清华源
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/Anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/Anaconda/pkgs/main/
conda config --add channels
https://mirrors.tuna.tsinghua.edu.cn/Anaconda/cloud/pytorch/
conda config --set show_channel_urls yes
# 更换中科大源
conda config --add channels https://mirrors.ustc.edu.cn/Anaconda/pkgs/main/
conda config --add channels https://mirrors.ustc.edu.cn/Anaconda/pkgs/free/
conda config --add channels https://mirrors.ustc.edu.cn/Anaconda/cloud/conda-forge/
conda config --add channels https://mirrors.ustc.edu.cn/Anaconda/cloud/msys2/
conda config --add channels https://mirrors.ustc.edu.cn/Anaconda/cloud/bioconda/
conda config --add channels https://mirrors.ustc.edu.cn/Anaconda/cloud/menpo/
conda config --set show_channel_urls yes
有时候Anaconda不含有某些Python包的链接,导致无法安装这些包。因此,我们需要用pip install xxx_package来安装。同样地,为了下载更迅速,我们依旧将pip的下载源换成国内阿里云源。Linux用户在自己平台的命令行下输入以下更换命令即可。
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple
一般来说,大家只是拥有Linux服务器的运行代码权限,也就是说只能用这个服务器去跑程序,而不能对服务器进行一些特定的修改。不过有时候我们需要安装一些特定的包来跑通我们的程序,这时候为了不修改当前环境,我们需要创建一个Python虚拟环境,我们可以在上面自由安装,而不影响当前环境,用完退出虚拟环境即可。
面我们已经介绍了Anaconda的安装,这里我们用Anaconda的命令来创建虚拟环境。使用conda create -n your_env_name python=X.X(2.7、3.6),使用该命令创建python版本为X.X,名字为your_env_name的虚拟环境。your_env_name文件可以在Anaconda安装目录envs文件下找到。
# 创建虚拟环境
conda create -n torch_nlp python==3.7
# 切换虚拟环境
source activate torch_nlp
# 安装软件
在你的虚拟环境中使用命令conda install your_package即可安装package到your_env_name中。使用conda安装,会自动帮你安装相关的从属包。
# 虚拟环境的相关命令
source deactivate # 退出虚拟环境
conda remove -n your_env_name(虚拟环境名称) --all # 删除虚拟环境
conda remove --name your_env_name package_name # 删除环境中的某个包
PyCharm是一款专业的编程开发软件。读者可以在官网使用校园邮箱注册,在安装过程中使用注册的账号进行登录,就可以免费使用PyCharm专业版,如图 2.5所示。
https://www.jetbrains.com/pycharm/download/#section=windows
图 2.5 PyCharm下载页面选择File→Settings→Project Interpreter,单击“Add”按钮,如图 2.6所示,而后选择“SSH Interpreter”按钮,输入远程服务器的账户与密码,如图2.6(b)所示。
图 2.6(a)连接虚拟环境 图 2.6 (b)连接虚拟环境正确填写密码,单击“Next”按钮,如图 2.7所示
图 2.7密码填写输入密码成功后,选择刚刚创建好的虚拟环境,单击“OK”即可连接虚拟环境,如图 2.8所示。
图 2.8选择虚拟环境配置本地代码与服务器同步目录, 选择Tools→Deployment→con-figuration,如图 2.9。
图 2.9配置代码同步目录选择刚刚创建好的SSH Interpreter,并选择服务器同步路径即可,此时便可同步本地与服务器之间的代码了,如图 2.10所示。
图 2.10选择SSH Interpreter当程序运行时间较长时,我们在当前Linux窗口直接运行程序,程序或许会因为网络问题异常终止。我们可以使用screen来解决本地突然离线的问题,因为screen相当于创建一个后台窗口在服务器,本地连接中断并不会影响正在运行的程序。我们在命令行敲入screen –ls命令,效果如图 2.11所示。
# 常用的screen命令
screen –S name # 创建一个窗口
screen –ls # 查看当前已经创建的窗口
screen –d –r name # 回到名字为name的窗口
screen –X –S name quit # 关闭名字为name的窗口
最后,读者在使用深度学习框架跑模型时需要指定GPU,否则程序将会把所有GPU都占了,严重影响他人使用GPU。
# Python指定GPU代码
gpu_id = 4
os.environ["CUDA_VISIBLE_DEVICES"] = str(gpu_id)
当前,开发应用程序所需要的不仅仅是编写代码。在每个项目的生命周期阶段,我们使用的各种工具存在多种语言、框架、体系结构以及不连续的接口,这极大地提高了我们使用代码的的复杂性。
2013年,docker推出了将成为容器行业标准的产品。容器(container)是标准化的软件单元,它使开发人员能够将其应用程序与环境隔离,从而解决了“代码在我的机器上运行没问题”的麻烦。
作为一种优秀的容器技术,docker的出现简化并加速了我们的工作流程,方便开发人员在无需配置环境的前提下,自由地使用每个项目的工具和应用程序,从而提高生产效率。
图2.12 docker技术架构图docker技术架构由图2.12所示,我们可以将其理解为它在宿主机的操作系统上建立了一层docker操作系统。docker操作系统上运行的每一个容器都是独立的应用程序环境,容器之间相互隔离,但所有容器共享docker操作系统中的一些公共库。
众所周知,大家初始学习一门计算机技能的最大时间成本是代码环境配置。然而,docker技术可以将代码的环境进行打包,使用者只需将打包的镜像拉取到本地,便可使用发布者的代码环境,从而避免了配置环境出现的种种问题。
对于本书代码的运行环境,笔者也提供了docker的选项,帮助大家缓解配置环境的烦恼,接下来笔者将通过一系列的命令来帮助大家掌握docker的应用。
一般地,安装docker需要sudo权限,而大家在服务器上的用户都是没有sudo权限的。因此,安装docker这一步需要大家去咨询服务器的管理员。这里,我们还是走完安装docker的流程。
sudo apt-get remove docker docker-engine docker.io # 卸载旧版本
# 添加传输软件包与CA证书
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl
gnupg-agent software-properties-common
# 添加docker国内源,加速下载
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add –
# sources.list中添加docker软件源
sudo add-apt-repository
"deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu
$(lsb_release -cs) stable"
# 安装docker
sudo apt-get update
sudo apt-get install docker.io
# 启动docker
sudo systemctl enable docker
sudo systemctl start docker
同样地,这一步也需要服务器的管理员进行操作。创建docker用户组的用途是为了避免服务器的普通用户使用docker过程中使用sudo权限,也避免root用户使用docker服务时频繁输入密码。
# 建立用户组
sudo groupadd docker
# 添加当前用户到用户组
sudo usermod -aG docker $USER
# 更新docker用户组
newgrp docker
# 退出远程终端,并测试docker
docker run hello-world # 自动下载并拉取hello-word镜像
测试docker run hello-world命令,如图2.13所示,则说明docker已经安装成功。
图
2.13docker安装成功图现在,假设我们需要一个Pytorch代码运行环境镜像,此时我们则先需要拉取互联网上已经发布的Pytorch镜像。
当前,阿里云提供了以下基础镜像源,我们选择Pytorch-1.4-cuda10.1版本的镜像进行拉取即可。
# Python:
registry.cn-shanghai.aliyuncs.com/tcc-public/python:3
# Pytorch:
registry.cn-shanghai.aliyuncs.com/tcc-public/pytorch:latest-py3
registry.cn-shanghai.aliyuncs.com/tcc-public/pytorch:latest-cuda9.0-py3
registry.cn-shanghai.aliyuncs.com/tcc-public/pytorch:1.1.0-cuda10.0-py3
registry.cn-shanghai.aliyuncs.com/tcc-public/pytorch:1.4-cuda10.1-py3
# TensorFlow:
registry.cn-shanghai.aliyuncs.com/tcc-public/tensorflow:latest-py3
registry.cn-shanghai.aliyuncs.com/tcc-public/tensorflow:1.1.0-cuda8.0-py2
registry.cn-shanghai.aliyuncs.com/tcc-public/tensorflow:1.12.0-cuda9.0-py3
registry.cn-shanghai.aliyuncs.com/tcc-public/tensorflow:latest-cuda10.0-py3
# Keras:
registry.cn-shanghai.aliyuncs.com/tcc-public/keras:latest-py3
registry.cn-shanghai.aliyuncs.com/tcc-public/keras:latest-cuda9.0-py3
registry.cn-shanghai.aliyuncs.com/tcc-public/keras:latest-cuda10.0-py3
# 拉取Pytorch镜像
docker pull registry.cn-shanghai.aliyuncs.com/tcc-public/pytorch:1.4-cuda10.1-py3
程序结果如图2.14所示。
图2.14 docker pull示意图# 查看当前环境的镜像列表
docker images
我们可以看到之前已经拉取下来的Pytorch镜像,如图2.15所示。
图2.15 docker images示意图接下来,我们通过下载好的Pytorch镜像来启动容器,相当于启动运行Pytorch代码的运行环境。
# 由于下载好的Pytorch镜像名字过长,我们可以将其重命名
# docker image tag [IMAGE ID] [重命名:重命名TAG]
docker image tag 76c152fbfd03 torch_nlp:1.4-cuda10.1-py3
# 启动Pytorch容器
# docker run -itd –name [启动的容器名字] [镜像名:镜像TAG] /bin/bash
docker run -itd --name torch_ct torch_nlp:1.4-cuda10.1-py3 /bin/bash
# 查看容器,可以看到刚刚创建的torch_ct容器
docker ps # 查看正在运行的容器
docker ps -a # 查看所有容器,包含停止的容器
至此一步,我们才算是进入了运行Pytorch代码的环境,类似于我们使用anaconda创建的虚拟环境,只不过在这个容器中,我们拥有root权限。
# 进入刚刚创建的torch_ct容器
docker exec -it torch_ct /bin/bash
# 在容器中创建data目录
mkdir data
ls
# 退出当前容器
exit
容器一般都与外界隔离。为此,容器与宿主机之间进行数据交互则需要使用docker技术。值得注意的是,容器与宿主机之间的数据交互都是要在宿主机上进行,为此,我们需要事先退出当前所在的容器。
# 复制本地文件到容器中
# docker cp 本地文件 容器:容器目录
docker cp local_data torch_ct:/root
# 复制docker文件到本地
# docker cp 容器:容器文件路径 宿主机目录
docker cp torch_ct:/root/container_data /home/wangzhili/docker_test
容器运行程序有两种方法:
1.通过2.2.4小节介绍的数据互传命令,将数据和代码都上传至容器中,而后进入容器,运行代码。
2.无需上传数据和代码至容器,通过docker挂载命令,我们可以借助docker容器进行运行代码,前提是需要保证本地代码和数据都在同一个本地文件夹下。而程序运行产生的数据文件都保存在宿主机的目录中,我们只是借助容器来进行运算而已。
# docker挂载命令
# docker run -v 本地代码与数据目录:挂载的容器目录 挂载镜像id 运行挂载容器目录的程序
docker run -v /home/wangzhili/docker_test:/root 76c152fbfd03 python /root/hello_world.py
有时候,我们自己开发的软件需要被其他人所应用。为了减少代码环境配置的时间成本,我们可以将当前运行的容器进行打包,并输出镜像文件,传给使用者即可。
# 打包镜像
# docker commit [CONTANINER ID] [IMAGE NAME:TAG]
# docker commit的其他参数
# -a :镜像作者名字;
# -c :使用dockerfile指令来创建镜像;
# -m :提交说明文字;
# -p :暂停容器服务。
docker commit 344d077602a2 torch_nlp:1.4-cuda10.1-py3
# 打包镜像
docker save -o torch_nlp.tar torch_nlp # 当前路径下会生成一个torch_nlp.tar
# 将tar包生成镜像
docker load < torch_nlp.tar # 生成的镜像跟之前打包的镜像名称一样
当然了,docker还存在很多我们日常能用到的命令,以下命令都是在宿主机中进行操作。
# 启动/停止容器服务
docker start/stop torch_ct
# 删除容器
docker rm [CONTAINER ID]
# 删除镜像
# docker rmi [REPOSITORY:TAG]
docker rmi registry.cn-shanghai.aliyuncs.com/tcc-public/pytorch:1.4-cuda10.1-py3 # 删除下载好的阿里云镜像
这一章主要介绍了本书代码开发环境的搭建和常见工具及命令的使用,目的是让读者在学习自然语言性处理的原理与应用之前,先掌握操作深度学习的工具,因为人类能力的加成均来源于工具。因此,虽然该章节相对繁琐,但读者们也需耐心阅读,力求掌握。