企业应用中的计算(下)

在前文中,我们描述了一个计算的算法结构模型。接下来,我们要设计这个计算的算法运行时。在实践中,对之前的算法结构模型设计做了一些细微的调整,例如,无序的栈区被去除了,就地计算更加高效。另外,引入了Layout Template的概念,Calculation Context被用于组织算法运行时。

在算法运行时,我们需要为本次计算开辟一块内存空间。为了确保这块内存空间尽可能的小,需要一个新的结构来容纳必须的数据。这个结构将不包括算法布局模板中的元数据信息,例如,指定一个算法布局以并行方式运行,指定计算子的求值结果是否需要输出,指定计算子求值结果的精度等。算法结构中的各个模型实例可以通过引用来获得元数据。

计算子的定位是另一个重要的概念。前文提到的场景表明,此类计算中前后的计算子求值存在着相互依赖的关系。因此,我们引入了Item Location Map的概念,确保有一个快速的连接路径来定位计算子的锚。下面是最终设计的算法运行时,见图4。

图4

值得一提的是,每一个计算布局都需要指定是否需要采用并行计算。这和实际的计算场景有关,基于NQ模型,在某些场景下,并行计算所带来的调度开销可能大于其带来的好处,有兴趣的朋友可以看看这篇文章。

更多的算法细节这里就不赘述了。下图是最终求值的部分结果截图,见图5。我的E450笔记本计算耗时300ms左右,相信在40核的服务器上会有更好的表现。

图5

正如前文所述,在企业应用中,算法设计通常只是计算的一个组成部分。我们还需要考虑如何使用这个算法的计算框架,从而服务于各种计算场景。

一个好的计算框架,应该具备良好的接口和简洁必要的输入约束。单纯从本文所提到的计算场景来看,最理想的工作方式是,使用者只需要描述计算布局,撰写各个计算子的公式,然后,计算框架进行计算,为使用者提供计算结果。因此,我们通过json来定义计算布局,通过Groovy所提供的Closure来配置公式,见图6。

图6

关于框架设计,我将在软件架构论中展开,这里也不在赘述。

注:我的同事Yi Feng指出,计算布局的基本想法和TensorFlow中所用的计算图比较像,我因此去学习了一下,发现两者都是从计算规则入手。不过,计算图显然更加基础,适应更多的计算需求,本文中的计算布局,其设计目的是为了解决并行计算的问题,应用范围也没有那么广。谢谢Yi的指教。

你可能感兴趣的:(企业应用中的计算(下))