2017-08-03 7 views
7

यह एक लंबा शॉट है, यदि आपको लगता है कि प्रश्न बहुत स्थानीय है, तो कृपया बंद करने के लिए वोट दें। मैं caffe2 github भंडार की खोज नहीं की, एक ही सवाल पूछने an issue खोला, क्योंकि इसके लेखक यह सबसे अच्छा समझने के लिए, caffe2::Tensor और caffe2::CUDAContext, पर Doxygen प्रलेखन पढ़ सकते हैं और यहां तक ​​कि caffe2 source code के माध्यम से चला रहा है caffe2_ccp_tutorials भंडार में एक और मुद्दा खोला, और tensor.h, context_gpu.h और context_gpu.cc विशिष्ट में।कैफे 2 टेंसर <CUDAContext> असाइनमेंट, निर्माण या प्रतिलिपि

मैं समझता हूं कि वर्तमान में कैफे 2 डिवाइस मेमोरी को टेंसर पर कॉपी करने की अनुमति नहीं देता है। मैं लाइब्रेरी का विस्तार करने के लिए तैयार हूं और इसे प्राप्त करने के लिए पुल अनुरोध करता हूं। इसके पीछे मेरा कारण यह है कि मैं cv::cuda::* विधियों का उपयोग कर सभी छवि प्री-प्रोसेसिंग करता हूं जो डिवाइस मेमोरी पर काम करता है, और जैसा कि मुझे लगता है कि यह स्पष्ट रूप से जीपीयू पर प्री-प्रोसेसिंग करने में एक समस्या है, केवल होस्ट पर परिणाम डाउनलोड करने के लिए , और फिर इसे होस्ट से डिवाइस पर नेटवर्क पर फिर से अपलोड कर दिया है।

Tensor<Context> के निर्माताओं को देखते हुए मैं देख सकता हूँ शायद ही

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

को प्राप्त हो सकता है कि मैं क्या चाहता हूँ, लेकिन मैं कैसे <ContextForCopy> सेट और फिर निर्माण के लिए इसका इस्तेमाल करने की कोई अंदाज़ा नहीं है।

इसके अलावा, मुझे लगता है कि मैं सही आयामों के साथ टेन्सर निर्माण कर सकते हैं, और फिर शायद का उपयोग कर

template <typename T> 
T* mutable_data() 

मैं प्रदान कर सकते हैं/डेटा की प्रतिलिपि। डेटा को std::vector<cv::cuda::GpuMat में संग्रहीत किया जाता है, इसलिए मुझे इसे फिर से चालू करना होगा, और फिर अंतर्निहित डिवाइस आवंटित डेटा तक पहुंचने के लिए cuda::PtrStepSz or cuda::PtrStep का उपयोग करें। यह वही डेटा है जिसे मुझे caffe2::Tensor<CUDAContext> में कॉपी/असाइन करने की आवश्यकता है।

मैं पता लगाने के लिए आंतरिक रूप से Tensor<CPUContext>Tensor<CUDAContext> को कॉपी किया है के बाद से मैं इसके बारे में उदाहरण देखा है की कोशिश कर रहा है, लेकिन मैं इसे समझ नहीं सकता है, हालांकि मुझे लगता है कि प्रयोग विधि CopyFrom है। पहले ही उल्लेख के रूप में हमेशा की तरह उदाहरण, सीपीयू से GPU को कॉपी:

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

मैं कर रहा हूँ काफी हैरान कोई भी अभी तक इस कार्य को भी करना पड़ा है, और एक संक्षिप्त खोज पैदावार केवल एक open issue जहाँ लेखक (@peterneher) पूछ रहा है एक ही चीज़ कम या ज्यादा।

उत्तर

0

मैंने इसे समझने में कामयाब रहा है। ओपनसीवी जो उपयोग करने के लिए स्मृति स्थान को बताने का सबसे आसान तरीका है। यह 7th and 8th overload of the cv::cuda::GpuMat constructor नीचे दिखाया गया है का उपयोग करके किया जा सकता है:

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 
         )  

ऐसा करने से संकेत मिलता है कि caffe2::TensorCUDA घोषित किया गया है और पहले से आवंटित:

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); 

उदाहरण के लिए, एक 3 चैनल बीजीआर नाव प्रसंस्करण cv::cuda::split का उपयोग कर मैट्रिक्स:

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); 

हो पे यह किसी को कैफी 2 के सी ++ पक्ष में रहने में मदद करेगा।

नोट कि caffe2::Predictorcaffe2::TensorCUDA साथ काम नहीं करेंगे, तो आप मैन्युअल टेन्सर का प्रचार करने के बजाय होगा। इस पर अधिक जानकारी के लिए, the caffe2_cpp_tutorial mnist.cc

संबंधित मुद्दे