4 Python机器学习性能优化
2020-03-01 209浏览
- 1.Python机器学习性能优化 以BERT服务为例例,从1到1000 刘欣
- 2.⽬目录 CONTENTS 1. 优化的哲学 2. 了解你的资源 3. 定位性能瓶颈 4. 动⼿优化
- 3.1. 优化的哲学 "There ain't no such thing as a free lunch"
- 4.Ahmdal’s Law • 系统整体的优化,取决于热点部分的占⽐比和该部分的加速程度
- 5.No Free Lunch • 定位热点 & 热点加速 • 对于项⽬目开发周期: 1. 先做出效果 2. 确定整体pipeline 3. 再考虑优化 • 对于⼈人⼯工智能项⽬目:迭代周期更更⻓长,更更是如此
- 6.以BERT服务为例 • BERT: TODO: ⼀一句句话解释 • 横扫多项NLP任务的SOTA榜 • 惊⼈人的3亿参数
- 7.以BERT服务为例 • Self Attention机制 • 预训练 + Finetune
- 8.以BERT服务为例 • 完型填空任务: Happy birthday to [MASK] . • WebAPI:$ curl -X POSThttp://localhost:5005/predict-d 's=Happy birthday to [MASK].' [“you"]
- 9.以BERT服务为例 • 我们现在上线了了这样⼀一个服务,每秒钟只能处理理10个请求 •Q:⼤大家⼀一开始如何着⼿手优化 •
- 10.Profile before Optimizing • 建⽴立闭环
- 11.2 了解你的资源 cpu/内存/io/gpu
- 12.GPU为什么“快”?
- 13.计算⼒对⽐ • GFLOPS/s 每秒浮点数计算次数
- 14.摩尔定律的限制 • “集成电路路上可容纳的晶体管数⽬目,约每⼗十⼋八个⽉月便便会增加⼀一倍” CPU更更多⽤用在了了Cache(L1/L2/L3)和Control GPU绝⼤大部分⽤用来在了了ALU计算单元
- 15.GPU特性 • SIMD • 显存分级 • 异构&异步
- 16.Python为什么“慢”?
- 17.Flask Development Server • 默认threaded server • GIL限制多核使⽤用 • 解释执⾏行行:序列列化慢(动态特性的tradeoff)
- 18.Flask Production Server • gunicorn 多进程解决多核利利⽤用率问题 • gevent 协程替代多线程⽹网络模型 • 更更⾼高效的序列列化lib
- 19.3 定位性能瓶颈 Profile before Optimizing
- 20.Python Profilers • • • • time.time() cProfile line profiler pyflame
- 21.line profiler • 放个截图
- 22.cProfile • 倒序打印 & graph
- 23.pyflame • 插桩 or 采样 • 放个flamegraph • 开源地址
- 24.wrk • 制造压⼒力力 • 挖掘整体性能瓶颈 • 实现⾮非常精妙的压⼒力力⼯工具,强烈烈安利利(要不不要写个py binding)
- 25.4 动⼿优化
- 26.多线程服务器的问题 • 每个请求单独进GPU,利利⽤用率不不⾼高 • ⼤大量量请求并⾏行行,CUDA会爆 • wrk截图
- 27.service-streamer • 请求排队组装成batch,再⼀一起送进GPU • ⼀一个GPU worker只会有⼀一条队列列,最⼤大batch size可控 • 多个GPU worker分布式处理理 • todo:补图
- 28.batch predict profile • 有了了service-streamer: ⽹网络服务性能 等价与 本地batch predict的性能 • 再次profile:这⾥里里先卖个关⼦子,猜猜哪⼀一步是瓶颈 • Bert Tokenize远⾼高于inference时间 • 再次说明:先profile再优化
- 29.pybind c++ extenstion • pybind11 • 感谢知乎cuBERT提供的c++实现 • ⽤用pybind11⼀一波封装 • 再加上正经多线程
- 30.model inference optimize • 终于到了了我们直觉的优化部分 • 先补了了补GPU和Cuda的知识 • ⼏几个可以选择的⽅方案: 1. 买更更多更更贵的机器器——fp16、v100、cpu化 2. 优化算法——知识蒸馏 3. 优化实现——jit/TensorRT
- 31.PyTorch jit • 原理理介绍 • 转化为graph截图
- 32.TensorRT • NVIDIA推出的inference引擎 • ⾃自家硬件使⽤用到极致 • 与CPU⽐比较:20x faster • 正确的问法: 与TF/PyTorch⽐比较如何?
- 33.BERT runtime • 使⽤用SQuAD任务测试,输⼊入padding到328,batch size分别取1和32 • 计时代码只包含GPU时间,排除掉前后处理理时间,另包含数据在 CPU和GPU之间copy的时间
- 34.异步执⾏ • CPU与GPU异构,所以可以异步 • PyTorch也是异步执⾏行行,所以没有带来提升
- 35.cuda优化 • 更更⾼高效的kernel函数实现,替代默认导出的算⼦子
- 36.知识蒸馏 • Teacher Student 学的更更快 • Huggingface Distill BERT • 12层 蒸出 6层
- 37.what’s next? • TensorRT inference server 改变pipeline • cpu化 不不在意延时,只追求吞吐量量 • fp16低精度
- 38.THANK YOU Meteorix 刘欣 github.com/Meteorix 15927607981