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 一类函数,没有这个类)。
hif8.py
cvt_float16_to_hifuint8
另外两处:
gen_c_data_nz_format(...)
matmul_channelsplit_output/scripts/gen_data.py:23
matmul_ibshareB/scripts/gen_data.py:82
MatmulGenData
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 场景"两条路写成了必炸的坑。
if a_format == "NZ":
gen_golden_data()
data_type_str
hif8_hif8_float
fp8_*
"float16_float32"
"float16_float16"
gen_golden_data_fp16
python3 ../scripts/gen_data.py -scenarioNum=0
本机没装 tensorflow / ml_dtypes,且脚本里的 tf_matmul 用的是 TF1 graph API,所以我用替身把 tf_matmul / savebinfile 顶掉,让执行推进到出问题的第 121 行——这两个替身与要证明的 NameError 无关(NameError 在它们之后才发生)。脚本主体是原样 exec 仓内文件:
tensorflow
ml_dtypes
tf_matmul
savebinfile
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 调用)。
a_format = "ND"
"NZ"
MatmulGenHifFp8Data
nd_to_nz
MatmulGenHifFp8Data.nd_to_nz
a_format/b_format/c_format
float16_*
gen_c_data_nz_format
matmul_channelsplit_output/scripts/gen_data.py
我倾向 1(改动最小,且与 README 目前只描述 ND 的口径一致)。要哪一种请回复,我今天就补上对应 PR。
你好,感谢指出问题,当前用例确实残留了 fp16 示例的复制片段,需要进行删除,会尽快修复
问题已修复,已删除多余片段
你好,相关问题已修复。 我们先关闭此issue,如有其他问题,欢饮再提issue交流
级别判断
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 仓库中没有任何定义:
只在这一个文件里出现:既没有 class 定义,也没有 import;同目录只有
hif8.py(里面是cvt_float16_to_hifuint8一类函数,没有这个类)。另外两处:
gen_c_data_nz_format(...):本仓只有另外两个示例里有这个名字(matmul_channelsplit_output/scripts/gen_data.py:23是自由函数、matmul_ibshareB/scripts/gen_data.py:82是MatmulGenData的方法),本文件既没 import 也没有定义。gen_golden_data_fp16(...):本仓只有matmul_ibshareB/scripts/gen_data.py:112里作为方法存在。现在为什么还没炸(如实说明)
所以
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)三步结果:
第 2、3 步的唯一改动就是把
a_format = "ND"换成"NZ"、把data_type_str换成"float16_float32",别的都原样。也就是说:这两条路径写在了示例代码里,但一旦被启用就是 NameError,而MatmulGenHifFp8Data这个类名在本仓任何地方都不存在(nd_to_nz在别的示例里有 4 种自由函数/静态方法实现,唯独这里被当成MatmulGenHifFp8Data.nd_to_nz调用)。建议(三选一,我按维护者的决定出 PR)
a_format/b_format/c_format恒为 ND,data_type_str恒不等于float16_*),文件立刻不再有"改配置就 NameError"的陷阱;nd_to_nz本仓有多个可参考实现;gen_c_data_nz_format在matmul_channelsplit_output/scripts/gen_data.py里就是自由函数,可以直接搬),并把data_type_str的取值与 scenario 对齐;MatmulGenHifFp8Data是内部/历史版本的类被删掉了:至少把调用点注释掉并留一行说明,别让读者以为配成 NZ 就能跑。我倾向 1(改动最小,且与 README 目前只描述 ND 的口径一致)。要哪一种请回复,我今天就补上对应 PR。