文章放在了新开的个人技术公众号Meteorix
,欢迎关注
BERT Runtime
BERT Runtime
最近继续怼BERT,项目大部分模型都上了BERT,真香啊。
本来一直在使用PyTorch JIT
来解决加速和部署的问题,顺手还写了个service-streamer来做web和模型的中间件。
正好上个月NVIDIA开源了基于TensorRT
的BERT代码,官方blog号称单次inference
只用2.2ms,比cpu快20倍。但是正确的问法是:这东西能比TF/PyTorch快多少呢?
于是从TensorRT开始,认真学习了一波NVIDIA的BERT实现。并做了性能Benchmark对比TensorFlow和PyTorch,结论是gpu时间能快15%-30%。主要归因于对BERT的计算图优化,自己实现了4个cuda kernel,另外避免了TensorFlow和PyTorch等框架带来的overhead。
Prerequisite
比较有用的几个背景知识:
- 当然是BERT的Paper,Tensorflow实现,PyTorch实现
- Harvard写的著名解读The Annotated Transformer
- GPU和Cuda基础知识,很简单可以参考我的cuda101
TensorRT
TensorRT是NVIDIA官方推出的inference引擎,建立在CUDA之上。可以对TensorFlow/PyTorch
等框架训练出来的模型进行CUDA优化,达到更高的inference性能。同时支持低精度参数、跨平台部署等,总之就是对自己家的GPU使用的最好。
cuda 101
cuda 101
最近开始做深度学习后端和性能优化,做到模型部分需要补补gpu和cuda知识。记录此篇入门笔记,配合官方文档食用。
NVIDIA的官方文档和blog写的真好,读了一天非常舒服。很多之前调包(Pytorch/Tensorflow)不理解的地方,都有更深的认识,期待尽早开始写自己的kernel。
get started
从这篇官方博客开始quickstart,写的非常好,可以快速了解gpu特性、编程模型、显存等
https://devblogs.nvidia.com/even-easier-introduction-cuda/
线程结构
6年后,为什么离开网易游戏
在网易游戏待了六年,如果说这里是一所大学,那我也算毕业了,能拿个优秀毕业生吗:-D
游戏改变世界
小s面试时问我梦想是什么,我想了很久说出这个答案。虽然听起来很中二,我今天依然相信,技术可以改变世界。在GDC和GoogleIO上发布Airtest,算是达成了一点小目标。可是做游戏,至少在网易,离梦想却是渐行渐远。
本科时认真做的两件事,考GRE和打Dota。以前我是个狂热的游戏玩家,打游戏就是要赢。为了Dota毕业杯,能拉十个人去训练个把月,热血依旧。清晰地记得当时的心境,做游戏多有激情,为何要去美帝大农村?于是拒掉USC,来到网易。
Pyflame解析和扩展
Pyflame是uber开源的一个python性能profiler。
没有profile的优化就是耍流氓
说起python,被吐槽最多的就是慢。根据上面的名言,首先我们需要一个性能profiler。
profiler的两种原理
profile工具基本分成两种思路:
插桩
这个理解起来非常直白,在每个函数的开始和结束时计时,然后统计每个函数的执行时间。python自带的
Profile
和cProfile
模块就是这个原理。但是插桩会有两个问题,一是插桩计时本身带来的性能消耗overhead
极大,二是对一个正在运行的程序没法插桩。采样
采样是注入正在运行的进程,高频地去探测函数调用栈。根据大数定理,探测到次数越多的函数运行时间越长。pyflame正是基于采样的原理。统计结果用另一个神器——火焰图flamegraph展示,我们就可以完整地了解cpu运行状态。
使用pyflame和火焰图
官方提供了pyflame源码,需要自己编译对应python版本,然后调用flamegraph生成火焰图svg。具体可以看官方文档。为了方便自己人使用,我写了个pyflame-server。
记一次pytorch的coredump调试
两个算法小哥写了个flask的web服务器,跑ocr的服务。单个请求是好的,多请求就崩了, log就显示:
Segmentation fault (core dumped)
“wtf is core dump?”
just google it, 简单说就是程序崩溃之后dump出来的一些信息
调试到了凌晨2点,加了一堆log,还是没有找到原因,看起来很随机。第二天找到我:
python coredump了怎么办?
为了debug这个coredump,先打开系统设置
1
ulimit -c unlimited
再次制造coredump,在当前目录下就产生了一个4G的core文件
1
-rw------- 1 liuxin root 4.2G 4月 29 14:21 core
core文件就是保存了crash时候的所有信息,调用栈、线程、内存等。然后运用我们的linux c++开发经验,可以知道用gdb来调试coredump文件
1
gdb <executable> <coredump file>
等等,这里我们是python程序崩了,为什么没有traceback?因为在调用到pytorch的c++代码时,直接segmentfault,并没能等到python的退出机制打印出traceback,直接崩了。但是操作系统能产生coredump文件,这是我们的救命稻草。
vs2017混合调试py/c++
vs2017混合调试py/c++
python卡死了怎么办?
一般的python程序卡死,可以用pycharm debug。但是有时候是python和c/c++库混合开发,比如pyqt或者boost python程序卡死,就非常难查。以前都是二分法注释代码查找问题,异常低效。
于是我尝试了vs2017的新功能:python & c++ 混合调试 Debug Python and C++ together
vs2017 python
vs一直被称为宇宙最强IDE,貌似python支持是vs2017新加的功能。相比pycharm之类的python编辑器,vs2017最大的优势就是在python和native c/c++代码的混合调试。包括:
- python / c++ 调用栈合并显示
- python / c++ 都可以断点
- python / c++ 代码之间step
- python / c++ 对象都可以watch
由于python的性能瓶颈,很多时候混合开发需要同时调试,这正是我们需要的!
gdb调试cpython
gdb调试cpython
主要参考这篇文章:
- https://www.podoliaka.org/2016/04/10/debugging-cpython-gdb/
- https://blog.alswl.com/2013/11/python-gdb/
同时debug c栈和py栈
在调试脚本卡死的时候特别有用,如下图
安装python-dbg
1 | sudo apt-get install gdb python-dbg |
新ubuntu环境搭建
Airtest刷刷抖音
Airtest刷刷抖音
用Airtest做点有意思的事情,先来刷个抖音?
Get Started
环境准备
手边没有android手机,iOS又懒得搭ios-tagent的环境,于是采用最偷懒的方式:
- 夜神模拟器(可用安卓机代替)
- AirtestIDE