【问题标题】:Can Caffe or Caffe2 be given input data directly from gpu?可以直接从 gpu 给 Caffe 或 Caffe2 输入数据吗?
【发布时间】:2018-01-14 12:59:49
【问题描述】:

我已阅读 caffe2 教程并尝试过预训练模型。我知道 caffe2 将利用 GPU 来运行模型/网络。但是输入数据似乎总是来自 CPU(即主机)内存。比如Loading Pre-Trained Models中,模型加载完成后,我们可以通过

result = p.run([img])

但是,图像“img”应该在 CPU 范围内读取。我寻找的是一个可以将图像(从视频解码并仍然驻留在 GPU 内存中)直接传输到预测模型的框架,而不是将其从 GPU 复制到 CPU 范围,然后再次传输到 GPU 进行预测结果。 Caffe 或 Caffe2 是否为 python 或 C++ 提供了这样的功能或接口?还是我需要修补 Caffe 才能这样做?非常感谢。


这是我的解决方案:

我在tensor.h 中发现,函数ShareExternalPointer() 完全可以做我想做的事。

以这种方式输入 gpu 数据,

pInputTensor->ShareExternalPointer(pGpuInput, InputSize);

然后运行预测网络

pPredictNet->Run();

其中pInputTensor 是预测网络pPredictNet 的入口张量

【问题讨论】:

    标签: python c++ caffe caffe2


    【解决方案1】:

    我不认为你可以在 中使用 python 接口做到这一点。
    但我认为可以使用 c++ 来完成:在 c++ 中,您可以访问Blobmutable_gpu_data()。您可以编写在设备上运行的代码并直接从 gpu “填充”输入 Blob 的 mutable_gpu_data()。进行此更新后,caffe 应该能够从那里继续其net->forward()

    更新
    2017 年 9 月 19 日,PR #5904 并入 master。此 PR 通过 python 接口公开 blob 的 GPU 指针。
    您可以直接从 python 访问blob._gpu_data_ptrblob._gpu_diff_ptr风险自负

    【讨论】:

      【解决方案2】:

      正如您所指出的,使用 Python 层会强制数据进出 GPU,这可能会对性能造成巨大影响。这不仅适用于 Caffe,也适用于其他框架。要详细说明 Shai 的答案,您可以查看this step-by-step tutorial on adding C++ layers to Caffe。给出的示例应该涉及处理层实现的大多数问题。披露:我是作者。

      【讨论】:

        猜你喜欢
        • 2018-07-08
        • 2015-02-01
        • 2018-09-28
        • 1970-01-01
        • 1970-01-01
        • 2015-07-23
        • 1970-01-01
        • 1970-01-01
        • 2020-05-25
        相关资源
        最近更新 更多