`

深度学习之五:使用GPU加速神经网络的训练

阅读更多

使用神经网络训练,一个最大的问题就是训练速度的问题,特别是对于深度学习而言,过多的参数会消耗很多的时间,在神经网络训练过程中,运算最多的是关于矩阵的运算,这个时候就正好用到了GPU,GPU本来是用来处理图形的,但是因为其处理矩阵计算的高效性就运用到了深度学习之中。Theano支持GPU编程,但是只是对英伟达的显卡支持,而且对于Python编程而言,修改一些代码就可以使用GPU来实现加速了。

 

一,首先需要安装GPU环境(说明:我开始按照官网步骤发生了错误,下面是我综合网上一些资料最后安装成功之后的环境配置,本人机器能用)

 

  1. 安装Cuda,Cuda是英伟达公司提供的GPU开发环境,可以直接在官网上下载,我安装的是windows64位版本 ,按照制定的步骤一步一步安装即可    
  2. 安装visual studio2010(cuda支持visual studio 2010,2012,2013)  ,我就是因为没有装这个导致一直报错:找不到nvcc编译器
  3. 安装Cuda过程中会自动在windows的环境变量里面加上了CUDA_PATH这个环境变量:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5
  4. 在环境变量中的path配置如下:
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\bin;
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\libnvvp;
 
   5.在前面的文章中介绍了windows下安装theano,在里面有一个 .theanorc.txt文件,如果需要使用GPU,那么需要将其文件改为:
[global]
device=gpu
floatX=float32
openmp=False

[blas]
ldflags=
[gcc]
cxxflags = -ID:\Anaconda2\MinGW

[cuda]
root=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\bin

[nvcc]
fastmath=True
flags= -LD:\Anaconda2\libs
compiler_bindir=C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin





如果需要验证是否成功开启了GPU ,可以使用下面的测试程序(见了解gputest.py),如果显示使用的是GPU则表示成功!
到这里,就可以使用Theano来编写GPU加速的程序了,在theano中编写Theano程序需要注意几个点:
1.Python中的浮点数默认是float64位的,但是如果需要用到cuda那么必须将浮点数转成float32,在上面的.theanorc.txt中就是使用了floatX=float32,就是为了这点,当然还是几种其他的方法,例如使用Tensor的T.fvector方法等
2.使用GPU编程,在Theano中得shared parameters需要全部转成float32位数据,array必须使用dtype=float32进行定义或者使用asType等方法转化成float32
3.从GPU中存取数据一定要小心,如果需要将全部数据存入GPU中,那么最好是讲参数全部变成32位的shared parameters,避免或者谨慎使用gpu_from_host方法
了解了上面的内容,我们就可以将前一篇文章的代码改成可以在GPU上运行的代码了,改动的地方如下:
二、将数据类型全部改成float32位的
np.random.seed(0)
train_X, train_y = datasets.make_moons(5000, noise=0.20)
train_y_onehot = np.eye(2)[train_y]



#设置参数
num_example=len(train_X)
nn_input_dim=2 #输入神经元个数
nn_output_dim=2 #输出神经元个数
nn_hdim=1000
#梯度下降参数
epsilon=np.float32(0.01) #learning rate
reg_lambda=np.float32(0.01) #正则化长度

#设置共享变量
# GPU NOTE: Conversion to float32 to store them on the GPU!
X = theano.shared(train_X.astype('float32')) # initialized on the GPU
y = theano.shared(train_y_onehot.astype('float32'))
# GPU NOTE: Conversion to float32 to store them on the GPU!
w1 = theano.shared(np.random.randn(nn_input_dim, nn_hdim).astype('float32'), name='W1')
b1 = theano.shared(np.zeros(nn_hdim).astype('float32'), name='b1')
w2 = theano.shared(np.random.randn(nn_hdim, nn_output_dim).astype('float32'), name='W2')
b2 = theano.shared(np.zeros(nn_output_dim).astype('float32'), name='b2')


w1.set_value((np.random.randn(nn_input_dim, nn_hdim) / np.sqrt(nn_input_dim)).astype('float32'))
    
b1.set_value(np.zeros(nn_hdim).astype('float32'))
    
w2.set_value((np.random.randn(nn_hdim, nn_output_dim) / np.sqrt(nn_hdim)).astype('float32'))
    
b2.set_value(np.zeros(nn_output_dim).astype('float32'))
 这里把输入数值traing_X和train_y也设置成theano的共享变量,也是为了将数据全部放入GPU中进行运算。其他的过程都不变,整个代码见下:
# -*- coding: utf-8 -*-
import theano
import theano.tensor as T
import numpy as np
from sklearn import datasets
import matplotlib.pyplot as plt
import time
#定义数据类型

np.random.seed(0)
train_X, train_y = datasets.make_moons(5000, noise=0.20)
train_y_onehot = np.eye(2)[train_y]



#设置参数
num_example=len(train_X)
nn_input_dim=2 #输入神经元个数
nn_output_dim=2 #输出神经元个数
nn_hdim=1000
#梯度下降参数
epsilon=np.float32(0.01) #learning rate
reg_lambda=np.float32(0.01) #正则化长度

#设置共享变量
# GPU NOTE: Conversion to float32 to store them on the GPU!
X = theano.shared(train_X.astype('float32')) # initialized on the GPU
y = theano.shared(train_y_onehot.astype('float32'))
# GPU NOTE: Conversion to float32 to store them on the GPU!
w1 = theano.shared(np.random.randn(nn_input_dim, nn_hdim).astype('float32'), name='W1')
b1 = theano.shared(np.zeros(nn_hdim).astype('float32'), name='b1')
w2 = theano.shared(np.random.randn(nn_hdim, nn_output_dim).astype('float32'), name='W2')
b2 = theano.shared(np.zeros(nn_output_dim).astype('float32'), name='b2')

#前馈算法
z1=X.dot(w1)+b1
a1=T.tanh(z1)
z2=a1.dot(w2)+b2
y_hat=T.nnet.softmax(z2)
#正则化项
loss_reg=1./num_example * reg_lambda/2 * (T.sum(T.square(w1))+T.sum(T.square(w2)))
loss=T.nnet.categorical_crossentropy(y_hat,y).mean()+loss_reg
#预测结果
prediction=T.argmax(y_hat,axis=1)

forword_prop=theano.function([],y_hat)
calculate_loss=theano.function([],loss)
predict=theano.function([],prediction)


#求导
dw2=T.grad(loss,w2)
db2=T.grad(loss,b2)
dw1=T.grad(loss,w1)
db1=T.grad(loss,b1)

#更新值
gradient_step=theano.function(
    [],
    updates=(
        (w2,w2-epsilon*dw2),
        (b2,b2-epsilon*db2),
        (w1,w1-epsilon*dw1),
        (b1,b1-epsilon*db1)

    )
)

def build_model(num_passes=20000,print_loss=False):

    w1.set_value((np.random.randn(nn_input_dim, nn_hdim) / np.sqrt(nn_input_dim)).astype('float32'))
    b1.set_value(np.zeros(nn_hdim).astype('float32'))
    w2.set_value((np.random.randn(nn_hdim, nn_output_dim) / np.sqrt(nn_hdim)).astype('float32'))
    b2.set_value(np.zeros(nn_output_dim).astype('float32'))

    for i in xrange(0,num_passes):
        start=time.time()
        gradient_step()
        end=time.time()
        # print "time require:"
        # print(end-start)
        if print_loss and i%1000==0:
            print "Loss after iteration %i: %f" %(i,calculate_loss())

def accuracy_rate():
    predict_result=predict()
    count=0;
    for i in range(len(predict_result)):
        realResult=train_y[i]
        if(realResult==predict_result[i]):
            count+=1
    print "count"
    print count
    print "the correct rate is :%f" %(float(count)/len(predict_result))

def plot_decision_boundary(pred_func):
    # Set min and max values and give it some padding
    x_min, x_max = train_X[:, 0].min() - .5, train_X[:, 0].max() + .5
    y_min, y_max = train_X[:, 1].min() - .5, train_X[:, 1].max() + .5
    h = 0.01
    # Generate a grid of points with distance h between them
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
    # Predict the function value for the whole gid
    Z = pred_func(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    # Plot the contour and training examples
    plt.contourf(xx, yy, Z, cmap=plt.cm.Spectral)
    plt.scatter(train_X[:, 0], train_X[:, 1], c=train_y, cmap=plt.cm.Spectral)
    plt.show()


build_model(print_loss=True)
accuracy_rate()


# plot_decision_boundary(lambda x: predict(x))
# plt.title("Decision Boundary for hidden layer size 3")

 程序中为了使得加速效果更明显,将隐含层的个数调整为1000个然后将训练参数个数调整到5000个,首先来看一下执行结果:


然后我们对比一下在使用GPU加速之前和使用GPU加速之后一次迭代的时间代价,需要使用cpu只需要将上面配置文件的device的gpu改成cpu即可
在使用GPU之后,一次迭代gradient_step()的时间是:


 
使用CPU运行的结果是:


我的显卡是GT720,属于比较低端的显卡,我的CPU是Inter i5,算是还不多的CPU,但是就算配置相差大,但是加速效果也有5倍之多,在稍微好点的GPU中,这个实验可以跑到7.5ms,加速足足有40倍之多,所以GPU对训练过程的加速效果还是显而易见的
 
1
5
分享到:
评论

相关推荐

    支持OpenCL的GPU加速人工神经网络训练.pdf

    人工神经网络训练是机器学习和深度学习的核心组件之一,但随着神经元数量的增加,训练时间也随之增加。这篇论文提出了一种使用OpenCL实现的GPU加速人工神经网络训练方法,以提高训练速度。 首先,人工神经网络训练...

    深度学习之四:使用Theano编写神经网络

    在本篇博文中,我们将深入探讨如何利用Theano这一强大的深度学习库来编写神经网络。Theano是一款Python库,它允许定义、优化并高效地计算数学表达式,特别是在多维数组处理方面,对于构建和训练神经网络模型尤其有用...

    加速深度学习任务:TensorFlow GPU 教程

    TensorFlow是一个广泛使用的深度学习框架,它支持GPU加速,使得处理大规模数据和复杂模型成为可能。下面我们将深入探讨如何在TensorFlow环境中设置和优化GPU使用。 首先,理解为何需要GPU加速至关重要。深度学习...

    基于虚拟化的多GPU深度神经网络训练框架.pdf

    本文主要讨论基于虚拟化的多GPU深度神经网络训练框架,旨在解决深度神经网络在分布式多机多GPU上的加速训练问题。作者提出了基于虚拟化的远程多GPU调用方法,利用分布式环境中的远程GPU资源实现深度神经网络的加速...

    深度学习框架PyTorch:入门与实践_高清1

    4. **第5章** 探讨数据加载、GPU加速以及可视化等实用工具的使用方法,为实际项目打下基础。 第二部分(第6~10章)以实战案例为主线,引导读者将所学知识应用到具体任务中: 1. **第6章** 通过Kaggle上的图像二...

    【全网首发】Pytorch深度学习与图神经网络卷1:基础知识

    **PyTorch深度学习与图神经网络卷1:基础知识** PyTorch是当前最流行的深度学习框架之一,它以其灵活性和易用性受到广大研究人员和开发者的青睐。本卷主要介绍PyTorch的基础知识,包括核心概念、基本操作以及如何...

    GPU版本卷积神经网络

    MATLAB中的深度学习工具箱支持创建和训练CNN,它提供了一系列的函数和类,使得构建复杂的神经网络结构变得简单。在GPU上运行CNN,可以利用其并行计算能力,大幅减少训练时间,这对于处理大规模数据集或者复杂模型...

    MATLAB实现基于CPU和GPU的并行神经网络运算【深度学习、人工智能项目实战】.zip

    深度学习的核心在于训练过程,而并行计算则能显著加速这一过程。MATLAB支持CPU多线程和GPU并行计算,这使得在大型数据集上训练模型变得更加高效。在GPU上执行计算可以极大地减少训练时间,特别是对于那些计算密集型...

    MATLAB 神经网络案例:并行运算与神经网络——基于CPUGPU的并行神经网络运算.zip

    这个压缩包“MATLAB神经网络案例:并行运算与神经网络——基于CPUGPU的并行神经网络运算.zip”显然是一个教学资源,它详细探讨了如何利用MATLAB的并行计算能力来提升神经网络的训练速度,特别是涉及到CPU和GPU的并行...

    GPU加速计算机视觉(源码).rar

    5. **深度学习的GPU加速**:了解如何在GPU上运行深度学习模型,如CNN(卷积神经网络),提升模型训练和推理的速度。 6. **性能优化技巧**:学习如何进行CUDA程序的性能分析和优化,包括内存管理、计算效率的提升等...

    探究GPU对神经网络的加速作用.pdf

    GPU(图形处理器)因其并行计算能力的优越性,逐渐成为加速神经网络计算的重要工具。 GPU的发展现状表明,它们已经从原本主要用于图形渲染和游戏性能提升的角色,转变为高性能计算的重要平台。相比于CPU,GPU具有更...

    Python-深度学习GPU训练系统

    标题中的“Python-深度学习GPU训练系统”表明我们将探讨如何使用Python编程语言来构建和优化在GPU上运行的深度学习模型。深度学习是人工智能的一个分支,它利用神经网络对复杂数据进行模式识别和预测。GPU(图形处理...

    对使用TensorRT加速AI深度学习推断效率的探索.pdf

    在深度学习模型的训练过程中,需要使用大量的标记数据来训练神经网络,使其能够学习数以百万计的权重或参数。然后,使用训练好的模型来进行预测,以满足实时应用的需求。然而,这个过程中存在着许多挑战,例如模型的...

    基于GPU通用计算的深度学习模型性能分析.pdf

    深度学习是一种基于人工神经网络的学习技术,它在过去的几年里取得了显著的进展,特别是在图像识别、自然语言处理和游戏智能等领域。随着社会数据化的到来,深度学习模型由于其高复杂度和巨大的计算需求而被广泛研究...

    神经网络与深度学习python源码朴素贝叶斯

    其简洁明了的语法和强大的第三方库支持使得Python成为神经网络与深度学习领域首选的语言之一。 #### 2.2 常用Python库介绍 - **NumPy**:提供高性能的数组操作和数学函数。 - **Pandas**:用于数据处理和分析的...

    深度学习_多层神经网络的复兴与变革

    其中,多层神经网络是深度学习的核心技术之一,它的复兴与变革对推动整个领域的发展具有重要意义。本文旨在探讨多层神经网络的历史背景、发展历程以及最新进展,并对其未来趋势进行展望。 #### 二、多层神经网络的...

    neuralnetworks, java深度学习算法与基于gpu加速的深层神经网络.zip

    neuralnetworks, java深度学习算法与基于gpu加速的深层神经网络 基于GPU支持的深神经网络这是我在ExB研究工作时开发的一个新版本的更新版本。 当前,可以生成项目,但有些测试不工作。 如果你想访问以前的版本,则...

    Omega-AI基于java打造的深度学习框架帮助你快速搭建神经网络实现模型推理与训练引擎支持自动求导多线程与GPU运算

    基于java打造的深度学习框架,帮助你快速搭建神经网络,实现训练或测试模型,支持多线程运算,框架目前支持BP神经网络、卷积神经网络、vgg16、resnet、yolo等模型的构建,目前引擎最新版本支持CUDA和CUDNN两种GPU...

    GPU为HPC和深度学习提供强大加速动力.pdf

    文档中提到,在NVIDIA的推动下,GPU加速计算领域在过去几年里实现了显著的增长,尤其是在深度学习方面,GPU的应用掀起了全球热潮,许多企业和研究机构依靠GPU在深度学习领域实现了创新。 3. GPU技术的发展与展望 ...

    :基于java打造的深度学习框架,帮助你快速搭建神经网络,实现模型推理与训练,引擎支持自动求导,多线程与GPU运算

    Omega-AI是一个基于Java开发的深度学习框架,其设计目标是简化神经网络的构建过程,加速模型的训练和推理,并且充分利用硬件资源,如多线程计算和GPU加速。这个框架的核心特性包括自动求导、多线程优化以及对CUDA和...

Global site tag (gtag.js) - Google Analytics