Ascend-pytorch插件介绍及模型迁移
用于昇腾适配PyTorch框架,为使用PyTorch框架的开发者提供昇腾AI处理器的超强算力。
当前(2023.9.20)AscendPyTorch支持的pytorch版本如下:
AscendPyTorch版本 | CANN版本 | 支持PyTorch版本 | 代码分支名称 |
---|---|---|---|
5.0.RC2 | CANN 6.3.RC2 | 2.0.1.rc1 | v2.0.1-5.0.rc2 |
5.0.RC2 | CANN 6.3.RC2 | 1.8.1.post2 | v1.8.1-5.0.rc2 |
5.0.RC2 | CANN 6.3.RC2 | 1.11.0.post1 | v1.11.0-5.0.rc2 |
基本介绍
PyTorch Adapter实现原理
pytorch仓的结构:
- torch/ # 存放大家熟悉的python模块
- csrc # 用C++实现的pytorch前端的功能,包括python和C++的binding,autograd和JIT
- aten # "A Tensor Library"的缩写
- src/ATen # 用C++实现的tensor基本操作
- c10 # Caffe2和 A Tensor的双关语,包含pytorch的核心抽象,以及tensor和存储数据结构的实际实现
核心机制-dispatch
简单而言,就是根据API调用时,输入的数据类型来决定后端调用的API类型。比如CPU和GPU的API是不一样的,可以自动根据传入的tensor类型来自动选择API。
具体来看,对于每一个前端的算子,dispatcher会维护一个函数指针表,为每个dispatch key提供对应的视线。这个表中有针对不同后端(CPU,GPU,XLA)的dispatch条目,也有想autograd和tracing这样的高抽象层级概念的条目。dispatcher根据输入的tensor和其他东西计算出一个dispatch key,然后跳转到函数指针表所指向的函数。
所以,对于昇腾处理器而言,实现Adapter主要就是要讲用昇腾实现的算子注册到dispatcher上面,即可复用pytorch的dispatch机制完成算子分布。
示例-单算子调用流程
- 用户在前端调用算子,比如可调用nn.Module,nn.Funtional,Tensor对象上的函数;
- pybind11根据注册绑定的映射规则,调用后端C++方法;
- 后端C++接口根据输入参数来选取所需调用的算子类型(dispatch机制),比如是调用CPU实现的算子还是GPU实现的算子(注意:此处只要注册NPU实现的算子,便可调用昇腾处理器的计算能力;
- 调用相应算子,返回结果;
PyTorch Adapter的逻辑架构图
在线适配方案:模型执行,训练等主要功能流程有Pytorch框架提供,用户界面API保持不变,将Davinci设备和计算库作为扩展资源注册到PyTorch框架中。
- 优点:
- 继承PyTorch动态图特性
- 继承原生PyTorch使用方式,移植的时候,在开发方式和代码复用方便做到最小的改动;
- 继承Pytorch的原生体系结构,保留框架本身出色的特性,