根据我的理解,内置的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操作.
在给定二维张量的 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)
特别是在 …
几天前我问了一个关于将项目与 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) 在 PyTorch 中测试网络时,可以使用with torch.no_grad():. Libtorch (C++) 的等效项是什么?谢谢!
我有一个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) 我在 .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 ”以避免上述错误。 …
我正在尝试使用 cmake 构建一个程序。由于多种原因,必须使用静态库而不是动态库构建程序,并且我需要使用 PyTorch,所以这就是我所做的:
libtorch.a下载并安装了 PyTorch 静态库(我在正确的路径中找到了/home/me/pytorch/torch/lib)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,老实说也不完全确定。
我做错了什么吗,或者这个问题有解决方法吗?任何帮助或推动正确的方向将不胜感激。
聚苯乙烯
确切的错误尚未发布,因为它太长了,但它主要由undefined reference to ~错误组成。如果查看错误消息可能对某些人有帮助,我很乐意编辑问题并发布它。
build如果我从代码中删除需要库函数的部分而不从.#include <torch/torch.h>example-app.cpp
我正在尝试在 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++ 程序,需要对 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) 如果我们<<一个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<<重载代码,也没有找到。