首页 > 编程语言 >【杂谈】工程能力差,C++水平菜?CUDA没写过?我推荐玩下Caffe

【杂谈】工程能力差,C++水平菜?CUDA没写过?我推荐玩下Caffe

时间:2022-12-28 12:34:01浏览次数:70  
标签:.. 框架 任务 C++ 玩下 Caffe CUDA


深度学习开源框架众多,基于C++的训练框架唯有Caffe一个,尽管Caffe在做一些比较新的任务时成本极高,但它依旧有它存在的价值,今天在这里给出几个推荐理由。

作者&编辑 | 言有三

1 Caffe的功绩

笔者从2015年开始从事深度学习相关的工作,彼时不管是学术界还是工业界,Caffe是主流。哪怕随着几年后Tensorflow,MxNet,以及近两年Pytorch的崛起,在移动端部署,各家公司在很长一段时间内都是将Caffe的核心代码移植到手机上。

随着腾讯的NCNN,小米MACE等移动端开源框架的流行,这个比例才慢慢降低。但是如果你认识一些在移动端上做视觉算法的朋友,可以问问他们的产品线上还有Caffe还有多大的比例,我相信或多或少都有,甚至是主流。

【杂谈】工程能力差,C++水平菜?CUDA没写过?我推荐玩下Caffe_CUDA

接口稳定,推理速度快,这是它流行的最重要的原因,这两点对于工业界应用来说是真正的刚需。

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有可能是最简单的了。它的使用流程如下:

【杂谈】工程能力差,C++水平菜?CUDA没写过?我推荐玩下Caffe_开源框架_02

以图像分类任务为例:

(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 {

一边改一边在Netscope中实时可视化,网络拓扑结构有没有问题一点就能看出来。

【杂谈】工程能力差,C++水平菜?CUDA没写过?我推荐玩下Caffe_CUDA_03

(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写的,使用工厂设计模式,代码结构清晰,可读性和拓展性强,效率高。

【杂谈】工程能力差,C++水平菜?CUDA没写过?我推荐玩下Caffe_开源框架_04

(2) 自己添加新的网络层,包括数据层,损失层等。

把C++类的设计,各种数据结构和标准库熟悉并且用起来,把CUDA代码也写一写。这些都是以后去公司从事模型部署和优化框架工作所必须准备好的技能。

【杂谈】工程能力差,C++水平菜?CUDA没写过?我推荐玩下Caffe_开源框架_05

(3) 学会用Caffe部署和分析模型。

学会用Caffe去分析每一个网络层的计算量和计算时间,找到性能瓶颈。学会用它把模型进行封装和加密,在嵌入式平台中使用。

【杂谈】工程能力差,C++水平菜?CUDA没写过?我推荐玩下Caffe_开源框架_06

Caffe确实没有像Pytorch等框架那么学术而更偏工程,但工程能力正是现在大多数想进入这一行的同学所欠缺的。


你会的,别人不会,才体现出你的价值。

对公司来说重要的,不是你会什么,而是它需要什么。

脱离了工程实践能力的算法工程师,满大街都是,但他们找不到工作。

5 Caffe的稳和缺点

Caffe最大的特点是稳,不像Tensorflow等框架一样更新一次版本后原来的代码就不能用了,库又得重新装了等等,只需要专注于自己的任务即可。

当然版本稳定就带来了一些缺点,比如不支持自动求导,不支持模型级并行,只支持数据级并行,不适合于非图像任务等。

但还是那句话,对于基于卷积神经网络的成熟而通用的任务来说,Caffe是很不错的选择,它的学习价值,也永不褪色。



【杂谈】工程能力差,C++水平菜?CUDA没写过?我推荐玩下Caffe_CUDA_07

总结

C++和CUDA等代码的水平对于在工业界从事深度学习相关工作至关重要,差异化的能力更容易让你在竞争中取胜。


侵权必究

【杂谈】工程能力差,C++水平菜?CUDA没写过?我推荐玩下Caffe_深度学习_08

【杂谈】工程能力差,C++水平菜?CUDA没写过?我推荐玩下Caffe_深度学习_09

【杂谈】工程能力差,C++水平菜?CUDA没写过?我推荐玩下Caffe_深度学习_09

标签:..,框架,任务,C++,玩下,Caffe,CUDA
From: https://blog.51cto.com/u_14122493/5974299

相关文章

  • C++11:非受限联合体(union)
    在C/C++中,联合体(Union)是一种构造数据类型。在一个联合体内,我们可以定义多个不同类型的成员,这些成员将会共享同一块内存空间。老版本的C++为了和C语言保持兼容,对联合体......
  • Effective C++ 电子书 pdf
    EffectiveC++是世界顶级C++大师 ScottMeyers的成名之作,书中的50条准则,每一条都扼要说明了一个可让你写出更好的C++程序代码的方法,并以特别设计过的例子详加讨论。......
  • 预告!10 万字的 C++ 八股文 PDF
    大家好,我是小贺。北京最热的7月已经过去了,8月要来了。 晚餐过后散散步,走在小区旁边的小河边,凉风吹在脸上的感觉,就很舒服。每到周末的晚上,自己做做饭,小区周围散散步,吹吹......
  • 我是如何学好C++的?
    搞音视频开发,免不了要跟 C++打交道。不过,C++的复杂、难学也是出了名的。随着标准版本的演进,C++里包含的东西也越来越多。不断膨胀的核心语言加上庞大的标准库,让学习、使......
  • C/C++《数据结构课程设计》任务书[2022-12-27]
    C/C++《数据结构课程设计》任务书[2022-12-27]《数据结构课程设计》任务书一、任务总体安排:班级 设计时间 地点 指导老师21软件开发 17周每周一至周五五六节 徐青翠......
  • 编程语言那么多,为什么说C++无可替代?
    C++,一门名声在外的编程语言。作为一门多范式的通用编程语言,它适用的领域非常广泛,小到嵌入式,大到分布式服务器,到处可以见到C++的身影。  它的发展前景也非常广阔,作为未来......
  • c/c++ 大小写转换(位运算)
    #include<iostream>//大写转小写小写转大写staticcharUpperOrLower(charch){return(ch^0x20);}//转大写staticcharToUpper(charch){ret......
  • c++一些常用的知识
    时间复杂度:数量级     能承受的大致规模     常见算法0(1)         任意               输出O(lo......
  • cocos2d-x 通过JNI实现c/c++和Android的java层函数互调
    文章摘要: 本文主要实现两个功能:(1)通过Androidsdk的API得到应用程序的包名(PackageName),然后传递给c++层函数。(2)通过c++函数调用Android的java层函数,显示一个对话框......
  • C++11 新特性之Lambda函数(匿名函数)
    声明:本文参考了AlexAllain的文章​​http://www.cprogramming.com/c++11/c++11-lambda-closures.html​​加入了自己的理解,不是简单的翻译C++11终于知道要在语言中加入......