2021年12月25日土曜日

Thinker BoardのOpenCL(2)

 前の投稿で、ビルドして動かすところまで、やってみましたが、今回はOpenCLを使うと、あまりに遅かったので、パラメータを調整してみます。
どうも、max_bin = 255となっていたので、64とかに減らして実行すると15がいいよというWarningがでました。

[LightGBM] [Info] Finished loading parameters
[LightGBM] [Info] Using column number 0 as label
[LightGBM] [Info] Loading weights...
[LightGBM] [Info] Construct bin mappers from text data time 0.03 seconds
[LightGBM] [Info] Loading weights...
[LightGBM] [Info] Finished loading data in 0.207653 seconds
[LightGBM] [Info] Number of positive: 3716, number of negative: 3284
[LightGBM] [Info] This is the GPU trainer!!
[LightGBM] [Info] Total Bins 0
[LightGBM] [Info] Number of data points in the train set: 7000, number of used features: 28
[LightGBM] [Warning] Setting max_bin to 15 is suggested for best performance
・・・
・・・
[LightGBM] [Info] 27.172875 seconds elapsed, finished iteration 99
[LightGBM] [Info] Iteration:100, training binary_logloss : 0.267676
[LightGBM] [Info] Iteration:100, training auc : 0.991391
[LightGBM] [Info] Iteration:100, valid_1 binary_logloss : 0.5031
[LightGBM] [Info] Iteration:100, valid_1 auc : 0.834687
[LightGBM] [Info] 27.380465 seconds elapsed, finished iteration 100
[LightGBM] [Info] Finished training

それで、15に設定すると。確かに早くなりましたが、それでもCPUより圧倒的に遅いです。

[LightGBM] [Info] Finished loading parameters
[LightGBM] [Info] Using column number 0 as label
[LightGBM] [Info] Loading weights...
[LightGBM] [Info] Construct bin mappers from text data time 0.03 seconds
[LightGBM] [Info] Loading weights...
[LightGBM] [Info] Finished loading data in 0.213896 seconds
[LightGBM] [Info] Number of positive: 3716, number of negative: 3284
[LightGBM] [Info] This is the GPU trainer!!
[LightGBM] [Info] Total Bins 0
[LightGBM] [Info] Number of data points in the train set: 7000, number of used features: 28
[LightGBM] [Info] Using GPU Device: Mali-T760, Vendor: ARM
[LightGBM] [Info] Compiling OpenCL Kernel with 16 bins...
[LightGBM] [Info] GPU programs have been built
[LightGBM] [Info] Size of histogram bin entry: 8
[LightGBM] [Info] 27 dense feature groups (0.11 MB) transferred to GPU in 0.011649 secs. 1 sparse feature groups
[LightGBM] [Info] Finished initializing training
・・・
・・・
[LightGBM] [Info] 17.915968 seconds elapsed, finished iteration 99
[LightGBM] [Info] Iteration:100, training binary_logloss : 0.346398
[LightGBM] [Info] Iteration:100, training auc : 0.96812
[LightGBM] [Info] Iteration:100, valid_1 binary_logloss : 0.566812
[LightGBM] [Info] Iteration:100, valid_1 auc : 0.773077
[LightGBM] [Info] 18.062390 seconds elapsed, finished iteration 100
[LightGBM] [Info] Finished training

同じパラメータでCPUで実行すると、CPUでもさらに早くなりました。2倍ぐらいでしょうか。
・・・
[LightGBM] [Info] Iteration:100, training binary_logloss : 0.268637
[LightGBM] [Info] Iteration:100, training auc : 0.991395
[LightGBM] [Info] Iteration:100, valid_1 binary_logloss : 0.518213
[LightGBM] [Info] Iteration:100, valid_1 auc : 0.816853
[LightGBM] [Info] 0.491855 seconds elapsed, finished iteration 100
[LightGBM] [Info] Finished training

他のパラメータもチューニングしていく必要がありそうです。ただ、GPUがそもそも遅いように思います。


2021年12月24日金曜日

Thinker BoardのOpenCL

 ASUSのThinker Boardを以前購入したのですが、いまいち使い道がなく、結局放置していました。最近Thinker BoardにMali-T760が搭載されていて、OpenCLが使えるということに気づきました。

勾配ブーストの機械学習で、広く使われている、LightGBMがOpenCLに対応していたので、Thinker Boardで動かしてみました。

環境:

Thinker Board 
OS : Thinker OS version(/etc/versionの情報です) 2.1.1

LightGBM: 3.3.1

まず、OpenCLの情報を見ようclinfoを使います。

sudo apt-get install clinfo
clinfoで、なんか、デバイスが無いという状態

/etc/OpenCL/vendorsをみようとすると、標準でこのファイルは存在していますが、/etc/OpenCL/vendersとまさかの、スペルミスの状態になっています。。こういうのはちょっと恥ずかしいレベルですね。とりあえず、リンクを作ります。

sudo ln -s /etc/OpenCL/venders /etc/OpenCL/vendors

clinfoの出力結果です。

  Platform Name                                   ARM Platform

Number of devices                                 1

  Device Name                                     Mali-T760

  Device Vendor                                   ARM

  Device Vendor ID                                0x7500001

  Device Version                                  OpenCL 1.2 v1.r13p0-00rel0-git(a4271c9).40dbad8455f8b43d1f8fbb5a1fe733e6

  Driver Version                                  1.2

  Device OpenCL C Version                         OpenCL C 1.2 v1.r13p0-00rel0-git(a4271c9).40dbad8455f8b43d1f8fbb5a1fe733e6

  Device Type                                     GPU

  Device Profile                                  FULL_PROFILE

  Max compute units                               4

  Max clock frequency                             100MHz

  Device Partition                                (core)

    Max number of sub-devices                     0

    Supported partition types                     None

  Max work item dimensions                        3

  Max work item sizes                             256x256x256

  Max work group size                             256

  Preferred work group size multiple              4

・・・

OpenCLは1.2ですね。

次にLightGBMをビルドします。

LightGBM GPU Tutorial — LightGBM 3.3.1.99 documentation
上記の流れに従います。

sudo apt-get install --no-install-recommends git cmake build-essential libboost-dev libboost-system-dev libboost-filesystem-dev


実際は、aptで配信されているcmakeが古い(cmake 3.2.0以降が必要)ので、ダウンロードしてビルドします。

cmake 3.22.1を使っています。

git clone --recursive https://github.com/microsoft/LightGBM

cd LightGBM

mkdir build

cd build

下記のように、ライブラリとヘッダを指定してビルドしないとうまくいかないです。

/usr/local/bin/cmake -DUSE_GPU=1 -DOpenCL_LIBRARY=/usr/lib/arm-linux-gnueabihf/libOpenCL.so.1 -DOpenCL_INCLUDE_DIR=/usr/include/CL ..

make -j4

これでビルドできるので、試してみます。pythonは64bitしかモジュールをインストールできないので、コマンドラインのlightgbmを使います。

cd ..

cd examples/binary_classification

../../lightgbm config=train.conf device=gpu

上記で、学習が始まります。ただなんかとっても遅い。。。30秒弱かかります。

標準ではデバイスはCPUなのですが、

../../lightgbm config=train.conf 

これだと、1秒程度。。

チューニングが必要かもしれませんが、本日はこのあたりで力尽きました。



Thinker BoardのOpenCL(2)

 前の投稿で、ビルドして動かすところまで、やってみましたが、今回はOpenCLを使うと、あまりに遅かったので、パラメータを調整してみます。 どうも、max_bin = 255となっていたので、64とかに減らして実行すると15がいいよというWarningがでました。 [LightG...