如何在 Windows 上构建/调试(完整)LibTorch 源?

Posted

技术标签:

【中文标题】如何在 Windows 上构建/调试(完整)LibTorch 源?【英文标题】:How to Build/Debug (full) LibTorch Sources on Windows? 【发布时间】:2021-06-19 19:54:42 【问题描述】:

下面的链接很好地说明了如何下载预构建的 libtorch windows 二进制文件并将它们集成到 Visual Studio 中。

https://towardsdatascience.com/setting-up-a-c-project-in-visual-studio-2019-with-libtorch-1-6-ad8a0e49e82c

我下载了 pytorch 1.8.1 的 Debug 和 Release 发行版。我很惊讶在两个扩展的 zip 文件中看到许多重复的目录/文件。 zip 文件都包含标题和 some 源。我很想合并两个层次结构,只保留单独的 bin 和 lib 文件夹,但有些头文件并不相同。

在我的示例项目的编译过程中,我遇到了一个编译器错误,我根据下面的“SBW”注释行进行了修复。

template<bool Condition, class ThenCallback>
decltype(auto) if_constexpr(ThenCallback&& thenCallback) 
#if defined(__cpp_if_constexpr)
  // If we have C++17, just use it's "if constexpr" feature instead of wrapping it.
  // This will give us better error messages.
  if constexpr(Condition) 
    if constexpr (detail::function_takes_identity_argument<ThenCallback>::value) 
      // SBW 2021.05.12 Disambiguate std.
      // https://github.com/pytorch/pytorch/pull/53490/files/2ef3c80214c798afdf165d677fc04025b28166d7
      // return std::forward<ThenCallback>(thenCallback)(detail::_identity());
      return ::std::forward<ThenCallback>(thenCallback)(detail::_identity());
     else 
      // return std::forward<ThenCallback>(thenCallback)();
      return ::std::forward<ThenCallback>(thenCallback)();
    
  
#else
  // C++14 implementation of if constexpr
  return if_constexpr<Condition>(std::forward<ThenCallback>(thenCallback), [] (auto) );
#endif

调试示例项目是了解新库的绝佳方式,因此我为 Debug 构建所做的第一件事就是将 .pdb 文件的副本添加到上面链接中描述的 Post-Build 步骤.

我目前的项目涉及将 libtorch 模型和优化器与现有的本土深度学习代码集成。几年前,我们使用 TensorFlow 开始了这项工作,但当我们发现 TF c++ api 不支持模型训练时,它就停止了。

我们有一个自定义优化器,需要在训练阶段计算雅可比行列式,libtorch 本身不支持,所以我需要了解 autograd 库。在调试时,我很快发现自己处于一个没有附带源代码的堆栈中——Windows 二进制文件下载仅包含源代码的一个子集。

如何获得完整的资源集?

【问题讨论】:

【参考方案1】:

经过更多调查,我找到了以下答案,但我仍然希望https://github.com/microsoft/vcpkg/pull/17199会有一个vcpkg端口

当调试器找不到源文件时,我做了一个 .git 的源文件,然后将 VS 指向新文件夹。这几乎奏效了,但我仍然发现缺少一些功能。一些 autograd 代码是通过 python 安装自动生成的。 (这可能是调试和发布分支文件略有不同的原因。)

接下来我按照这里的构建说明进行操作:https://github.com/pytorch/pytorch#from-source

对我来说,这导致了以下步骤:

** 获取 PyTorch 源代码 **

在将发布页面上的 1.8.1 分支标识为 Commid ID/SHA “56b43f4”后,我从 github 提取了完整源代码:

git 克隆https://github.com/pytorch/pytorch.git cd 火炬 git checkout 56b43f4

** 蟒蛇 **

下载/安装 (Python 3.8):Anaconda3-2021.05-Windows-x86_64.exe 安装:只有我 进阶:将 Anaconda3 注册为我的默认 Python 3.8

** 环境 **

USE_CUDA=0

** 安装依赖 **

PS> conda install astunparse numpy ninja pyyaml mkl mkl-include setuptools cmake cffi typing_extensions 未来六个请求数据类

** 安装 MKL/OpenMP **

这些指示对我来说并不是很清楚。我的机器已经在各个地方安装了 mkl 和 opemmp,包括 Anaconda 发行版。我尝试为这些位置设置环境变量,但 setup.py 没有找到库。这就是最终奏效的方法。

下载英特尔 oneAPI:https://software.intel.com/content/www/us/en/develop/tools/oneapi/base-toolkit/download.html?operatingsystem=window&distributions=webdownload&options=offline

运行:w_BaseKit_p_2021.2.0.2871_offline.exe 选择 MKL 和编译器(用于 OpenMP)

** 设置 **

说明说要运行“python setup.py install”,但由于缺少 python38_d.lib,调试构建失败。 我发现这个链接建议使用不同的命令来构建 libtorch:https://github.com/pytorch/pytorch/issues/17489

PS > $env:DEBUG=1
PS > $env:CMAKE_INCLUDE_PATH="C:\Program Files (x86)\Intel\oneAPI\mkl\latest\include"
PS > $env:LIB="C:\Program Files (x86)\Intel\oneAPI\mkl\latest\lib\intel64"
PS > python tools\build_libtorch.py

这成功了,我终于能够使用完整的源代码进行调试。从那以后,我了解到许多缺少的源是专门为支持所选后端而构建的。

【讨论】:

以上是关于如何在 Windows 上构建/调试(完整)LibTorch 源?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows 上构建 lib2geom

如何在 Windows 上使用 QtCreator 为 Linux 构建和调试应用程序?

调试 Qt 项目文件?

如何在 Windows 上构建 gnu `libiconv`?

在 Windows 上构建 V8 不输出 v8_base.lib

将 file.lib 构建为可在 linux 上使用的 file.a