可以直接从gpu中为Caffe或Caffe2提供输入数据吗?

时间:2017-08-07 09:08:53

标签: python c++ caffe caffe2

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

预测图像
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

的入口张量

2 个答案:

答案 0 :(得分:2)

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

<强>更新
2017年9月19日PR #5904被合并为主人。这个PR通过python接口暴露了blobs的GPU指针 您可以直接从python 访问net->forward()blob._gpu_data_ptr,风险自负

答案 1 :(得分:1)

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