众所周知,炼丹需要强大的计算资源,通常都是在服务器(集群)上进行炼丹。
但是,对于新手来说,Linux命令不熟悉,远程登录软件不会用,python环境不会管理等等,分分钟劝退。曾经的我就是这样一个小小白,跳了许多坑,慢慢摸索着才上了道。
所以就写一篇博客,随手记录一下常见的一些操作,会一直更新,免得自己忘记。这些是我个人使用的一些操作或者解决方案,不是放之四海而皆准的,请酌情参考哈!
我的基本环境是:
远程我使用的是VSCode+Remote SSH拓展+OpenSSH
VSCode远程登录服务器
ssh node2 #当前结点跳转到结点node2
在终端输入以下命令
nvidia-smi
#终端输入
nvcc -V
#或者
cat /usr/local/cuda/version.txt
Linux下删除文件
rm [-选项] 文件或目录
-f:不做确认提示,忽略不存在的文件,不会出现任何警告
-i:进行确认提示,删除前询问是否确认删除
-r:递归删除,可以删除目录
-v:在删除文件之前打印文件名称
rm -f a.o
删除目录
rm -r dir #dir是指定目录
删除特定开头的文件,只需要在特定开头后面加上*
rm -r P* #删除以P开头的所有文件
find -type f | wc -l
#如果要统计文件夹个数,将f改成d即可
find -type d | wc -l
nohup python train.py >train.log 2>&1 &
将train.py运行输出的内容重定向到train.log中,最后一个&表示将程序放入后台运行。
在你的训练的python文件中加入,指定使用序号为2的GPU
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "2" #2代表GPU的序号,可以是一个,也可以是'0,1,2,3'这样的多个
conda install numpy # 最基本的情况将numpy替换成要安装的库即可
conda install numpy==1.14.3 #安装指定的版本
安装指定较老版本的pytorch和torchvision,GPU版。
conda install pytorch==0.4.0 torchvision cuda92 #去掉cuda92安装cpu版本
安装最新的pytorch可以到pytorch官网直接安装。
conda install pytorch torchvision cudatoolkit=10.2 -c pytorch
对于安装cv2,conda好像没有???
#用
conda install opencv
#安装的包在import cv2时会报
ModuleNotFoundError: No module named 'cv2'
说明opencv这个包和cv2是不同的包。
然后我用
conda install opencv-python
发现在conda的channels里面没有找到这个包。
最后,使用pip安装opencv-python成功,能够使用cv2库。
所以安装cv2推荐使用pip:
pip install opencv-python
创建一个名为pytorch10,python版本为3.6的新环境
conda create -n pytorch10 python=3.6
查看你创建了多少个虚拟环境
conda env list #或者
conda info -e
激活你创建的环境,这样就可以使用你新建的环境了,可以正常滴安装需要的库。
conda activate pytorch10 #Linux Windows
source activate pytorch10 #Linux下,若上面命令不行,使用这个命令
退出虚拟环境
conda deactivate pytorch10 #退出pytorch10
source deactivate pytorch10 #Linux下
删除不想要的虚拟环境
conda remove -n pytorch10 --all
安装指定版本pytorch,GPU版本的pytorch要和CUDA版本对应。
# CUDA 9.2
conda install pytorch==1.2.0 torchvision==0.4.0 cudatoolkit=9.2 -c pytorch
# CUDA 10.0
conda install pytorch==1.2.0 torchvision==0.4.0 cudatoolkit=10.0 -c pytorch
# CPU Only
conda install pytorch==1.2.0 torchvision==0.4.0 cpuonly -c pytorch
torchvision.transforms.ToTensor()
在加载数据的时候,经常需要用到这个类。其输入可以是PIL Image或者np.ndarray格式(包括cv2)。它会先将图像由HWC格式转换成CHW格式。
对于ndarray,如果输入的数据类型是int型,那么ToTensor之后输出的将会是[0,1]归一化的结果。如果输入的数据类型是 float的,其输出数据范围为[0,255]。很多时候我们的模型输入是归一化的,如果不注意这一点,有可能会使模型loss很大,甚至出现nan。
>>> from torchvision import transforms
>>> import torch
>>> import numpy as np
>>> transform = transforms.Compose([transforms.ToTensor()])
>>>#整型
>>> img1 = np.array([[1,2,3],[4,5,6]], dtype=np.uint8)
>>>#float型
>>> img2 = np.array([[1,2,3],[4,5,6]], dtype=np.float32)
>>>
>>> img1 = transform(img1)
>>> img1 #其数据范围[0-1]
tensor([[[0.0039, 0.0078, 0.0118],
[0.0157, 0.0196, 0.0235]]])
>>>
>>> img2 = transform(img2)
>>> img2 #其数据范围[0-255.]
tensor([[[1., 2., 3.],
[4., 5., 6.]]])
>>>
对于PILImage转化的Tensor,其数据类型是torch.FloatTensor。具体参考博文1、博文2。
THCudaCheck FAIL file=/opt/conda/conda-bld/pytorch_1579022034529/work/aten/src/THC/THCGeneral.cpp line=313 error=98 : invalid device function
新版本pytorch运行旧版本的代码时遇到的问题,我的解决方案是将cuda从9.2更新到10.1 。不知道大家还有什么好办法??
解决方案
To Be Continue…