1.一些重要的概念
Tensor
autograd
Variable
nn — high-level abstraction
The
nn
package defines a set of
Modules, which are roughly equivalent to neural network layers.torch.nn.Linear
torch.nn.ReLU
A common PyTorch convention is to save models using either a
.pt
or
.pth
file extension.
A trailling
_
in PyTorch signifies that the operation is performed in-place.View is PyTorch’s version of numpy’s
reshape
.A
Sequential
object runs each of the modules contained within it, in a sequential manner.
使用nn.optim时,requires_grad设为False,意为freeze some layers
加载数据使用datasets loader
2.一些操作
Tensor.topk
to get the index of the greatest value:
def categoryFromOutput(output):
top_n, top_i = output.data.topk(1) # Tensor out of Variable with .data
category_i = top_i[0][0]
return all_categories[category_i], category_i
print(categoryFromOutput(output))
nn.LogSoftmax对应的loss是criterion = nn.NLLLoss()
nn.LSTM
nn.GRU
使用python指定GPU,如下
有一台服务器,服务器上有多块儿GPU可以供使用,但此时只希望使用第2块和第4块GPU,但是我们希望代码能看到的仍然是有两块GPU,分别编号为0,1,这个时候我们可以使用环境变量CUDA_VISIBLE_DEVICES来解决这个问题。
比如:
CUDA_VISIBLE_DEVICES=1 只有编号为1的GPU对程序是可见的,在代码中gpu[0]指的就是这块儿GPU
CUDA_VISIBLE_DEVICES=0,2,3 只有编号为0,2,3的GPU对程序是可见的,在代码中gpu[0]指的是第0块儿,gpu[1]指的是第2块儿,gpu[2]指的是第3块儿
CUDA_VISIBLE_DEVICES=2,0,3 只有编号为0,2,3的GPU对程序是可见的,但是在代码中gpu[0]指的是第2块儿,gpu[1]指的是第0块儿,gpu[2]指的是第3块儿
在python程序中,我们可以这么写
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "1"
torch.cuda.is_available()
dev = torch.device("cuda") / torch.device("cpu")
2.1 关于DataParallel
这里有一个讨论dataparallel-imbalanced-memory-usage。
2.2 数据类型转换
2.3 一些见到的汇总
3.遇到的坑
3.1 在测试pytorch-yolo2的时候,发现这个错误,已解决
PyTorch socket.error [Errno 111] Connection refused
3.2 在测试CornerNet的时候,使用conda安装pytorch等环境,
要升级conda里的gcc版本,因为Pytorch要求gcc>=4.9.
方法是在anaconda cloud里下载了gcc 4.9,安装后软连接即可,如下
ln -s /home/20xxx/anaconda2/envs/CornerNet/bin/gcc-4.9 /home/20xxx/anaconda2/envs/CornerNet//bin/gcc
ln -s /home/20xxx/anaconda2/envs/CornerNet/bin/g++-4.9 /home/20xxx/anaconda2/envs/CornerNet//bin/g++
3.3 RuntimeError
3.3.1 RuntimeError: Only Tensors of floating point dtype can require gradients
在运行xmfbit/captcha-recognition时,会报此错误。把main.py的test()里这一段修改下
#x, act_lengths, flatten_target, target_lengths = tensor_to_variable(
(x, act_lengths, flatten_target, target_lengths), volatile=True)
x, act_lengths, flatten_target, target_lengths = tensor_to_variable(
(x, act_lengths, flatten_target, target_lengths), volatile=False)
关于requires_grad和volatile二者的区别和联系,还没有调查过。
另外,captcha-recognition在进行warpctc的python绑定时,使用的是pytoch-1.0的cpu版本。gpu版本当前pytorch10-py36-cuda8.0-cudnn7.1.2运行会有错误。
3.4 Error
ERROR: Unexpected bus error encountered in worker. This might be caused by insufficient shared memory (shm)
解决办法:出现这个错误的情况是,在服务器上的docker中运行训练代码时,batch size设置得过大,shared memory不够(因为docker限制了shm).解决方法是,将Dataloader的num_workers调小
RuntimeError: DataLoader worker (pid 27) is killed by signal: Killed. Details are lost due to multiprocessing. Rerunning with num_workers=0 may give better error trace.
References
[1] Pytorch中文文档.