解决在ImageNet上速度慢的问题,在1080上跑sop
train_data = datasets.CIFAR100(data_dir, train=True, transform=trans_t, download=True)
test_data = datasets.CIFAR100(data_dir, train=False, transform=trans, download=True)
train_data = datasets.ImageFolder(root = train_dir,transform=trans_t)
test_data = datasets.ImageFolder(root = test_dir ,transform=trans)
ImageFolder 是 PyTorch 中的一个通用数据集类,用于加载基于文件夹结构组织的图像数据集。这种数据集结构要求每个类别的图像样本都存放在一个单独的子文件夹中,并且每个子文件夹的名称代表了该类别的标签。不会下载任何东西。
ImageNet 是 PyTorch 中专门用于加载 ImageNet 数据集的数据集类。ImageNet 是一个大型的图像数据集,包含数百万张图像样本,用于图像分类任务。ImageNet 数据集具有特定的结构,包含训练集和验证集两部分,每个图像样本都与一个 ImageNet 类别标签相关联。
ImageNet 类在加载 ImageNet 数据集时,会自动检查数据集是否已经下载,如果没有下载,它会自动尝试从指定的下载链接下载数据集。(和cifar10/100没什么区别)
imagefolder用于加载ImageNet因为,由于 ImageNet 数据集的大小较大,下载和处理可能需要一定的时间和存储空间。所以一般默认imagenet已经下载好了,你要填写已经下载好的位置/nvme/ImageNet/train & val
,而不能像cifar系列一样想在哪下在哪下。
对于ImageFolder使用方法,我们需要将所有图像按照文件夹保存,例如所有猫的图像放入到cat文件夹中,所有狗的图像放入到dog文件夹中,该函数就会自动识别类别,将图像所在的目录名称作为label。
问题:ImageNet速度太慢
解决:考虑数据传输的速度瓶颈,重点应该在data的转移:检查dataloader发现问题。
1、num_workers = 0 ----> num_workers = 20
一般建议,在拥有多核 CPU 和较大数据集的情况下,将 num_workers 设置为一个适当的正整数,通常在 2 到 8 之间,以实现更快的数据加载速度。设置0纯属sb
2、没有pin_memory ----> True
Host to GPU copies are much faster when they originate from pinned (page-locked) memory.
好文:
科普帖:深度学习中GPU和显存分析
regarding pin memory
还是那句话,一份代码只要能在一台机器上跑就证明代码没问题,剩下的就是环境配置的问题。遇到一个环境问题解决一个即可。
比如:遇到numpy的问题,直接查看原来的numpy版本和现在的numpy版本,发现不一致:
import numpy
print(numpy.__version__)
pip install --upgrade numpy==1.21.5
--upgrade
是一个参数
用upgrade直接更新成一样的
TypeError: cat() received an invalid combination of arguments - got (Tensor, Tensor, dim=int), but expected one of:
- (tuple of Tensors tensors, int dim, *, Tensor out)
received an invalid combination of arguments 说明给的参数不对,得到了一个 tensor,tensor,dim的参数,但是expected 形式给出了
所以应该把代码从:
spikes[module] = torch.cat(spikes[module],output.detach().cpu(), dim=0)
改成
spikes[module] = torch.cat((spikes[module],output.detach().cpu()), dim=0)
RuntimeError: Unable to find a valid cuDNN algorithm to run convolution
显存不够了
一、什么是混合精度训练
在pytorch的tensor中,默认的类型是float32,神经网络训练过程中,网络权重以及其他参数,默认都是float32,即单精度,为了节省内存,部分操作使用float16,即半精度,训练过程既有float32,又有float16,因此叫混合精度训练。
二、如何进行混合精度训练
pytorch中是自动混合精度训练,使用 torch.cuda.amp.autocast 和 torch.cuda.amp.GradScaler 这两个模块。
torch.cuda.amp.autocast
:在选择的区域中自动进行数据精度之间的转换,即提高了运算效率,又保证了网络的性能。
torch.cuda.amp.GradScaler
:来解决数据溢出问题,即数据溢出问题:Overflow / Underflow
# Creates model and optimizer in default precision
model = Net().cuda()
optimizer = optim.SGD(model.parameters(), ...)
# Creates a GradScaler once at the beginning of training.
scaler = GradScaler()
for epoch in epochs:
for input, target in data:
optimizer.zero_grad()
# Runs the forward pass with autocasting.
with autocast():
output = model(input)
loss = loss_fn(output, target)
# Scales loss. Calls backward() on scaled loss to create scaled gradients.
# Backward passes under autocast are not recommended.
# Backward ops run in the same dtype autocast chose for corresponding forward ops.
scaler.scale(loss).backward()
# scaler.step() first unscales the gradients of the optimizer's assigned params.
# If these gradients do not contain infs or NaNs, optimizer.step() is then called,
# otherwise, optimizer.step() is skipped.
scaler.step(optimizer)
# Updates the scale for next iteration.
scaler.update()
https://zhuanlan.zhihu.com/p/145427849
直接pip install gpustat即可安装,gpustat基于nvidia-smi,可以提供更美观简洁的展示,结合watch命令,可以动态实时监控GPU的使用情况。
如果使用『watch --color -n1 gpustat』没有显示颜色的话,可以改为『watch --color -n1 gpustat --color』