已关闭
[L2] matmul_fp8 示例的 gen_data.py 残留 fp16 示例的复制片段:引用了本仓不存在的 MatmulGenHifFp8Data / gen_c_data_nz_format / gen_golden_data_fp16 #1825
eieiei创建于  18 天前关闭于  10 天前
eieiei
eieiei
18 天前 创建

级别判断

L2(本仓当前配置下不会立刻报错,但脚本里有三段"永远走不到、且一走就 NameError"的复制残留;只要有人把 a_format/b_format/c_format 改成 NZ,或按 fp16 示例的方式用这个脚本,就直接炸)

位置

examples/01_simd_cpp_api/04_advanced_api/00_matmul/matmul_fp8/scripts/gen_data.py

现象

这个文件里有 3 个名字在整个 asc-devkit 仓库中没有任何定义:

$ git grep -n "MatmulGenHifFp8Data"
examples/.../matmul_fp8/scripts/gen_data.py:121:        x1_gm = MatmulGenHifFp8Data.nd_to_nz(x1_gm, x1_shape, src_type, c0size)
examples/.../matmul_fp8/scripts/gen_data.py:123:        x2_gm = MatmulGenHifFp8Data.nd_to_nz(x2_gm, x2_shape, src_type, c0size)
examples/.../matmul_fp8/scripts/gen_data.py:174:        x1_gm = MatmulGenHifFp8Data.nd_to_nz(x1_gm, x1_shape, srca_type, c0size)
examples/.../matmul_fp8/scripts/gen_data.py:176:        x2_gm = MatmulGenHifFp8Data.nd_to_nz(x2_gm, x2_shape, srcb_type, c0size)

只在这一个文件里出现:既没有 class 定义,也没有 import;同目录只有 hif8.py(里面是 cvt_float16_to_hifuint8 一类函数,没有这个类)。

另外两处:

  • 第 126 / 179 行调用 gen_c_data_nz_format(...):本仓只有另外两个示例里有这个名字(matmul_channelsplit_output/scripts/gen_data.py:23 是自由函数、matmul_ibshareB/scripts/gen_data.py:82 是 MatmulGenData 的方法),本文件既没 import 也没有定义。
  • 第 83 / 85 行调用 gen_golden_data_fp16(...):本仓只有 matmul_ibshareB/scripts/gen_data.py:112 里作为方法存在。

现在为什么还没炸(如实说明)

gen_data.py:31-33    a_format = "ND"
                     b_format = "ND"
                     c_format = "ND"

所以 if a_format == "NZ": 这些分支目前恒不进入;gen_golden_data() 里 data_type_str 只会被赋成 hif8_hif8_float 或 4 种 fp8_*,永远不等于 "float16_float32" / "float16_float16",所以 gen_golden_data_fp16 那两条也是死分支。也就是说 README 第 91 行的 python3 ../scripts/gen_data.py -scenarioNum=0 目前是通的——问题在于这段从 fp16 示例复制来的死代码,把"NZ 布局"和"fp16 场景"两条路写成了必炸的坑。

实测复现(含对照)

本机没装 tensorflow / ml_dtypes,且脚本里的 tf_matmul 用的是 TF1 graph API,所以我用替身把 tf_matmul / savebinfile 顶掉,让执行推进到出问题的第 121 行——这两个替身与要证明的 NameError 无关(NameError 在它们之后才发生)。脚本主体是原样 exec 仓内文件:

src = io.open(P, encoding="utf-8").read()          # P = 该示例的 gen_data.py
g = {"__name__": "gen_data", "__file__": P}
exec(compile(src, P, "exec"), g)
g["tf_matmul"]  = lambda x1, x2, bias=None: ...    # 替身
g["savebinfile"] = lambda *a, **k: None            # 替身
g["gen_golden_data_hif8"](work_dir)

三步结果:

1) 原样(a_format=ND,README 的用法): OK —— 正常返回,NZ 分支没被进入
2) 仅把 a_format 改成 NZ:              NameError | name 'MatmulGenHifFp8Data' is not defined
3) scenario 走 float16 分支:            NameError | name 'gen_golden_data_fp16' is not defined

第 2、3 步的唯一改动就是把 a_format = "ND" 换成 "NZ"、把 data_type_str 换成 "float16_float32",别的都原样。也就是说:这两条路径写在了示例代码里,但一旦被启用就是 NameError,而 MatmulGenHifFp8Data 这个类名在本仓任何地方都不存在(nd_to_nz 在别的示例里有 4 种自由函数/静态方法实现,唯独这里被当成 MatmulGenHifFp8Data.nd_to_nz 调用)。

建议(三选一,我按维护者的决定出 PR)

  1. 最小:删掉这三段死分支(a_format/b_format/c_format 恒为 ND,data_type_str 恒不等于 float16_*),文件立刻不再有"改配置就 NameError"的陷阱;
  2. 若这个示例本意要支持 NZ/fp16:把缺的符号补进来(nd_to_nz 本仓有多个可参考实现;gen_c_data_nz_format 在 matmul_channelsplit_output/scripts/gen_data.py 里就是自由函数,可以直接搬),并把 data_type_str 的取值与 scenario 对齐;
  3. 若 MatmulGenHifFp8Data 是内部/历史版本的类被删掉了:至少把调用点注释掉并留一行说明,别让读者以为配成 NZ 就能跑。

我倾向 1(改动最小,且与 README 目前只描述 ND 的口径一致)。要哪一种请回复,我今天就补上对应 PR。

likedislike
myx_32成员
11 天前 评论:

你好,感谢指出问题,当前用例确实残留了 fp16 示例的复制片段,需要进行删除,会尽快修复

likedislike
Mmyx_32成员
11 天前 关联了pull request:fix example matmul_fp8 gen_data.py
myx_32成员
10 天前 评论:

问题已修复,已删除多余片段

likedislike
myx_32成员
10 天前 评论:

你好,相关问题已修复。
我们先关闭此issue,如有其他问题,欢饮再提issue交流

likedislike
Mmyx_32成员
10 天前 issue状态由 进行中 改变为 已完成
Mmyx_32成员
10 天前 关闭了 issue
CANN-robotCANN-robot成员
10 天前 添加了label:resolved