DLPack构建跨框架的深度学习编译器

DLPack构建跨框架的深度学习编译器

Tensorflow,PyTorch和ApacheMxNet等深度学习框架提供了一个功能强大的工具包,可用于快速进行原型设计和部署深度学习模型。易用性通常是以碎片为代价的:孤立地使用每个框架是很容易的。垂直集成已使常见用例的开发流程简化了,但是冒险走过的路可能很棘手。

一个支持不佳的方案是将张量直接从一个框架传递到内存中的另一个框架,而没有任何数据重复或复制。支持这种用例使用户能够将管道串联在一起,其中某些算子在一个框架中得到比在另一个框架中得到更好的支持(或更快速)。框架之间共享的数据表示形式也将弥合这一差距,并在为算子生成代码时,允许编译器堆栈以单一格式为目标。

DLPack是用于张量数据结构的中间内存表示标准。使用DLPack作为通用表示,传统上只能依赖供应商提供的库的框架编写的脚本中利用TVM。TVM打包函数可以在DLPack张量上运行,提供包装程序以桥接带有零数据副本的框架(例如PyTorch和MxNet)中的张量数据结构。

DLPack提供了一种简单的可移植内存数据结构:

/*!
 * \brief Plain C Tensor object, does not manage memory.
 */
 
 

  /*!
   * \brief The opaque data pointer points to the allocated data.
   *  This will be CUDA device pointer or cl_mem handle in OpenCL.
   *  This pointer is always aligns to 256 bytes as in CUDA.
   */
  
 

  

  
 

  

  
 

  

  
 

  

  
 

  /*!
   * \brief strides of the tensor,
   *  can be NULL, indicating tensor is compact.
   */
  
 

  

  
 

 

例如,在TVM中声明并编译一个矩阵乘法算子,并构建一个使用DLPack表示形式的包装器wrapper,允许该算子支持PyTorch张量。还使用MxNet重复此演示。此扩展使机器学习开发人员可以在不牺牲性能的情况下,将代码快速移植到相对不受支持的硬件平台上。

DLPack如何提供框架和TVM之间共享的中间包wrapper的说明:

 

 图1

首先,在PyTorch中计算参考输出:

    
 

    
 
 

    
 
 

    
 
 

然后,使用默认调度定义并构建TVM矩阵乘法算子:

    
 
 

    
 
 
 

    
 
 
 

 
    
 
 
 
 

    
 
 
 
 
 
 
 

    
 
 

    
 
 
 
 
 
 
 

为简便起见,没有涵盖可用于优化矩阵乘法的TVM大量的调度原语集合。如果希望使自定义GEMM算子在的硬件设备上快速运行,请参考详细的教程。

然后,将TVM函数转换为支持PyTorch张量的函数:

    
 
 
 

    # fmm is the previously built TVM function (Python function)
    # fmm is the wrapped TVM function (Python function)
    
 
 

    
 
 

    
 
 

    
 

并验证结果是否匹配。

可以重复相同的示例,但是使用MxNet代替:

    
 

    
 
 
 

    
 
 

    
 
 
 

    
 
 
 

    
 
 
 

    
 
 
 
 
 
 
 

    
 
 

    
 
 

    
 

在PyTorch示例的幕后

由于TVM提供了将dlpack张量转换为tvm的功能NDArray反之亦然,因此,通过wrapper功能,所需的只是一些语法 syntactic sugar 。 convert_func是用于使用具有dlpack支持的张量的框架的通用转换器,可以用于实现方便的转换器,例如 to_pytorch_func

 
 
 

    
 

 
    
 

        
 
 
\
            
 
 
 
 
 
 
 
 

        
 

 
    
 

 
 

    
 

    
 

    
 
 
 

 

posted @   吴建明wujianming  阅读(227)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示