Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在c++ pytorch前端API中将变量从GPU迁移到CPU?

如何在c++ pytorch前端API中将变量从GPU迁移到CPU?
EN

Stack Overflow用户
提问于 2019-01-25 14:50:20
回答 1查看 2.1K关注 0票数 1

我正在编写一段推理代码,以便在C++中加载转换后的pytorch模型(来自imagenet的标记模型)。我使用的是c++ pytorch前端接口。我的代码在CPU上工作正常,但在GPU上不工作。问题是,当我想要打印最终结果时,我得到了分割错误(核心转储)错误。我必须将"top_scores_a“和"top_idx_a”变量传递给CPU,但我不知道如何做到这一点。

我在GPU上加载模型和输入图像。错误发生在以下部分:

代码语言:javascript
运行
AI代码解释
复制
for (int i = 0; i < 2; ++i)
    {
        // int idx = top_idxs_a[i];
        std::cout << "top-" << i+1 << " label: ";
        // std::cout << labels[idx] << ", score: " << top_scores_a[i] << std::endl;
    }

完整的代码可以在这里找到:

代码语言:javascript
运行
AI代码解释
复制
#include "torch/script.h"
#include <torch/script.h>
#include <torch/torch.h>
#include <ATen/Tensor.h>
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <time.h> 

#include <iostream>
#include <memory>
#include <cuda.h>
#include <cuda_runtime_api.h>

using namespace std;



// __global__
int main(int argc, const char* argv[]) {

    //// asign gpu
    torch::Device device(torch::kCPU);
    clock_t tStart = clock();

    //// check cuda visibility
    if (torch::cuda::is_available()) 
    {
        std::cout << "CUDA is available! Run on GPU." << std::endl;
        device = torch::kCUDA;

    }

    if (argc != 4) {
        cout << "ptcpp path/to/scripts/model.pt path/to/image.jpg path/to/label.txt\n";
        return -1;
    }

    cout << "Will load from " << argv[1] << endl;
    shared_ptr<torch::jit::script::Module> module = torch::jit::load(argv[1]);
    module->to(device); // on gpu

    if (module == nullptr) {
        cerr << "model load error from " << argv[1] << endl;
    }
    cout << "Model load ok.\n";

    // load image and transform
    cv::Mat image;
    image = cv::imread(argv[2], 1);

    cv::Mat image_rgb;
    cv::cvtColor(image, image_rgb, CV_BGR2RGB);  

    cv::Mat image_resized;
    cv::resize(image_rgb, image_resized, cv::Size(224, 224));

    cv::Mat image_resized_float;
    image_resized.convertTo(image_resized_float, CV_32F, 1.0/255);

    auto img_tensor = torch::CPU(torch::kFloat32).tensorFromBlob(image_resized_float.data, {1, 224, 224, 3}).to(device); // work correctly

    cout << "img tensor loaded..\n";
    img_tensor = img_tensor.permute({0, 3, 1, 2});
    img_tensor[0][0] = img_tensor[0][0].sub(0.485).div(0.229);
    img_tensor[0][1] = img_tensor[0][1].sub(0.456).div(0.224);
    img_tensor[0][2] = img_tensor[0][2].sub(0.406).div(0.225);

    auto img_var = torch::autograd::make_variable(img_tensor, false);

    vector<torch::jit::IValue> inputs;
    inputs.push_back(img_var);
    torch::Tensor out_tensor = module->forward(inputs).toTensor();


    // load labels
    vector<string> labels;
    ifstream ins;
    ins.open(argv[3]);
    string line;
    while (getline(ins, line)) 
    {
        labels.push_back(line);
    }


    std::tuple<torch::Tensor,torch::Tensor> result = out_tensor.sort(-1, true); //-1
    torch::Tensor top_scores = std::get<0>(result)[0];
    torch::Tensor top_idxs = std::get<1>(result)[0].toType(torch::kInt32);

    auto top_scores_a = top_scores.accessor<float,1>();
    auto top_idxs_a = top_idxs.accessor<int,1>();


    for (int i = 0; i < 2; ++i)
    {
        int idx = top_idxs_a[i];
        std::cout << "top-" << i+1 << " label: ";
        std::cout << labels[idx] << ", score: " << top_scores_a[i] << std::endl;
    }


    float tend = clock();
    printf("Time taken: %.2fs\n", (double)(tend - tStart)/CLOCKS_PER_SEC);

    return 0;
}
EN

回答 1

Stack Overflow用户

发布于 2019-01-25 15:00:27

要将数据从CPU移动到GPU,反之亦然,您必须分配所谓的托管内存。请看这里的一些示例代码https://devblogs.nvidia.com/even-easier-introduction-cuda

如果您的cuda版本不支持cudaMallocManaged,那么您必须使用cudaMalloc + cudaMemcpy序列。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54367644

复制
相关文章
C++ GPU && CPU
1 #include <amp.h> 2 3 #include <iostream> 4 5 #include <winbase.h> //操作系统的底层文件 6 7 8 9 using namespace concurrency; 10 11 using namespace std; 12 13 14 15 void main () { 16 17 18 19 20 21 int a [] = {1 ,2, 3,4 ,5, 6
Gxjun
2018/03/26
7390
PyTorch 1.7 发布! 支持CUDA 11,Windows 分布式训练,以及FFT新API
今天,我们正式发布 PyTorch 1.7,以及升级的域库。PyTorch 1.7版本包括了一些新的 API,比如对兼容 numpy 的 FFT 操作的支持、性能分析工具以及对分布式数据并行(DDP)和基于远程过程调用(RPC)的分布式训练的重要更新。此外,还有一些特性移到了 stable 状态,包括自定义 C++ 类、内存分析器、通过自定义类张量对象实现的扩展、 RPC 中的用户异步函数以及 torch.distributed 中的其他一些特性,如 Per-RPC 超时、 DDP dynamic bucketing 和 RRef helper。
McGL
2020/10/30
1.1K0
[开发技巧]·PyTorch如何使用GPU加速(CPU与GPU数据的相互转换)
在进行深度学习开发时,GPU加速可以提升我们开发的效率,速度的对比可以参照笔者这篇博文:[深度应用]·主流深度学习硬件速度对比(CPU,GPU,TPU)结论:通过对比看出相较于普通比较笔记本的(i5 8250u)CPU,一个入门级显卡(GPU MX150)可以提升8倍左右的速度,而高性能的显卡(GPU GTX1080ti)可以提升80倍的速度,如果采用多个GPU将会获得更快速度,所以经常用于训练的话还是建议使用GPU。
小宋是呢
2019/06/27
35.5K1
PyTorch 1.5上线:加入稳定C++前端,高级自动梯度API
今天,PyTorch 1.5 宣布上线,此版本主要包括几个新的 API 的添加和改进。新版 PyTorch 包括对 C++前端的重大更新,用于计算机视觉模型的「channels last」存储格式,以及用于模型并行训练的分布式 RPC 框架的稳定版本。该版本还提供了针对自动求导机制中黑塞和雅可比的新 API,以及受 pybind 启发,允许用户创建自定义 C++类的一个 API。另外,torch_xla 已可在 PyTorch 1.5 版中使用,并在 1.5 版本中进行了测试,可提供成熟的 Cloud TPU 体验。
机器之心
2020/04/23
5660
PyTorch 1.7来了:支持Windows上的分布式训练,还有大波API袭来
据Facebook 官方博客公告,PyTorch1.7版本已经于昨日正式发布,相比于以往的 PyTorch 版本,此次更新除了增加了更多的API,还能够支持 NumPy兼容下的傅里叶变换、性能分析工具,以及对基于分布式数据并行(DDP)和远程过程调用(RPC)的分布式训练。
AI科技评论
2020/11/06
1.3K0
PyTorch 1.7来了:支持Windows上的分布式训练,还有大波API袭来
PyTorch 1.7来了:支持Windows上的分布式训练,还有大波API袭来
据Facebook 官方博客公告,PyTorch1.7版本已经于昨日正式发布,相比于以往的 PyTorch 版本,此次更新除了增加了更多的API,还能够支持 NumPy兼容下的傅里叶变换、性能分析工具,以及对基于分布式数据并行(DDP)和远程过程调用(RPC)的分布式训练。
AI算法与图像处理
2020/11/06
1.2K0
PyTorch 1.7来了:支持Windows上的分布式训练,还有大波API袭来
[源码解析] PyTorch 如何使用GPU
在 PyTorch DataParallel 训练过程中,其会在多个GPU之上复制模型副本,然后才开始训练。笔者在分析过程中,发现如果不把一些GPU相关基础知识整理出来,很难理解DataParallel的这个复制模型的过程,遂有此文。
罗西的思考
2021/11/10
3.4K0
GPU VS CPU
安装TensorFlow GPU版本 !pip install tensorflow-gpu Collecting tensorflow-gpu [?25l Downloading https://
用户3577892
2020/06/11
5560
PyTorch 2.0 重磅发布:编译、编译、还是编译!
内容一览:昨晚召开的 PyTorch Conference 2022 中,官方正式发布了 PyTorch 2.0。本文将梳理 PyTorch 2.0 与 1.x 相比的最大差异。
HyperAI超神经
2023/02/27
1.5K0
PyTorch 2.0 重磅发布:编译、编译、还是编译!
PyTorch 1.12发布,正式支持苹果M1芯片GPU加速,修复众多Bug
点击上方↑↑↑“OpenCV学堂”关注我来源:公众号 机器之心  授权 PyTorch 1.12 正式发布,还没有更新的小伙伴可以更新了。 距离 PyTorch 1.11 推出没几个月,PyTorch 1.12 就来了!此版本由 1.11 版本以来的 3124 多次 commits 组成,由 433 位贡献者完成。1.12 版本进行了重大改进,并修复了很多 Bug。 随着新版本的发布,大家讨论最多的可能就是 PyTorch 1.12 支持苹果 M1 芯片。 其实早在今年 5 月,PyTorch 官方就已经
OpenCV学堂
2022/07/04
9150
PyTorch 1.12发布,正式支持苹果M1芯片GPU加速,修复众多Bug
开发 | 用PyTorch还是TensorFlow?斯坦福大学CS博士生带来全面解答
AI 科技评论按:关于深度学习的框架之争一直没有停止过。PyTorch,TensorFlow,Caffe还是Keras ?近日, 斯坦福大学计算机科学博士生Awni Hannun就发表了一篇文章,对比当前两个主流框架PyTorch和TensorFlow。 AI 科技评论编译如下: 这篇指南是我目前发现的PyTorch和TensorFlow之间的主要差异。写这篇文章的目的是想帮助那些想要开始新项目或者转换深度学习框架的人进行选择。文中重点考虑训练和部署深度学习堆栈组件时框架的可编程性和灵活性。我不会权衡速度、
AI科技评论
2018/03/13
1.8K0
PyTorch 1.0 中文官方教程:使用 PyTorch C++ 前端
PyTorch C++ 前端 是PyTorch机器学习框架的一个纯C++接口。PyTorch的主接口是Python,Python API位于一个基础的C++代码库之上,提供了基本的数据结构和功能,例如张量和自动求导。C++前端暴露了一个纯的C++11的API,在C++底层代码库之上扩展了机器学习训练和推理所需的工具扩展。这包括用于神经网络建模的内置组件集合;扩展此集合的自定义模块API;流行的优化算法库(如随机梯度下降);使用API定义和加载数据集的并行数据加载程序;序列化例行程序等等。
ApacheCN_飞龙
2022/05/07
6750
PyTorch如何加速数据并行训练?分布式秘籍大揭秘
在芯片性能提升有限的今天,分布式训练成为了应对超大规模数据集和模型的主要方法。本文将向你介绍流行深度学习框架 PyTorch 最新版本( v1.5)的分布式数据并行包的设计、实现和评估。
机器之心
2020/07/14
1.1K0
PyTorch如何加速数据并行训练?分布式秘籍大揭秘
清华自研深度学习框架「计图」开源!多项任务性能超过PyTorch
刚刚,清华自研的深度学习框架,正式对外开源。“贵系”计算机系的图形实验室出品,取名Jittor,中文名计图。
量子位
2020/03/31
4870
清华自研深度学习框架「计图」开源!多项任务性能超过PyTorch
PyTorch如何加速数据并行训练?分布式秘籍大揭秘
在芯片性能提升有限的今天,分布式训练成为了应对超大规模数据集和模型的主要方法。本文将向你介绍流行深度学习框架 PyTorch 最新版本( v1.5)的分布式数据并行包的设计、实现和评估。
CV君
2020/07/17
9340
PyTorch如何加速数据并行训练?分布式秘籍大揭秘
PyTorch如何加速数据并行训练?分布式秘籍大揭秘
在芯片性能提升有限的今天,分布式训练成为了应对超大规模数据集和模型的主要方法。本文将向你介绍流行深度学习框架 PyTorch 最新版本( v1.5)的分布式数据并行包的设计、实现和评估。
代码医生工作室
2020/07/17
9030
PyTorch如何加速数据并行训练?分布式秘籍大揭秘
Pytorch 最全入门介绍,Pytorch入门看这一篇就够了
本文通过详细且实践性的方式介绍了 PyTorch 的使用,包括环境安装、基础知识、张量操作、自动求导机制、神经网络创建、数据处理、模型训练、测试以及模型的保存和加载。
TechLead
2023/10/21
6.5K0
Pytorch 最全入门介绍,Pytorch入门看这一篇就够了
在 Python 中将数值变量转换为分类变量
这篇文章是今天发布的CTGAN的补充,我们可以使用pandas的cut函数将数据进行离散化、将连续变量进行分段汇总,这比写自定义函数要简单的多。
deephub
2021/11/16
2.2K0
Python中将字典转为成员变量
当我们在Python中写一个class时,如果有一部分的成员变量需要用一个字典来命名和赋值,此时应该如何操作呢?这个场景最常见于从一个文件(比如json、npz之类的文件)中读取字典变量到内存当中,再赋值给一个类的成员变量,或者已经生成的实例变量。
DechinPhy
2022/05/10
1.4K0
点击加载更多

相似问题

如何在pytorch中从gpu返回cpu?

340

PyTorch (GPU)比CPU慢

13

在Pytorch中从GPU/CPU中删除模型

10

Pytorch CPU和GPU并行运行

115

Pytorch-GPU我忘了把什么移到GPU上?

294
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文