如何在源代码中查找从 torch._C 导入的函数

Sam*_*bel 8 pytorch

我正在尝试跟踪torch.nn.NLLLoss源代码中的实现。我在文件torch._C.nll_loss中的函数nll_loss中得到了调用torch.nn.functional。但是我找不到创建_C的地方。

有人有这方面的信息吗?

nnn*_*mmm 6

请查看PyTorch 博客上的PyTorch 内部概览。相关摘录:

\n
\n

PyTorch 定义了一个新的包 torch。在这篇文章中,我们将考虑 ._C 模块。这个模块被称为 \xe2\x80\x9cextension module\xe2\x80\x9d - 用 C 编写的 Python 模块。此类模块允许我们定义新的内置对象类型(例如张量)并调用 C/C++功能。

\n

._C 模块在 torch/csrc/Module.cpp 中定义。init_C() / PyInit__C() 函数创建模块并添加适当的方法定义。该模块被传递给许多不同的 __init() 函数,这些函数向模块添加更多对象、注册新类型等。

\n
\n

该文章的第二部分详细介绍了构建系统。在有关神经网络模块的部分中,它说

\n
\n

简而言之,让\xe2\x80\x99s接触一下build_deps命令的最后一部分:generate_nn_wrappers()。我们使用 PyTorch\xe2\x80\x99s 自定义 cwrap 工具绑定到后端库,我们在上一篇文章中谈到过该工具。为了绑定 TH 和 THC,我们手动为每个函数编写 YAML 声明。然而,由于 THNN 和 THCUNN 库相对简单,我们自动生成 cwrap 声明和生成的 C++ 代码。

\n

我们将 THNN.h 和 THCUNN.h 头文件复制到 torch/lib 的原因是,generate_nn_wrappers() 代码期望这些文件位于此处。generate_nn_wrappers() 做了一些事情:

\n
    \n
  • 解析头文件,生成 cwrap YAML 声明并将它们写入输出 .cwrap 文件
  • \n
  • 使用这些 .cwrap 文件上的适当插件调用 cwrap 来为每个文件生成源代码
  • \n
  • 再次解析标头以生成 THNN_generic.h - 一个采用 THPP 张量、PyTorch\xe2\x80\x99s \xe2\x80\x9cgeneric\xe2\x80\x9d C++ 张量库的库,并调用相应的 THNN/THCUNN基于Tensor动态类型的库函数
  • \n
\n
\n

如果没有上下文,也许没有多大帮助,但我认为我不应该在这里复制整个帖子。

\n

当我试图在没有阅读这些帖子的情况下追踪 NLLLoss 的定义时,我最终通过aten/ src/ATen/nn.yaml 找到了 aten/ src/THNN/generic/ClassNLLCriterion.c。后者可能是第二篇文章谈到的 YAML,但我还没有检查过。

\n

  • 我还写了一篇关于代码库的文章:http://blog.christianperone.com/2018/03/pytorch-internal-architecture-tour/ (2认同)