您的位置:

python训练时指定gpu的简单介绍

本文目录一览:

pytorch用什么显卡

1. 利用CUDA_VISIBLE_DEVICES设置可用显卡

在CUDA中设定可用显卡,一般有2种方式:

(1) 在代码中直接指定

import os

os.environ['CUDA_VISIBLE_DEVICES'] = gpu_ids

(2) 在命令行中执行代码时指定

CUDA_VISIBLE_DEVICES=gpu_ids python3 train.py

如果使用sh脚本文件运行代码,则有3种方式可以设置

(3) 在命令行中执行脚本文件时指定:

CUDA_VISIBLE_DEVICES=gpu_ids sh run.sh

(4) 在sh脚本中指定:

source bashrc

export CUDA_VISIBLE_DEVICES=gpu_ids python3 train.py

(5) 在sh脚本中指定

source bashrc

CUDA_VISIBLE_DEVICES=gpu_ids python3 train.py

如果同时使用多个设定可用显卡的指令,比如

source bashrc

export CUDA_VISIBLE_DEVICES=gpu_id1 CUDA_VISIBLE_DEVICES=gpu_id2 python3 train.py

那么高优先级的指令会覆盖第优先级的指令使其失效。优先级顺序为:不使用sh脚本 (1)(2); 使用sh脚本(1)(5)(4)(3)

个人感觉在炼丹时建议大家从(2)(3)(4)(5)中选择一个指定可用显卡,不要重复指定以防造成代码的混乱。方法(1)虽然优先级最高,但是需要修改源代码,所以不建议使用。

2 .cuda()方法和torch.cuda.set_device()

我们还可以使用.cuda()[包括model.cuda()/loss.cuda()/tensor.cuda()]方法和torch.cuda.set_device()来把模型和数据加载到对应的gpu上。

(1) .cuda()

以model.cuda()为例,加载方法为:

model.cuda(gpu_id) # gpu_id为int类型变量,只能指定一张显卡

model.cuda('cuda:'+str(gpu_ids)) #输入参数为str类型,可指定多张显卡

model.cuda('cuda:1,2') #指定多张显卡的一个示例

(2) torch.cuda.set_device()

使用torch.cuda.set_device()可以更方便地将模型和数据加载到对应GPU上, 直接定义模型之前加入一行代码即可

torch.cuda.set_device(gpu_id) #单卡

torch.cuda.set_device('cuda:'+str(gpu_ids)) #可指定多卡

但是这种写法的优先级低,如果model.cuda()中指定了参数,那么torch.cuda.set_device()会失效,而且pytorch的官方文档中明确说明,不建议用户使用该方法。

第1节和第2节所说的方法同时使用是并不会冲突,而是会叠加。比如在运行代码时使用

CUDA_VISIBLE_DEVICES=2,3,4,5 python3 train.py

而在代码内部又指定

model.cuda(1)

loss.cuda(1)

tensor.cuda(1)

那么代码会在GPU3上运行。原理是CUDA_VISIBLE_DEVICES使得只有GPU2,3,4,5可见,那么这4张显卡,程序就会把它们看成GPU0,1,2,3,.cuda(1)把模型/loss/数据都加载到了程序所以为的GPU1上,则实际使用的显卡是GPU3。

如果利用.cuda()或torch.cuda.set_device()把模型加载到多个显卡上,而实际上只使用一张显卡运行程序的话,那么程序会把模型加载到第一个显卡上,比如如果在代码中指定了

model.cuda('cuda:2,1')

在运行代码时使用

CUDA_VISIBLE_DEVICES=2,3,4,5 python3 train.py

这一指令,那么程序最终会在GPU4上运行。

3.多卡数据并行torch.nn.DataParallel

多卡数据并行一般使用

torch.nn.DataParallel(model,device_ids)

其中model是需要运行的模型,device_ids指定部署模型的显卡,数据类型是list

device_ids中的第一个GPU(即device_ids[0])和model.cuda()或torch.cuda.set_device()中的第一个GPU序号应保持一致,否则会报错。此外如果两者的第一个GPU序号都不是0,比如设置为:

model=torch.nn.DataParallel(model,device_ids=[2,3])

model.cuda(2)

那么程序可以在GPU2和GPU3上正常运行,但是还会占用GPU0的一部分显存(大约500M左右),这是由于pytorch本身的bug导致的(截止1.4.0,没有修复这个bug)。

device_ids的默认值是使用可见的GPU,不设置model.cuda()或torch.cuda.set_device()等效于设置了model.cuda(0)

4. 多卡多线程并行torch.nn.parallel.DistributedDataParallel

(这个我是真的没有搞懂,,,,)

参考了这篇文章和这个代码,关于GPU的指定,多卡多线程中有2个地方需要设置

torch.cuda.set_device(args.local_rank)

torch.nn.parallel.DistributedDataParallel(model, device_ids=[args.local_rank])

模型/loss/tensor设置为.cuda()或.cuda(args.local_rank)均可,不影响正常运行。

5. 推荐设置方式:

(1) 单卡

使用CUDA_VISIBLE_DEVICES指定GPU,不要使用torch.cuda.set_device(),不要给.cuda()赋值。

(2) 多卡数据并行

直接指定CUDA_VISIBLE_DEVICES,通过调整可见显卡的顺序指定加载模型对应的GPU,不要使用torch.cuda.set_device(),不要给.cuda()赋值,不要给torch.nn.DataParallel中的device_ids赋值。比如想在GPU1,2,3中运行,其中GPU2是存放模型的显卡,那么直接设置

CUDA_VISIBLE_DEVICES=2,1,3

(3) 多卡多线程

使用python在GPU上构建和训练卷积神经网络

我将对代码进行补充演练,以构建在数据集上训练的任何类型的图像分类器。在这个例子中,我将使用花卉数据集,其中包括102种不同类型的花。需要数据集和代码都可以私信我。

Pytorch是机器学习和Python上的免费软件包,非常易于使用。语法模拟numpy,因此,如果你在python中有一些科学计算经验,那么会相当有用的。只需几行代码,就可以下载预先训练的数据集,使用定义的变换对图像进行标准化,然后运行训练。

创建和扩充数据集

为了增加数据集,我使用' google_images_download'API 从互联网上下载了相关图像。显然,您可以使用此API不仅可以扩充现有数据集,还可以从头开始创建自己的数据集。

确保从图像中挑选出异常值(损坏的文件或偶然出现的无关图像)。

图像标准化

为了使图像具有相同的大小和像素变化,可以使用pytorch的transfors模块:

转移学习

从头开始训练的模型可能不是最明智的选择,因为有许多网络可用于各种数据集。简单地说,像edge-和其他简单形状检测器等低级特征对于不同的模型是相似的,即使clasificators是针对不同目的进行训练的。在本项目中,我使用了一个预训练网络Resnet152,只有最后一个完全连接的层重新用于新任务,即使这样也会产生相当好的效果。

在这里,我将除最后一层之外的所有层都设置为具有固定权重(requires_grad = False),因此只有最后层中的参数将通过梯度下降进行更新。

训练模型

下面介绍一下进行训练的函数:

如何获得GPU?

当然,对CPU的训练太慢了。根据我自己的经验,在GPU仅需要一个小时就可以完成12次训练周期,但是在CPU上相同数量的训练周期可能需要花费大约15个小时。

如果您没有本地可用的GPU,则可以考虑使用云GPU。为了加速CNN的训练,我使用了floydhub()上提供的云GPU 。

这项服务非常指的使用:总有很好的文档和大量的提示,所以你会很清楚的知道下一步需要如何去做。在floydhub上对于使用GPU的收费也是可以接受的。

首先,需要将数据集上传到服务器

然后,需要创建项目。需要在计算机上安装floydhub客户端,将数据集上载到其网站并在终端中运行以下命令:

其中'username'是您的登录名,'i'是数据集所在的文件夹。

这样子在训练网络时就会很轻松了

结果和改进想法

得到的模型在数据集上训练了1.5小时,并在验证数据集上达到了95%的准确度。

caffe python代码怎么用 gpu运行

编译和安装Caffe 。。。但我在编译caffe时 输入make all 指令时报错 :提示找不到hdf5.h 我百度后 按照这个解决了。这样make all 成功 make test也成功 make runtest也成功。 再开始其第3步:增加python支持这步 开始我看不清 就从这里开始参考: 编译python时: make pycaffe报错:找不到arrayobject.h 解决办法:sudo apt-get install python-numpy 这样就解决了。这样第3步的几条指令均成功。再开始第4步 第4.2步报错说:pip 找不到指令 于是我在终端输入sudo apt-get install python-pip即解决了。 接着执行4.2步 第一个ipython[all]装时失败了 我就先装后面的几个 有的成功 有的失败 失败的是protobuf和skimage 解决办法是:自己