那一年,让我整个人升华的 C++ BERT 项目
作者 | rumor
来源 | 李rumor(ID:leerumorr)
最近知乎有个很火的问题:「你的编程能力从什么时候开始突飞猛进?」,每次信息流刷到的的时候都会拨动我记忆的缓存,让我想起那段大起大落的时光。
19年夏的某一天,在各大公司陆续推出自己预训练的BERT,并开始用它们做离线任务时,leader把我叫进会议室,说老大想上线BERT,需要尽快写一个C++版本的BERT服务。
不是那种用tfserving或者libtorch哦,是直接用C++写。
我面无波动地答应了下来,实则内心已经裂开了。
自己不是CS科班出身,压根没写过完整的C++项目,虽然有些Java基础,但到底几斤几两我还是蛮清楚的。
打比方的话,就是让第一次玩塞尔达、刚开完四个神庙、出了新手村的我直接去打盖农,悲壮之感难以言表。
整个人都不好了
但我作为新时代的自强女性,还是开启了冲向海拉尔中心的旅程。
第一步,就是搜集可以参考的开源项目。
Fortunately,我找到了知乎开源的cuBERT项目,作者写得特别清楚,并且同时提供了GPU和CPU版本,但老板看了速度之后仍不太满意,最终我靠着极强的搜索技术又找到了英伟达刚开源的fastertransformer,用Cuda C++直接实现了transformer底层运算,速度秒杀其他方案。
在经历了各种make、install的折磨之后,我终于摸清了如何在服务器配置相关lib并运行c++代码,也顺利跑通了官方demo,性能完全符合预期。但不能高兴得太早,因为这个库只有transformer层的实现,前面的tokenization、embedding、pooling都没有写。。所以,这意味着我要读懂源码,然后自己把剩下的补全。
第二步,我开始读源码改项目。
这里有碰到了第一个难点,就是跑官方给的模型没问题,但运行我们自己的模型后就出现了 nan 这个恐怖的结果。于是我开始使用 print 大法,但惊讶地发现 cuda 底层全是并行的,一打日志都是乱的。。。于是我学会了 synchronize,在每个 operation 之后同步再打印结果,最终花了两天时间定位了问题:原来是Softmax没加溢出保护。立刻给作者提issue,不过在等待作者回复的过程中我居然自己给改好了,还默默学会了 Parallel Reduction 算法。
期间我还会卡在各种各样的事情上,经常会卡上一两天,陷入自我放弃的漩涡。
最终还是搞懂了源码,搞懂了cuda运算,并加上输入输出层搞出了完整的C++ BERT。
但仅仅有个程序还是不够,服务接口在哪里呢?
第三步,整一个服务。
于是我又搜啊搜,找到了一个宝藏:TensorRT Inference Server。当时的版本提供以下超赞的功能:
支持单GPU上的多模型&单模型多实例
支持多种backends框架(TensorRT、Tensorflow)
动态Batch增加吞吐
提供负载均衡及状态监测
所以又花了几天把C++ BERT适配TensorRT框架,成功变成了服务。
变成服务之后又有问题,就是每次换机器都要重新配置环境并部署,于是我又学会了docker,减轻运维负担。
通关了!
整个改造差不多耗时小两个月,也是我工作至今记忆最深的一段时刻。
我永远忘不了,那种看着看着代码就想站起来掀桌子的感觉。可以一起体会下:
template <typename T>__inline__ __device__
T blockReduceMax(T val)
{static __shared__ T shared[32]; int lane = threadIdx.x & 0x1f; // in-warp idxint wid = threadIdx.x >> 5; // warp idxval = warpReduceMax(val); // get maxx in each warpif(lane == 0) // record in-warp maxx by warp Idxshared[wid] = val;__syncthreads();val = (threadIdx.x < (blockDim.x >> 5 )) ? shared[lane] : -1e20f;val = warpReduceMax(val);return val;
}
当然也忘不了身边同事牺牲自己时间给我的帮助,还有lead和我一起翻了半天C++ Premier才解决问题的欣喜。
故事的后来很圆满,压测效果满意,成功服务了团队的BERT上线。包括后来我在20年初和其他两个大厂团队的人交流,都没有听到过更快的速度,甚至有同学直接质疑了我,因为他们的时延是我们的两倍......
去挑战一座山吧
现在回想起来,这段经历真的太宝贵了。虽然不想再经历一次,但自那以后我再也没怕过任何代码。
做算法也有了底气,我可是搞过CUDA C++的女人,别叫我调包侠。
如果想快速提升,那就去挑战一座山吧,找一个高质量的项目,读懂并进行修改,在一次次自我放弃中成长。
就像走过高考、走过考研、走过校招那样,过去那道坎就没什么了。
☞爱奇艺一程序员用 10 万元“买”了个北京户口
☞壕!阿里开工红包惊人,最高 1000 万,有人却只收到一杯白开水
☞谷歌称居家办公影响工作效率!2021 年将回归线下办公
☞雷军坚持了 10 年的东西,现在彻底凉了
点分享点收藏点点赞点在看
那一年,让我整个人升华的 C++ BERT 项目相关推荐
- 那一年,让我整个人升华的C++ BERT项目
大家好,我是rumor. 最近知乎有个很火的问题:「你的编程能力从什么时候开始突飞猛进?」,每次信息流刷到的的时候都会拨动我记忆的缓存,让我想起那段大起大落的时光. 19年夏的某一天,在各大公司陆续推 ...
- 在对人的管理上,项目经理应该做些什么?
在对人的管理上,项目经理应该做些什么? 2010-09-26 18:51:00 标签:企业管理 博客话题 人 管理 项目经理 [推送到技术圈] 版权声明:原创作品,如需转载,请与作者联系.否则将追究法 ...
- 农村有什么适合农村人的小本创业项目?
近些年新农村的快速发展趋势,农村是销售市场室内空间发展趋势愈来愈宽阔,很多地域发生了一些农村妇女创业的创业人.传统式买卖发展趋势情况近几年来一直走下坡,那麼在农村有什么适合农村人的小本创业项目? 农村 ...
- #边学边记 必修5 高项:对人管理 第2章 项目沟通管理和干系人管理 2-5 项目干系人管理
导学 重要知识点:干系人分析,干系人分类.分析技术.项目干系人管理过程的输入.工具与技术.输出等.下午的案例题可能会涉及与项目干系人管理知识点相关的简答题. 干系人管理的过程 1. 识别干系人 识别能 ...
- 山东人社厅灾备项目建设
A5包.同城容灾系统建设 一.供应商资格要求 1.符合<×××政府采购法>第二十二条的规定. 2.供应商的资质要求:(1)具有计算机信息系统集成二级及以上资质 二.技术要求 背景及现状 随 ...
- 哈哈哈,这个教人写烂代码的项目在 GitHub 上火了...
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 如果说到什么是好代码,我们肯定都能说出一堆规则,例如使用一致的格式 ...
- 如何做到让屏幕中的人不翼而飞?这个JavaScript项目告诉你该怎么做!
大家好,我是TJ 一个励志推荐10000款开源项目与工具的程序员 TJ君今天发现一个很好玩的项目,竟然只用JavaScript.js就可以使一个视频中的人物凭空消失!你说神奇不神奇? 那到底是怎么做到 ...
- 另类交易所再次让人跌破眼镜,放权项目方星客究竟意欲何为?
摘要:春苗计划启动之后新生项目将迎来前所未有的机遇 进入十一月之后,数字货币行业的景象可谓是悲喜两重天,前一天还沉浸在巨大的利好消息中,后一天就又被突如其来的负面消息狠狠打脸.圈子里面上上下下高涨的热 ...
- #边学边记 必修5 高项:对人管理 第2章 项目沟通管理和干系人管理 2-1 沟通的基本概念
导学 偏重于概念知识,涉及到下午案例,重要知识点有: 沟通模型 沟通渠道数量计算 沟通的方式 沟通渠道 沟通方法 沟通管理计划的内容 管理沟通 控制沟通 沟通的输入.工具与技术.输出 过程名 输入 工 ...
最新文章
- 判读一个对象不为空_LabVIEW面向对象编程_初窥门径(3):开发实践
- Oracle的FIXED_DATE参数
- 类属性的存储和this指针
- linux安装joomla,安装Joomla
- hook 与aspectj_将AspectJ与NetBeans平台开发集成
- linux的硬件系统管理,Linux 系统硬件管理的基础知识(四)
- 下拉菜单(含有阻止事件冒泡)
- WebFlux响应式编程基础之 2 函数式编程 工具jclasslib bytecode viewer
- PDF模板报表导出(Java+Acrobat+itext)
- 友盟分享纯图片到微信
- JavaScript和TypeScript学习总结
- excel实现分组计数
- MBA教学目标、内容和方法
- 我国古代数学家张丘建在《算经》一书中曾提出过著名的“百钱买百鸡”问题,该问题叙述如下: 鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,则翁、母、雏各几何?
- mysql创建、修改、删除索引和主键
- Java swing 写会员卡管理系统
- cad注释比例和打印比例不一样_CAD注释性比例该如何设置?看完你就懂了
- c++,数组与指针的差别
- 《设计模式解析》读书笔记
- 【Python个人学习笔记】--- pyc文件(了解)
热门文章
- Activity如何后台运行?不是缓存,是运行。
- 远程实习 | 达特茅斯学院招收网络嵌入和图挖掘方向研究型实习生
- 北京/上海/深圳内推 | 百度视觉技术团队招聘视觉/3D算法工程师
- 出道即巅峰,掀起AI领域巨浪的GPT-3来啦
- 李德毅院士:智能时代的农机驾驶——人工智能一百年
- 四种常见NLP框架使用总结
- 40亿次仿真学习:人工智能5:0大胜人类飞行员
- GPT-3 1750亿参数少样本无需微调,网友:「调参侠」都没的当了
- 谷歌开源文本生成新方法 LaserTagger,直击 seq2seq 效率低、推理慢、控制差三大缺陷!
- 微软分享史上最大基于Transformer架构的语言生成模型