安装PyTorch

本文记录一下给服务器安装PyTorch的过程。

准备工作

安装包管理器Anaconda

  1. 下载Anaconda for python3.6
  2. 上传到服务器scp Anaconda3-5.1.0-Linux-x86_64.sh user@server:~/share
  3. 安装bash ~/share/Anaconda3-5.1.0-Linux-x86_64.sh
  4. 激活source ~/.bashrc
  5. 更新到最新版conda update -n base conda

Anaconda 会自动修改环境变量,用户下的python(及pip)将会被切换为python3.6,但不会影响系统使用的python版本:
可以使用 sudo su 切换到root再使用 python(python3) –version 查看

更新pip和numpy到最新版本

1
2
3
# 更新pip3和numpy
conda update pip
conda update numpy

安装GPU加速工具包

选择正确版本的CUDA TOOLKIT目标主机设置,下载cuda-repo-xx.deb

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 安装前设置主机环境
sudo apt-get install linux-headers-$(uname -r)

# 安装合适版本
sudo dpkg -i cuda-repo-ubuntu1604_9.1.85-1_amd64.deb
sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub`
sudo apt-get update
sudo apt-get install cuda

# 安装后设置
# 1. 添加环境变量(写入~/.bashrc)
export PATH=/usr/local/cuda-9.1/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-9.1/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
# 此时可以查看安装的cuda版本了
nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2017 NVIDIA Corporation
Built on Fri_Nov__3_21:07:56_CDT_2017
Cuda compilation tools, release 9.1, V9.1.85

# 2.* 如果是POWER9系统,需要设置以支持cuda9的新特性
# 创建 /usr/lib/systemd/system/nvidia-persistenced.service 并使生效
sudo systemctl enable nvidia-persistenced
# 删除一条LINUX的默认udev rule
注释掉/lib/udev/rules.d/40-vm-hotadd.rules的其中一行:
# SUBSYSTEM=="memory", ACTION=="add", DEVPATH=="/devices/system/memory/memory[0-9]*", TEST=="state", ATTR{state}="online"

# 重启主机以生效

nvidia-persistenced.service 文件内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description=NVIDIA Persistence Daemon
Wants=syslog.target

[Service]
Type=forking
PIDFile=/var/run/nvidia-persistenced/nvidia-persistenced.pid
Restart=always
ExecStart=/usr/bin/nvidia-persistenced --verbose
ExecStopPost=/bin/rm -rf /var/run/nvidia-persistenced

[Install]
WantedBy=multi-user.target

开始安装PyTorch

本来想使用Anaconda安装的,但它的镜像连接不上,改用PIP安装。

1
2
pip install http://download.pytorch.org/whl/cu91/torch-0.3.1-cp36-cp36m-linux_x86_64.whl 
pip install torchvision

如果由于网络原因安装失败可以先下载下来再 pip install ~/TorchFileLocalPath

安装成功:

1
2
3
4
5
6
7
>>> python
Python 3.6.4 |Anaconda custom (64-bit)| (default, Jan 16 2018, 18:10:19)
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> import torchvision
>>>

使用Pycharm进行远程开发与调试

强大的Pycharm ProIDE可以直接在服务器上开发、调试,就不用再给本地搭建和服务器上一样的环境了。在Tools->Deployment里面可以设置自动部署(或者在创建项目时选用远程服务器和解释器)。

需要设置的有SFTPRemote Interpreter。SFTP用于代码同步,类似git上传,同步后可以在服务器上直接运行上传的代码。

  1. 在Tools->Deployment中添加SFTP服务:Connect页填写服务器连接选项,Mapping页设置本地路径和远程路径(注意这个路径是相对于前面的Root Path的)的映射;
  2. 选择自动上传(Automatic Uploaded);
  3. Preference->Project Interpreter中添加远程解释器,可以使用已添加的SFTP中的服务器设置(使用Deployment Configure选项)

遇到了问题,Python Console不可用,远程连接控制台不成功:
ssh://usr@10.xx.xx.xx:22/home/usr/anaconda3/bin/python -u /home/usr/.pycharm_helpers/pydev/pydevconsole.py 0 0
Couldn’t connect to console process.
Process finished with exit code -1
这是Pycharm的一个未解决BUG,但评论中提到的解决方法allowing the server public IP for all traffic对我的情况没用。无法解决,暂搁置。

Python Console 问题后续:

  • 查看pycharm的log无有用提示(~/Library/Logs/PyCharm2018.1/idea.log);
  • 使用nettop监控pycharm进程通信发现有一个通信一直被关闭,以为是进程通信的问题:
  • 给macos开发端口:修改\etc\pf.conf配置文件,但还是没有解决问题。
1
2
3
4
5
6
7
8
sudo vim /etc/pf.conf

# 添加规则允许本机IP访问任何端口
pass in proto tcp from 127.0.0.1
pass in proto tcp from localhost

# 使配置生效
sudo pfctl -evf /etc/pf.conf

使用Jupyter Notebook

Jupyter是一个基于 websocket 的 Python 交互式编程环境。由于之前在 Pycharm 配置的远程解释器无法运行Python Console,所以使用 Jupyter Notebook 以方便进行实验。(Jupyter虽然不适合作为生产环境,但作为实验环境来说非常好用。)

在服务器上安装Jupyter Notebook:

1
server$ pip install jupyter

开启服务:

1
2
server$ jupyter notebook --no-browser --port=8080  
#no-browser since that is not available through an SSH session

可以保存配置以简化启动命令:jupyter notebook –generate-config;
然后在~/.jupyter/jupyter_notebook_config.py中添加:
c.NotebookApp.password = ‘sha1:a86…使用notebook.auth.passwd()生成的密文’
c.NotebookApp.open_browser = False
c.NotebookApp.port =8080

通过 SSH 进行远程访问:

1
2
3
ssh -N -L 8080:localhost:8080 <remote_user>@<remote_host>
# Add the option -N to tell SSH that I'm not going to execute any remote commands. This ensures that the connection cannot be used in that way, see this as an added security measure.
# Add the -L option that tells SSH to open up a tunnel from port 8080 on the remote machine to port 8080 in my local machine.

现在本地可以通过http://localhost:8080/使用 Jupyter Notebook 啦~

参考资料

[1] pycharm 远程服务器开发调试
[2] Pycharm远程调试使用服务器资源
[3] OSX上pf的简单配置笔记