到目前为止,解决的比较好的异构编程模型就是CUDA

  我们在做计算机软硬件设计时,左图描述的分层抽象是一个非常重要的方法学。通过一个定义比较清晰的层次和接口,能够采用分而治之的方法来解决复杂的问题,大家可以聚焦在自己的层次上,只要提供一个统一的接口就可以了,这是比较理想的情况。
  然而现实的情况可能更多的是右侧的“奶酪模型”,大家出于不同的需求和目的,可能要在不同层次间打一些“洞”直接直接调用下面几层的接口或者提供的feature,导致整个理想的清晰的分层实际是很难实现的。
  这里看到的“奶酪”情况还是针对比较成熟的CPU生态。而由于AI DSA来说,至少到目前为止,还没有大家公认的分层模型和接口的设计。为了追求硬件性能,或者是充分利用现在DSA硬件的创新,不得不让程序员或者软件工具直接面对很多硬件的复杂度,导致整个软件栈设计面临更大困难。
  这里看一些例子。第一就是AI里最常见的核心运算,GEMM运算。对GEMM的实现不同硬件都有一些差异,软件(程序员)如果不能很好的利用硬件的细节特征,可能就无法实现对于GEMM硬件的高效利用;第二,在AI DSA比较常见的实践是很多Memory直接有软件(程序员)管理,增加了软件栈的复杂性,特别是如果Memory Hierarchy有较多层次的时候复杂性就会更高;第三,AI加速主要是通过大量的并行计算来实现,软件(程序员)必须充分利用硬件提供的同步机制,才能让并行运行的工作有效的配合起来;另外,从系统角度看,不管是SOC芯片,还是一个Server,甚至是整个数据中心,还包括很多涉及互联,网络,或者其它和硬件能力或者是硬件器件相关的因素需要考虑,都也会影响到模型的训练和部署效率。
  从另一个角度来看,未来还我们还会看到更多硬件的创新,比如近存储计算或者是存内计算,芯片的异构集成,或者系统层面的一些变化,比如DPU的引入等等。这些也都会直接影响到编程模型,或者是大家使用硬件的方式,这些东西都会反映到程序员的编程的难度和软件栈优化的复杂性上面。
  最后,还有一个非常基本的挑战,就是异构的挑战。到目前为止,解决的比较好的异构编程模型就是CUDA。但是随着DSA的更多应用,系统的异构特征会越来越强。要把异构特性的效率发挥得更高并且保证一定的Productivity,软件栈面临的压力是相当大的。

你可能感兴趣的:(人工智能)