monolish を触りっしゅ!(触ります)
本日は
- monolish というすべてのハードウェア、型、行列構造への依存を吸収することを目的として開発された、数値計算ライブラリ"monolish"を動かしてみたお話です.
- 開発元の科学計算総合研究所のツイート によればmonolish を使うと簡単なインタフェースで、MKL、 cuBLAS、cuSPARSE、cuSOLVER、BLAS、LAPACKのAPI を統一した関数で利用できるようです.
- 統一ってかっこいいじゃん.一方で,API の名前は聞いたことがある程度で直でそれらのAPIを叩いた経験はほぼ皆無なのんびり楽をして生活したいぐーたらアザラシ(の飼い主)にとってはありがたい話です.
触りっしゅ(触ります)
- C++ 系のプロジェクトで辛いのは
面白そうで動かしたいが動かし方わからん
and手元でビルドできないのでそもそも動かせないが・・・(・ω・`)
であきらめてしまいがちです. - 幸いなことに先日開発者と雑談する機会があったのでそこで monolish をとりあえず動かす方法を教えていただきました.
- 今回の記事の目的は提供されている Docker イメージの上で触ることでとりあえず動い
ピオカ!なる(動いたという)成功体験を共有することです.\tan\theta - Docker は各自で導入してください.
- CPUがインテルの MacBook と Ubuntu 20.04 が入っているインテルのCPUが入ったBTOのマシンで動作確認しています.
イメージをダウンロードしてコンテナの中に入る
まずは monolish の README にあるように
Docker container with monolish installed
のドキュメントに飛びます.色々選択肢があって迷いますが,ひとまず OSS
というのを選び下記のコマンドを実行します:
$ docker run -it --rm ghcr.io/ricosjp/monolish/oss:latest
他のオプションは What's monolish? にある Switching libraries
の段落にあるフローチャートを見ると理解が深まると思います.
初めて動かす場合はイメージのダウンロードに時間がかかりますがコーヒーでも飲んで待機します.
正しく実行されればターミナルのプロンプトが下記のようになります.
root@<適当な文字列>:/#
examples を動かす (monolish 0.14.0)
なんか動いてるなーってのを知るために examples
を動かしてみます.コンテナ内に既に /opt/monolish
があるのでわざわざ monolish をクローンする必要はないです.
root@xxxxx:/# cd /opt/monolish/examples/
root@xxxxx:/opt/monolish/examples# ls
Makefile blas cpu_only eigen equation
Makefile
があるので make
を実行してみましょう. 固有値計算したり線型方程式を解くC++の例が動きます.中身は GitHub の monolish/examples でも閲覧できます.
root@xxxxx:/opt/monolish/examples# make
make -C ./blas/cg_impl/ cpu
make[1]: Entering directory '/opt/monolish/examples/blas/cg_impl'
g++ -O3 cg.cpp -o cg_cpu.out -I /root/lib/monolish/include/ -L/root/lib/monolish/lib/ -lmonolish_cpu
echo "run CPU"
run CPU
./cg_cpu.out
<出力略>
Remark (monolish 0.15.0 の場合)
-
/opt/monolish
から/usr/share/monolish
に変わったようです.
benchmark の方を動かす
/opt/monolish/benchmark
に移動して下記を実行すればベンチマークが走ります.
root@xxxxx:/# cd /opt/monolish/benchmark
:/opt/monolish/benchmark# make intel_oss
:/opt/monolish/benchmark# make run_intel_oss
htop
で見ると下記のようにコアをぶん回している様子がわかります.
GPU リソースを使う場合
- GPU を使う場合はコンテナから GPU が見えている必要があります.GPUに対応するドライバーを導入して NVIDIA Container Toolkit を導入して
--gpus all
オプションをつけてコンテナ内部でnvidia-smi
して確認する云々になれている場合であればお手軽に利用できます. - ↑のようなDockerの構築が済んだ場合は
oss_nvisia
イメージを使います.下記のコマンドを実行するとコンテナ内部に入ります. - macOS ユーザは諦めてUbuntuが入っている自作PCを組んでください.
$ docker run -it --rm --gpus all ghcr.io/ricosjp/monolish/oss_nvidia:latest
root@xxxxxx:/#
nvidida-smi
コマンドを使ってコンテナ内からGPUが見えているかを確認しておきましょう.
root@xxxxxx:/# nvidia-smi
あとは /opt/monolish/examples
, /opt/monolish/benchmark
以下のコードを GPU を使うようにビルドするだけです.
呪文の実行
その前に下記の呪文をコンテナ内部で実行しておきます.
root@xxxxx:#/ sh /opt/monolish/link_monolish_gpu.sh
上記のスクリプトを実行しないと /usr/bin/ld: cannot find -lmonolish_gpu
が出てきます.
examples, benchmark の実行
- examples
root@xxxxx:/opt/monolish/examples# make gpu
- benchmark
root@xxxxx:/opt/monolish/benchmark# make nvidia
root@xxxxx:/opt/monolish/benchmark# make run_nvidia
1080Ti のマシーンで動きました.
呪文が必要な理由
- 呪文を実行しないと
/usr/bin/ld: cannot find -lmonolish_gpu
と怒られます.
libmonolish_gpu.so
どこにあるのかな?と探すとコンテナ内部の/usr/lib
でそれっぽいものが見つかります.
root@xxxxx:/# cd /usr/lib/
root@xxxxx:/usr/lib# ls
apt libmonolish_cpu.so libmonolish_gpu_75.so python3.9
bfd-plugins libmonolish_gpu_35.so locale sasl2
compat-ld libmonolish_gpu_37.so mime ssl
dpkg libmonolish_gpu_50.so monolish systemd
file libmonolish_gpu_52.so openssh tar
gcc libmonolish_gpu_53.so os-release tmpfiles.d
git-core libmonolish_gpu_60.so pkg-config.multiarch valgrind
gnupg libmonolish_gpu_61.so pkgconfig x86_64-linux-gnu
gnupg2 libmonolish_gpu_62.so python3
gold-ld libmonolish_gpu_70.so python3.8
CPU 版 libmonolish_cpu.so
はあれど gpu 版は libmonolish_gpu_NN.so
のような番号付きのものはあります. 番号は Compute Capability を指していて https://developer.nvidia.com/cuda-gpus から自分の環境にあった番号を探します.
- 例えば 1080Ti だと
6.1
ですのでlibmonolish_gpu_61.so
をlibmonolish_gpu.so
にすると/opt/monolish/examples make gpu
が無事通ります.
わざわざ番号を調べるのが面倒ですがその作業を link_monolish_gpu.sh
が担当しています.呪文と言っても allgebra_get_device_cc
を実行して Compute Capability の値を取得して ln -s
でシンボリックリンクを作っています. allgebra_get_device_cc
は https://github.com/ricosjp/allgebra で提供されている機能ですね.monolish を動かすDockerのイメージは allgebra をベースにしているようです.実際,oss_nvidia.Dockerfile を眺めるとそのことがわかります.
まとめ
- monolish をとりあえず試すための手順をまとめました.
- GPU を持っていれば動かせるかも
- やったね.これでみんな monolish 完全理解者になったね.
Discussion