C++ 機械学習ライブラリ
のビルドメモです.
環境
- Ubuntu 16.04
- CUDA 9.2
- CUDA 10 ではビルドはできるが arrayfire の cublas テストが失敗するので動かないかも
Docker ビルドでは動かない...?
flashlight には Docker でのビルドがありますが, こちらの環境ではドライバのバージョンとかが悪いのか, Docker 環境に nvidia-docker で入って flashlight example を動かそうとすると GPU に最初にアクセスするときあたりで止まってしまいました.
したがってネイティブ環境でビルドしてみます.
ネイティブ環境でビルドする.
基本的には Dockerfile に書かれているようにすればコンパイルと動作ができます.
まずは flashlight が依存している arrayfire をビルドします.
コンパイラの設定
普段 ccache を使うために CXX=ccache clang++
としていますが, nvcc が ccache をうまく扱えない & clang++ が新しすぎると(2019 年 01 月 01 日時点 7.0.0 とか) nvcc がうまく動かないので, CXX=g++ cmake ...
などとして gcc を指定しておきます.
arrayfire + CUDA 10
flashlight は CUDA 9.2 をターゲットにしています. 一応 CUDA 10 でもコンパイルできますが, cublas テストが失敗するのでまだ使えないかもです
(また, deprecated な math_function.h を使っている warning が出ます)
CUDA 10 を利用している場合は, arrayfire のビルド時に cmake が古いと cublas を見つけてくれません.
cmake 3.13.2 以上であれば cublas を見つけてくれます.
cublas は apt で入るものを使いました.
wav2letter++
オーディオ関連のライブラリを apt で入れます.
$ sudo apt install libflac-dev libsndfile1-dev
他の依存ライブラリはソースからビルドしないとダメそうです.
$HOME/local
をインストール先にするものとします(-DCMAKE_INSTALL_PREFIX=$HOME/local
)
gtest
Getst は ubuntu で入るのは古いので, ソースからビルド(v1.8.x)します.
sndfile
sndio 周りでビルドに失敗するので sndio を off(cmake/SndFileChecks.cmake でコメントアウト)にしてビルドします.
KenLM
test プログラムのビルドで isnan
エラーがでるかもしれません. std::isnan
に書き換えておきます.
KenLM は cmake install では bin
しかインストールしてくれないので, ビルドしたディレクトリと .a のパスを後述の cmake に設定します.
MKL
Intel のサイトから落としてインストールします.
cmake configure
cmake の引数で GTEST_ROOT=/path/to/gtest
で gtest のディレクトリを指定します.
INTEL_MKL_DIR
で MKL のインストールディレクトリを指定します.
ccache や clang だと nvcc 内部でのコンパイラ呼び出しで失敗したりするので, Ubuntu 標準の g++, gcc を使うようにします.
最終的にこんな感じになりました.
rm -rf build
mkdir build
CXX=g++ CC=gcc cmake -Bbuild -H. -DCMAKE_BUILD_TYPE=Release -DCRITERION_BACKEND=CUDA \
-DINTEL_MKL_DIR=$HOME/intel/mkl \
-DKENLM_DIR=$HOME/work/kenlm \
-DKENLM_LIB=$HOME/work/kenlm/build/lib/libkenlm.a \
-DKENLM_UTIL_LIB=$HOME/work/kenlm/build/lib/libkenlm_util.a \
-DGTEST_ROOT=$HOME/local
TODO
- CUDA10 で動かす
- なんだかんだで依存ライブラリが多いのでビルドスクリプトを用意する
- Docker で動かない原因を探る