深度网络的设计与可视化工具

深度网络的设计与可视化工具

caffe

Linux环境的准备

主要是根据 caffe install manual 来进行的。主要库的依赖可以用这个https://github.com/gwli/StudyNote/blob/master/caffe/install/prepare.py 来完成安装。

nvidia driver 的安装
  1. 从 官网 下载最新driver,

  2. 进入字符介面 tty1

    ctl+alt+F1

  3. 关掉 X windows.

    sudo service lightdm stop

  4. 安装driver.

    chmod +x installer.run;./installer.run

  5. 恢复 X windows.

    sudo service lightdm start

Note

正常的情况下installer会自动disable的自带的driver,如果失败的重起一下,重新执行installer就行了。

安装cuda-toolkit

这里从两种方式来安装,手动安装,或者使用 jetpack pro 只安装 host端的cuda-toolkit.

  1. 添加源

    $ dpkg -i cuda-repo-ubuntu1404_6.5_amd64.deb
    
  2. 安装 cuda toolkit

    $ sudo apt-get install -y cuda-toolkit-6-5
    
  3. 配置环境变量

      $ export PATH+=:/usr/local/cuda-6.5/bin/:
      $ LD_LIBRARY_PATH+= /usr/local/cuda-6.5/bin/lib:
      $ export LD_LIBRARY_PATH
    
    .. note::
    
       也可以直接写.bashrc中就行,重启shell就行了。
    
相关库的安装

直接使用 https://github.com/gwli/StudyNote/blob/master/caffe/install/prepare.py 来完成就行了。

下面几个不常见库的说明

libs
Lib names Content Remark
google-glog google提供的一个C++的logging库 https://code.google.com/p/googl有e-glog/
protobuf-devel 性能更好的jason用于进程通信 相当于TCP/IP的包解析技术用在了进程通信IPC.
gflags 类似于getopt命令行处理接口 http://dreamrunner.org/blog/2014/03/09/gflags-jian-ming-shi-yong/
google snappy 一个高速的压缩库,http://www.infoq.com/cn/news/2011/04/Snappy  
google leveldb LevelDB is a fast key-value storage library written at Google that provides an ordered mapping from string keys to string values.,https://github.com/google/leveldb  
安装cudnn
  1. 从 ·https://developer.nvidia.com/cuDNN 下载 linux 官

  2. 解压安装

    $ tar -xzvf cudnn.tgz
    $ mv cudnn /usr/local/cudnn
    
  3. 修改LD_LIBRARY_PATH

      LD_LIBRARY_PATH+=:/usr/local/cudnn:
      C_INCLUDE_PATH+=:/usr/local/cudnn:
      CPLUS_INCLUDE_PATH+=:/usr/local/cudnn:
    
      PATH+=:/usr/local/cuda-6.5/bin:
      LD_LIBRARY_PATH+=:/usr/local/cuda-6.5/lib64:
      LD_LIBRARY_PATH+=:/usr/local/cuda/cudnn:
      export LD_LIBRARY_PATH
      C_INCLUDE_PATH+=:/usr/local/cuda/cudnn:
      CPLUS_INCLUDE_PATH+=:/usr/local/cuda/cudnn:
    
    由于采用 cudnn 的库与caffe兼容性问题,现在 caffe 与V1 是工作的。
    
    一个快速灵活的办法,那就是link.
    
    .. code-block:: bash
    
       ln -s  /usr/local/cudnn-6.5-linux-x64-v2-rc2/ /usr/local/cuda/cudnn
    
build

caffe 采用了大量的template,所以代码模式基本

digraph flow {    template->code->"PIC so"-> "link to app";}

  1. build the app

    make all |tee make.log

  2. build the test

    make test |tee test.log

  3. run the test

    make runtest |tee runtest.log

Note

cudnn-6.5-linux-R2-RC1 is compatible with caffe, cudnn-6.5-linux-R1 is good. 可以在这个https://groups.google.com/forum/#!forum/caffe-users 里找到这个问题

support python

  1. 安装依赖

    cd $caffe_root/python
    for req in $(cat requirements.txt);do pip install $req; done
    
  2. installl scipy

there is miss requirment scipy this need fortrain compiler you can install it by

  1. install gfortran apt-get install gfortran-4.8
  2. make link due can’t find gfortran ln -s /usr/bin/gfortran-4.8 /usr/bin/gfortan

最简单的办法

apt-get install python-scipy

  1. 添加caffe to python lib

    export PYTHONPATH=/$caffe_root/python:$PYTHONPATH
    
  2. 生成文档

    1. install jekyll

      apt-get install jekyll doxygen texlive-full

深度学习

深度学习与前些年神经网络的区别,那就是网络层数要比以前多了。这样的话功能就大大加强了。

网络一组layer来组成,layer 又由一组node来组成,层与层之间联接是由forword与backwrod连接组成。每一层都solver,以及module. 而这里blobs 就是node. foward 用来把input -> output同时计算出 loss cost,而backword 而是根据loss cost来计算梯度来提取下一步w,b,优化到什么程度为止呢,取决于error 要求和iter numbers.

每一个小的神经网络连接再加上形成大的神经网络,就实现了脑的功能。

Blobs 是由包着数据本身(什么意思?),而数据本身四维的数组(Num,Channels,Height and Width) 有点类似于CUDA的Thread分配。Blobs更像是CUDA Array 的机制。Blobs统一管理CPU与GPU的内存。(n,k,h,w)正好每个线程计算输入都是由Blobs来的。输入传输,利用google proto来进传输。 Google Protocol Buffer 的使用和原理 google 这种机制就其名字一样,(把什么当作?)当作协议包来解析,就像网络包一样,每一个包不需要通用,只要自己能认识自己就行了。就像网络协议一样,只规定了协议包结构。就自然解析就容易了。无非两种TLV,并且进一步利用编码本身实现压缩,并且元编程实现类的自动化定义与实现。并且还支持动态编译JIT,这也就意味着没有只要有源码就行了。

同时Blobs,保存两种数据,一种是Data,一种是diff,简单的说Data是往前传,而diff计算梯度是往后传。

这个是把编码与元编程技术结合起来的。

caffe 这个神经网络还可以snapshotting与resume,这个就非常的方便。

深度网络

本质是一层一层向上抽象的过程。同时一个由无序到有序的过程。但是过程的路径又不指一条,就像人每个人的思维过程也是一样的。所以每一层的每个神经网络的抽象可以不同。并且再加上一顺序就会有各种各样的结果。到这个过程中就像需要有一个像分词库一样的东东。如果只是简单组合就能得到一属性,还是排列才能进行判定, 排列与组合是不同层次的判别路线。

深学习就是在解决如抽象概念这个难题。

caffe流程

caffe的设计原则与自己的原则一样的,分层的模块化的设计。把一个大大的问题不断的breakdown,变成几个已经解决的小问题。 #. 数据格式的转换,目前支持 lmdb,leveldb. #. 定义 network

digraph flow{    Input->Forward->Output;    Output->Backword->Input;}

  1. 定义 solver
  2. training
  3. testing

开发流程添加几个头文件与与源文件。然后实现setup,initial, resharp,forward,backword,然后就注册就行了。

数据的准备

在网络 里主要有 data_para 与 transform_para .

  1. from database levelDB or LMDB
  2. directly from memory
  3. from files on disk in HDF5
  4. common image formats

而预处理包括,通过指定 TransformationParameterS.

  1. mean subtraction,
  2. scaling
  3. random cropping
  4. mirroring

数据格式

key,value格式,leveldb,lmdm等等就是这种。

hdf5 用来层次化的数据格式,相当于面向对象结构串行化。 如果其看成是例如IP的解析则更容易理解,例如Mongo那种理解,就相当于TLV格式的包结构。 Hierarchical Data formathttp://en.wikipedia.org/wiki/Hierarchical_Data_Format.

深度学习和并行计算

早期的神经网络,因无法处理两层以上的网络,都是浅层的。目前的深度学习,因采取逐层预训练和全局微调策略,能够实现深层次的网络结构(目前通常需要10层以上的隐含层,才能够取得较好的建模效果),但实际上训练一层的神经网络是非常困难的。这是因为当前的深度学习网络中存在上百万、甚至是上千万的参数需要经过后向反馈来调整,并且深度学习需要大量的训练数据来确保分类和预测的准确性,也就意味着几百万甚至是几千万的输入数据需要运行在前向或者后向反馈中,因此计算量是非常巨大的。另一方面,深度学习由大量相同的、并行的神经元组成,能够并行映射到GPU中,能够提供巨大的计算加速。这里使用NVIDIA公司提供的深度学习平台:CAFFE。 实验已表明,当训练“reference imagenet”时, 并行计算能够获得10倍于intel ivyBridge CPU的加速。

NVIDIA cuDNN 是主要的深度学习GPU加速库,它提供深度学习中常用的操作。比如:卷积、池化、softmax、神经元激活(包括sigmoid、矫正线性器和Hyperbolic tangent ),当然这些函数都支持前向、后向传播,cuDNN主要是在以矩阵相乘的方面擅长,cuDNN特性定数据输出,支持可伸缩的维度定制, dimension ordering, striding and subregions for 对于四维张量。这些可伸缩性允许神经元积分,并且能够避免输入输出转换。

cuDNN是线程安全的,提供基于内容的APi,从而能够支持多线程和共用CUDA线程。使得开发者能够精确地使用多主线程和多GPU,控制库。确保GPU设备总是在一个特殊的主线程中使用。

cuDNN允许深度学习开发者能够掌握当前的状态并且能够把精力集中在应用和机器学习问题上,而不需要写额外的定制代码。cuDNN能够 在Windows和LInux OSes平台上。支持所有的NVIDIA GPU,从低端的GPU,比如Tegra k1 到高端的 Tesla K40. 当开发者使用cuDNN,能够确保得到目前的和未来的高性能,并且得益于GPU特性。

cuDNN是为了深度学习开发者,它非常易用,使得开发者无需知道CUDA。在CAFFE,深度学习使用基于本文的配置文件。使用CAFFE,使用定义神经网络的每一层,制定层的类型(包括数据、卷积和全连接)并且层提供他的输入。并且有类似的配置文件,定义怎样初始化神经网络参数以及训练的重复次数等等。

cudnn

cuda的deeplearning 库

流程本身与CUDA是一样的,数据格式可以改变access pattern可以尽可能利用cache来提高效率。 kernel本身计算模式的改变可以尽可能利用硬件资源。一个算法本身计算量可以大大的减少。 通过thread,L1,L2,register等等,以及 stream, cdn,cnp资源的分配来提高硬件的occupancy.

digraph flow {    H2D -> "kernel exuection" -> D2H;}

目前为止,这是CUDA执行模式。各种库无非就在些基础上来进行进一步限定。

或者添加些help函数来实现实现自动的thread分配。并且把一些算法的kernel来实现一下, 并且更加上一些元编程把kernel的实现做一些自动的适配与优化。thrust都是这样干的。

checkCUDNN( cudnnConvolutionForward(cudnnHandle,
                                    &alpha,
                                    srcTensorDesc,
                                    srcData,
                                    filterDesc,
                                    conv.data_d,
                                    convDesc,
                                    algo,
                                    workSpace,
                                    sizeInBytes,
                                    &beta,
                                    dstTensorDesc,
                                    *dstData) );
  1. Convolution 的kerneldnn 自己实现了。
  2. srcTensorDesc,dstTensorDesc, 就是为描述资源的格式与大小方便后存储与对memory 以及kernel的thread的分配。
  3. 主要采用是四维的张量计算
  4. 所谓network其实就是一个cudnnCreate 一个cudaContext而己。用完之后是需要cudaDestroy的。 这样可以把数据保存显存里,然后方便多个kernel之间的计算减少D<=>H之间的传输而己。 可以使用 CUDA annalysis 对其进行分析。
  5. kernel中算法本身需要的参数

其余那就类似于 CUDA runtimeapi 一样,各种各样的get/set以及createhandle之类的东东了。

Theano

  • install note

  1. pip install Theano #. pip install numpy #. apt-get install python-scipy
  2. apt-get install libblas-dev #. apt-cache search blas
introduction

theano利用python的语法来实现了自己的语言。这个语言的特别之处,自己实现的用自己的,自己没有实现的就可以直接使用了python的,不过只是一个中间件语言,下层实现还是直接借用CPU与GPU的blas库。并且theano实现还是一个JIT编译器。它的主要特点那就是直接使用利用sympy以及自己的张量符号表达式来直接构造公式,在theano中公式与函数基本上可以直接化等号了。 并且theano还有自己的编译算法,它可以直接打印出依赖图,如何简化自己的逻辑图呢。

既然是语言,就要变量,循环,分支,函数。那theano中是如何实现这些的。

变量 类型两部分,基本类型本身另外那就是结构,例如tensor.dscalar,就是double类型的标量

b w i l f d c byte word int long int float double compex  
scalar vector matrix                        

循环,又分为map/reduce两种。而在theano中采用了scan 来描述。这样是为了能够让theano识别for,只是其返回值,其中update是要function来用,另外是做计算结果来使用的。

分支 对于计算模型循环要远远大于分支,并且在大量的matrix不存在分支模型。所以在计算型的语言中分支会用的比较少,例如CG编程中主要是计算。

函数 直接用表达式来构造函数,但是没有看到其作用域的使用,没有直接声明函数的{}范围,其实直接使用引用传递,与可以实现 多值反回,就可以实现n对n的输出。正常的函数输出是n对1,n对n的输出,那就可以引用传递。在python 可以使用global来实现。 theano中函数声明没有传统语言的方式,直接符号表达式使用来当做函数体。当然这个过程它也会做一些符号计算。帮你做公式推导。

theano.function这个是编译指令,然后返回一个编译后object,就像shaderobject. 函数输入,解决了python中没有引用传递的问题,如果你把变量声明成shared类型,那就是引用传递了。也可以用borrow 的属性来直接使用引用传递。但保存一些python中好的习惯,参数可以有默认的值。格式Param(y,default=1)格式,也可以name/value来赋值。 函数体的可以直接使用输出表达式,也可以用update,given来指定。update 是用来指定如何操作shared变量,而givens,用来变量替换的。 theano这种方式可以复用达到每一条指令的颗粒度,即因为在没有编译之前都是符号表达式。

函数输出可以是多值输出,这可以任意的中间状态输出。

+theano 结构

现在明白了theano中对于优化问题的固定的结构,首先declare the variable, then compile the data ,input, outputs, then tain the data; finally look at the results.

declare variable->construct the expression graph-> compile->train->show the results

+theano graph

在调试的时候,我们必须知道什么是graph,包产variable,op等,首先输出的操作数,y.owner.op.name 对于函数输出y.maker.fgraph.outputs,一个函数形式,y.maker.fgraph.inputs是[x, w, b],输入tensorvariable。

好像整个都是以函数的输出就是函数 theano.function{outputs} 中输出的类型就是function,无法得到实际数据。

多次迭代共同改变的是w的值。调节的是x,y 不断的输入,现在明白了为什么w,b是全局变量。

这里的prediction 好像没有什么用,只是预测。

  1. theano学习指南 明天看一下
  2. Intel MKL基础(1)了解MKL、MKL资源 CUDA 是不是有类似的库
  3. matlab

math compiler 公式编译器,原理你把公式写出来,编译器就会把公式化简然后转化为高性能代码来进行计算。因为各个平台都会有各自己的高性能计算库,例如blas,lapack,intel的mkl,还有nv的cuda等等都是有现成了运算库,然后我们需要把算法以及矩阵运算,然后把分块分工,然后分配给这些计算单元并行。看来编译语法分析是重点。自己一定要自己实现一个解析器。

– Main.GangweiLi - 22 Jan 2014

张量计算 这个是theano这个库所主要实现的功能,这个是sympy所没有实现的功能。另外的那就是公式编译器。其通过实现一个图,采用利用图论的最短路径来进行化简。

– Main.GangweiLi - 26 Jan 2014

theano利用自己的内存分配机制,例如share型,一个独立的类型,就像语言一样有register型,对于异构编程的时候,会有对应的内存,例如CPU内存,GPU内存,还有共享区域。

– Main.GangweiLi - 26 Jan 2014

我是不是要实现一门自己的语言,然后把它转化成各种语言,以后我只写我自己的语言,然后再进行转换。

– Main.GangweiLi - 26 Jan 2014

NVCC 这个封装与python自身的那个 destutil 差不多,自己封装一个toolchain for NVCC, 当然要写配置文件,分析配置文件直接使用的是python 的configparser 库,看来自己以后可以直接这个了。

– Main.GangweiLi - 07 Mar 2014

优化 对于不认识的新op是不会进行优化的。

– Main.GangweiLi - 07 Mar 2014

from: http://deeplearningongpu.readthedocs.org/en/latest/Stage_3.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值