CUDAでヒストグラム計算を書いてcupyにmergeしてもらった
View Slide
石田 岳志 (@sonicair)東京高専 専攻科 2年 (B4)● qiita.com/IshitaTakeshi● 日経ソフトウエア2017年8月号● 特許6306770日経ソフトウエア 2017年8月号 日経BP社
やったことPCANet (Chan et al. 2014) を実装した→ CUDAでヒストグラム計算を書いた→ CuPyにpull requestを送った→ mergeしてもらった
動機:PCANetの実装● フィルタの重みをPCAで計算できるCNN● (論文によると) PCAなので学習が速いChan, Tsung-Han, et al. "PCANet: A simple deep learning baseline for image classification?."IEEE Transactions on Image Processing 24.12 (2015): 5017-5032.
CUDAで書こう!
Poolingが重い → CUDAで書こう!cupy.ElementwiseKernel● 並列処理をCUDAで直接書ける
戦略: 並列化してそれぞれ二分探索20 1 2 3 4 5 6-0.5 0.5 1.5 2.5 3.5 4.5 5.5
戦略: 並列化してそれぞれ二分探索-0.5 = bins[0] <= 2 <= bins[6] = 5.50 1 2 3 4 5 6-0.5 0.5 1.5 2.5 3.5 4.5 5.5
戦略: 並列化してそれぞれ二分探索0 1 2 3 4 5 6-0.5 0.5 1.5 2.5 3.5 4.5 5.53 = (0 + 6) / 2bins[3] = 2.5
戦略: 並列化してそれぞれ二分探索3 = (0 + 6) / 2bins[3] = 2.5 >= 20 1 2 3 4 5 6-0.5 0.5 1.5 2.5 3.5 4.5 5.5
戦略: 並列化してそれぞれ二分探索1 = (0 + 3) / 2bins[1] = 0.50 1 2 3 4 5 6-0.5 0.5 1.5 2.5 3.5 4.5 5.5
戦略: 並列化してそれぞれ二分探索1 = (0 + 3) / 2bins[1] = 0.5 <= 20 1 2 3 4 5 6-0.5 0.5 1.5 2.5 3.5 4.5 5.5
戦略: 並列化してそれぞれ二分探索2 = (1 + 3) / 2bins[2] = 1.50 1 2 3 4 5 6-0.5 0.5 1.5 2.5 3.5 4.5 5.5
戦略: 並列化してそれぞれ二分探索2 = (1 + 3) / 2bins[2] = 1.5 <= 20 1 2 3 4 5 6-0.5 0.5 1.5 2.5 3.5 4.5 5.5
戦略: 並列化してそれぞれ二分探索0 1 2 3 4 5 6-0.5 0.5 1.5 2.5 3.5 4.5 5.52 -> 2
https://github.com/cupy/cupy/pull/298
PFNの方々にご協力いただきました @unnonouno さん @okuta さん ありがとうございました
評価GPU TITAN X (Pascal)CPU Intel Core i7-6700Binの数,サンプル数 を 24~216 の範囲で変化させて実行時間を調査
結果