笹川大河
Taiga Sasagawa
Таига Сасагава

筑波大学
理工情報生命学術院 生命地球科学研究群
環境科学学位プログラム
流域管理研究室 博士 (前期) 課程 2年

Master's Program in Environmental Sciences,
Degree Programs in Life and Earth Sciences,
Graduate School of Science and Technology,
University of Tsukuba.

Магистерская программа в области наук об окружающей среде,
Дипломные программы в области наук о жизни и земле,
Высшая школа науки и технологий,
Университет Цукуба

Random forest of CuMLを並行処理で動かしたい

Random forestのような軽い機械学習を, GPUを使用した上で並行処理してみます...

Taiga Sasagawa

はじめに

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と言われて失敗します. ということで最初に関数を定義する必要があります.

では並列処理の結果どの程度計算速度が向上するのかを確認してみましょう.

  • None
  • None

最近の投稿

カテゴリー

本サイトについて

衛星リモセン研究者の端くれが学んだこと・考えたことをよしなに発信します.
お手柔らかに.