标签: libtorch

将torch.nn.DataParallel与自定义CUDA扩展一起使用

根据我的理解,内置的pytorch操作都可以通过隐式矢量化自动处理批处理,允许跨多个GPU进行并行处理.

但是,根据文档在CUDA中编写自定义操作时,给定的LLTM示例执行批处理不变的操作,例如,计算元素的Sigmoid函数的梯度.

但是,我有一个不是批处理元素不变的用例而不是vectorisable.在单个GPU上运行,我目前(效率低下)遍历批处理中的每个元素,为每个元素执行内核启动,就像这样(用浏览器编写,只是为了演示):

std::vector<at::Tensor> op_cuda_forward(at::Tensor input, 
                                        at::Tensor elementSpecificParam) {

    auto output = at::zeros(torch::CUDA(/* TYPE */), {/* DIMENSIONS */});

    const size_t blockDim = //
    const size_t gridDim = //
    const size_t = numBatches = //

    for (size_t i = 0; i < numBatches; i++) {
        op_cuda_forward_kernel<T><<<gridDim, blockDim>>>(input[i],
                                                         elementSpecificParam[i], 
                                                         output[i]);
    }

    return {output};
}
Run Code Online (Sandbox Code Playgroud)

但是,我希望通过批处理元素将此操作拆分为多个GPU.

如何output在多GPU场景中分配Tensor?

当然,可以在启动适当的内核之前在每个GPU上创建中间Tensors,但是将输入数据复制到每个GPU并且再次返回的开销将是有问题的.

有没有一种更简单的方法来启动内核而不首先探测GPU信息的环境(#GPU等)?

最终目标是使用与torch.nn.DataParallel一起使用的CUDA操作.

neural-network deep-learning pytorch libtorch

18
推荐指数
1
解决办法
533
查看次数

Pytorch/ATen C++中切片张量的等价性

在给定二维张量的 Python 中,我们可以使用tensor[:,:2]对矩阵左上角前两个元素的 2x2 矩阵进行切片,例如:

x = torch.tensor([[-1.4673,  0.9980, -2.1427, -1.1798, -0.0646, -0.2635, -2.8930, -0.2563,
          0.4559, -0.7947, -0.4540,  3.3224,  0.2295,  5.5568, -8.0451, -2.4529,
          4.8724,  2.1640,  3.3255,  0.6693, -1.2362,  4.4713, -3.5547, -0.0528,
          0.1031, -1.2472, -1.6014,  1.8134],
        [ 2.1636, -1.1497, -5.0298,  2.8261, -0.5684,  0.6389,  2.9009, -5.1609,
          1.7358, -3.1819, -0.9877,  5.5598,  6.7142,  4.5704, -1.2683, -5.3046,
          3.0454,  3.2757, -3.2541,  3.6619, -3.6391, -0.2002,  5.7175,  5.7130,
          0.6632, -0.0744, -0.3502,  4.8116]])

y, z = x[:,:2].chunk(2,1)

print(y)

print(z)
Run Code Online (Sandbox Code Playgroud)

[出去]:

tensor([[-1.4673],
        [ 2.1636]])
tensor([[ 0.9980],
        [-1.1497]])
Run Code Online (Sandbox Code Playgroud)

特别是在 …

c++ pytorch tensor libtorch

8
推荐指数
2
解决办法
3100
查看次数

无法使用 cmake 与 OpenCV 和 LibTorch 链接项目

几天前我问了一个关于将项目与 OpenCV 链接的类似问题。我已经成功了,但现在我使用 CMake 并将 LibTorch 添加到项目中遇到了一个非常奇怪的问题。

如果我在项目中只使用 OpenCV,一切都会编译、链接并运行良好。

但是如果我将 Torch 添加到 CMakeLists.txt,我会收到链接器错误:

cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
set(CMAKE_VERBOSE_MAKEFILE ON)
project(torchscriptie)

find_package( OpenCV REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )

find_package(Torch HINTS "/usr/local/libtorch")
message(STATUS "TORCH_LIBRARIES = ${TORCH_LIBRARIES}")

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TORCH_CXX_FLAGS}")

add_executable(torchscriptie main.cpp)
target_link_libraries( torchscriptie ${OpenCV_LIBS} )
target_link_libraries(torchscriptie "${TORCH_LIBRARIES}")
set_property(TARGET torchscriptie PROPERTY CXX_STANDARD 14)
Run Code Online (Sandbox Code Playgroud)

此 CMakeLists.txt 文件会导致此错误:

CMakeFiles/torchscriptie.dir/main.cpp.o: In function `main':
/code/cpp/torchscriptie/main.cpp:18: undefined reference to `cv::imread(std::string const&, int)'
/code/cpp/torchscriptie/main.cpp:24: undefined reference to `cv::namedWindow(std::string const&, int)'
/code/cpp/torchscriptie/main.cpp:25: undefined reference to `cv::imshow(std::string const&, cv::_InputArray const&)'
collect2: error: …
Run Code Online (Sandbox Code Playgroud)

opencv cmake libtorch

8
推荐指数
1
解决办法
1983
查看次数

LibTorch 相当于 PyTorch 的 torch.no_grad 是什么?

在 PyTorch 中测试网络时,可以使用with torch.no_grad():. Libtorch (C++) 的等效项是什么?谢谢!

c++ python pytorch autograd libtorch

8
推荐指数
1
解决办法
3101
查看次数

如何将 std::vector&lt;std::vector&lt;double&gt;&gt; 转换为 torch::Tensor?

我有一个std::vector<std::vector<double>>地方想将它转换成torch::Tensorlibtorch 。然而,torch::tensor()、 或torch::from_blob()、 似乎不能用于此目的!

我尝试使用c10::ArrayRef然后使用它来将数据转换为 by torch::Tensordo c10::ArrayRef<std::vector<std::vector<double>>> res(myvecs),但这似乎也没用,因为我似乎找不到一种方法将其转换为torch::Tensor.

我应该如何在 libtorch 中进行这种转换?除了例如之外我还有什么其他选择:

auto tensor = torch::zeros({ 46,85 });
for (size_t i = 0; i < 46; i++)
{
   for (size_t j = 0; j < 85; j++)
   {
       tensor[i][j] = probs[i][j];
   }
}
Run Code Online (Sandbox Code Playgroud)

c++ torch libtorch

7
推荐指数
1
解决办法
4732
查看次数

使用 Libtorch + OpenCV + QT Creator 时的错误

我在 .pro 文件中有以下配置

TEMPLATE = app
CONFIG += console c++11
CONFIG -= app_bundle
CONFIG -= qt
CONFIG += thread

SOURCES += main.cpp

INCLUDEPATH += /usr/local/include/opencv4
LIBS += -L/usr/local/lib/
LIBS += -lopencv_core
LIBS += -lopencv_highgui
LIBS += -lopencv_imgproc
LIBS += -lopencv_videoio

QMAKE_CXXFLAGS += -D_GLIBCXX_USE_CXX11_ABI=0

INCLUDEPATH += /path/to/libtorch/include
INCLUDEPATH += /path/to/libtorch/include/torch/csrc/api/include
LIBS += -L/path/to/libtorch/lib
LIBS += -ltorch -lc10
Run Code Online (Sandbox Code Playgroud)

OpenCV 在没有“QMAKE_CXXFLAGS += -D_GLIBCXX_USE_CXX11_ABI= 0 ”的情况下工作得很好。但是,有了这个,我得到了以下错误:

在此处输入图片说明

OpenCV 也适用“QMAKE_CXXFLAGS += -D_GLIBCXX_USE_CXX11_ABI= 1 ”。但它引发了一组不同的错误:

在此处输入图片说明

大多数论坛都建议为 Libtorch设置“QMAKE_CXXFLAGS += -D_GLIBCXX_USE_CXX11_ABI= 0 ”以避免上述错误。 …

c++ opencv qt-creator libtorch

6
推荐指数
1
解决办法
336
查看次数

cmake - 链接静态库pytorch在构建过程中找不到其内部函数

我正在尝试使用 cmake 构建一个程序。由于多种原因,必须使用静态库而不是动态库构建程序,并且我需要使用 PyTorch,所以这就是我所做的:

  1. libtorch.a下载并安装了 PyTorch 静态库(我在正确的路径中找到了/home/me/pytorch/torch/lib
  2. CMakeLists.txt由以下内容制成:
cmake_minimum_required(VERSION 3.5.1 FATAL_ERROR)
project(example-app LANGUAGES CXX)
find_package(Torch REQUIRED)
add_executable(example-app example-app.cpp argparse/argparse.cpp)
target_link_libraries(example-app "${TORCH_LIBRARIES}" -static -fopenmp)
set_property(TARGET example-app PROPERTY CXX_STANDARD 14)
Run Code Online (Sandbox Code Playgroud)

仅供参考,example-app.cpp是具有主函数的文件,并且argparse/是一个目录,其中包含调用函数的一些源代码example-app.cpp

它一直工作到cmake -DCMAKE_PREFIX_PATH=/home/me/pytorch/torch ..,但是下面build会出现一些错误,说它找不到对某些函数的引用,即以 开头的函数fbgemm::fbgemm是(据我所知)用于实现 PyTorch 的某种 GEMM 库。

在我看来,在链接静态 PyTorch 库时,其内部库(如fbgemm内容)尚未正确链接,但我不是这方面的专家cmake,老实说也不完全确定。

我做错了什么吗,或者这个问题有解决方法吗?任何帮助或推动正确的方向将不胜感激。

聚苯乙烯

  1. 确切的错误尚未发布,因为它太长了,但它主要由undefined reference to ~错误组成。如果查看错误消息可能对某些人有帮助,我很乐意编辑问题并发布它。

  2. build如果我从代码中删除需要库函数的部分而不从.#include <torch/torch.h>example-app.cpp

cmake static-libraries static-linking pytorch libtorch

6
推荐指数
1
解决办法
4810
查看次数

如何正确地将 cv::Mat 转换为具有完美匹配值的 torch::Tensor?

我正在尝试在 C++ 中对 jit 跟踪模型运行推理,目前在 Python 中获得的输出与在 C++ 中获得的输出不同。

最初我认为这是由 jit 模型本身引起的,但现在我不这么认为,因为我发现 C++ 代码中的输入张量存在一些小偏差。我相信我按照文档的指示做了所有事情,因此也可能会在torch::from_blob. 我不知道!

因此,为了确定是哪种情况,这里有 Python 和 C++ 的代码片段以及用于测试的示例输入。

这是示例图像:

对于 Pytorch,运行以下代码片段:

import cv2
import torch
from PIL import Image 
import math
import numpy as np

img = Image.open('D:/Codes/imgs/profile6.jpg')
width, height = img.size
scale = 0.6
sw, sh = math.ceil(width * scale), math.ceil(height * scale)
img = img.resize((sw, sh), Image.BILINEAR)
img = np.asarray(img, 'float32')

# preprocess it 
img = img.transpose((2, 0, 1))
img = np.expand_dims(img, 0)
img …
Run Code Online (Sandbox Code Playgroud)

c++ opencv torch libtorch

6
推荐指数
1
解决办法
8013
查看次数

如何从 jit::script::module 访问模块属性,例如卷积步幅

我目前正在编写一个 C++ 程序,需要对 torchScript 格式的 CNN 模型的结构进行一些分析。我按照 torch.org 上显示的方式使用 C++ torch 库,加载到模型中,如下所示:

#include <torch/script.h>
#include <torch/torch.h>

#include <iostream>
#include <memory>

int main(int argc, const char* argv[]) {
    if (argc != 2) {
        std::cerr << "usage: example-app <path-to-exported-script-module>\n";
        return -1;
    }

    torch::jit::script::Module module;
    try {
        // Deserialize the ScriptModule from a file using torch::jit::load().
        module = torch::jit::load(argv[1]);
    }
    catch (const c10::Error& e) {
        std::cerr << "error loading the model\n";
        return -1;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

据我所知,module由一组嵌套的集合组成,torch::jit::script::Module其中最低的代表内置函数。我按如下方式访问这些最低模块:

void …
Run Code Online (Sandbox Code Playgroud)

jit pytorch torchscript libtorch

6
推荐指数
0
解决办法
923
查看次数

如何获得 torch::张量形状

如果我们<<一个torch::Tensor

#include <torch/script.h>
int main()
{
    torch::Tensor input_torch = torch::zeros({2, 3, 4});
    std::cout << input_torch << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我们看

(1,.,.) = 
  0  0  0  0
  0  0  0  0
  0  0  0  0

(2,.,.) = 
  0  0  0  0
  0  0  0  0
  0  0  0  0
[ CPUFloatType{2,3,4} ]
Run Code Online (Sandbox Code Playgroud)

如何获得张量形状(即2,3,4)?我在https://pytorch.org/cppdocs/api/classat_1_1_tensor.html?highlight=tensor中搜索了API 调用,但找不到。而且我搜索了operator<<重载代码,也没有找到。

c++ pytorch libtorch

5
推荐指数
2
解决办法
1万
查看次数