Lecture 6:Hardware and Software
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
现有大量的深度学习框架
torch和tensorflow的优势在于:
(1)自动计算梯度
如图所示
(2)可运行在GPU上,加快特定问题的运行速度
PyTorch
基础概念:
(1)torch.Tensor:类似于numy的array,但是可以运行在GPU上
(2)torch.autograd:自动对Tensor计算梯度
(3)torch.nn.Module:一个神经网络层,可自动存储权重
可以重新定义激活函数或者是前向传播,使用new autograd functions,在这里梯度要自己计算。
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可以更加方便的定义一个新的模型
例子如下:
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如下所示:
可以看出每一次运行时,都要重新建立模型,很浪费时间
所以提出了Static Computation Graphs
若想用pytorch实现静态图,可以使用ONNX。
需要先建立模型,输入dummy_input,使用torch.onnx.export导出,可以在caffe2等平台运行。
除此之外,也可以使用torchscript构建静态图。
Tensorflow
tesorflow2.0以前默认静态计算图,可选择动态图
2.0以后默认动态图,可选择静态图
对于tensorflow,定义计算图如图所示
之后多次运行该计算流图
对于2.0版本以后的Tensorflow,提出了Eager模式。
如图所示
一般而言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来实现静态图编译,例子如下:
在模型相同的情况下,静态图要比动态图更快,但实际的表现还是取决于计算图或模型本身的结构。
静态图的另一个优势在于可以让framework在运行前对图进行优化。
Dynamic Graphic Applications
Recurrent networks循环神经网络
Recursive networks递归神经网络
Modular networks 模块化网络
model parallel & data parallel
model parrallel指将计算图切分成多个部分,交给GPU进行计算
data parralle指将数据集切分成多个部分,交个GPU进行计算。
对于data parallel的实现
Pytorch:
nn.DataParallel(易于使用)
nn.DistributedDataParallel(需要手动指定设备,手动运行训练过程)
Tensorflow:
tf.distributed.Strategy