4 Python机器学习性能优化

CodeWarrior

2019/10/11 发布于 技术 分类

文字内容
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] . • Web API: $ curl -X POST http://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