From d307b0b884091099f9b17d728cd1624fedd89509 Mon Sep 17 00:00:00 2001 From: ShiyaNiu Date: Fri, 19 Sep 2025 12:07:24 +0800 Subject: [PATCH 1/2] update torchair readme --- ACL_PyTorch/docs/torchair/README.md | 25 ++++++++++++++++++ ...3\344\274\230\346\265\201\347\250\213.png" | Bin 0 -> 87777 bytes 2 files changed, 25 insertions(+) create mode 100644 ACL_PyTorch/docs/torchair/README.md create mode 100644 "ACL_PyTorch/docs/torchair/images/\346\200\247\350\203\275\350\260\203\344\274\230\346\265\201\347\250\213.png" diff --git a/ACL_PyTorch/docs/torchair/README.md b/ACL_PyTorch/docs/torchair/README.md new file mode 100644 index 0000000000..58d869b2b2 --- /dev/null +++ b/ACL_PyTorch/docs/torchair/README.md @@ -0,0 +1,25 @@ + + +## TorchAir介绍 +TorchAir(Torch Ascend Intermediate Representation)是昇腾Ascend Extension for PyTorch(torch_npu)的图模式能力扩展库,提供了昇腾设备亲和的torch.compile图模式后端,实现了PyTorch网络在昇腾NPU上的图模式推理加速及性能优化。 + +目前TorchAir暂未提供单独的发布包,而是作为Ascend Extension for PyTorch的三方库,随着torch_npu一起发布。请直接安装torch_npu插件,即可使用TorchAir。 + +## 常用概念 + +| 名称 | 说明 | +| ----------|--------| +| Eager模式 | PyTorch支持的单算子执行模式(未使用torch.compile)。Eager模式执行特点如下,1. 即时执行:每个计算操作在定义后立即执行,无需构建计算图;2. 动态计算图:每次运行可能生成不同的计算图。 | +| 图模式 | 一般指使用torch.compile加速的模型执行方式。图模式执行特点如下,1. 延迟执行:所有计算操作先构成一张计算图,再在会话中下发执行;2. 静态计算图:计算图在运行前固定。 | + +## 模型适配和性能调优流程 + +1. [torch_npu迁移适配](torch_npu/torch_npu迁移适配.md)用户使能图模式之前,请先将模型迁移至昇腾NPU上,确保能够在单算子模式(Eager)下正确执行 +2. [torch_npu性能优化](torch_npu/常用优化点.md)模型性能涉及包括算法在内的多个模块,因此模型性能的优化的关键在于找到当前性能瓶颈,找到关键问题后再针对性优化。小模型一般运行在单卡上,因此本章节主要从计算和下发角度介绍常用的torch_npu性能优化方法。 +3. [图优化](图优化/1.前置分析及约束条件.md)当Host侧任务下发耗时超过Device侧任务执行耗时,Device会因等待新任务而处于空闲状态,形成性能瓶颈,即Host Bound问题。图模式具备"延迟执行"和"静态计算图"两个特点,可以有效优化算子下发,解决Host Bound问题。本章节主要介绍TorchAir常用配置、迁移适配流程、功能精度问题定位方法等。 + +**图1** 性能调优流程图 + +![image](images/性能调优流程.png) + +更多介绍请参考昇腾社区[TorchAir官方介绍文档](https://www.hiascend.com/document/detail/zh/Pytorch/710/modthirdparty/torchairuseguide/torchair_00003.html) \ No newline at end of file diff --git "a/ACL_PyTorch/docs/torchair/images/\346\200\247\350\203\275\350\260\203\344\274\230\346\265\201\347\250\213.png" "b/ACL_PyTorch/docs/torchair/images/\346\200\247\350\203\275\350\260\203\344\274\230\346\265\201\347\250\213.png" new file mode 100644 index 0000000000000000000000000000000000000000..201300a76df04141eb92f5fa2f1481960ad49d41 GIT binary patch literal 87777 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
Z4}qsLn5x{a)$D4O(+*Ix^ehFkVQ8@)se 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 literal 0 HcmV?d00001 -- Gitee From 32d3071dbb119b82de5505a725cc468ceebbbcf1 Mon Sep 17 00:00:00 2001 From: ShiyaNiu Date: Fri, 19 Sep 2025 12:09:45 +0800 Subject: [PATCH 2/2] fix clean code --- ACL_PyTorch/docs/torchair/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ACL_PyTorch/docs/torchair/README.md b/ACL_PyTorch/docs/torchair/README.md index 58d869b2b2..a0dd6cd6b1 100644 --- a/ACL_PyTorch/docs/torchair/README.md +++ b/ACL_PyTorch/docs/torchair/README.md @@ -14,9 +14,9 @@ TorchAir(Torch Ascend Intermediate Representation)是昇腾Ascend Extension ## 模型适配和性能调优流程 -1. [torch_npu迁移适配](torch_npu/torch_npu迁移适配.md)用户使能图模式之前,请先将模型迁移至昇腾NPU上,确保能够在单算子模式(Eager)下正确执行 -2. [torch_npu性能优化](torch_npu/常用优化点.md)模型性能涉及包括算法在内的多个模块,因此模型性能的优化的关键在于找到当前性能瓶颈,找到关键问题后再针对性优化。小模型一般运行在单卡上,因此本章节主要从计算和下发角度介绍常用的torch_npu性能优化方法。 -3. [图优化](图优化/1.前置分析及约束条件.md)当Host侧任务下发耗时超过Device侧任务执行耗时,Device会因等待新任务而处于空闲状态,形成性能瓶颈,即Host Bound问题。图模式具备"延迟执行"和"静态计算图"两个特点,可以有效优化算子下发,解决Host Bound问题。本章节主要介绍TorchAir常用配置、迁移适配流程、功能精度问题定位方法等。 +1. [torch_npu迁移适配](torch_npu/torch_npu迁移适配.md): 用户使能图模式之前,请先将模型迁移至昇腾NPU上,确保能够在单算子模式(Eager)下正确执行 +2. [torch_npu性能优化](torch_npu/常用优化点.md): 模型性能涉及包括算法在内的多个模块,因此模型性能的优化的关键在于找到当前性能瓶颈,找到关键问题后再针对性优化。小模型一般运行在单卡上,因此本章节主要从计算和下发角度介绍常用的torch_npu性能优化方法。 +3. [图优化](图优化/1.前置分析及约束条件.md): 当Host侧任务下发耗时超过Device侧任务执行耗时,Device会因等待新任务而处于空闲状态,形成性能瓶颈,即Host Bound问题。图模式具备"延迟执行"和"静态计算图"两个特点,可以有效优化算子下发,解决Host Bound问题。本章节主要介绍TorchAir常用配置、迁移适配流程、功能精度问题定位方法等。 **图1** 性能调优流程图 -- Gitee