| 【bugfix】 修复 acl_save 保存非连续张量数据异常 (#502) Co-authored-by: Tjh-UKN<2559659915@qq.com> # message auto-generated for no-merge-commit merge: !937 merge fix/acl-save-python-contiguous-502 into master 【bugfix】 修复 acl_save 保存非连续张量数据异常 (#502) Created-by: Tjh-UKN Commit-by: Tjh-UKN Merged-by: ascend-robot Description: # Pull Request ## 修改内容 - 将 acl_save 和 acl_tensor_save 的非连续张量归一化操作移至 Python 包装层,使 contiguous() 成为可被 ACLGraph 捕获的普通 PyTorch 操作。 - C++ 算子直接保存 Python 层传入的连续张量,不再在 C++ 内创建临时 Tensor。 - 新增连续输入复用及非连续 split/view 输入归一化的单元测试。 ## 关联 Issue Closes #502 ## 验证 - [x] python -m pytest test/msprobe_test/pytorch_ut/dump/test_aclgraph_dumper.py::TestAclGraphDumpApi -q(3 passed) - [x] Ruff 检查通过 - [x] git diff --check 通过 - [x] GitCode 远端 Git hooks 通过 - [x] vLLM-Ascend 0.20.2 镜像 NPU eager 回归:BF16 mixed_qkvz.split([qkv_size, z_size], dim=-1) 与 torch.save 对比,基础 3 组及 matmul 压测 10 组均 torch.equal=True、max_abs=0.0 --- # acl_save非连续Tensor保存修复Feature验证报告 ## 验证基线 - 关联问题: [Issue #502](https://gitcode.com/Ascend/msprobe/issues/502) - 修复PR: [PR !937](https://gitcode.com/Ascend/msprobe/merge_requests/937) - msprobe提交: 4ed35d39f4299b89a0e3ef48fd6d2b732faeb852 - 环境: 192.168.9.131, 容器 problem_zx - 镜像ID: sha256:c477838e036c248df4a82c13a6c067898c97b08d7f6dae7bb068e144f95e4783 - 软件: vLLM 0.20.2, Torch 2.10.0+cpu, TorchNPU 2.10.0 - 硬件: Ascend 910B4, NPU 0 - 构建: python3 build.py -e include-mod=aclgraph_dump -e no-check=true - 产物: mindstudio_probe-26.0.0-cp311-cp311-manylinux_2_35_aarch64.whl - wheel SHA256: 7ab1a7bf9dddb5bff810f6495b74494f2c8e78e7883dfb15cee44c64adcca8be ## 问题根因 ### 1. mixed_qkv是带行间空洞的非连续view vLLM-Ascend eager路径中的代码为: python mixed_qkv, z = mixed_qkvz.split([qkv_size, z_size], dim=-1) 当token数大于1时,mixed_qkv与z共享mixed_qkvz的Storage。以本次基础用例 shape=(2, 40)、qkv_size=32、z_size=8为例,mixed_qkv的逻辑shape是(2, 32), 但stride仍是(40, 1),因此is_contiguous=False。 如果从mixed_qkv.data_ptr()直接复制numel * element_size个连续字节,读取顺序将变为: 1. 第0行的32个QKV元素; 2. 第0行紧随其后的8个Z元素; 3. 第1行前24个QKV元素。 这与逻辑Tensor所需的“第0行32个QKV + 第1行32个QKV”不同,因此底层raw memcpy只能接收已经连续化的Tensor。 ### 2. 旧实现的contiguous临时Tensor跨越了异步callback生命周期 旧C++路径在acl_save_impl内部执行: cpp at::Tensor tensor_to_save = x.is_contiguous() ? x : x.contiguous(); auto* payload = new SaveTaskPayload(tensor_to_save, path); aclrtLaunchHostFunc(stream, acl_save_host_func, payload); SaveTaskPayload为避免ACLGraph graph-pool Storage无法复用,只保存device_ptr、nbytes、shape和dtype, 不持有at::Tensor。但在eager模式下,tensor_to_save是C++函数内的局部临时Tensor,代码只代表task下发,不代表执行完成; acl_save_impl返回后该Tensor生命周期结束,而acl_save_host_func稍后才异步读取payload中的裸设备地址。 临时Storage一旦被分配器回收或复用,callback就可能读取到其他算子的内容,表现为acl_save结果与torch.save不一致。 不能简单让现有payload长期持有Tensor:ACLGraph replay会重复使用同一个payload,持有graph-pool Storage会阻止显存池复用, 导致图模式显存膨胀。因此eager与ACLGraph不能共用“payload持有Tensor直到进程结束”的修复方式。 ### 3. torch.save为什么没有该问题 torch.save保存Tensor时会持有底层Storage,并记录shape、stride和storage_offset等元数据; 对于设备Storage,D2H完成后才写入文件并返回。它既不会把非连续view误当成紧密排列的numel字节, 也不会让异步callback在Storage生命周期结束后继续读取裸地址。 ### 4. 本PR的修复机制 本PR将布局转换移至Python包装接口: python tensor_to_save = x if x.is_contiguous() else x.contiguous() return torch.ops.my_ns.acl_save(tensor_to_save, path) 同时C++算子不再创建局部contiguous临时Tensor;底层算子保持非抛异常路径,由公开Python接口负责传入连续Tensor,避免校验异常中断推理服务。 - eager模式:连续化Tensor作为dispatcher的显式输入,连续化操作与callback按当前NPU stream排序;本次在忽略返回值、 callback完成前额外制造显存分配和写入压力的条件下验证通过。 - ACLGraph模式:contiguous()作为普通PyTorch操作参与图捕获,C++ payload继续只保存稳定设备地址, 不持有graph-pool Tensor,不影响显存池复用。 ## 用例名 - acl_save_split_view_basic_compare - acl_save_split_view_matmul_allocator_stress ## 安装命令 bash docker exec problem_zx bash -lc ' work_dir=$(cat /tmp/msprobe-502-current) wheel=$(find "$work_dir/src/artifacts" -name "mindstudio_probe*.whl" | head -1) python3 -m pip install --force-reinstall --no-deps "$wheel" ' ## 执行命令 bash ASCEND_RT_VISIBLE_DEVICES=0 docker exec -i problem_zx \ bash -lc 'ASCEND_RT_VISIBLE_DEVICES=0 PYTHONUNBUFFERED=1 python3 -' \ < /data01/tjh/code/reports/msprobe_937_acl_save_validation.py \ > /data01/tjh/code/reports/msprobe_937_acl_save_validation.log 2>&1 ## 执行步骤 1. 从PR分支构建并安装包含aclgraph_dump_ext.so的wheel。 2. 校验实际加载的Python wrapper和扩展.so均来自新安装的msprobe。 3. 基础用例使用BF16 Tensor执行split([32, 8], dim=-1),覆盖token数1、2、7。 4. 分别使用torch.save与acl_save保存,加载到CPU后比较shape、dtype、stride、逐元素值和最大绝对误差。 5. 压力用例通过NPU BF16 matmul生成mixed_qkvz,执行split([256, 64], dim=-1)。 6. 压力用例故意忽略acl_save返回值,并在synchronize前分配和写入8个同级NPU Tensor,连续执行10轮。 ## 执行日志片段(连续) text MSPROBE_FILE= /usr/local/python3.11.15/lib/python3.11/site-packages/msprobe/__init__.py ACLGRAPH_WRAPPER_FILE= /usr/local/python3.11.15/lib/python3.11/site-packages/msprobe/pytorch/aclgraph_dump/__init__.py ACLGRAPH_EXT_FILE= /usr/local/python3.11.15/lib/python3.11/site-packages/msprobe/lib/aclgraph_dump_ext.so TORCH= 2.10.0+cpu TORCH_NPU= 2.10.0 NPU_AVAILABLE= True BASIC_CASE=0 TOKENS=1 INPUT_CONTIGUOUS=True INPUT_STRIDE=(40, 1) TORCH_STRIDE=(40, 1) ACL_STRIDE=(32, 1) EQUAL=True MAX_ABS=0.0 BASIC_CASE=1 TOKENS=2 INPUT_CONTIGUOUS=False INPUT_STRIDE=(40, 1) TORCH_STRIDE=(40, 1) ACL_STRIDE=(32, 1) EQUAL=True MAX_ABS=0.0 BASIC_CASE=2 TOKENS=7 INPUT_CONTIGUOUS=False INPUT_STRIDE=(40, 1) TORCH_STRIDE=(40, 1) ACL_STRIDE=(32, 1) EQUAL=True MAX_ABS=0.0 STRESS_CASE=0 TOKENS=2 INPUT_STRIDE=(320, 1) EQUAL=True MAX_ABS=0.0 STRESS_CASE=1 TOKENS=3 INPUT_STRIDE=(320, 1) EQUAL=True MAX_ABS=0.0 STRESS_CASE=2 TOKENS=4 INPUT_STRIDE=(320, 1) EQUAL=True MAX_ABS=0.0 STRESS_CASE=3 TOKENS=5 INPUT_STRIDE=(320, 1) EQUAL=True MAX_ABS=0.0 STRESS_CASE=4 TOKENS=6 INPUT_STRIDE=(320, 1) EQUAL=True MAX_ABS=0.0 STRESS_CASE=5 TOKENS=7 INPUT_STRIDE=(320, 1) EQUAL=True MAX_ABS=0.0 STRESS_CASE=6 TOKENS=2 INPUT_STRIDE=(320, 1) EQUAL=True MAX_ABS=0.0 STRESS_CASE=7 TOKENS=3 INPUT_STRIDE=(320, 1) EQUAL=True MAX_ABS=0.0 STRESS_CASE=8 TOKENS=4 INPUT_STRIDE=(320, 1) EQUAL=True MAX_ABS=0.0 STRESS_CASE=9 TOKENS=5 INPUT_STRIDE=(320, 1) EQUAL=True MAX_ABS=0.0 SUMMARY BASIC=3/3 STRESS=10/10 ALL_EQUAL=True ## 执行结果 通过。 - 基础用例:3/3通过。 - NPU matmul及显存复用压力用例:10/10通过。 - 所有用例均为torch.equal=True、MAX_ABS=0.0。 - torch.save加载结果保留原view stride;acl_save加载结果为连续stride,这是预期布局差异,不影响shape、dtype和逻辑数值。 - 忽略acl_save返回值并在同步前制造分配器压力后仍全部通过。 ## 原始文件位置 - 报告: /data01/tjh/code/reports/msprobe_937_acl_save_contiguous_feature_report.md - 验证脚本: /data01/tjh/code/reports/msprobe_937_acl_save_validation.py - 验证日志: /data01/tjh/code/reports/msprobe_937_acl_save_validation.log - 构建日志: /data01/tjh/code/reports/msprobe_937_acl_save_build.log See merge request: Ascend/msprobe!937 | 1 小时前 |
| [master]adump模块日落 Co-authored-by: jiangchaoj<chaojiang_j@163.com> # message auto-generated for no-merge-commit merge: !832 merge master-del_adump into master [master]adump模块日落 Created-by: jianchaoj Commit-by: jiangchaoj Merged-by: ascend-robot Description: # PR 合入模板 **注:经过自检不涉及的可标注“不涉及”或直接打勾,特殊情况请文字备注。不符合规范的 PR 不允许合入,请(后备)commit 注意。** ## 1. 修改描述 - **修改原因:** MindSpore不再支持ge_backend模式,msProbe同步移除依赖该模式得adump模块 - **修改内容:** - 删除adump源码、编译代码。修改工具安装指南 - 移除MindSpore ge_backend模式下的Dump功能,保留ms_backend模式下的Dump功能。删除配置文件中的"file_format"参数,修改对应资料 - 移除MindSpore ge_backend模式下的溢出检测功能,保留ms_backend模式下的异常Dump功能。删除配置文件中的"overflow_check" task,修改对应资料 - 移除MindSpore动态图模式下,API Kernel Dump功能。修改对应资料 ## 2. 功能验证 - 编译  - PyTorch Dump  - PyTorch overflow_check  - MindSpore 动态图Dump  - MindSpore 静态图L0 Dump  - MindSpore 静态图L2 Dump  - MindSpore overflow_check  - MindSpore 动态图L2 Dump  ## 3. 分支合并要求 同步合入master、26.1.0分支 ## 3. 代码检视 - **要求:** - 合入代码超过 200 行,需三人以上会议检视。 - 检视密度≥1个/100行。 - 检视缺陷密度未达要求需提供说明。 - 大于 1000 行代码原则上不允许合入,需进行备案。 - [x] **是否经过代码检视** - [x] **是否具备 UT 测试用例看护** (如不符合,请说明原因:____________________) ## 4. 变更知会 - [x] **资料修改** - [x] **变更通知(消息知会 + 邮件知会)** See merge request: Ascend/msprobe!832 | 1 个月前 |
| 【Doc】动态图多batch支持指定request采集资料 Co-authored-by: HowSir_X<zhonghao31@huawei.com> # message auto-generated for no-merge-commit merge: !932 merge request_id_doc into master 【Doc】动态图多batch支持指定request采集资料 Created-by: HowSir_X Commit-by: HowSir_X Merged-by: ascend-robot Description: 【Doc】动态图多batch支持指定request采集资料  See merge request: Ascend/msprobe!932 | 2 天前 |
| doc:快速入门优化 Co-authored-by: mengguangxin<mgx0018@163.com> # message auto-generated for no-merge-commit merge: !886 merge dev_0714 into master doc:快速入门优化 Created-by: mengguangxin Commit-by: mengguangxin Merged-by: ascend-robot Description: 修改原因: 快速入门文档自动化程度没有达到要求,易用性不够 修改内容: 命令行部分达成全程 Copy/Paste 执行标准,通过容器技术彻底解决环境问题,对整体流程进行了全面梳理重构 See merge request: Ascend/msprobe!886 | 23 天前 |
| 目录初始化 Co-authored-by: lichangwei<lichangwei4@huawei.com> | 9 个月前 |
| chore(deps): 升级前端依赖修复CVE漏洞 Co-authored-by: sun-cha<1299792067@qq.com> # message auto-generated for no-merge-commit merge: !897 merge fix/issue-CVE into master chore(deps): 升级前端依赖修复CVE漏洞 Created-by: sun-cha Commit-by: sun-cha Merged-by: ascend-robot Description: ## 变更说明 升级前端插件依赖包版本,修复已知 CVE 安全漏洞。 ### 依赖更新 | 依赖包 | 旧版本 | 新版本 | |--------|--------|--------| | axios | 1.15.0 | 1.16.0 | | lodash | 4.17.21 | 4.18.0 | ### 新增依赖 - https-proxy-agent — HTTPS 代理支持 - agent-base — 代理底层依赖 ### 其他 - 清理 package-lock.json 中多余的 peer 标记配置 ## 影响范围 - plugins/tb_graph_ascend/hierarchy_plugin/front/ - plugins/tb_graph_ascend/monvis_plugin/front/ ## 变更类型 - [x] 安全修复(CVE) - [ ] 新功能 - [ ] Bug 修复 - [ ] 破坏性变更 See merge request: Ascend/msprobe!897 | 18 天前 |
| gitleaks能力上线 Co-authored-by: wangchao285<wangchao285@huawei.com> # message auto-generated for no-merge-commit merge: !883 merge master into master gitleaks能力上线 Created-by: wangchao285 Commit-by: wangchao285 Merged-by: ascend-robot Description: 上线gitleaks能力: Gitleaks 是一个开源的 Git 仓库密钥/敏感信息扫描工具(Secret Scanning),用来在代码仓库里找硬编码的密码、API Key、Token、私钥等,防止敏感信息被提交到 Git 后泄露。 See merge request: Ascend/msprobe!883 | 26 天前 |
| 【bugfix】 修复 acl_save 保存非连续张量数据异常 (#502) Co-authored-by: Tjh-UKN<2559659915@qq.com> # message auto-generated for no-merge-commit merge: !937 merge fix/acl-save-python-contiguous-502 into master 【bugfix】 修复 acl_save 保存非连续张量数据异常 (#502) Created-by: Tjh-UKN Commit-by: Tjh-UKN Merged-by: ascend-robot Description: # Pull Request ## 修改内容 - 将 acl_save 和 acl_tensor_save 的非连续张量归一化操作移至 Python 包装层,使 contiguous() 成为可被 ACLGraph 捕获的普通 PyTorch 操作。 - C++ 算子直接保存 Python 层传入的连续张量,不再在 C++ 内创建临时 Tensor。 - 新增连续输入复用及非连续 split/view 输入归一化的单元测试。 ## 关联 Issue Closes #502 ## 验证 - [x] python -m pytest test/msprobe_test/pytorch_ut/dump/test_aclgraph_dumper.py::TestAclGraphDumpApi -q(3 passed) - [x] Ruff 检查通过 - [x] git diff --check 通过 - [x] GitCode 远端 Git hooks 通过 - [x] vLLM-Ascend 0.20.2 镜像 NPU eager 回归:BF16 mixed_qkvz.split([qkv_size, z_size], dim=-1) 与 torch.save 对比,基础 3 组及 matmul 压测 10 组均 torch.equal=True、max_abs=0.0 --- # acl_save非连续Tensor保存修复Feature验证报告 ## 验证基线 - 关联问题: [Issue #502](https://gitcode.com/Ascend/msprobe/issues/502) - 修复PR: [PR !937](https://gitcode.com/Ascend/msprobe/merge_requests/937) - msprobe提交: 4ed35d39f4299b89a0e3ef48fd6d2b732faeb852 - 环境: 192.168.9.131, 容器 problem_zx - 镜像ID: sha256:c477838e036c248df4a82c13a6c067898c97b08d7f6dae7bb068e144f95e4783 - 软件: vLLM 0.20.2, Torch 2.10.0+cpu, TorchNPU 2.10.0 - 硬件: Ascend 910B4, NPU 0 - 构建: python3 build.py -e include-mod=aclgraph_dump -e no-check=true - 产物: mindstudio_probe-26.0.0-cp311-cp311-manylinux_2_35_aarch64.whl - wheel SHA256: 7ab1a7bf9dddb5bff810f6495b74494f2c8e78e7883dfb15cee44c64adcca8be ## 问题根因 ### 1. mixed_qkv是带行间空洞的非连续view vLLM-Ascend eager路径中的代码为: python mixed_qkv, z = mixed_qkvz.split([qkv_size, z_size], dim=-1) 当token数大于1时,mixed_qkv与z共享mixed_qkvz的Storage。以本次基础用例 shape=(2, 40)、qkv_size=32、z_size=8为例,mixed_qkv的逻辑shape是(2, 32), 但stride仍是(40, 1),因此is_contiguous=False。 如果从mixed_qkv.data_ptr()直接复制numel * element_size个连续字节,读取顺序将变为: 1. 第0行的32个QKV元素; 2. 第0行紧随其后的8个Z元素; 3. 第1行前24个QKV元素。 这与逻辑Tensor所需的“第0行32个QKV + 第1行32个QKV”不同,因此底层raw memcpy只能接收已经连续化的Tensor。 ### 2. 旧实现的contiguous临时Tensor跨越了异步callback生命周期 旧C++路径在acl_save_impl内部执行: cpp at::Tensor tensor_to_save = x.is_contiguous() ? x : x.contiguous(); auto* payload = new SaveTaskPayload(tensor_to_save, path); aclrtLaunchHostFunc(stream, acl_save_host_func, payload); SaveTaskPayload为避免ACLGraph graph-pool Storage无法复用,只保存device_ptr、nbytes、shape和dtype, 不持有at::Tensor。但在eager模式下,tensor_to_save是C++函数内的局部临时Tensor,代码只代表task下发,不代表执行完成; acl_save_impl返回后该Tensor生命周期结束,而acl_save_host_func稍后才异步读取payload中的裸设备地址。 临时Storage一旦被分配器回收或复用,callback就可能读取到其他算子的内容,表现为acl_save结果与torch.save不一致。 不能简单让现有payload长期持有Tensor:ACLGraph replay会重复使用同一个payload,持有graph-pool Storage会阻止显存池复用, 导致图模式显存膨胀。因此eager与ACLGraph不能共用“payload持有Tensor直到进程结束”的修复方式。 ### 3. torch.save为什么没有该问题 torch.save保存Tensor时会持有底层Storage,并记录shape、stride和storage_offset等元数据; 对于设备Storage,D2H完成后才写入文件并返回。它既不会把非连续view误当成紧密排列的numel字节, 也不会让异步callback在Storage生命周期结束后继续读取裸地址。 ### 4. 本PR的修复机制 本PR将布局转换移至Python包装接口: python tensor_to_save = x if x.is_contiguous() else x.contiguous() return torch.ops.my_ns.acl_save(tensor_to_save, path) 同时C++算子不再创建局部contiguous临时Tensor;底层算子保持非抛异常路径,由公开Python接口负责传入连续Tensor,避免校验异常中断推理服务。 - eager模式:连续化Tensor作为dispatcher的显式输入,连续化操作与callback按当前NPU stream排序;本次在忽略返回值、 callback完成前额外制造显存分配和写入压力的条件下验证通过。 - ACLGraph模式:contiguous()作为普通PyTorch操作参与图捕获,C++ payload继续只保存稳定设备地址, 不持有graph-pool Tensor,不影响显存池复用。 ## 用例名 - acl_save_split_view_basic_compare - acl_save_split_view_matmul_allocator_stress ## 安装命令 bash docker exec problem_zx bash -lc ' work_dir=$(cat /tmp/msprobe-502-current) wheel=$(find "$work_dir/src/artifacts" -name "mindstudio_probe*.whl" | head -1) python3 -m pip install --force-reinstall --no-deps "$wheel" ' ## 执行命令 bash ASCEND_RT_VISIBLE_DEVICES=0 docker exec -i problem_zx \ bash -lc 'ASCEND_RT_VISIBLE_DEVICES=0 PYTHONUNBUFFERED=1 python3 -' \ < /data01/tjh/code/reports/msprobe_937_acl_save_validation.py \ > /data01/tjh/code/reports/msprobe_937_acl_save_validation.log 2>&1 ## 执行步骤 1. 从PR分支构建并安装包含aclgraph_dump_ext.so的wheel。 2. 校验实际加载的Python wrapper和扩展.so均来自新安装的msprobe。 3. 基础用例使用BF16 Tensor执行split([32, 8], dim=-1),覆盖token数1、2、7。 4. 分别使用torch.save与acl_save保存,加载到CPU后比较shape、dtype、stride、逐元素值和最大绝对误差。 5. 压力用例通过NPU BF16 matmul生成mixed_qkvz,执行split([256, 64], dim=-1)。 6. 压力用例故意忽略acl_save返回值,并在synchronize前分配和写入8个同级NPU Tensor,连续执行10轮。 ## 执行日志片段(连续) text MSPROBE_FILE= /usr/local/python3.11.15/lib/python3.11/site-packages/msprobe/__init__.py ACLGRAPH_WRAPPER_FILE= /usr/local/python3.11.15/lib/python3.11/site-packages/msprobe/pytorch/aclgraph_dump/__init__.py ACLGRAPH_EXT_FILE= /usr/local/python3.11.15/lib/python3.11/site-packages/msprobe/lib/aclgraph_dump_ext.so TORCH= 2.10.0+cpu TORCH_NPU= 2.10.0 NPU_AVAILABLE= True BASIC_CASE=0 TOKENS=1 INPUT_CONTIGUOUS=True INPUT_STRIDE=(40, 1) TORCH_STRIDE=(40, 1) ACL_STRIDE=(32, 1) EQUAL=True MAX_ABS=0.0 BASIC_CASE=1 TOKENS=2 INPUT_CONTIGUOUS=False INPUT_STRIDE=(40, 1) TORCH_STRIDE=(40, 1) ACL_STRIDE=(32, 1) EQUAL=True MAX_ABS=0.0 BASIC_CASE=2 TOKENS=7 INPUT_CONTIGUOUS=False INPUT_STRIDE=(40, 1) TORCH_STRIDE=(40, 1) ACL_STRIDE=(32, 1) EQUAL=True MAX_ABS=0.0 STRESS_CASE=0 TOKENS=2 INPUT_STRIDE=(320, 1) EQUAL=True MAX_ABS=0.0 STRESS_CASE=1 TOKENS=3 INPUT_STRIDE=(320, 1) EQUAL=True MAX_ABS=0.0 STRESS_CASE=2 TOKENS=4 INPUT_STRIDE=(320, 1) EQUAL=True MAX_ABS=0.0 STRESS_CASE=3 TOKENS=5 INPUT_STRIDE=(320, 1) EQUAL=True MAX_ABS=0.0 STRESS_CASE=4 TOKENS=6 INPUT_STRIDE=(320, 1) EQUAL=True MAX_ABS=0.0 STRESS_CASE=5 TOKENS=7 INPUT_STRIDE=(320, 1) EQUAL=True MAX_ABS=0.0 STRESS_CASE=6 TOKENS=2 INPUT_STRIDE=(320, 1) EQUAL=True MAX_ABS=0.0 STRESS_CASE=7 TOKENS=3 INPUT_STRIDE=(320, 1) EQUAL=True MAX_ABS=0.0 STRESS_CASE=8 TOKENS=4 INPUT_STRIDE=(320, 1) EQUAL=True MAX_ABS=0.0 STRESS_CASE=9 TOKENS=5 INPUT_STRIDE=(320, 1) EQUAL=True MAX_ABS=0.0 SUMMARY BASIC=3/3 STRESS=10/10 ALL_EQUAL=True ## 执行结果 通过。 - 基础用例:3/3通过。 - NPU matmul及显存复用压力用例:10/10通过。 - 所有用例均为torch.equal=True、MAX_ABS=0.0。 - torch.save加载结果保留原view stride;acl_save加载结果为连续stride,这是预期布局差异,不影响shape、dtype和逻辑数值。 - 忽略acl_save返回值并在同步前制造分配器压力后仍全部通过。 ## 原始文件位置 - 报告: /data01/tjh/code/reports/msprobe_937_acl_save_contiguous_feature_report.md - 验证脚本: /data01/tjh/code/reports/msprobe_937_acl_save_validation.py - 验证日志: /data01/tjh/code/reports/msprobe_937_acl_save_validation.log - 构建日志: /data01/tjh/code/reports/msprobe_937_acl_save_build.log See merge request: Ascend/msprobe!937 | 1 小时前 |
| 【bugfix】修复cmp包安装问题 Co-authored-by: l30036321<lvkaimeng@gmail.com> # message auto-generated for no-merge-commit merge: !818 merge master into master 【bugfix】修复cmp包安装问题 Created-by: lv-kaimeng Commit-by: l30036321 Merged-by: ascend-robot Description: 1. 拷贝前进行写权限提权,拷贝后恢复 2. 修改默认安装路径以环境变量为准 See merge request: Ascend/msprobe!818 | 1 个月前 |
| 【bugfix】 修复 acl_save 保存非连续张量数据异常 (#502) Co-authored-by: Tjh-UKN<2559659915@qq.com> # message auto-generated for no-merge-commit merge: !937 merge fix/acl-save-python-contiguous-502 into master 【bugfix】 修复 acl_save 保存非连续张量数据异常 (#502) Created-by: Tjh-UKN Commit-by: Tjh-UKN Merged-by: ascend-robot Description: # Pull Request ## 修改内容 - 将 acl_save 和 acl_tensor_save 的非连续张量归一化操作移至 Python 包装层,使 contiguous() 成为可被 ACLGraph 捕获的普通 PyTorch 操作。 - C++ 算子直接保存 Python 层传入的连续张量,不再在 C++ 内创建临时 Tensor。 - 新增连续输入复用及非连续 split/view 输入归一化的单元测试。 ## 关联 Issue Closes #502 ## 验证 - [x] python -m pytest test/msprobe_test/pytorch_ut/dump/test_aclgraph_dumper.py::TestAclGraphDumpApi -q(3 passed) - [x] Ruff 检查通过 - [x] git diff --check 通过 - [x] GitCode 远端 Git hooks 通过 - [x] vLLM-Ascend 0.20.2 镜像 NPU eager 回归:BF16 mixed_qkvz.split([qkv_size, z_size], dim=-1) 与 torch.save 对比,基础 3 组及 matmul 压测 10 组均 torch.equal=True、max_abs=0.0 --- # acl_save非连续Tensor保存修复Feature验证报告 ## 验证基线 - 关联问题: [Issue #502](https://gitcode.com/Ascend/msprobe/issues/502) - 修复PR: [PR !937](https://gitcode.com/Ascend/msprobe/merge_requests/937) - msprobe提交: 4ed35d39f4299b89a0e3ef48fd6d2b732faeb852 - 环境: 192.168.9.131, 容器 problem_zx - 镜像ID: sha256:c477838e036c248df4a82c13a6c067898c97b08d7f6dae7bb068e144f95e4783 - 软件: vLLM 0.20.2, Torch 2.10.0+cpu, TorchNPU 2.10.0 - 硬件: Ascend 910B4, NPU 0 - 构建: python3 build.py -e include-mod=aclgraph_dump -e no-check=true - 产物: mindstudio_probe-26.0.0-cp311-cp311-manylinux_2_35_aarch64.whl - wheel SHA256: 7ab1a7bf9dddb5bff810f6495b74494f2c8e78e7883dfb15cee44c64adcca8be ## 问题根因 ### 1. mixed_qkv是带行间空洞的非连续view vLLM-Ascend eager路径中的代码为: python mixed_qkv, z = mixed_qkvz.split([qkv_size, z_size], dim=-1) 当token数大于1时,mixed_qkv与z共享mixed_qkvz的Storage。以本次基础用例 shape=(2, 40)、qkv_size=32、z_size=8为例,mixed_qkv的逻辑shape是(2, 32), 但stride仍是(40, 1),因此is_contiguous=False。 如果从mixed_qkv.data_ptr()直接复制numel * element_size个连续字节,读取顺序将变为: 1. 第0行的32个QKV元素; 2. 第0行紧随其后的8个Z元素; 3. 第1行前24个QKV元素。 这与逻辑Tensor所需的“第0行32个QKV + 第1行32个QKV”不同,因此底层raw memcpy只能接收已经连续化的Tensor。 ### 2. 旧实现的contiguous临时Tensor跨越了异步callback生命周期 旧C++路径在acl_save_impl内部执行: cpp at::Tensor tensor_to_save = x.is_contiguous() ? x : x.contiguous(); auto* payload = new SaveTaskPayload(tensor_to_save, path); aclrtLaunchHostFunc(stream, acl_save_host_func, payload); SaveTaskPayload为避免ACLGraph graph-pool Storage无法复用,只保存device_ptr、nbytes、shape和dtype, 不持有at::Tensor。但在eager模式下,tensor_to_save是C++函数内的局部临时Tensor,代码只代表task下发,不代表执行完成; acl_save_impl返回后该Tensor生命周期结束,而acl_save_host_func稍后才异步读取payload中的裸设备地址。 临时Storage一旦被分配器回收或复用,callback就可能读取到其他算子的内容,表现为acl_save结果与torch.save不一致。 不能简单让现有payload长期持有Tensor:ACLGraph replay会重复使用同一个payload,持有graph-pool Storage会阻止显存池复用, 导致图模式显存膨胀。因此eager与ACLGraph不能共用“payload持有Tensor直到进程结束”的修复方式。 ### 3. torch.save为什么没有该问题 torch.save保存Tensor时会持有底层Storage,并记录shape、stride和storage_offset等元数据; 对于设备Storage,D2H完成后才写入文件并返回。它既不会把非连续view误当成紧密排列的numel字节, 也不会让异步callback在Storage生命周期结束后继续读取裸地址。 ### 4. 本PR的修复机制 本PR将布局转换移至Python包装接口: python tensor_to_save = x if x.is_contiguous() else x.contiguous() return torch.ops.my_ns.acl_save(tensor_to_save, path) 同时C++算子不再创建局部contiguous临时Tensor;底层算子保持非抛异常路径,由公开Python接口负责传入连续Tensor,避免校验异常中断推理服务。 - eager模式:连续化Tensor作为dispatcher的显式输入,连续化操作与callback按当前NPU stream排序;本次在忽略返回值、 callback完成前额外制造显存分配和写入压力的条件下验证通过。 - ACLGraph模式:contiguous()作为普通PyTorch操作参与图捕获,C++ payload继续只保存稳定设备地址, 不持有graph-pool Tensor,不影响显存池复用。 ## 用例名 - acl_save_split_view_basic_compare - acl_save_split_view_matmul_allocator_stress ## 安装命令 bash docker exec problem_zx bash -lc ' work_dir=$(cat /tmp/msprobe-502-current) wheel=$(find "$work_dir/src/artifacts" -name "mindstudio_probe*.whl" | head -1) python3 -m pip install --force-reinstall --no-deps "$wheel" ' ## 执行命令 bash ASCEND_RT_VISIBLE_DEVICES=0 docker exec -i problem_zx \ bash -lc 'ASCEND_RT_VISIBLE_DEVICES=0 PYTHONUNBUFFERED=1 python3 -' \ < /data01/tjh/code/reports/msprobe_937_acl_save_validation.py \ > /data01/tjh/code/reports/msprobe_937_acl_save_validation.log 2>&1 ## 执行步骤 1. 从PR分支构建并安装包含aclgraph_dump_ext.so的wheel。 2. 校验实际加载的Python wrapper和扩展.so均来自新安装的msprobe。 3. 基础用例使用BF16 Tensor执行split([32, 8], dim=-1),覆盖token数1、2、7。 4. 分别使用torch.save与acl_save保存,加载到CPU后比较shape、dtype、stride、逐元素值和最大绝对误差。 5. 压力用例通过NPU BF16 matmul生成mixed_qkvz,执行split([256, 64], dim=-1)。 6. 压力用例故意忽略acl_save返回值,并在synchronize前分配和写入8个同级NPU Tensor,连续执行10轮。 ## 执行日志片段(连续) text MSPROBE_FILE= /usr/local/python3.11.15/lib/python3.11/site-packages/msprobe/__init__.py ACLGRAPH_WRAPPER_FILE= /usr/local/python3.11.15/lib/python3.11/site-packages/msprobe/pytorch/aclgraph_dump/__init__.py ACLGRAPH_EXT_FILE= /usr/local/python3.11.15/lib/python3.11/site-packages/msprobe/lib/aclgraph_dump_ext.so TORCH= 2.10.0+cpu TORCH_NPU= 2.10.0 NPU_AVAILABLE= True BASIC_CASE=0 TOKENS=1 INPUT_CONTIGUOUS=True INPUT_STRIDE=(40, 1) TORCH_STRIDE=(40, 1) ACL_STRIDE=(32, 1) EQUAL=True MAX_ABS=0.0 BASIC_CASE=1 TOKENS=2 INPUT_CONTIGUOUS=False INPUT_STRIDE=(40, 1) TORCH_STRIDE=(40, 1) ACL_STRIDE=(32, 1) EQUAL=True MAX_ABS=0.0 BASIC_CASE=2 TOKENS=7 INPUT_CONTIGUOUS=False INPUT_STRIDE=(40, 1) TORCH_STRIDE=(40, 1) ACL_STRIDE=(32, 1) EQUAL=True MAX_ABS=0.0 STRESS_CASE=0 TOKENS=2 INPUT_STRIDE=(320, 1) EQUAL=True MAX_ABS=0.0 STRESS_CASE=1 TOKENS=3 INPUT_STRIDE=(320, 1) EQUAL=True MAX_ABS=0.0 STRESS_CASE=2 TOKENS=4 INPUT_STRIDE=(320, 1) EQUAL=True MAX_ABS=0.0 STRESS_CASE=3 TOKENS=5 INPUT_STRIDE=(320, 1) EQUAL=True MAX_ABS=0.0 STRESS_CASE=4 TOKENS=6 INPUT_STRIDE=(320, 1) EQUAL=True MAX_ABS=0.0 STRESS_CASE=5 TOKENS=7 INPUT_STRIDE=(320, 1) EQUAL=True MAX_ABS=0.0 STRESS_CASE=6 TOKENS=2 INPUT_STRIDE=(320, 1) EQUAL=True MAX_ABS=0.0 STRESS_CASE=7 TOKENS=3 INPUT_STRIDE=(320, 1) EQUAL=True MAX_ABS=0.0 STRESS_CASE=8 TOKENS=4 INPUT_STRIDE=(320, 1) EQUAL=True MAX_ABS=0.0 STRESS_CASE=9 TOKENS=5 INPUT_STRIDE=(320, 1) EQUAL=True MAX_ABS=0.0 SUMMARY BASIC=3/3 STRESS=10/10 ALL_EQUAL=True ## 执行结果 通过。 - 基础用例:3/3通过。 - NPU matmul及显存复用压力用例:10/10通过。 - 所有用例均为torch.equal=True、MAX_ABS=0.0。 - torch.save加载结果保留原view stride;acl_save加载结果为连续stride,这是预期布局差异,不影响shape、dtype和逻辑数值。 - 忽略acl_save返回值并在同步前制造分配器压力后仍全部通过。 ## 原始文件位置 - 报告: /data01/tjh/code/reports/msprobe_937_acl_save_contiguous_feature_report.md - 验证脚本: /data01/tjh/code/reports/msprobe_937_acl_save_validation.py - 验证日志: /data01/tjh/code/reports/msprobe_937_acl_save_validation.log - 构建日志: /data01/tjh/code/reports/msprobe_937_acl_save_build.log See merge request: Ascend/msprobe!937 | 1 小时前 |
| clang-tidy能力上线 Co-authored-by: wangchao285<wangchao285@huawei.com> # message auto-generated for no-merge-commit merge: !904 merge master into master clang-tidy能力上线 Created-by: wangchao285 Commit-by: wangchao285 Merged-by: ascend-robot Description: clang-tidy能力上线 See merge request: Ascend/msprobe!904 | 16 天前 |
| 【feat】msprobe编译脚本重构优化 Co-authored-by: curry808<485078529@qq.com> # message auto-generated for no-merge-commit merge: !798 merge master into master 【feat】msprobe编译脚本重构优化 Created-by: curry808 Commit-by: curry808 Merged-by: ascend-robot Description: 【feat】msprobe编译脚本重构优化 See merge request: Ascend/msprobe!798 | 1 个月前 |
| clang-tidy能力上线 Co-authored-by: wangchao285<wangchao285@huawei.com> # message auto-generated for no-merge-commit merge: !904 merge master into master clang-tidy能力上线 Created-by: wangchao285 Commit-by: wangchao285 Merged-by: ascend-robot Description: clang-tidy能力上线 See merge request: Ascend/msprobe!904 | 16 天前 |
| 【资料】适配readdocs Co-authored-by: wugengjun<wugengjun1@huawei.com> # message auto-generated for no-merge-commit merge: !460 merge master_docs into master 【资料】适配readdocs Created-by: wugengjun Commit-by: wugengjun Merged-by: ascend-robot Description: 适配readdocs 效果如下  See merge request: Ascend/msprobe!460 | 4 个月前 |
| 【feature】msProbe支持ATB数据dump-4 Co-authored-by: jiangchaoj<chaojiang_j@163.com> | 6 个月前 |
| 【feature】msprobe add compare Co-authored-by: ylw1234<lwying007@126.com> | 9 个月前 |
| docs:README中的Slime场景挪到PyTorch场景下 Co-authored-by: cai-weiwei1989<734267852@qq.com> # message auto-generated for no-merge-commit merge: !918 merge master into master docs:README中的Slime场景挪到PyTorch场景下 Created-by: cai-weiwei1989 Commit-by: cai-weiwei1989 Merged-by: ascend-robot Description: README中的Slime场景挪到PyTorch场景下 See merge request: Ascend/msprobe!918 | 9 天前 |
| 【feature】msprobe资料易用性整改 Co-authored-by: wugengjun<wugengjun1@huawei.com> # message auto-generated for no-merge-commit merge: !787 merge master0610 into master 【feature】msprobe资料易用性整改 Created-by: wugengjun Commit-by: wugengjun Merged-by: ascend-robot Description: msprobe资料易用性整改 关键文档易用性评分:  全量文档易用性评分:  See merge request: Ascend/msprobe!787 | 1 个月前 |
| 【bugfix】修复编译构建相关的一些问题 Co-authored-by: curry808<wurui56@h-partners.com> # message auto-generated for no-merge-commit merge: !923 merge master into master 【bugfix】修复编译构建相关的一些问题 Created-by: curry808 Commit-by: curry808 Merged-by: ascend-robot Description: 【bugfix】修复编译构建相关的一些问题 See merge request: Ascend/msprobe!923 | 4 天前 |
| 【bugfix】修复编译构建相关的一些问题 Co-authored-by: curry808<wurui56@h-partners.com> # message auto-generated for no-merge-commit merge: !923 merge master into master 【bugfix】修复编译构建相关的一些问题 Created-by: curry808 Commit-by: curry808 Merged-by: ascend-robot Description: 【bugfix】修复编译构建相关的一些问题 See merge request: Ascend/msprobe!923 | 4 天前 |
| 【feat】msprobe编译脚本重构优化 Co-authored-by: curry808<485078529@qq.com> # message auto-generated for no-merge-commit merge: !798 merge master into master 【feat】msprobe编译脚本重构优化 Created-by: curry808 Commit-by: curry808 Merged-by: ascend-robot Description: 【feat】msprobe编译脚本重构优化 See merge request: Ascend/msprobe!798 | 1 个月前 |
| 【bugfix】修复编译构建相关的一些问题 Co-authored-by: curry808<wurui56@h-partners.com> # message auto-generated for no-merge-commit merge: !923 merge master into master 【bugfix】修复编译构建相关的一些问题 Created-by: curry808 Commit-by: curry808 Merged-by: ascend-robot Description: 【bugfix】修复编译构建相关的一些问题 See merge request: Ascend/msprobe!923 | 4 天前 |