2017-08-03 47 views
7

Bu, çok yerel bir soru olduğunu düşünüyorsanız, lütfen kapatmak için oy kullanın. Ben caffe2 github depo aramış, aynı soruyu soran an issue açıldı yazarı caffe2::Tensor ve caffe2::CUDAContext, üzerine doxygen belgelerini okuyun ve hatta caffe2 source code geçirdi, iyi anlamak görünüyor, çünkü caffe2_ccp_tutorials deposunda başka sorunu açıldı ve spesifik olarak tensor.h, context_gpu.h ve context_gpu.cc.caffe2 Tensor atama, yapım ya da kopyalama

Şu anda caffe2 cihaz belleğinin bir tensöre kopyalanmasına izin vermediğini anlıyorum. Bunu başarmak için kütüphaneyi genişletmek ve bir çekme talebi yapmak istiyorum. Bunun arkasındaki nedenim, cihaz belleğinde çalışan cv::cuda::* yöntemlerini kullanarak tüm görüntü ön işleme işlemlerini gerçekleştirdiğimden dolayı, gpu üzerinde ön işlemeyi gerçekleştirmenin bir problem olduğunu düşünüyorum. ve sonra ağa ana bilgisayardan cihaza yeniden yüklenmesini sağlayın.

Tensor<Context> yapıcıları baktığımızda belki sadece

template<class SrcContext , class ContextForCopy > 
Tensor (const Tensor<SrcContext> &src, ContextForCopy *context) 

İstediğimi elde olabileceğini görebiliyorum, ama nasıl <ContextForCopy> ayarlayın ve sonra inşaat için kullanmak hiçbir fikrim yok.

Bundan başka, I doğru boyutlarla Tensörü oluşturur ve daha sonra belki

template <typename T> 
T* mutable_data() 

I atayabilir kullanarak/veri kopyalama görüyoruz. Verilerin kendisi std::vector<cv::cuda::GpuMat'da saklanır, bu yüzden yinelemeliyim, sonra da aygıtın tahsis ettiği verilere erişmek için cuda::PtrStepSz or cuda::PtrStep kullanın. Bu, caffe2::Tensor<CUDAContext>'a kopyalamak/atamak istediğim verilerle aynı.

Ben bunun örneklerini görmeyeli Tensor<CPUContext> Tensor<CUDAContext> kopyalanır nasıl içten öğrenmek için çalışıyorum, ama kullanılan yöntem CopyFrom olduğunu düşünüyorum rağmen, onu anlamaya olamaz. Oldukça sürpriz kimsenin henüz bu görev haline tükendi am

TensorCPU tensor_cpu(...); 
TensorCUDA tensor_cuda = workspace.CreateBlob("input")->GetMutable<TensorCUDA>(); 
tensor_cuda->ResizeLike(tensor_cpu); 
tensor_cuda->ShareData(tensor_cpu); 

ve kısa bir arama verimleri tek open issue nerede yazar (@peterneher) soruyor: önce de belirtildiği gibi olağan örnekleri, CPU dan GPU kopyalamak aynı şeyi az ya da çok.

cevap

0

Bunu çözmeyi başardım. En basit yol, bellek konumunun kullanılacağı OpenCV 'a anlatmaktır. Bu 7th and 8th overload of the cv::cuda::GpuMat constructor aşağıda gösterilen kullanılarak yapılabilir: 3 kanal BGR şamandıra işlem, örneğin

std::vector<caffe2::TIndex> dims({1, 3, 224, 224}); 
caffe2::TensorCUDA tensor; 
auto ptr = tensor.mutable_data<float>(); 
cv::cuda::GpuMat matrix(224, 224, CV_32F, ptr); 

:

cv::cuda::GpuMat::GpuMat(int rows, 
         int cols, 
         int type, 
         void *  data, 
         size_t  step = Mat::AUTO_STEP 
         )  

cv::cuda::GpuMat::GpuMat(Size size, 
         int type, 
         void *  data, 
         size_t  step = Mat::AUTO_STEP 
         )  

Aksi takdirde

caffe2::TensorCUDA ilan edilmiştir ifade eder ve önceden tahsis matrisi cv::cuda::split kullanarak:

cv::cuda::GpuMat mfloat; 
// TODO: put your BGR float data in `mfloat` 
auto ptr = tensor.mutable_data<float>(); 
size_t width = mfloat.cols * mfloat.rows; 
std::vector<cv::cuda::GpuMat> input_channels { 
    cv::cuda::GpuMat(mfloat.rows, mfloat.cols, CV_32F, &ptr[0]), 
    cv::cuda::GpuMat(mfloat.rows, mfloat.cols, CV_32F, &ptr[width]), 
    cv::cuda::GpuMat(mfloat.rows, mfloat.cols, CV_32F, &ptr[width * 2]) 
}; 
cv::cuda::split(mfloat, input_channels); 

Ho Bu, Caffe2'nin C++ tarafında yaşayan herkesin yardımcı olacaktır.caffe2::Predictor o caffe2::TensorCUDA ile çalışmaz

NOT elle tensörünü yaymak yerine sahip olacaktır. Daha fazla bilgi için, the caffe2_cpp_tutorial mnist.cc.