两个脑洞的工作方向
- 2020 年 4 月 22 日
- AI
不负责任的两个脑洞的技术方向。
A. 异构计算部署
如果业务背景比较单纯的话,模型部署可以简单粗暴,这个问题其实也没有凸显出来。不过,一旦整个业务流程复杂度增加,怎样利用好所有异构硬件,overlap算力外的开销,榨干硬件上的每一分算力,提高整个系统的吞吐量就成为值得解决的问题。
这也可以看作分布式模型训练增加吞吐量的方法在模型推理阶段的扩展,只不过有一些稍微的不同:
1. 不仅仅是单一模型
实际应用中会有很多复杂业务场景,组合成不同的模型流程,比如 NVIDIA 在推的 DeepStream 就是试图增加业务流程灵活性的体现,不同的业务流会需要不同的模型组成。比如,一个典型的 CV 流程可能是:快速的目标检测 -> 提取目标后根据类型分配给不同的模型(比如,分割、细粒度分类、回归模型)。
具体的,放在自动驾驶上,可能会有这些流程:
- 一个快速的目标检测算法,获得目标框和大致类型
- 车辆交给关键点和回归模型预测 3D box,车辆朝向,距离,车速
- 行人交给另外的模型预测运动轨迹
- 车道开始分割和聚类
- 红绿灯定位后,可能需要第二个长焦摄像头数据进行具体类别分析
- 路面、路上各种标识的分类,OCR
- 各种关注目标的跟踪、ReID、数据结构维护
人脸识别上基本也是类似流程,每一步可能都会是一个模型(当然,理想主义情况下,最好一个模型能够搞定以上所有)。
这些模型的算力要求、模型大小、调用频率都各不相同,需要更好的安排模型运行,才能增加并行性、提高系统的吞吐量或者实时性。
2. 不仅仅是模型
- 有些模块可能并不需要模型,比如编解码、预处理,
- 还有一些逻辑上的工作,比如不同模型的可能共享或者使用不同的预处理。
这些模块都需要通过更好的设计来增加并行性,甚至可能需要动态的分配不同的硬件。
3. 不仅仅是完整模型
模型的各个部分可以拆分到不同的硬件上,通过更加细粒度的调度算法来提升整体的性能,甚至还可以做到运行时根据负载动态调度。
技术前提
- 算子化,大部分的操作要能够实现算子化,方便调度算法。
- 不同架构下的算子一致性,最好有类似 Rocm 的编译能力,同样的一份代码可以编译到不同的硬件平台上。
- 各个硬件的算力分析/预估能力。
- 调度搜索算法,目前我接触的是 Zhihao Jia 的工作涉及到这一部分: //cs.stanford.edu/people/zhihao/
B. 大规模向量搜索
神经网络(NN)基本是所有非结构化数据的标配,图像、文本、声音,都可以用 distributed representation来表示,按照NN的思路现在都是 everything2vec。
之前也有一些空间搜索,比如我最早的接触是 reverse geocoding,靠着 KD-tree,问题也不大,尤其是 POI(point of interest) 全国加起来几千万顶天,还有行政地理区间这样的限制可以减少搜索量。不过按照 xx2vec 的节奏,数据量只会指数级的膨胀。
相比之前的文本搜索引擎,专注向量搜索的引擎似乎还没有完全成熟的解决方案,不过很多搜索相关的公司已经有库放出了,目前自己已知的有:
- Facebook AI 的 FAISS 库
- 国人开发的 Milvus://www.milvus.io/cn/ 目前似乎现在正在稳步成长
- Microsoft AI lab 的 SPTAG //github.com/microsoft/SPTAG
这里还有一些ANN库的性能资料,里面雅虎Japan的NGT倒是很有优势://github.com/erikbern/ann-benchmarks