首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在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

复制
相关文章
Double为什么会丢失精度
在工作中,谈到有小数点的加减乘除都会想到用BigDecimal来解决,但是有很多人对于double或者float为啥会丢失精度一脸茫然。还有BigDecimal是怎么解决的?话不多说,我们开始。
用户4283147
2022/10/08
2.4K0
Double为什么会丢失精度
VS2017 安装 Microsoft Visual Studio Installer Project
1.安装打包插件:Microsoft Visual Studio 2017安装程序项目
全栈程序员站长
2022/09/09
2.7K0
VS2017 安装 Microsoft Visual Studio Installer Project
如何修复Ubuntu 14.04 系统设置丢失的问题
其实遇到这个问题的一个最主要的原因是之前执行过卸载ibus输入法的操作,所以为了避免这个问题请不要卸载ibus输入法,大家依然可以安装fcitx输入法使用。
WindCoder
2018/09/19
2.1K0
如何修复Ubuntu 14.04 系统设置丢失的问题
VS2019内C语言头文件丢失
安装VS 2019 的时候。嫌弃占用空间大 然后就没有安装 之后编译程序出现没有头文件的问题 先点击这里 在C++的这里把SDK重新装上 记得关闭自己的程序 安装,稍等片刻 接着就成功了
云深无际
2021/03/12
1.1K0
VS2019内C语言头文件丢失
jenkins修改安全策略,权限设置丢失
默认的jenkins用户权限,通过插件Role-based Authorization Strategy来设置的。
py3study
2020/04/08
1.8K0
vs2010设置问题
解决办法:拷贝整个Microsoft Help Viewer覆盖以前的文件,覆盖后可能会遇到vs中F1帮助或者菜单栏里的选项失效,需要手动启动help libary代理解决。
sofu456
2019/07/09
8900
vs2010设置问题
高效的编码:我的VS Code设置
代码编辑器很多,有些是免费的,有些是付费的。其中最喜欢的代码编辑器是 Visual Studio Code。它是免费的,并具有惊人的功能。我从 Web 开发旅程的开始就开始使用它。
张张
2020/03/18
1.8K0
高效的编码:我的VS Code设置
VS2010Web默认的浏览器设置和VS里调试JavaScript代码的设置
   重装系统后,VS调用的Web浏览器不是IE了,VS调式不了JavaScript代码了。这两天一直在试终于搞定了。这里查找的问题当然主要是VS里面调式JavaScript代码了。
aehyok
2018/09/11
1.2K0
VS2010Web默认的浏览器设置和VS里调试JavaScript代码的设置
explicit_defaults_for_timestamp参数详解
explicit_defaults_for_timestamp 系统变量决定MySQL服务端对timestamp列中的默认值和NULL值的不同处理方法。此变量自MySQL 5.6.6 版本引入,分为全局级别和会话级别,可动态更新,默认值为OFF。本文主要介绍该参数打开和关闭情况下对timestamp的影响 。
MySQL技术
2019/09/08
4.6K0
Infor ERP LN有用的Session:ttstpdeldeflt Remove User Defaults
在使用Infor ERP LN的过程中,由于网络中断或者不稳定经常会出现用户打开某个Session的时候报错,信息类似如下:
崔文远TroyCui
2020/12/01
6240
Infor ERP LN有用的Session:ttstpdeldeflt Remove User Defaults
Mac vs code自动换行设置
windows 的话可以设置 wordwrap,但是 mac 的内置格式化插件好像有问题,我试了改 wordwrap 的值不管用。 有个更简单的方法,只要 option+z【alt+z】 就好了。
小蓝枣
2020/09/23
2.2K0
VS 2017打开老项目报错:Project Target Framework Not Installed
由于笔记本硬盘转速太慢,把光驱拆了,装了一个光驱位硬盘支架,搞了块250G的三星SSD固态硬盘,然后使用Samsung Data Migration,花了近2个小时把C盘近200G文件无损迁移到新硬盘,然后将笔记本启动项修改为Bay(这里耗费了好多时间去测试),老机器重获新生!
崔文远TroyCui
2019/02/26
9940
VS 2017打开老项目报错:Project Target Framework Not Installed
杂记随笔:唤醒丢失问题 & 条件变量 vs 信号量
在没有新消息进入的时候,receiver 应该放弃共享缓冲区的锁,然后进入睡眠等待 sender 唤醒。 然而上述代码的问题在于,「放弃缓冲区锁」和「进入睡眠」不是一步原子操作,而是独立的两步操作。
Miigon
2022/10/27
7180
explicit_defaults_for_timestamp参数导致复制中断
explicit_defaults_for_timestamp是从5.6.6引入的一个新参数,默认是off。 作用:对TIMESTAMP类型列的默认值和NULL值的处理,是否启用非标准特性。 默认情况下,explicit_defaults_for_timestamp被禁用,即启用非标准特性。 什么是非标准特性? 标准特性:如果没有显示声明为 NOT NULL,则默认声明为 NULL (除timestamp外的其他数据类型) 非标准特性:如果没有显示声明为 NULL,则默认声明为 NOT NULL(times
MySQL轻松学
2018/03/09
1.5K0
explicit_defaults_for_timestamp参数导致复制中断
[WP Code Highlight.js] Project
https://github.com/owt5008137/WP-Code-Highlight.js
owent
2018/08/01
8000
VS Code 为什么能这么牛?
Visual Studio Code(VS Code)近年来获得了爆炸式增长,成为广大开发者工具库中的必备神器。它作为一个开源项目,也吸引了无数第三方开发者和终端用户,成为顶尖开源项目之一。它在功能上做到了够用,体验上做到了好用,更在拥有海量插件的情况下做到了简洁流畅,实属难能可贵。
GitHubDaily
2019/10/14
1.7K0
如何使用flask的 @app.url_defaults 装饰器
@app.url_defaults 装饰器是 Flask 中的一个装饰器,用来注册一个 URL 变量默认值函数。这个函数会在每次构造 URL 时执行,在请求处理函数之前执行,它的主要作用是为 URL 变量提供默认值。
测试开发囤货
2023/03/14
7770
如何使用flask的 @app.url_defaults 装饰器
vs2019:devExpress设置blazor工程
https://docs.devexpress.com/Blazor/401986/getting-started/install-components-and-create-an-application/without-devexpress-installer/microsoft-templates#2-obtain-your-devexpress-nuget-feed
周星星9527
2021/02/03
1K0
vs2019:devExpress设置blazor工程
点击加载更多

相似问题

Thorntail: project_defaults.yml上的动态值

29

ORDS defaults.xml vs conf/<name>..xml文件上载<entry defaults.xml

13

我到底应该把project-defaults.yml放在哪里?

117

M Project vs Sproutcore

12

如何使用project-defaults yaml配置消息传递activemq thorntail或swarm

131
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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