Tensorflow Profiler 踩坑记
众所周知,在 AI 模型落地的时候,我们不仅仅关注模型的准确率,同样也会关注模型的性能。
在使用 VSCode 等 IDE 开发 C++、C# 应用的时候,我们就会去开启 debug 模式,通过可视化工具分析应用的热点与瓶颈在哪里,这个过程一般叫做 profiling。当然,在 linux 上,我们也有 valgrind 等工具可以方便我们分析。
那么具体到 tensorflow 的模型中,我们也想要进行类似的分析。好在 Google 官方提供了 tensorflow profiler 以及官方教程,我们可以 follow 这个教程来分析。此外,也有其他人写过博客来介绍 tensorflow profiler 的使用。
当然 Google 在知乎中也发表过一篇介绍文。
但是这玩意儿它坑就坑在在自己机器上作分析的话,这些东西要自己装。那么要装这些东西就会踩到一些坑。
_甚至用 Google Colab 都不可避免地会踩到一些坑_
包的版本
首先,为了稳定性,工地的 docker 镜像都是统一采用 tensorflow=2.10.0
,尽管现在有更新的版本。因此,为了和工地的设置一致,我们本地也安装这个版本,tensorboard 也需要和 tensorflow 版本一致(最好是 2.10.0
,我一开始直接pip install tensorflow=2.10
结果安装成了 2.10.1
,后面也乖乖地设置成了 2.10.0
)
然后就是 tensorboard_plugin_profile
包的版本。我一开始是直接 follow 官方教程的
1 | pip install tensorboard_plugin_profile |
来进行安装,结果训练时能正常 dump 记录到文件,但是启动 tensorboard 到浏览器上去看 profile 页面的时候,发现如下内容的页面:
1 | **No profile data was found.** |
一开始看到这玩意儿一头雾水,然后就去搜了下,发现有几个 Github issue:
- https://github.com/tensorflow/tensorflow/issues/61212
- https://github.com/tensorflow/tensorflow/issues/62373
里面给出的解决方案基本上是调调文件目录结构,甚至还有给出一个手动下载并覆盖 events.out.tfevents.TIMESTAMP.USER.profile-empty
这种 monkey patch 级别的修复。试了一下,发现都不管用。
后面想到 tensorboard 本质上是一个 B-S 结构,那么看看服务端,结果发现了两行日志:
1 | W tensorflow/core/profiler/convert/xplane_to_tools_data.cc:231] Can not find tool: tool_names. Please update to the latest version of Tensorflow. |
然后就在猜想这个 tool_names
是不是 tensorflow profiler 后续版本引入的新字段,但是在老版本的 tensorboard 中,该字段并不能够解析;并且刷新浏览器并仔细观察,发现是有一个 load 的进度条的,走到三分之一的地方才说 No profile data was found,这个现象其实从某红程度上来说作证了我们的猜想。pip
查看 tensorboard_plugin_profile
包的版本,发现为 2.15.1
。
然后尝试装 2.10.0
的版本:
1 | pip install tensorboard_plugin_profile==2.10.0 |
结果发现还是没得:
1 | ERROR: Could not find a version that satisfies the requirement tensorboard_plugin_profile==2.10.0 (from versions: 2.2.0a1, 2.2.0a2, 2.2.0a3, 2.2.0a4, 2.2.0a5, 2.2.0a6, 2.2.0rc0, 2.2.0, 2.3.0rc0, 2.3.0, 2.4.0, 2.5.0, 2.8.0, 2.11.1, 2.11.2, 2.13.0, 2.13.1, 2.14.0, 2.15.0, 2.15.1) |
猜想就是可能这种插件性质的包更新速度不如 tensorflow 和 tensorboard 更新得频繁,可能 tensorflow=2.8.0
的下一次更新就直接到了 tensorflow=2.11.1
,所以我们选择装 2.8.0
版本的 tensorboard_plugin_profile
:
1 | pip install tensorboard_plugin_profile==2.8.0 |
然后重新捕捉训练的记录,结果 tensorboard 就能正常显示 profile 信息了。
CUPTI DLL 缺失
在捕捉训练记录的过程中,会看到
1 | CUPTI error: CUPTI could not be loaded or symbol could not be found. |
然后其实主要就是: