作者 | 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。当时的版本提供以下超赞的功能:

  1. 支持单GPU上的多模型&单模型多实例

  2. 支持多种backends框架(TensorRT、Tensorflow)

  3. 动态Batch增加吞吐

  4. 提供负载均衡及状态监测

所以又花了几天把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 项目相关推荐

  1. 那一年,让我整个人升华的C++ BERT项目

    大家好,我是rumor. 最近知乎有个很火的问题:「你的编程能力从什么时候开始突飞猛进?」,每次信息流刷到的的时候都会拨动我记忆的缓存,让我想起那段大起大落的时光. 19年夏的某一天,在各大公司陆续推 ...

  2. 在对人的管理上,项目经理应该做些什么?

    在对人的管理上,项目经理应该做些什么? 2010-09-26 18:51:00 标签:企业管理 博客话题 人 管理 项目经理 [推送到技术圈] 版权声明:原创作品,如需转载,请与作者联系.否则将追究法 ...

  3. 农村有什么适合农村人的小本创业项目?

    近些年新农村的快速发展趋势,农村是销售市场室内空间发展趋势愈来愈宽阔,很多地域发生了一些农村妇女创业的创业人.传统式买卖发展趋势情况近几年来一直走下坡,那麼在农村有什么适合农村人的小本创业项目? 农村 ...

  4. #边学边记 必修5 高项:对人管理 第2章 项目沟通管理和干系人管理 2-5 项目干系人管理

    导学 重要知识点:干系人分析,干系人分类.分析技术.项目干系人管理过程的输入.工具与技术.输出等.下午的案例题可能会涉及与项目干系人管理知识点相关的简答题. 干系人管理的过程 1. 识别干系人 识别能 ...

  5. 山东人社厅灾备项目建设

    A5包.同城容灾系统建设 一.供应商资格要求 1.符合<×××政府采购法>第二十二条的规定. 2.供应商的资质要求:(1)具有计算机信息系统集成二级及以上资质 二.技术要求 背景及现状 随 ...

  6. 哈哈哈,这个教人写烂代码的项目在 GitHub 上火了...

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 如果说到什么是好代码,我们肯定都能说出一堆规则,例如使用一致的格式 ...

  7. 如何做到让屏幕中的人不翼而飞?这个JavaScript项目告诉你该怎么做!

    大家好,我是TJ 一个励志推荐10000款开源项目与工具的程序员 TJ君今天发现一个很好玩的项目,竟然只用JavaScript.js就可以使一个视频中的人物凭空消失!你说神奇不神奇? 那到底是怎么做到 ...

  8. 另类交易所再次让人跌破眼镜,放权项目方星客究竟意欲何为?

    摘要:春苗计划启动之后新生项目将迎来前所未有的机遇 进入十一月之后,数字货币行业的景象可谓是悲喜两重天,前一天还沉浸在巨大的利好消息中,后一天就又被突如其来的负面消息狠狠打脸.圈子里面上上下下高涨的热 ...

  9. #边学边记 必修5 高项:对人管理 第2章 项目沟通管理和干系人管理 2-1 沟通的基本概念

    导学 偏重于概念知识,涉及到下午案例,重要知识点有: 沟通模型 沟通渠道数量计算 沟通的方式 沟通渠道 沟通方法 沟通管理计划的内容 管理沟通 控制沟通 沟通的输入.工具与技术.输出 过程名 输入 工 ...

最新文章

  1. 判读一个对象不为空_LabVIEW面向对象编程_初窥门径(3):开发实践
  2. Oracle的FIXED_DATE参数
  3. 类属性的存储和this指针
  4. linux安装joomla,安装Joomla
  5. hook 与aspectj_将AspectJ与NetBeans平台开发集成
  6. linux的硬件系统管理,Linux 系统硬件管理的基础知识(四)
  7. 下拉菜单(含有阻止事件冒泡)
  8. WebFlux响应式编程基础之 2 函数式编程 工具jclasslib bytecode viewer
  9. PDF模板报表导出(Java+Acrobat+itext)
  10. 友盟分享纯图片到微信
  11. JavaScript和TypeScript学习总结
  12. excel实现分组计数
  13. MBA教学目标、内容和方法
  14. 我国古代数学家张丘建在《算经》一书中曾提出过著名的“百钱买百鸡”问题,该问题叙述如下: 鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,则翁、母、雏各几何?
  15. mysql创建、修改、删除索引和主键
  16. Java swing 写会员卡管理系统
  17. cad注释比例和打印比例不一样_CAD注释性比例该如何设置?看完你就懂了
  18. c++,数组与指针的差别
  19. 《设计模式解析》读书笔记
  20. 【Python个人学习笔记】--- pyc文件(了解)

热门文章

  1. Activity如何后台运行?不是缓存,是运行。
  2. 远程实习 | 达特茅斯学院招收网络嵌入和图挖掘方向研究型实习生
  3. 北京/上海/深圳内推 | 百度视觉技术团队招聘视觉/3D算法工程师
  4. 出道即巅峰,掀起AI领域巨浪的GPT-3来啦
  5. 李德毅院士:智能时代的农机驾驶——人工智能一百年
  6. 四种常见NLP框架使用总结
  7. 40亿次仿真学习:人工智能5:0大胜人类飞行员
  8. GPT-3 1750亿参数少样本无需微调,网友:「调参侠」都没的当了
  9. 谷歌开源文本生成新方法 LaserTagger,直击 seq2seq 效率低、推理慢、控制差三大缺陷!
  10. 微软分享史上最大基于Transformer架构的语言生成模型