🧙

monolish を触りっしゅ!(触ります)

2021/09/16に公開

本日は

  • 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.solibmonolish_gpu.so にすると /opt/monolish/examples make gpu が無事通ります.

わざわざ番号を調べるのが面倒ですがその作業を link_monolish_gpu.sh が担当しています.呪文と言っても allgebra_get_device_cc を実行して Compute Capability の値を取得して ln -s でシンボリックリンクを作っています. allgebra_get_device_cchttps://github.com/ricosjp/allgebra で提供されている機能ですね.monolish を動かすDockerのイメージは allgebra をベースにしているようです.実際,oss_nvidia.Dockerfile を眺めるとそのことがわかります.

まとめ

  • monolish をとりあえず試すための手順をまとめました.
  • GPU を持っていれば動かせるかも
  • やったね.これでみんな monolish 完全理解者になったね.
GitHubで編集を提案

Discussion