1

我已经阅读了 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

4

2 回答 2

2

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

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

于 2017-08-07T09:14:28.797 回答
1

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

于 2017-08-18T00:44:17.843 回答