2017-08-01 59 views
0

我試圖使操作者在MXNet將在以下面的方式輸出介紹稀疏性輸入:使用TOPK修剪在MXNet

  • 分別做用於每個數據點的修剪(軸0爲對於數據點)
  • 滴藥較低的權重爲0
  • 保持相同的尺寸輸入

我目前這樣做與下面的代碼段(假定動作是輸入至t他的運營商):

flat = mx.sym.flatten(act) 
mask = mx.sym.topk(flat, k = int(frac * flat.infer_shape(data=shape)[1][0][1]), axis = 1, ret_typ = 'mask').reshape(act.infer_shape(data=shape)[1][0]) 
custom = mx.sym.where(mask == 1, act, mask) 

在這種實現方式下,張量行爲的維度存在限制。一個非常大的張量,夷爲平地,傳遞到在IndexFill錯誤TOPK結果時:

[20:27:53] /home/ubuntu/mxnet/dmlc-core/include/dmlc/logging.h:304: [20:27:53] /home/ubuntu/mxnet/mshadow/mshadow/././././cuda/tensor_gpu-inl.cuh:58: too large launch parameter: IndexFill[100352,1], [32,32,1] 

Stack trace returned 10 entries: 
[bt] (0) /usr/local/lib/python2.7/dist-packages/mxnet-0.10.1-py2.7.egg/mxnet/libmxnet.so(_ZN4dmlc15LogMessageFatalD1Ev+0x3c) [0x7fb593bbc9ac] 
[bt] (1) /usr/local/lib/python2.7/dist-packages/mxnet-0.10.1-py2.7.egg/mxnet/libmxnet.so(_ZN7mshadow4cuda9IndexFillIffEEvNS_6TensorINS_3gpuELi2ET0_EERKNS2_IS3_Li1ET_EERKS5_+0x492) [0x7fb59581bf82] 
[bt] (2) /usr/local/lib/python2.7/dist-packages/mxnet-0.10.1-py2.7.egg/mxnet/libmxnet.so(_ZN5mxnet2op8TopKImplIN7mshadow3gpuEEEvNS_10RunContextENS_8ResourceERKNS_5TBlobERKSt6vectorIS6_SaIS6_EERKNS0_9TopKParamE+0x3ca1) [0x7fb595841521] 
[bt] (3) /usr/local/lib/python2.7/dist-packages/mxnet-0.10.1-py2.7.egg/mxnet/libmxnet.so(_ZN5mxnet2op4TopKIN7mshadow3gpuEEEvRKN4nnvm9NodeAttrsERKNS_9OpContextERKSt6vectorINS_5TBlobESaISC_EERKSB_INS_9OpReqTypeESaISH_EESG_+0x345) [0x7fb595842cc5] 
[bt] (4) /usr/local/lib/python2.7/dist-packages/mxnet-0.10.1-py2.7.egg/mxnet/libmxnet.so(+0x1318cf9) [0x7fb5947aecf9] 
[bt] (5) /usr/local/lib/python2.7/dist-packages/mxnet-0.10.1-py2.7.egg/mxnet/libmxnet.so(_ZN5mxnet6engine14ThreadedEngine15ExecuteOprBlockENS_10RunContextEPNS0_8OprBlockE+0x8c) [0x7fb5947ef07c] 
[bt] (6) /usr/local/lib/python2.7/dist-packages/mxnet-0.10.1-py2.7.egg/mxnet/libmxnet.so(_ZNSt17_Function_handlerIFvvEZZN5mxnet6engine23ThreadedEnginePerDevice13PushToExecuteEPNS2_8OprBlockEbENKUlvE1_clEvEUlvE_E9_M_invokeERKSt9_Any_data+0x60) [0x7fb5947f2190] 
[bt] (7) /usr/lib/x86_64-linux-gnu/libstdc++.so.6(+0xb1a60) [0x7fb5a3c45a60] 
[bt] (8) /lib/x86_64-linux-gnu/libpthread.so.0(+0x8184) [0x7fb5a9e07184] 
[bt] (9) /lib/x86_64-linux-gnu/libc.so.6(clone+0x6d) [0x7fb5a9b34bed] 

所以我的問題是:

  • 目前,它具有非常小批量的大小的功能。但有沒有辦法增加批量並避免錯誤?
  • 是否有更好的實現操作符的方法?
+0

它看起來像一個MXNet的錯誤,我可以問你在這裏提交它:https://github.com/apache/incubator-mxnet/issues/新 –

回答

2

問題的原因與GPU運算符及其內核的實現有關,特別是內核啓動時的線程數,塊數以及網格維數。

特別是,NVIDIA CUDA計算能力指定了線程的最大數量,每個線程的線程以及每個維度的塊數(網格維度)。例如,參見http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#compute-capabilities

在您的情況下,第一個網格維度的閾值爲65535。在MXNet中,此閾值也定義爲kMaxGridDim。因此它會拋出錯誤。

要解決這個問題,可能會有不同的選擇:更改特定的運算符本身和內核啓動請求的線程數,然後可能內核本身;或者,在通用MXNet GPU內核啓動函數中的修復也可以實現。

明天我會研究它,並在問題得到解決時更新我的​​答案。

編輯:問題已經處理和解決:https://github.com/dmlc/mshadow/pull/277