diff --git a/dicp/readme.md b/dicp/readme.md new file mode 100644 index 000000000..6a5fc8de0 --- /dev/null +++ b/dicp/readme.md @@ -0,0 +1,85 @@ +
+ +
+ +# DICP + +标准编译协议(Device-Independent Compile Protocol,DICP)定义了统一的计算描述(中间表示),通过计算图获取深度学习模型中的计算任务表达为上述中间表示,然后通过计算图优化技术自动生成人工智能芯片设备代码,从而提高研发效率和计算的执行性能。中间表示是介于源语言和目标语言之间的程序表示,能够极大程度地提高编译流程的可拓展性,同时也能降低优化流程对前端和后端的破坏。多层次中间表示包含从应用到芯片端的多种表示层次,不同层次旨在解决不同尺度的问题。 + +DICP主要的核心功能如下: +1. **通过接入编译路线带来性能优势,在大模型场景最大限度释放芯片能力** +2. **作为训练框架与国产硬件芯片之间的通用桥梁,支持多种前后端,带来使用易用性** +3. **提供易用、高效的一站式编译适配流程,灵活支持国产硬件图编译器的特性,提高芯片适配效率** + +下图描述了DICP在编译链路中的位置: + +
+ +

*DICP在编译链路中的位置

+ +
+ +1. 训练框架通过图获取模块将用户的模型代码转换成统一的中间表达。此处的中间表达完全与芯片无关。所以在之后的编译协议部分中,需要建立起与后端芯片的联系。这样才能高效的完成接入。 +2. 编译协议完成了衔接框架与芯片编译器的工作,其中包含硬件相关的切图,统一中间表达与芯片所支持的算子之间的映射关系以及数据格式的转换模块。 +3. 在编译协议吸收了芯片特点之后,由代码生成模块生成最终的代码,并通过芯片的编译器生成二进制可执行文件之后由框架调用。 + + + +## 基于DICP的国产硬件接入PyTorch2实践 + + + +基于上述DICP,国产硬件可快速接入Pytorch2的编译路线。此路线中的TorchDynamo组件,可使国产硬件在运行时的overhead大幅缩小。 +并且针对国产硬件实现了以下特性: + - 灵活支持国产硬件图编译器的特性 + - 支持多种国产硬件数据格式 + - 支持动态shape + +### 运行逻辑 +DICP的运行逻辑如下图所示: + + +
+ +
+ +其中: +1. **算子映射**: 主要解决框架层算子与后端图编译器的算子之间的语义差别,包括1对1和1对多的转换。 +2. **Shape&Dtype推导**: 进行Shape&data_type的推导,补全整张静态图上的信息,便于之后在代码生成模块能生成代码。 +3. **子图改写**: 将多个小算子融合成为一个或多个适合图编译器的算子,配合后端图编译器将计算效率最大化。 +4. **数据格式调整**: 是根据后端芯片与其图编译器的特性,针对特定的算子调整其输入输出的数据格式,使得最大程度的发挥芯片性能。 + +### 目录结构 +* dicp/dynamo_bridge: 多后端通用的接入代码,包含了 + 1. 接收从AOTAutograd下发而来的FX Graph + 2. 启动各个厂商的IR转换与优化 + 3. 启动CodeGen以及JIT缓存的逻辑。 +* dicp/vender: 主要包含了各个厂商IR的定义,AtenIR到厂商IR的转换,厂商IR上的优化以及最后的代码生成模块。 +* test: 包含了model测试与op测试 + + +### Demo + +#### 安装DICP + +``` +cd /path_to_dicp +pip install . +``` + +#### 在华为910上执行llama7B前向推理 +``` +export DIPU_MOCK_CUDA = false +export DICP_TOPS_DIPU = True +export TEST_DIR = /path_to_dicp/test/ +export LLAMA_MODEL_DIR=/path_to_llama_model +bash /path_to_dicp/test/model/run_test_model.sh llama ascendgraph false +``` + +#### 在燧原T20上执行resnet50训练 +``` +export DIPU_MOCK_CUDA = false +export DICP_TOPS_DIPU = True +export TEST_DIR = /path_to_dicp/test/ +bash /path_to_dicp/test/model/run_test_model.sh resnet50 topsgraph false +``` diff --git a/dipu/README.md b/dipu/README.md index f49a08dab..8409b00f4 100644 --- a/dipu/README.md +++ b/dipu/README.md @@ -1,5 +1,5 @@
- +
# DIPU @@ -81,7 +81,7 @@ DIPU 的这一部分主要就是对 PyTorch 的``c10`` 和``c10d``相关接口 ### 算子适配能力 - 为了更好的接入 DIOPI 算子,DIPU 提供了一组 算子适配相关的辅助能力,比如灵活的算子 Fallback to CPU 的能力,算子精度自动对比的能力(对比 DIOPI 算子 和 PyTorch 原生的 CPU 算子),算子执行过程中打印算子参数的能力。基于这些能力,接入算子时可以更方便排查算子精度等问题。 相关能力的具体说明参见 [Quick Start 文档](https://github.com/DeepLink-org/dipu/blob/main/QuickStart.md)的 *算子库接入*。 + 为了更好的接入 DIOPI 算子,DIPU 提供了一组 算子适配相关的辅助能力,比如灵活的算子 Fallback to CPU 的能力,算子精度自动对比的能力(对比 DIOPI 算子 和 PyTorch 原生的 CPU 算子),算子执行过程中打印算子参数的能力。基于这些能力,接入算子时可以更方便排查算子精度等问题。 相关能力的具体说明参见 [Quick Start 文档](https://deeplink.readthedocs.io/zh-cn/latest/doc/DIPU/quick_start.html)的 *算子库接入*。 ## 质量保障体系 @@ -91,10 +91,10 @@ DIPU 的这一部分主要就是对 PyTorch 的``c10`` 和``c10d``相关接口 2. 简单开发的手工测例。这部分测例更注重算子能否跑通,对算子要求较低。 3. 模型测试。我们开发了``one_iter``精度对比工具,会先在精度正确性没问题的设备(如 CPU 和 CUDA )上训练模型,保存每一层的算子输入、输出、权重、梯度数据,再在待测试设备上训练模型,逐层对比训练精度。 -更多信息请参考:[dipu/tests](https://github.com/DeepLink-org/dipu/tree/main/tests) +更多信息请参考:[dipu/tests](https://github.com/DeepLink-org/DIPU/tree/main/dipu/tests)。 ## Learn More -* [使用/设备接入教学](https://github.com/DeepLink-org/dipu/blob/main/QuickStart.md) -* [常见问题](https://github.com/DeepLink-org/dipu/blob/main/FAQ.md) -* [开发者指南](https://github.com/DeepLink-org/dipu/blob/main/Contributors.md) +* [Quick Start](https://deeplink.readthedocs.io/zh-cn/latest/doc/DIPU/quick_start.html) +* [常见问题](https://deeplink.readthedocs.io/zh-cn/latest/doc/DIPU/FAQ.html) +* [开发者指南](https://github.com/DeepLink-org/DIPU/tree/main/dipu/Contributors.md)