尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

TensorFlow 函数在 XLA jit_compile=True 下抛出 InvalidArgumentError 怎么排查?

TensorFlow 函数在 XLA jit_compile=True 下抛出 InvalidArgumentError 怎么排查? TensorFlow 函数在 XLA jit_compileTrue 下抛出 InvalidArgumentError 怎么排查【免费下载链接】tensorflowAn Open Source Machine Learning Framework for Everyone项目地址: https://gitcode.com/GitHub_Trending/te/tensorflow给tf.function加上jit_compileTrue后程序第一次调用就抛出errors.InvalidArgumentError。这不是普通的数据错误jit_compile是 must-compile 语义——要么整个函数被 XLA 完整编译要么直接抛errors.InvalidArgumentError来源tf2xla/index.md。因此这个错误意味着XLA 拒绝编译该函数排查方向应集中在函数内部哪一部分不可编译而不是去检查输入数据。文档给出的两类典型根因维度不可推断uninferrableXLA 当前无法编译那些不跑完整计算就无法推断所有张量维度的函数。文档给出的不可编译例子tf.function def not_compilable(x): return tf.unique(x)注意相反的情况是允许的shape 可以在不同 run 之间变化每次触发重新编译即可tf.function(jit_compileTrue) def recompiled_on_launch(a, b): return a b recompiled_on_launch(tf.ones([1, 10]), tf.ones([1, 10])) recompiled_on_launch(tf.ones([1, 100]), tf.ones([1, 100]))不支持的算子仓库中的测试testUnsupportedOpstensorflow/python/compiler/xla/tests/jit_compile_test.py验证了这一点——把 XLA 不支持的 op测试里用了string_formatstring_length放进jit_compileTrue的函数运行时断言抛出errors.InvalidArgumentError且消息匹配Detected unsupported operationswith self.assertRaisesRegex(errors.InvalidArgumentError, Detected unsupported operations): with session.Session(graphg) as sess: sess.run(x, feed_dict{inputs: [1, 2, 2, 3, 3]})这段测试本身也是文档提供的判断依据确认崩溃在某个不支持的 op 上说明 XLA 编译器确实被调用了报错消息里会点名不支持的操作。先做最小复现把问题收敛到单个 op去掉与报错无关的分支把出错的tf.function缩到最小输入、最小算子集合确认错误仍然复现。对照上面两类根因检查函数体是否有输出 shape 依赖运行时值的操作如tf.unique这类或者是否使用了 XLA 当前不支持的算子。报错消息中的Detected unsupported operations片段会直接指出不支持的 op按它定位。检查调用栈嵌套规则文档明确只要调用栈中至少一个函数带jit_compileTrue被嵌套调用的函数也会被编译Nesting behavior。也就是说即使你只在外层函数上加了jit_compileTrue内层某个普通tf.function也可能因为被拉入编译而触发错误定位时不要把范围限定在最外层函数体内。用 XLA 内省工具查看编译器到底看到了什么文档提供了两个查看机制都能在不改业务逻辑的情况下收集证据。用experimental_get_compiler_ir查看 HLO对已编译的函数可以直接打印编译器中间表示来源jit_compile.ipynbprint(train_mnist.experimental_get_compiler_ir(images, labels)(stagehlo))文档说明stage的取值hlo是编译出的 HLOoptimized_hlo是优化后的 HLOoptimized_hlo_dot是 Graphviz 图。对比编译前后的 HLO可以看到哪些算子被融合、哪些原样保留辅助判断是不支持的 op还是shape 推断问题。用环境变量 dump 生成的编译程序运行出问题的程序前设置XLA_FLAGS把生成的 XLA 程序落盘到/tmp/generated$ XLA_FLAGS--xla_dump_to/tmp/generated TF_XLA_FLAGS--tf_xla_auto_jit2 my/tensorflow/programdump 完成后/tmp/generated下会出现module_XXXX.*_optimizations.txt每个编译 cluster 一份生成的 XLA 程序文档特别指出提交 XLA bug report 时附上这些文件非常有帮助module_XXXX.ir-*.ll带 NVPTX intrinsics 的 LLVM IRmodule_XXXX.ptx生成的 PTX 文件。如果还要看 XLA cluster 在 TensorFlow 图里的嵌入位置再加图 dump注意这是 auto-clustering 场景的调试命令$ TF_DUMP_GRAPH_PREFIX/tmp/generated TF_XLA_FLAGS--tf_xla_clustering_debug组装可复现的 bug report确认是 XLA 侧的问题后按文档的Reproducible bug reports流程tf2xla/index.md一次生成全部证据。该命令会用--tf_xla_auto_jit2开启 auto-clustering 并 dump 图和 HLO 文本副作用只是把生成文件写入/tmp/generated目录$ TF_DUMP_GRAPH_PREFIX/tmp/generated \ TF_XLA_FLAGS--tf_xla_clustering_debug --tf_xla_auto_jit2 \ XLA_FLAGS--xla_dump_hlo_as_text --xla_dump_to/tmp/generated \ my/tensorflow/program提交 bug 时附上/tmp/generated目录的内容。文档还建议如果可能用run_hlo_module工具对生成的程序逐个迭代运行把 bug 隔离到单个 XLA 程序文档链接指向 run_hlo_module_main.cc 的说明。限制与边界tf.unique这类输出维度依赖运行时值的函数在文档中被明确列为will not compile这不是 bug是 XLA 的编译前提维度必须可静态推断。auto-clustering 的 CPU 支持与多 GPU 环境下的支持是实验性的experimental。本文命令中的my/tensorflow/program、path/to/your/tf/program是文档原样使用的占位写法替换为你实际的程序入口即可。若最终确认是函数含不支持的 op且短期内无法改写可选的替代路径是改用 auto-clusteringTF_XLA_FLAGS--tf_xla_auto_jit2它自动寻找可编译的连通子图来编译不需要修改源码GPU 优先CPU 上需额外加--tf_xla_cpu_global_jit。【免费下载链接】tensorflowAn Open Source Machine Learning Framework for Everyone项目地址: https://gitcode.com/GitHub_Trending/te/tensorflow创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表