通过pytorch的torch.profiler带调用栈采集运行过程可以看到如下信息,通过chrome://tracing
查看,
图上每个小条条表示一个traceEvent, json中的信息如下图所示,其中cat表示traceEvent的类型,有cpu_op
,python_function
等,前者表示torch的cpp代码中定义的操作,后者表示pytorch的python代码中定义的函数。实际看cpp_op并不直接对应到cpp代码中函数的名字,应该是按某种约定注册的名字,这为gdb断点查看带来了一些不便。
通过断点uniform_
函数看到采集的函数aten::uniform_
对应代码at::Tensor::uniform_
, aten::rand
对应代码中的at::native::rand
,且at::Tensor::uniform_
在libtorch_cpu.so的plt上,也就是这个符号是可以被动态打桩打掉的。
在代码中找到callstack上两个rand的函数如下,函数含pytorch的源码文件pytorch/aten/src/ATen/native/TensorFactories.cpp
中,
result.uniform_
中的函数在TensorBody.h中,也及Tensor的一个成员函数,里面调用的是at::_ops::uniform_::call
函数,call函数编在libtorch_cpu.so
中,
但call的源码不再pytorch下载的原始源码中,而是下面build过程中生成的Operators_2.cpp
中,
create_uniform_typed_handle
也在Operators_2.cpp
中定义,从代码中可以看到采样信息中的aten::uniform_
字样,很可能采样信息就是从这里来的。自动生成的Operators_2.cpp
很可能是来自pytorch中配置的某个yaml文件。