cs231n-Lecture 6:Hardware and Software

Lecture 6:Hardware and Software

  • Deep Learning Hardware
  • Deep Learning Software
  • PyTorch
  • Tensorflow
  • Dynamic Graphic Applications
  • model parallel & data parallel

Deep Learning Hardware

CPU:central processing unit
CPU核心少,每一个核心更快,且更能干,更擅长顺序计算
GPU:graphic processing unit
GPU有更多的核心,每个核心更慢,且笨,更擅长并行任务
TPU:为深度学习专有的硬件
programming on GPUS
CUDA:
(1)可直接在GPU运行类似C的代码,
(2)优化的API有:cuBLAS,cuFFT,cuDNN,etc
(3)仅限于英伟达
OpenCL:
(1)类似于CUDA,但可以运行在任何事情上
(2)英伟达硬件上通常更慢
HIP:
(1)可以将运行在CUDA的代码转化为运行在AMD,GPU的代码

Deep Learning Software

现有大量的深度学习框架
cs231n-Lecture 6:Hardware and Software_第1张图片

torch和tensorflow的优势在于:
(1)自动计算梯度
如图所示
cs231n-Lecture 6:Hardware and Software_第2张图片
cs231n-Lecture 6:Hardware and Software_第3张图片

(2)可运行在GPU上,加快特定问题的运行速度
cs231n-Lecture 6:Hardware and Software_第4张图片

PyTorch

基础概念:
(1)torch.Tensor:类似于numy的array,但是可以运行在GPU上
(2)torch.autograd:自动对Tensor计算梯度
(3)torch.nn.Module:一个神经网络层,可自动存储权重
可以重新定义激活函数或者是前向传播,使用new autograd functions,在这里梯度要自己计算。
cs231n-Lecture 6:Hardware and Software_第5张图片
在这里插入图片描述

tips:@staticmethod允许类可以不实例化的调用某一特定方法

torch.nn可以更加简化的实现代码
tips:

class Base():
	def __init__(self,val):
		print('winn',val)
class A(Base):
	def __init__(self,haha):
		super(A,self).__init__(haha)
s= A(1)
winn 1

使用torch.nn.Module可以更加方便的定义一个新的模型
例子如下:
cs231n-Lecture 6:Hardware and Software_第6张图片

tips:在这里对torch.nn.Linear产生了一定的疑惑,感觉类实例化以后应该不能再输入参数了,但是这里却又输入参数。
查看了torch.nn中的代码,原来是有Input的用法。

    def forward(self, input: Tensor) -> Tensor:
        return F.linear(input, self.weight, self.bias)

可以使用torchvision中已经训练好的模型
如alexnet,vgg16,resnet101等
torch.utils.tensorboard是基于网络的视觉工具
可以更加方便的呈现视觉效果
常规的Dynamic Computation Graphs如下所示:
cs231n-Lecture 6:Hardware and Software_第7张图片

可以看出每一次运行时,都要重新建立模型,很浪费时间
所以提出了Static Computation Graphs
cs231n-Lecture 6:Hardware and Software_第8张图片
若想用pytorch实现静态图,可以使用ONNX。
需要先建立模型,输入dummy_input,使用torch.onnx.export导出,可以在caffe2等平台运行。
除此之外,也可以使用torchscript构建静态图。
cs231n-Lecture 6:Hardware and Software_第9张图片

Tensorflow

tesorflow2.0以前默认静态计算图,可选择动态图
2.0以后默认动态图,可选择静态图
对于tensorflow,定义计算图如图所示
cs231n-Lecture 6:Hardware and Software_第10张图片
之后多次运行该计算流图
cs231n-Lecture 6:Hardware and Software_第11张图片
对于2.0版本以后的Tensorflow,提出了Eager模式。
如图所示
cs231n-Lecture 6:Hardware and Software_第12张图片
一般而言tensorflow需要使用placeholder进行占位,之后建立tensorflow.Session,通过feed_dict的方式将数据导入,进行计算。与pytorch相比,这一做法很繁琐。
而eager模式则极大地简化了代码的书写。
TensorFlow集成了Keras这一第三方库,它是一种高水平的wrapper,可以进一步简化代码编写。
优点如下:
(1)可以使用keras的layers.Dense代替matmul来实现前向传播
(2)使用model.trainable_variables来表示所有训练权重
(3)还可以帮助进行循环迭代

常见的high-level wrapper还有estimator,sonnet,TFLearn,TensorLayer等
对于TensorFlow而言,一样可以实现静态图。
通过标注@tf.function来实现静态图编译,例子如下:
cs231n-Lecture 6:Hardware and Software_第13张图片

在模型相同的情况下,静态图要比动态图更快,但实际的表现还是取决于计算图或模型本身的结构。
静态图的另一个优势在于可以让framework在运行前对图进行优化。

Dynamic Graphic Applications

Recurrent networks循环神经网络
Recursive networks递归神经网络
Modular networks 模块化网络

model parallel & data parallel

model parrallel指将计算图切分成多个部分,交给GPU进行计算
cs231n-Lecture 6:Hardware and Software_第14张图片
data parralle指将数据集切分成多个部分,交个GPU进行计算。
cs231n-Lecture 6:Hardware and Software_第15张图片
对于data parallel的实现
Pytorch:
nn.DataParallel(易于使用)
nn.DistributedDataParallel(需要手动指定设备,手动运行训练过程)
Tensorflow:
tf.distributed.Strategy

你可能感兴趣的:(机器学习,python,算法)