Random forest of CuMLを並行処理で動かしたい
Random forestのような軽い機械学習を, GPUを使用した上で並行処理してみます...
はじめに
Random Forest (RF), Suport Vector Machine (SVM), Xgboost (XGB) などはさくっと機械学習を試すときに役立つ便利な手法の代表例です. また, これらの手法はさくっと試せる割にいい感じの精度が出る場合が多く, 実利用でも非常に役立ちます.
これらのアルゴリズムを実装する際, scikit-learnがよく使用されると思います. しかしながら, 大量の分類器を一度に並列して学習させたい場合, 通常の方法では, 順番に分類器を学習させていくしかありません. もちろん, pythonのmultiprocessingライブラリを使うという手もありますが, もしあなたのパソコンがGPUを積んでいるのであれば, GPUを使いたくなるというのが人情ってもんじゃないでしょうか.
GPUベースで動くRFなどのライブラリとしてCuMLがあります. しかしながら, 私が調べた限りでは, 「CuMLを使用しつつ並列処理をおこなう」という記事は見当たらなかったので, 実装しようと思います.
使用するライブラリはCuML, joblibです. ではやっていきましょう.
joblibを手なづけたい
joblibの公式APIはここです. まぁとりあえずまずは試しに軽くいじっていきましょう.
import numpy as np
from joblib import Parallel, delayed
とりあえず並行処理に使いそうなParallel
モジュールとdelayed
モジュールをインポートしときましょう.
では早速並列処理を試していきます.
$0$~$9$の整数$x$について, $2^x$を並列で求めて出力するという処理をしてみましょう. パワー!!!
def power_two(x):
return 2**x
Parallel(n_jobs=10)(delayed(power_tow)(x) for x in range(1, 11))
すると,
[1, 2, 4, 8, 16, 32, 64, 128, 256, 512]
とlist形式で計算結果が返ってきます.
ちなみにParallel
モジュールのざっくりした使い方は, Parallel(並列実行数)(delayed(関数)(引数)(イテレータ))
というふうになっています.
ここでdelayed(引数)
の部分は関数にしなければうまく動きません. 例えば,
Parallel(n_jobs=10)(delayed(2**x)(x) for x in range(1, 11))
としてもTypeError: 'numpy.int64' object is not callable
と言われて失敗します.
ということで最初に関数を定義する必要があります.
では並列処理の結果どの程度計算速度が向上するのかを確認してみましょう.