大家好,我是rumor。

最近知乎有个很火的问题:「你的编程能力从什么时候开始突飞猛进?」,每次信息流刷到的的时候都会拨动我记忆的缓存,让我想起那段大起大落的时光。

19年夏的某一天,在各大公司陆续推出自己预训练的BERT,并开始用它们做离线任务时,lead把我叫进会议室,说老大想上线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++的女人,别叫我调包侠

如果想快速提升,那就去挑战一座山吧,找一个高质量的项目,读懂并进行修改,在一次次自我放弃中成长。

就像走过高考、走过考研、走过校招那样,过去那道坎就没什么了。

最后,为了push你们学习,直接把我总结的CUDA编程入门干货送给大家,公众号后台回复「cuda」获取链接~

---

大家好我是rumor

一个热爱技术,有一点点幽默的妹子

欢迎关注我

带你学习带你肝

一起在人工智能时代旋转跳跃眨巴眼

「调包的日子,单纯快乐」

那一年,让我整个人升华的C++ BERT项目相关推荐

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

    作者 | rumor 来源 | 李rumor(ID:leerumorr) 最近知乎有个很火的问题:「你的编程能力从什么时候开始突飞猛进?」,每次信息流刷到的的时候都会拨动我记忆的缓存,让我想起那段大起 ...

  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. 作为mwp 和real 不错的资料
  2. HCNA多区域OSPF配置
  3. 【Java TCP/IP Socket】TCP Socket通信中由read返回值造成的的死锁问题(含代码)(转)...
  4. 遇到“BUG: soft lockup - CPU#0 stuck for 22s”的解决思路
  5. u-boot支持LCD显示(基于TQ2440)
  6. 浦银行面试总结(信息科技部)
  7. 年后开课 | 第 4 期临床基因组家系分析,助力发表Case Report
  8. cv方向有哪些_计算机视觉(CV)与交通的千丝万缕
  9. 小车手app安卓版下载_美森网校app下载_美森网校安卓版下载[英语培训]
  10. Mac SnailSVN不显示状态图标
  11. linux游戏掌机,一起来猎奇:窄众平板/游戏掌机推荐
  12. 未知病毒篡改火狐浏览器主页修复方法
  13. (转)Java面试笔试题大汇总(最全+详细答案)
  14. EXCEL表格-按条件求和、求平均值、求个数详解
  15. ST-LINK/V2:cannot reset target shutting down debug session
  16. 在Redhat9上安装Oracle 9.2
  17. 广告过滤算法实现及优化
  18. Python下安装Pywifi进行WiFi密码破解
  19. android时间控件
  20. PHP对接支付宝当面付详细教程

热门文章

  1. 找鞍点(C语言实现)
  2. 左子树中最右节点≠左子树中最右叶节点
  3. 【NOIP模拟赛】异象石
  4. 一张图读懂一个产业短视频第5期
  5. Android Studio在vivo Y93手机上调试apk出现解析包出错
  6. 抖音小店无货源是不是在割韭菜?
  7. python我的世界给予物品指令_我的世界指令给予物品
  8. 计算机数学应用研究生,应用数学研究生院校排名
  9. 2021-2027全球与中国医用级不间断电源市场现状及未来发展趋势
  10. 职业观的形成和提高职业素养