已合并
北京林业大学高性能计算数据结构 #926
zh1125创建于 8月31日
北京林业大学高性能计算数据结构 #926
已合并
共 15 个文件变更+27465-7
Acontrib/tutorials/data_structure_for_hpc/01_base/01_01_extra_ascendc_static_tensor_relu_vector.ipynb+1293-0
Acontrib/tutorials/data_structure_for_hpc/02_parallel_computing/02.03_extra_spmv_storage_format.ipynb+2041-0
| @@ -0,0 +1,528 @@ | |||
| 1 | +{ | ||
| 2 | + "cells": [ | ||
| 3 | + { | ||
| 4 | + "cell_type": "markdown", | ||
| 5 | + "metadata": {}, | ||
| 6 | + "source": [ | ||
| 7 | + "# 基于 CANN 的 Softmax 算子实现实验\n", | ||
| 8 | + "\n", | ||
| 9 | + "Softmax 是深度学习中连接线性层和概率分布的基础算子,也是一个很典型的“按行归约 + 逐元素归一化”问题。它不像 Add 那样只依赖当前位置:一行中的最大值和指数和会影响这一行的每一个输出,因此实现时必须同时考虑数值稳定性、连续访存、片上缓冲和多核任务划分。\n", | ||
| 10 | + "\n", | ||
| 11 | + "本实验在 Ascend C 编程模型下实现二维 `float32` 张量最后一维上的稳定 Softmax,并通过 ACL 直调验证 Kernel。实验特别强调编译边界:`softmax.asc` 只保留设备侧 Kernel 和 ASC 启动包装函数;`host.cpp` 独立承担 Tiling、ACL 资源管理、CPU 参考实现和结果统计。\n", | ||
| 12 | + "\n", | ||
| 13 | + "学习大纲如下:\n", | ||
| 14 | + "\n", | ||
| 15 | + "1. 环境准备:创建工程目录,检查 CANN 环境变量和 NPU 条件;\n", | ||
| 16 | + "2. 问题分析:理解稳定 Softmax 的数学形式、二维张量布局、行级并行策略,以及原单文件工程的编译失败原因;\n", | ||
| 17 | + "3. 数据结构与 Kernel:认识 `GlobalTensor`、`LocalTensor`、`TQue`、`TBuf` 和 `SoftMaxTiling` 在不同存储层次中的职责;\n", | ||
| 18 | + "4. Host 验证:生成可重复输入,计算 CPU golden,完成 Tiling、内存管理、Kernel 发射、计时和误差校验;\n", | ||
| 19 | + "5. 构建与结果分析:使用 ASC/CXX 分离编译,读取三组规模的准确率、时延和吞吐量;\n", | ||
| 20 | + "6. 实验总结与拓展:从访存连续性、归约开销和并行度角度解释现象,并设计后续变量控制实验。\n", | ||
| 21 | + "\n", | ||
| 22 | + "运行最后的编译和运行单元后,程序会执行 `16x1024`、`32x1024` 和 `64x1024` 三组测试,输出正确性指标、平均时延、吞吐量,并将汇总表保存到 `Source/04.00/softmax/softmax_results.txt`。" | ||
| 23 | + ] | ||
| 24 | + }, | ||
| 25 | + { | ||
| 26 | + "cell_type": "markdown", | ||
| 27 | + "metadata": {}, | ||
| 28 | + "source": [ | ||
| 29 | + "## 1. 环境准备\n", | ||
| 30 | + "\n", | ||
| 31 | + "下面创建工程目录并查找、加载 CANN 根目录下的 `set_env.sh`。编译和运行需要 Linux、CANN 8.3.RC1(或兼容版本)以及可用的昇腾 NPU。没有 NPU 时仍可先执行代码生成单元,检查工程文件和注释是否完整。\n", | ||
| 32 | + "\n", | ||
| 33 | + "生成后的目录结构如下:\n", | ||
| 34 | + "\n", | ||
| 35 | + "```text\n", | ||
| 36 | + "Source/04.00/softmax/\n", | ||
| 37 | + "├── softmax_common.h # Host 与 Kernel 共享的轻量配置\n", | ||
| 38 | + "├── softmax.asc # ASC 编译的设备侧 Kernel\n", | ||
| 39 | + "├── host.cpp # CXX 编译的 Host、Tiling 和校验\n", | ||
| 40 | + "├── CMakeLists.txt # ASC/CXX 混合目标和链接配置\n", | ||
| 41 | + "├── build/ # CMake 构建目录\n", | ||
| 42 | + "└── softmax_results.txt # 运行输出和汇总表\n", | ||
| 43 | + "```\n", | ||
| 44 | + "\n", | ||
| 45 | + "环境脚本由本单元先加载到 Notebook 的 Python 进程,再由编译和运行单元传递给 Bash。若脚本不存在,Notebook 会明确提示,而不会把一个缺少 CANN 依赖的半成品误认为编译成功。" | ||
| 46 | + ] | ||
| 47 | + }, | ||
| 48 | + { | ||
| 49 | + "cell_type": "code", | ||
| 50 | + "execution_count": null, | ||
| 51 | + "metadata": {}, | ||
| 52 | + "outputs": [], | ||
| 53 | + "source": [ | ||
| 54 | + "import os\n", | ||
| 55 | + "import shlex\n", | ||
| 56 | + "import subprocess\n", | ||
| 57 | + "from pathlib import Path\n", | ||
| 58 | + "\n", | ||
| 59 | + "project_dir = Path('Source/04.00/softmax')\n", | ||
| 60 | + "project_dir.mkdir(parents=True, exist_ok=True)\n", | ||
| 61 | + "\n", | ||
| 62 | + "# 与同目录 Ascend C 实验保持一致:优先使用已有变量,再扫描常见安装目录。\n", | ||
| 63 | + "candidate_roots = [\n", | ||
| 64 | + " os.environ.get('ASCEND_TOOLKIT_HOME'),\n", | ||
| 65 | + " os.environ.get('ASCEND_INSTALL_PATH'),\n", | ||
| 66 | + " os.environ.get('ASCEND_HOME_PATH'),\n", | ||
| 67 | + " os.environ.get('ASCEND_CANN_PACKAGE_PATH'),\n", | ||
| 68 | + " '/usr/local/Ascend/ascend-toolkit/latest',\n", | ||
| 69 | + " '/usr/local/Ascend/ascend-toolkit',\n", | ||
| 70 | + " '/opt/Ascend/ascend-toolkit/latest',\n", | ||
| 71 | + " '/opt/Ascend/ascend-toolkit',\n", | ||
| 72 | + " '/opt/conda/Ascend/cann-9.0.0/aarch64-linux',\n", | ||
| 73 | + " str(Path.home() / 'Ascend/ascend-toolkit/latest'),\n", | ||
| 74 | + " str(Path.home() / 'Ascend/ascend-toolkit'),\n", | ||
| 75 | + " '/workspace/Ascend/ascend-toolkit/latest',\n", | ||
| 76 | + " '/workspace/Ascend/ascend-toolkit',\n", | ||
| 77 | + "]\n", | ||
| 78 | + "set_env_path = None\n", | ||
| 79 | + "for root in candidate_roots:\n", | ||
| 80 | + " if root:\n", | ||
| 81 | + " candidate = Path(root) / 'set_env.sh'\n", | ||
| 82 | + " if candidate.exists():\n", | ||
| 83 | + " set_env_path = candidate\n", | ||
| 84 | + " break\n", | ||
| 85 | + "\n", | ||
| 86 | + "if set_env_path is None:\n", | ||
| 87 | + " for root in [Path('/usr/local/Ascend'), Path('/opt/Ascend'), Path('/opt/conda/Ascend'), Path.home(), Path('/workspace')]:\n", | ||
| 88 | + " if root.exists():\n", | ||
| 89 | + " matches = list(root.glob('**/ascend-toolkit*/set_env.sh')) + list(root.glob('**/cann-*/**/set_env.sh'))\n", | ||
| 90 | + " if matches:\n", | ||
| 91 | + " set_env_path = matches[0]\n", | ||
| 92 | + " break\n", | ||
| 93 | + "\n", | ||
| 94 | + "if set_env_path is not None:\n", | ||
| 95 | + " env_text = subprocess.check_output(\n", | ||
| 96 | + " ['bash', '-lc', f'source {shlex.quote(str(set_env_path))} && env'],\n", | ||
| 97 | + " text=True,\n", | ||
| 98 | + " )\n", | ||
| 99 | + " for line in env_text.splitlines():\n", | ||
| 100 | + " if '=' in line:\n", | ||
| @@ -1,15 +1,24 @@ | |||
| 1 | -# 面向高性能计算的数据结构 | 1 | +[](https://e.huawei.com/cn/talent/learning/#/zone?customizedZoneId=qS4mF6lijbGojmzxSlKlhX4ccow) |
| 2 | 2 | ||
| 3 | -本课程围绕高性能计算场景中的数据组织、内存访问、并行计算和性能优化方法展开。课程通过可运行的 Ascend C 实验,帮助学习者理解数据分块、片上存储和多核并行对计算性能的影响,并掌握面向昇腾 NPU 的基础性能分析与优化方法。 | 3 | +------ |
| 4 | 4 | ||
| 5 | -## 课程适用学习人群 | 5 | +## 课程简介 |
| 6 | 6 | ||
| 7 | -- 具备 C/C++ 基础语法和基本数据结构知识的学习者。 | 7 | +随着人工智能的普及与发展,高性能计算需求的不断增长,传统CPU串行模式下的数据结构教学已难以适配技术的发展。本课程依托于华为昇腾计算平台与CANN技术体系,构建高性能计算场景下的数据结构模块化实验。实验内容涵盖了并行计算、分布式计算、算子开发等核心内容,每个实验均提供了可运行的Ascend C程序,可结合华为ICT学院与此配套的体系化课程进行深入学习。通过实验课程,指导学习者使用Ascend C编程,面向昇腾NPU完成算子的设计、实现、调试和优化,培养从数据结构、算法设计到性能评价的系统工程能力。 |
| 8 | -- 具备基础 Linux 命令行和 Jupyter Notebook 使用经验,希望学习 Ascend C 与高性能计算优化的学生或开发者。 | ||
| 9 | 8 | ||
| 10 | -## 整体学习目标 | 9 | +## 适合人群 |
| 11 | 10 | ||
| 12 | -- 理解高性能计算中数据结构、数据布局与内存访问模式之间的关系。 | 11 | +建议学习者具备C/C++基础和数据结构基础,但不要求事先有Ascend C编程经验。 |
| 12 | + | ||
| 13 | +- 对并行计算、分布式计算或算子开发感兴趣,希望系统学习数据结构与并行算法的学习者; | ||
| 14 | +- 具备数据结构基础,希望进一步了解高性能场景下的数据组织、存储与并行算法实现的学习者; | ||
| 15 | +- 对华为昇腾计算平台与Ascend C算子开发感兴趣的学习者。 | ||
| 16 | + | ||
| 17 | +## 学习目标 | ||
| 18 | + | ||
| 19 | +- 理解面向高性能计算的数据结构设计原理 | ||
| 20 | +- 掌握并行算法设计与实现的基本方法 | ||
| 21 | +- 具备面向华为昇腾平台的算子开发实践能力 | ||
| 13 | 22 | ||
| 14 | ## 课程支持的硬件产品 | 23 | ## 课程支持的硬件产品 |
| 15 | 24 | ||
| @@ -31,8 +40,37 @@ CANNLab 环境创建与使用方法请参考 [CANNLab 环境体验指南](https: | |||
| 31 | 40 | ||
| 32 | ## 课程章节目录 | 41 | ## 课程章节目录 |
| 33 | 42 | ||
| 43 | +### 第一章:高性能计算基础 | ||
| 44 | + | ||
| 45 | +| Notebook | Link | 状态 | | ||
| 46 | +| -- | -- | -- | | ||
| 47 | +| 01.00 基于不同存储结构的求和算子实现 | - | 🚧 待内测 | | ||
| 48 | +| 01.01 基于静态 Tensor 的 ReLU 向量算子 | - | 🚧 待内测 | | ||
| 49 | + | ||
| 34 | ### 第二章:并行计算 | 50 | ### 第二章:并行计算 |
| 35 | 51 | ||
| 36 | | Notebook | Link | 状态 | | 52 | | Notebook | Link | 状态 | |
| 37 | | -- | -- | -- | | 53 | | -- | -- | -- | |
| 54 | +| 02.00 基于平衡二叉树的并行前缀和实现实验 | - | 🚧 待内测 | | ||
| 55 | +| 02.01 基于并行广度优先遍历的网络故障诊断实验 | - | 🚧 待内测 | | ||
| 38 | | 02.02 矩阵乘法分块优化实验 | [在线体验](https://ai.gitcode.com/user/username/notebookcann?repoUrl=https://gitcode.com/cann/cann-learning-hub.git&ttl=120&diskSize=40Gi&path=contrib/tutorials/data_structure_for_hpc&scanFilePath=contrib/tutorials/data_structure_for_hpc/02_parallel_computing/02.02_extra_ascendc_static_tensor_matmul.ipynb) | ✅ 已发布 | | 56 | | 02.02 矩阵乘法分块优化实验 | [在线体验](https://ai.gitcode.com/user/username/notebookcann?repoUrl=https://gitcode.com/cann/cann-learning-hub.git&ttl=120&diskSize=40Gi&path=contrib/tutorials/data_structure_for_hpc&scanFilePath=contrib/tutorials/data_structure_for_hpc/02_parallel_computing/02.02_extra_ascendc_static_tensor_matmul.ipynb) | ✅ 已发布 | |
| 57 | +| 02.03 稀疏矩阵存储格式与分块计算优化实验 | - | 🚧 待内测 | | ||
| 58 | + | ||
| 59 | +### 第三章:分布式计算 | ||
| 60 | + | ||
| 61 | +| Notebook | Link | 状态 | | ||
| 62 | +| -- | -- | -- | | ||
| 63 | +| 03.01 基于HCCL的分布式字符串词频统计实验 | - | 🚧 待内测 | | ||
| 64 | +| 03.02 基于一致性哈希环的分布式哈希表模拟实验 | - | 🚧 待内测 | | ||
| 65 | +| 03.03 分布式B+树结构动态更新与局部数据迁移实验 | - | 🚧 待内测 | | ||
| 66 | +| 03.04 基于 HCCL 的 CSR 图分区实验 | - | 🚧 待内测 | | ||
| 67 | + | ||
| 68 | +### 第四章:算子开发 | ||
| 69 | + | ||
| 70 | +| Notebook | Link | 状态 | | ||
| 71 | +| -- | -- | -- | | ||
| 72 | +| 04.00 基于 CANN的Softmax 算子优化 | - | 🚧 待内测 | | ||
| 73 | +| 04.01 低精度矩阵乘法优化实验 | - | 🚧 待内测 | | ||
| 74 | +| 04.02 卷积分类头前向计算实现与优化 | - | 🚧 待内测 | | ||
| 75 | +| 04.03 RMSNorm向量算子实现与流水优化 | - | 🚧 待内测 | | ||
| 76 | + | ||