发布于: Aug 23, 2022
深度学习框架决定了一个任务处理的能力,以 TalkingData 公司为例,该公司为了优化自己的大数据推理方案,采用 DJL(Deep Java Library)重构了他们的推理应用。DJL 提供了基于 Java 的 PyTorch 引擎库,这使得他们可以直接将这个库部署在 Spark 上。如下图所示,所有的任务都可以在 Spark 集群中实现:
- 降低了失败率:相比于单点故障,Spark 可以很轻松的调度算力来进行重启。
- 降低算力成本:相比于 GPU 的解决方案,完全基于 Spark 的方案可以充分使用 Apache Spark 本身的算力,从而节约成本。减少使用 GPU 机器大约节省了 20% 的总计算成本。
- 降低维护成本:Spark 的容错机制可以轻松应对故障,同时单一语言降低了多个语言维护的成本。
- 大幅提升性能:DJL 的多线程支持在 Apache Spark 上提升了性能。
在使用了 DJL 之后,TalkingData 成功的将总体任务运行时间降低到了 2 小时左右。相比于从前的单 GPU 解决方案,性能提升了三倍。同时,这套方案无论从短期还是长期都降低了运行成本。
DJL 可以让用户更灵活的调度分布式算力。在 PyTorch 高级设置中,用户可以选择优化算子的并行数,还有最多线程的并行数(用于提升推理性能)。DJL 提供了类似的选项:只需设定 num_interop_threads 和 num_threads 便可以轻松调度。这些选项可以同时与 Apache Spark 每个 Executor 的核心数目一起改变 –num-executors 这样他们都可以使用相同的 CPU 数目。这样,DJL 可以像 PyTorch 本身一样帮助用户进一步调优算力。
为了确保基于 DJL 的 PyTorch 解决方案与基于 Python 的 PyTorch 结果一致。TalkingData 数据科学组进行了严谨的比对测试。测试集大约 44 万条。下面是 PyTorch Python 与 DJL 的比对结果:
Column 1 |
Column 2 |
Column 3 |
项目 |
结果 |
解释 |
总数 |
4387830 |
测试集总数 |
平均值 |
5.27E-08 |
偏差平均值 |
方差 |
1.09E-05 |
方差 |
p25 |
0.00E+00 |
从小到大排列前25%的数据偏差 |
p50 |
2.98E-08 |
从小到大排列前50%的数据偏差 |
p75 |
5.96E-08 |
从小到大排列前75%的数据偏差 |
p99 |
1.79E-07 |
从小到大排列前99%的数据偏差 |
max |
7.22E-03 |
最大偏差值 |
这个实验验证了 DJL 在推理应用上十分可靠,超过 99% 的数据都是在 10^-7 以内的,换句话说,浮点数差别低于 0.0000001。我们同时也验证了最大偏差值的产生原因:是因为数据在传递过程中的精度损失导致的。
想了解更多关于 DJL 在 Spark 上的应用,可以参考 GitHub 上 DJL Spark 的案例,也可以参考这篇博客了解更多关于 Spark 的推理应用。
TalkingData 现今已经在生产环境中使用 DJL 在 Apache Spark 上进行大规模的深度学习推理应用。他们选择 DJL 的几个主要原因
1)显著减少了很大的其他架构的维护成本
2)DJL帮助 TalkingData 充分利用了已有的 Spark 算力
3)DJL 不局限于深度学习引擎,他们可以在很少改变代码的情况下,在未来新的任务上很轻松的部署任何深度学习模型。
Deep Java Library (DJL) 是一个基于 Java 的深度学习框架,同时支持训练以及推理。DJL 博取众长,构建在多个深度学习框架之上 (TenserFlow, PyTorch, MXNet, etc)也同时具备多个框架的优良特性。你可以轻松使用 DJL 来进行训练然后部署你的模型。它同时拥有着强大的模型库支持:只需一行便可以轻松读取各种预训练的模型。现在 DJL 的模型库同时支持高达 70 个来自 GluonCV, HuggingFace, TorchHub 以及 Keras 的模型。
相关文章