通过服务器进行深度学习

通过服务器进行深度学习

服务器配置

  • ubuntu16.04服务器版
  • anaconda
  • cuda
  • tensorflow
    :::info

安装

win10安装教程linux安装教程TensorFlow官网指导相关软件版本的对照表,页面底端如果不使用GPU的话,只需要cmd中一行pip install tensorflow就行了。不过需要注意的是,tensorflow的默认安装版本是1.31,而1.31对应的python版本最高是3.6,如果你的python版本过低或过高,在导入TensorFlow包时都会出错。
:::

  • frp:内网穿透
    :::info
    如果服务器处于局域网内,那么当终端离开局域网后是无法连接服务器的,这时我们就要借助内网穿透。内网穿透可以将内网中服务器的局域网ip和端口映射到外网ip和端口。具体实现时,你需要一台云服务器,然后在上面通过开源的frp搭建一个反向代理。
    :::

连接服务器

终端配置

以下都是通过ssh协议中的口令登录方式完成连接。

linux/mac

linux/mac系统集成了ssh工具,所以可以在shell中直连服务器。

win10

如果是windows系统,那么我们需要一个ssh工具来完成ssh连接。xshell或者putty都可以胜任。

免密登陆

ssh同时还提供了公钥登录的方式。这点在上面的背景知识中已经介绍了。
具体的做法就是将你的公钥存储在服务器的ssh信任列表中中。

  1. 生成秘钥
# -P表示需要密码,-P ‘’表示空密码
ssh-keygen -t rsa -P ''
之后系统会提示输入生成的密钥文件的文件名,可以输入任意名称,比如id_rsa
  1. 找到自己的公钥,没有的话通过ssh-keygen 生成。然后通过 scp 命令传输公钥到服务器中。

  1. 在服务器中将刚刚的公钥添加到ssh信任列表。然后即可免密登陆了。
cat id_rsa.pub >> ~/.ssh/authorized_keys

:::info
如果还是无法免密登陆,可能是服务器端的 .sshauthorized_keys 的权限不匹配。

  • 一般修改.ssh文件夹的权限就够了

chmod 700 /home/skyler/.ssh

  • 如无必要不作修改

chmod 600 /home/skyler/.ssh/authorized_keys
:::

文件传输与同步

传文件

Linux scp命令

linux间的文件/文件夹的传输可以通过scp命令完成。该命令基于ssh,所以,如果你的终端和服务器都是linux系统,并且终端已经通过ssh登录了服务器,那么,就可以通过该命令进行文件传输了。

用法:

  1. 从本地复制文件到远程到远程
scp local_file remote_username@remote_ip:remote_folder 
或者 
scp local_file remote_username@remote_ip:remote_file 
或者 
scp local_file remote_ip:remote_folder 
或者 
scp local_file remote_ip:remote_file 

:::tips

  • 第1,2个指定了用户名,命令执行后需要再输入密码,第1个仅指定了远程的目录,文件名字不变,第2个指定了文件名;
  • 第3,4个没有指定用户名,命令执行后需要输入用户名和密码,第3个仅指定了远程的目录,文件名字不变,第4个指定了文件名;
    :::
  1. 从本地复制文件夹到远程
scp -r local_folder remote_username@remote_ip:remote_folder 
或者 
scp -r local_folder remote_ip:remote_folder 

:::tips

  • 第1个指定了用户名,命令执行后需要再输入密码;
  • 第2个没有指定用户名,命令执行后需要输入用户名和密码;
    :::
  1. 从远程复制到本地

从远程复制到本地,只要将从本地复制到远程的命令的后2个参数调换顺序即可

scp root@www.runoob.com:/home/root/others/music /home/space/music/1.mp3 
scp -r www.runoob.com:/home/root/others/ /home/space/music/

如果远程服务器防火墙为scp命令设置了指定的端口,我们需要使用-P参数来指定传输端口

#scp 命令使用端口号 4588
scp -P 4588 remote@www.runoob.com:/usr/local/sin.sh /home/administrator

jupyter notebook

通过jupyter notebook进行远程调参,只需以下几步:

  1. 指定jupyter notebook的虚拟环境

默认情况下jupyter notebook是运行在系统的默认环境下的,如果要让它运行在通过conda建立的环境中,我们可以进入那个环境安装nb_conda这个库: conda install nb_conda

  1. 服务器端生成jupyter notebook的密码(可以略去这一步)
$ jupyter notebook password
Enter password:  ****
Verify password: ****
[NotebookPasswordApp] Wrote hashed password to /Users/you/.jupyter/jupyter_notebook_config.json
  1. 服务器端打开jupyter notebook
jupyter notebook --no-browser --port=8889
  1. 本地开启端口转发
  • linux:

在本地通过ssh隧道来将服务器端的8889端口号映射到本地的某个端口(如1234)

ssh -L 1234:localhost:8888 dlnlp@102.10.60.23
  • windows

通过putty建立端口转发,效果与上面的shell语句效果是一样的。
image.png

  1. 在终端浏览器中打开 http://localhost:1234 ,然后输入上面设置的密码。最后,选择下虚拟环境就可以开始愉快的debug了。

tensorboard

在服务器端指定端口打开tensorboard

tensorboard --logdir=log --port=6006

要在本地使用tensorboard,首先要在本地进行端口映射(操作同jupyter notebook)

ssh -L 16006:127.0.0.1:6006 usr@192.168.1.115

然后在本地浏览器中打开 localhost:16006 就可以访问到服务器上的tensorboard了。

pycharm

服务器常用操作

查询

查看内存使用: free -m

image.png

Mem行(单位均为M):

  • total:内存总数
  • used:已使用内存数
  • free:空闲内存数
  • shared:当前废弃不用
  • buffers:缓存内存数(Buffer)
  • cached:缓存内舒数(Page)

(-/+ buffers/cache)行:

  • (-buffers/cache): 真正使用的内存数,指的是第一部分的 used - buffers - cached
  • (+buffers/cache): 可用的内存数,指的是第一部分的 free + buffers + cached

Swap行指交换分区。

实际上不要看free少就觉得内存不足了,buffers和cached都是可以在使用内存时拿来用的,应该以(-/+ buffers/cache)行的free和used来看。只要没发现swap的使用,就不用太担心,如果swap用了很多,那就要考虑增加物理内存了。

查看CPU使用: top

image.png

上方文字部分的红框为总的CPU占用百分率,下方的表格是每个进程的CPU占用率,在表格第一行可以看到红框中占用率超过了150%,这是因为服务器是多核CPU,而该进程使用了多核。

查看显卡使用情况: nvidia-smi

image.png

表格中会显示显卡的一些信息,第一行是版本信息,第二行是标题栏,第三行就是具体的显卡信息了,如果有多个显卡,会有多行,每一行的信息值对应标题栏对应位置的信息。

  • GPU:编号
  • Fan:风扇转速,在0到100%之间变动,这里是42%
  • Name:显卡名,这里是TITAN X
  • Temp:显卡温度,这里是69摄氏度
  • Perf:性能状态,从P0到P12,P0性能最大,P12最小
  • Persistence-M:持续模式的状态开关,该模式耗能大,但是启动新GPU应用时比较快,这里是off
  • Pwr:能耗
  • Bus-Id:涉及GPU总线的东西
  • Disp.A:表示GPU的显示是否初始化
  • Memory-Usage:现存使用率,这里已经快满了
  • GPU-Util:GPU利用率
  • Compute M.:计算模式

需要注意的一点是显存占用率和GPU占用率是两个不一样的东西,类似于内存和CPU,两个指标的占用率不一定是互相对应的。

在下面就是每个进程使用的GPU情况了。

常见问题处理

"Failed to create session"

通常是tf未能获得计算硬件,从而无法创建会话。我们可以通过CUDA_VISIBLE_DEVICES来指定可用的GPU。需要注意的是,指定了可用的GPU后,其他的GPU就不再可用。
首先,可以通过 nvidia-smi 获取当前可用的显卡信息,比如1、5号卡可用。

  1. 针对单个程序:
  • 在shell中追加:CUDA_VISIBLE_DEVICES=1,5 python main.py
  • 在代码中追加:import os; os.environ['CUDA_VISIBLE_DEVICES=1,5']
  1. 针对各个虚拟环境:
  • 修改~/.virtualenv/YOUR_VENV/bin/postactivate, 在末尾添加行export CUDA_VISIBLE_DEVICES="1,5"即可.
  1. 针对所有用户:
  • 同上修改~/.bashrc即可.
    :::info
    如果你准备使用CPU,则可以通过CUDA_VISIBLE_DEVICES=''隐藏所有GPU,TensorFlow将默认使用CPU进行计算。
    :::

多任务管理

screen

Linux screen命令

用法:

  • 新建窗口
screen -S yolo # 创建一个窗口,并且为这个窗口命名为yolo

执行完后将自动跳入名为yolo的窗口

  • 断开窗口

通过快捷键Ctrl+A+D断开当前窗口连接返回会话界面,界面显示如下:

[detached from 28113.yolo]
user@ubuntu-Super-Server:~/code$

需要注意的是,断开连接仅是使窗口进入后台执行。

  • 查看已创建的窗口
screen -S ls #可以查看已创建的所有窗口
# 结果显示如下
user@ubuntu-Super-Server:~/code$ screen -ls
There are screens on:
	28475.ssd	(2017年11月27日 20时07分41秒)	(Detached)
	28113.yolo	(2017年11月27日 19时57分26秒)	(Detached)
  • 重连窗口
screen -r ssd #重新连接到yolo窗口,显示其运行过程
  • 关闭窗口
$kill 28475 #终止28475.ssd窗口对应任务的运行,同时杀死该窗口

byobu

tmux

强占式执行

在.bashrc中写入

alias python='run-one python'

该语句只允许运行一个python程序,后来的python程序在它执行完毕前是得不到执行的。

串行调参

通过python-fire这个工具,可以通过shell完成串行调参的需求。

posted @ 2019-04-25 20:37  eastzzp  阅读(5163)  评论(0编辑  收藏  举报