【杂谈】工程能力差,C++水平菜?CUDA没写过?我推荐玩下Caffe
深度学习开源框架众多,基于C++的训练框架唯有Caffe一个,尽管Caffe在做一些比较新的任务时成本极高,但它依旧有它存在的价值,今天在这里给出几个推荐理由。
作者&编辑 | 言有三
1 Caffe的功绩
笔者从2015年开始从事深度学习相关的工作,彼时不管是学术界还是工业界,Caffe是主流。哪怕随着几年后Tensorflow,MxNet,以及近两年Pytorch的崛起,在移动端部署,各家公司在很长一段时间内都是将Caffe的核心代码移植到手机上。
随着腾讯的NCNN,小米MACE等移动端开源框架的流行,这个比例才慢慢降低。但是如果你认识一些在移动端上做视觉算法的朋友,可以问问他们的产品线上还有Caffe还有多大的比例,我相信或多或少都有,甚至是主流。
接口稳定,推理速度快,这是它流行的最重要的原因,这两点对于工业界应用来说是真正的刚需。
2 Caffe安装真的很难吗
很多同学害怕Caffe,首先是因为害怕它的环境配置。诚然,Caffe需要自己编译,但是这个编译真的难吗?
以Ubuntu为例,高于17.04的版本,安装就一条命令:
sudo apt install caffe-cuda
低于17.04的版本,也就是要做几件事情:
(1) 安装Nvidia驱动和CUDA。
(2) 安装依赖库。
(3) 在Caffe源代码中配置好库路径然后编译。
第一条,或许是有一些坑,但这不是做深度学习算法工程师必备的技能吗?公司和实验室有了新的机器让你配置难道也说不会。
第二条,无脑apt-get命令。
第三条,配置一下库的路径而已,Makefile都没让你写,只是无脑敲一下make命令。
新手在环境安装上卡住,其实并不是Caffe难,而是使用者对Linux系统非常不熟悉,这个锅Caffe不背。还从未听过哪家做深度学习算法开发的公司不基于Linux环境,你今天不学会到了公司更痛苦。
3 Caffe其实是最简单的
很多人觉得Caffe好难啊,其实我想说,Caffe有可能是最简单的了。它的使用流程如下:
以图像分类任务为例:
(1) 准备数据就是将数据按照Caffe分类任务的输入格式准备如下,这很简单吧,一个Python遍历脚本。
../../../../datas/mouth/1/182smile.jpg 1
../../../../datas/mouth/1/435smile.jpg 1
../../../../datas/mouth/0/40neutral.jpg 0
../../../../datas/mouth/1/206smile.jpg 1
(2) 定义网络,就是去改改网络配置文件train.prototxt,复杂点的写个脚本,卷积层的格式如下:
layer {
name: "conv1"
type: "Convolution"
bottom: "data"
top: "conv1"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
convolution_param {
num_output: 12
pad: 1
kernel_size: 3
stride: 2
weight_filler {
type: "xavier"
std: 0.01
}
bias_filler {
type: "constant"
value: 0.2
}
}
}
一边改一边在Netscope中实时可视化,网络拓扑结构有没有问题一点就能看出来。
(3) 配置训练参数,就是改改下面的文件。
net: "./train.prototxt"
test_iter: 100
test_interval: 10
base_lr: 0.00001
momentum: 0.9
type: "Adam"
lr_policy: "fixed"
display: 100
max_iter: 10000
snapshot: 2000
snapshot_prefix: "./snaps/conv3_finetune"
solver_mode: GPU
(4) 训练,跟大部分框架一样,甚至更加简单。下面是一个finetune模型的例子。
SOLVER=./solver.prototxt
WEIGHTS=./init.caffemodel
../../../../libs/Caffe_Long/build/tools/caffe train -solver $SOLVER -weights $WEIGHTS -gpu 0 2>&1 | tee log.txt
纵观以上任务,你做了啥?不就是写个脚本处理了一下数据,把网络模块化的搭建一下,把优化参数配置一下,整体下来,可能20行Python代码都没有。
恐怕只有像Darknet这样类似的框架才有如此清晰而又简单的过程。
只要把你任务需要的网络层准备好了,用Caffe训练和测试都非常简单,至于网络层不会写,各路大神开源的代码在GitHub上多的很,至少一些基本的视觉任务都是有的。GitHub拿来主义,人人皆会。
4 如何用Caffe学习C++和CUDA
使用Caffe可以非常方便的锻炼自己的C++和CUDA水平,有三步曲。
(1) 阅读学习Caffe的源代码和设计模式。
Caffe的所有源代码都是C++/CUDA写的,使用工厂设计模式,代码结构清晰,可读性和拓展性强,效率高。
(2) 自己添加新的网络层,包括数据层,损失层等。
把C++类的设计,各种数据结构和标准库熟悉并且用起来,把CUDA代码也写一写。这些都是以后去公司从事模型部署和优化框架工作所必须准备好的技能。
(3) 学会用Caffe部署和分析模型。
学会用Caffe去分析每一个网络层的计算量和计算时间,找到性能瓶颈。学会用它把模型进行封装和加密,在嵌入式平台中使用。
Caffe确实没有像Pytorch等框架那么学术而更偏工程,但工程能力正是现在大多数想进入这一行的同学所欠缺的。
你会的,别人不会,才体现出你的价值。
对公司来说重要的,不是你会什么,而是它需要什么。
脱离了工程实践能力的算法工程师,满大街都是,但他们找不到工作。
5 Caffe的稳和缺点
Caffe最大的特点是稳,不像Tensorflow等框架一样更新一次版本后原来的代码就不能用了,库又得重新装了等等,只需要专注于自己的任务即可。
当然版本稳定就带来了一些缺点,比如不支持自动求导,不支持模型级并行,只支持数据级并行,不适合于非图像任务等。
但还是那句话,对于基于卷积神经网络的成熟而通用的任务来说,Caffe是很不错的选择,它的学习价值,也永不褪色。