news 2026/5/9 14:07:09

CANN/shmem算子泛化性测试框架说明

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CANN/shmem算子泛化性测试框架说明

算子泛化性测试框架说明

【免费下载链接】shmemCANN SHMEM 是面向昇腾平台的多机多卡内存通信库,基于OpenSHMEM 标准协议,实现跨设备的高效内存访问与数据同步。项目地址: https://gitcode.com/cann/shmem

1. 简介

本测试框架旨在为Shmem系列内核提供一个基于pytest的自动化、可扩展的泛化精度测试环境。框架的核心是通过随机生成覆盖各种数据类型、张量形状和数值分布的测试用例,调用C++内核执行计算,并与numpy在CPU上计算的真值进行对比,以验证内核的正确性和精度。

2. 框架结构

tests/examples/ ├── config.py # 全局测试配置文件 ├── utils.py # 通用工具函数(动态误差计算等) ├── np_uniform_generator.py # 均匀分布随机数生成器 ├── np_normal_generator.py # 正态分布随机数生成器 ├── matmul_allreduce/ │ ├── test_fusion_matmul_allreduce.py # matmul_allreduce 内核的 pytest 测试脚本 │ └── test_data/ # 持久化的测试数据缓存目录 ├── readme.md # 本文档 └── ... # 其他内核的测试目录
  • config.py: 定义了整个测试框架的通用配置,如张量形状约束、数值分布参数、数据类型、精度阈值等。
  • utils.py: 包含通用工具函数,特别是get_rtol()函数,用于根据数据类型和计算量动态计算误差阈值。
  • np_uniform_generator.py/np_normal_generator.py: 分别用于生成均匀分布和正态分布的测试数据。
  • <kernel_name>/test_<kernel_name>.py: 针对特定内核的测试脚本。
  • <kernel_name>/test_data/: 用于存储生成的测试数据,以备调试和分析。

3. 核心逻辑

测试脚本 (test_fusion_matmul_allreduce.py) 的执行流程如下:

3.1. 测试用例生成

  • 参数组合与分类:get_test_cases函数会生成两类测试用例:
    • 正确性 (correctness) 测试: 用于验证基本功能,输入数据范围较小。
    • 数值稳定性 (stability) 测试: 用于验证在极端或特殊数值下的表现,输入数据更复杂。 该函数根据config.py中定义的参数(如数据类型、rank数量、各类测试用例数)生成一系列pytest.param,用于驱动测试。
  • 形状生成:generate_shapes函数根据config.py中的约束(如SHAPE_DIM_VALUES,SHAPE_DIM_RANDOM_RANGE等)随机生成合法的张量形状。

3.2. 数据与真值生成

  • 张量生成:
    • 对于正确性测试,使用NPUniformGenerator在一个预设的、较小的范围内生成均匀分布的张量。
    • 对于数值稳定性测试,使用NPNormalGenerator生成符合正态分布的张量,可能包含更具挑战性的数值。
  • 真值计算: 在 CPU 端使用numpy计算真值。为了保证精度,中间累加过程在fp32下进行,最后再转换到目标精度。
  • 溢出处理: 在生成真值后,会检查是否存在infNaN。如果存在,会通过pytest.skip()跳过当前测试用例,避免因输入数据本身导致的问题而标记测试为失败。

3.3. 数据持久化

  • 为每个测试用例的参数组合计算一个唯一的MD5哈希值。
  • 以该哈希值创建一个目录(位于test_data/<hash_value>),并将该测试用例的所有输入张量(rank_<i>_a.bin,rank_<i>_b.bin)保存到此目录中。这便于后续的复现和调试。

3.4. C++ 内核执行

  • 使用 Python 的multiprocessing模块,为每个rank创建一个独立的进程。
  • 每个进程会调用预编译的 C++ 可执行文件 (EXECUTABLE_PATH)。
  • 测试所需的参数,包括rankworld_size、网络地址以及数据持久化目录的路径,都会通过命令行参数传递给 C++ 程序。
  • C++ 程序从指定的数据目录中读取输入,并将计算结果aclshmem_output.bin写回到同一目录。

3.5. 结果验证

  • 所有 C++ 进程执行完毕后,主进程会从数据目录中读取aclshmem_output.bin
  • 动态精度验证:
    1. 计算操作量: 根据m, k, n, world_size计算出总的浮点运算次数。
    2. 获取容忍度: 调用utils.py中的get_rtol()函数,传入数据类型和操作量,获得一个动态计算出的误差容忍度err
    3. 双重标准验证:
      • 对真值中绝对值大于等于1.0的部分,进行相对误差比较 (|act - gt| / |gt| <= err)。
      • 对真值中绝对值小于1.0的部分,进行绝对误差比较 (|act - gt| <= err)。

4. 如何运行测试

  1. 编译核函数: 确保目标核函数的 C++ 可执行文件已经编译。例如,对于matmul_allreduce,需要先执行:

    bash examples/matmul_allreduce/scripts/build.sh
  2. 设置可执行文件路径: 在test_fusion_matmul_allreduce.py脚本的顶部,确认EXECUTABLE_PATH变量指向了正确的 C++ 可执行文件路径。

  3. 运行 Pytest: 在项目根目录下,直接运行pytest命令。

    export LD_LIBRARY_PATH=<path_to_aclshmem_lib>:$LD_LIBRARY_PATH pytest -sv tests/examples/matmul_allreduce/

    请将<path_to_...>替换为实际的库路径。

  4. 输出示例

    说明:带“correctness"的用例是正确性测试用例,带”stability"是用例是数值稳定性测试用例。

5. 如何扩展

要为新的内核(例如allgather)添加测试,可以遵循以下步骤:

  1. tests/examples/目录下创建一个新的子目录,例如allgather
  2. 在该目录中创建一个新的测试脚本,例如test_allgather.py
  3. 参考test_matmul_allreduce.py的结构,实现新内核的测试逻辑:
    • 实现数据生成逻辑(可复用NP*Generator或创建新的生成器)和真值计算。
    • 实现调用 C++ 内核的辅助函数。
    • 实现结果验证逻辑,可复用get_rtol和双重标准验证方法。
  4. 如果需要新的通用配置,可以将其添加到tests/examples/config.py中。

【免费下载链接】shmemCANN SHMEM 是面向昇腾平台的多机多卡内存通信库,基于OpenSHMEM 标准协议,实现跨设备的高效内存访问与数据同步。项目地址: https://gitcode.com/cann/shmem

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/9 14:06:14

AI欺骗分析:从多智能体博弈到DAMAS防御框架的工程实践

1. 项目概述&#xff1a;当AI学会“说谎”&#xff0c;我们该如何应对&#xff1f;最近几年&#xff0c;我身边不少做多智能体系统&#xff08;Multi-Agent Systems, MAS&#xff09;和AI安全的朋友&#xff0c;都在讨论一个越来越无法回避的现象&#xff1a;我们训练出来的AI&…

作者头像 李华
网站建设 2026/5/9 14:06:06

基于LLM与Electron的CK3智能对话模组开发实战

1. 项目概述&#xff1a;当《十字军之王3》的宫廷开始“思考”如果你和我一样&#xff0c;是个策略游戏迷&#xff0c;同时又对AI技术充满好奇&#xff0c;那么“Voices of the Court”&#xff08;宫廷之声&#xff09;这个项目绝对会让你眼前一亮。简单来说&#xff0c;这是一…

作者头像 李华
网站建设 2026/5/9 14:05:53

ARM Trace协议异常处理数据包解析与应用

1. ARM Trace协议概述在嵌入式系统开发中&#xff0c;调试能力直接决定了问题定位和性能优化的效率。ARM Trace协议作为处理器执行流记录的行业标准&#xff0c;为开发者提供了非侵入式的实时追踪能力。与传统的断点调试不同&#xff0c;Trace技术通过专用硬件通道记录处理器执…

作者头像 李华
网站建设 2026/5/9 14:04:00

CANN/ops-solver Sgetri矩阵求逆

Sgetri 【免费下载链接】ops-solver 本项目是CANN提供的高级数值求解算子库&#xff0c;实现矩阵分解、求逆、特征值求解等功能在NPU上的加速计算。 项目地址: https://gitcode.com/cann/ops-solver 产品支持情况 产品是否支持Atlas 200I/500 A2 推理产品Atlas 推理系列…

作者头像 李华
网站建设 2026/5/9 14:03:45

基于RAG的私有知识库问答系统:从原理到部署实战

1. 项目概述&#xff1a;一个能“读懂”你文档的智能对话机器人最近在GitHub上看到一个挺有意思的项目&#xff0c;叫luolin-ai/chatgpt-KnowledgeBot。光看名字&#xff0c;你可能会觉得这又是一个基于ChatGPT API的简单聊天机器人包装。但如果你深入了解一下&#xff0c;会发…

作者头像 李华
网站建设 2026/5/9 14:01:32

CANN/pyasc AddRelu加法ReLU函数API

asc.language.basic.add_relu 【免费下载链接】pyasc 本项目为Python用户提供算子编程接口&#xff0c;支持在昇腾AI处理器上加速计算&#xff0c;接口与Ascend C一一对应并遵守Python原生语法。 项目地址: https://gitcode.com/cann/pyasc asc.language.basic.add_relu…

作者头像 李华