我正在尝试跟踪torch.nn.NLLLoss源代码中的实现。我在文件torch._C.nll_loss中的函数nll_loss中得到了调用torch.nn.functional。但是我找不到创建_C的地方。
有人有这方面的信息吗?
请查看PyTorch 博客上的PyTorch 内部概览。相关摘录:
\n\n\nPyTorch 定义了一个新的包 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
\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当我试图在没有阅读这些帖子的情况下追踪 NLLLoss 的定义时,我最终通过aten/ src/ATen/nn.yaml 找到了 aten/ src/THNN/generic/ClassNLLCriterion.c。后者可能是第二篇文章谈到的 YAML,但我还没有检查过。
\n| 归档时间: |
|
| 查看次数: |
5785 次 |
| 最近记录: |