Caffe 或 Caffe2 可以直接从 GPU 获得输入数据吗?

Can Caffe or Caffe2 be given input data directly from gpu?

本文关键字:输入 数据 GPU Caffe2 Caffe      更新时间:2023-10-16

我已经阅读了caffe2教程并尝试了预先训练的模型。我知道caffe2将利用GPU来运行模型/网络。但是输入数据似乎总是从 CPU 给出(即。主机(内存。例如,在加载预训练模型中,在加载模型后,我们可以通过以下方式预测图像

result = p.run([img])

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


这是我的解决方案:

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

以这种方式馈送 GPU 数据,

pInputTensor->ShareExternalPointer(pGpuInput, InputSize);

然后运行预测网络

pPredictNet->Run();

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

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

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

正如你所指出的,使用 Python 层强制数据进出 GPU,这可能会对性能造成巨大影响。这不仅适用于 Caffe,也适用于其他框架。要详细说明Shai的答案,您可以查看有关向Caffe添加C++层的分步教程。给出的示例应该涉及处理层实现的大多数问题。披露:我是作者。