Linux服务器从0开始运行Python项目

6,310 阅读4分钟

从学校实验室白嫖了个服务器账号,记录下配置环境以及训练模型等操作的步骤。

备注:受篇幅限制,本文在使用具体命令时仅介绍其基础用法,具体可参考附录链接。

查看服务器基础信息

Linux版本信息

通过cat /etc/centos-release查看linux发行版本。

通过arch查看操作系统架构,输出 x86_64 则表示为 64 位系统,输出 i686 或 i386 则表示为 32 位系统。

image.png

由图可知,笔者使用CentOS 7.7,64位系统。

GPU信息

通过nvidia-smi可查看GPU的状态信息,执行结果如图所示。

image.png

表格部分参数解释:

  • GPU: 本机中的GPU编号(有多块显卡的时候,从0开始编号)
  • Perf: GPU的性能状态,从P0(最大性能)到P12(最小性能)
  • Persistence-M: 持续模式的状态,持续模式虽然耗能大,但是在新的GPU应用启动时花费的时间更少,图上显示的是:off

配置conda环境

1. 下载linux安装包(.sh文件)

Anaconda官网-->Download Site-->Anaconda3-2019.03-Linux-x86_64.sh

2. 安装Anaconda3

bash Anaconda3-2019.03-Linux-x86_64.sh

3. 添加安装目录下的bin目录到当前用户环境变量文件(~/.bash_profile)中

在profile文件末尾加入一行:export PATH=/你的安装目录/anaconda3/bin:$PATH

使用source ~/.bash_profile让配置生效。

若在终端前出现了(base),即表示conda已经安装成功并进入conda中名为base的虚拟环境。 要退出conda环境,使用命令conda deactivate,则可关闭(base)提示。

使用conda env list显示所有虚拟环境 image.png

注意:执行命令时列出了一些WARNING,此处代表某些文件在新版本中被移除,这里使用conda update -n base conda命令更新conda版本,即可解决这个问题。

5. 创新环境并配置

先创建环境conda create –n 环境名,再使用conda activate 环境名进入环境。

注意:推荐以不指定python版本的方式创建环境,如conda create -n myenv python=3.6。只有不指定版本时,创建的环境会与主环境完全共享,使用pip安装时也只会安装在主环境。只有在成功使用conda install something后,这个环境才独立出来。参考 官方文档

配置项目环境

1. 使用ssh或sftp上传项目代码

参考链接: XShell上传文件到Linux服务器上 - Desperado_nbf - 博客园 (cnblogs.com)

2. 进入代码文件夹,配置环境

使用pip install -r requirements.txt安装项目需要的包。

也可以使用conda install --yes --file requirements.txt 来安装。

若项目中无requirements.txt文件,可边运行项目边检查错误信息,逐步安装依赖文件。

【可选】在使用pip安装项目依赖时,可先升级并更改pip源

# 升级pip版本(可选)
python -m pip install --upgrade pip 
# ===> 或使用 sudo pip install --upgrade pip
# 更改pip源为清华源(可选)
mkdir ~/.pip
vi ~/.pip/pip.conf
# ===> 添加下面的内容
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host = https://pypi.tuna.tsinghua.edu.cn
# ===> 然后保存并退出,以后使用pip install时,就可以享受正常网速了

3. 使用VSCode远程编辑服务器代码【可选】

参考链接:VsCode连接服务器并编辑服务器端代码_追公车的少年的博客-CSDN博客

4. 配置Jupyter Notebook【可选】

参考链接:linux环境conda&jupyter安装

运行项目

1. 测试项目是否正常运行

在运行项目时,笔者遇到了这样一个问题

 File "~/MyCode/RecursiveSeparation/uPIT_2spk/trainer.py", line 16, in <module>
   import matplotlib.pyplot as plt
 File "~/anaconda3/lib/python3.7/site-packages/matplotlib/pyplot.py", line 32, in <module>
   import matplotlib.colorbar

ImportError: /lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by ~/anaconda3/lib/python3.7/site-packages/matplotlib/_path.cpython-37m-x86_64-linux-gnu.so)

最简单的解决办法如下

$ vim  ~/.bash_profile  # 将下面两行命令写进文件
LD_LIBRARY_PATH=~/anaconda3/lib:$LD_LIBRARY_PATH     
export LD_LIBRARY_PATH
$ source  ~/.bash_profile

2. 启用守护进程

要将一个程序放到后台执行,我们一般使用nohup。

在使用xshell这种终端工具在退出的时候,会向我们在当前shell下启动的进程发送一个SIGHUP信号,这个信号默认操作是终止进程,导致一旦关闭连接,先前启动的程序也关闭了。

通过命令nohup python train.py(进程名) &可以将train.py设为守护命令运行。

nohup命令对train.py进程做了三件事:

  • 阻止SIGHUP信号发到这个进程;
  • 关闭标准输入。该进程不再能够接收任何输入,即使运行在前台;
  • 重定向标准输出和标准错误到当前目录下的nohup.out文件。

也就是说,nohup命令实际上将子进程与它所在的 session 分离了。

若想设置输出文件nohup.out的路径,并同时也将错误信息重定向到nohup.out中,使用nohup python -u train.py >train.log 2>&1 &。其中>是重定向符,第一个>表示将标准输出重定向到train.log,第二个>表示错误信息也重定向到标准输出,这两个>的位置不可换。-u确保输出可以及时地存入文件中。

注意,nohup命令不会自动把进程变为"后台任务",所以必须加上&符号。

3. 检测进程运行情况

ps命令用来查看系统中进程的情况。

一般使用ps -ef | gerp train.py(进程名)来显示train.py进程的情况。

ps命令的部分参数:

  • -e 显示所有进程
  • -f 显示所有信息(全格式)

| gerp train.py 作用

  • “|”是管道命令,指ps命令与grep命令同时执行
  • grep表示查找,使用正则表达式搜索文本,并将匹配的行打印出来。

执行结果

UID       PID       PPID      C     STIME    TTY       TIME         CMD image.png

各字段的含义:

  • UID      :进程的所有者
  • PID      :进程的 ID
  • PPID    :其父进程的 ID
  • C         :CPU 使用的资源百分比
  • STIME :系统启动时间
  • TTY     :登入者的终端机位置
  • TIME   :已使用 CPU 时间
  • CMD   :所下达的指令

图中圈出来的正是笔者之前使用nohup创建的守护进程,可以看到,其PPID是1,即init进程,符合守护进程的特性。并且看到C字段的值为99,代表这个进程占用了99%的CPU资源。

如果我们想杀死这个进程,可以使用kill命令 + -s KILL(要发送的信号) + PID号,发送KILL信号到PID指定的进程(Linux通过PID号唯一确定进程)。如kill -s KILL 9979

简便地,也可用kill %9979命令,两者是同样的效果。

此时再通过ps -ef | gerp train.py查看train.py进程,会发现进程已经被杀掉。

image.png

至此,本篇博文结束。这是我在掘金的第一篇博客,如有纰漏欢迎评论区交流。

Reference

linux查看操作系统版本信息 - vaelailai - 博客园 (cnblogs.com)

查看Linux系统架构类型的5条常用命令 | 《Linux就该这么学》 (linuxprobe.com)

GPU之nvidia-smi命令详解 - 简书 (jianshu.com)

Linux 软件安装到哪里合适,目录详解_勿忘初心-CSDN博客

Centos7 安装 Anaconda3 及 常用的conda命令 - 极客分享 (geek-share.com)

如何更新pip源 - 云+社区 - 腾讯云 (tencent.com)

有requirements.txt文件后,如何创建对应的conda虚拟环境?可以使用pip命令来安装吗?

使用conda安装requirement.txt指定的依赖包 - Gelthin - 博客园 (cnblogs.com)

VsCode连接服务器并编辑服务器端代码_追公车的少年的博客-CSDN博客_vscode 编辑服务器代码

ImportError: /lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found - 简书 (jianshu.com)

如何更新pip源 - 云+社区 - 腾讯云 (tencent.com)

Linux 守护进程的启动方法 - 阮一峰的网络日志 (ruanyifeng.com)

ps -ef|grep详解 - despair_ghost - 博客园 (cnblogs.com)

nohup 后台运行程序以及输出重定向 - 败北桑 - 博客园 (cnblogs.com)