数値解析日記

数値解析関係のネタ帳。C++,pythonなど

kvをdocker化すると何が嬉しいか?

こんなものを作ってみました

github.com

GitHubのコンテナレジストリを使ってみたかったので kvをdocker化してみました。
知見と問題点をまとめます。

www.publickey1.jp

dockerとは?

www.docker.com

解説記事は探せばたくさんあるのでここでは後で大事になる点だけ

デモ

f:id:o108minmin:20201101231204p:plain
instant-kv-demo

応用編

docker run -it --mount type=bind,source={path to kv/test}/test-interval.cc,target=/app/main.cc ghcr.io/o108minmin/instant-kv:main
Contributors

この{path to kv/test}の部分に任意のccファイルのフルパスを指定すれば、任意のファイルをkvでコンパイル可能/実行です

現時点でdocker化すると嬉しいこと

導入が楽・既存環境を汚さない

  • docker化前
    • A「kv使いたい!」
    • B「んじゃubuntu入れて、boost, gcc入れて、/usr/localに入れて(省略)」
    • A1「んー、ubuntu入れるの面倒だな…」A2「今他の研究で使ってるubuntuに余計なものを入れたく無いな…」
  • docker化後
    • A「kv使いたい」
    • B「んじゃこのdockerイメージ使って!」
    • A「自分の環境は壊さなくて済むし、コマンド1発でインストール/アンインストールできて手軽だし、試してみるか…」

kvを使ってみたい!となったらすぐ使えるようになるので導入の敷居が下がると思います。

実行者の環境に依存しない

  • A「kv使ったすごい計算プログラムができた!!!」
  • B「そのソースうちの環境だと動かんな…」
  • A「何インストールしたっけな???」

ってことがこのコンテナ使っている限りは減ります。
(ubuntu上に何をインストールしたかはこのコンテナイメージによって、同じになっているはずなので)

論文などでソースを公開する際も、再現性が高く、検証が容易なはずです。

tagでバージョン分けが簡単にできる

実はdockerのtag機能を使うと kv 0.4.50で実行できるイメージ kv 0.4.49で実行できるイメージ と分けることができます

/Users/o108minmin/go/src/github.com/o108minmin/instant-kv/docker% docker image ls
REPOSITORY                         TAG                     IMAGE ID            CREATED              SIZE
ghcr.io/o108minmin/instant-kv      0.4.49                  29e31a32e09a        About a minute ago   1.03GB
ghcr.io/o108minmin/instant-kv      0.4.50                  80ef85fa78bf        6 hours ago          1.03GB

これを利用して開発時に直っているかどうか確認することが第三者でも容易になります。

/Users/o108minmin% docker run -it --mount type=bind,source=/Users/o108minmin/kv/test/test-interval.cc,target=/app/main.cc ghcr.io/o108minmin/instant-kv:0.4.49

// なんか想定外の挙動

/Users/o108minmin% docker run -it --mount type=bind,source=/Users/o108minmin/kv/test/test-interval.cc,target=/app/main.cc ghcr.io/o108minmin/instant-kv:0.4.50

// このバージョンだと直ったよ!!!

将来的にdocker化すると嬉しいこと

テストの自動化

knowledge.sakura.ad.jp

こういったCI/CDで自動テストを実施する時のベースイメージとして利用できます。
記事中では runs-on: ubuntu-latest ←Ubuntuの最新版環境内で処理を実行することを指定 と指定していますが、ここをkvに差し替えることで様々なテスト/ビルドの自動化が行えます。
精度保証付き数値計算のユーザーが自分のプロジェクトに簡単に精度保証付き数値計算のCI・CDによる自動テストを導入することができます。

kubernetesなどのクラスタ上での処理

kvの設計思想とはかけ離れているかもしれませんが、コンテナ化されていればkubernetesなどのクラスタリング環境でkvの計算プログラムを実行することができます。

どんなCPU使ってるかわからない環境で精度保証できるかは謎です!

問題点

最大の疑問: 精度保証できているの?

  • A1. 大問題なんですがわからないです…。

dockerはLinuxカーネルを仮想化し、その上でコンテナを動作させます。
自分が見当をつけるとしたら下記のようになります。

大体はubuntuを直接インストールした時と挙動は変わらないはずです

速度は早くなるの?

  • A2. 環境によりますが、windowsmacOS上では早くなる(はず)

  • CPU: x86

    • OS: windows
      • おそらくvirtual boxを使ってubuntu仮想マシンで動かしているのと変わらないはず…
      • しかし、virtual box + ubuntu(デスクトップ)版と比較して、GUIレンダリングする必要がないので全体的に軽いはず
    • OS: macOS
    • OS: ubuntu
      • コンテナ化によるオーバーヘッドが少しあるので、ubuntuにインストールした時より少し遅いはず
    • OS: Linux(ubuntu以外)
      • コンテナ化によるオーバーヘッドが少しあるので、ubuntuにインストールした時より少し遅いはず

どうやってコンパイルオプションつけるの?

  • A3. 実は下記のように docker run ... ghcr.io/o108minmin/instant-kv:main {実行したコマンド} とすると任意のコマンドが実行できる。それを応用すればいける(はず)
/Users/o108minmin% docker run -it --mount type=bind,source=/Users/o108minmin/kv/test/test-interval.cc,target=/app/main.cc ghcr.io/o108minmin/instant-kv:main ls
affine.hpp      highderiv.hpp       ode-param.hpp
airy.hpp        hwround.hpp     ode-qr-lohner.hpp
all.hpp         hypergeom.hpp       ode-qr.hpp
allsol-affine.hpp   interval-conv.hpp   ode.hpp
allsol-simple.hpp   interval-vector.hpp odescale.hpp
allsol.hpp      interval.hpp        optimize.hpp
autodif.hpp     jointrange.hpp      poincaremap.hpp
bessel.hpp      kkt.hpp         psa-plot.hpp
beta.hpp        kraw-approx.hpp     psa.hpp
cardano-ferrari.hpp lobachevsky.hpp     qr.hpp
...

(Dockerfileによって、WORKDIRが /usr/local/include/kvになっているのでkvのファイルが見えます)

もちろん定番の -O3 -DNDEBUG も指定可能です。(実行できるとは言っていない)

/Users/o108minmin/go/src/github.com/o108minmin/instant-kv/docker% docker run -it --mount type=bind,source=/Users/o108minmin/kv/test/test-interval.cc,target=/app/main.cc ghcr.io/o108minmin/instant-kv:main c++ -O3 -DNDEBUG -I.. -I/usr/local/include /app/main.cc

またはdockerの実行時に環境変数を流し込めるので、それを利用する手もあります(検討中)

CPUがx86以外ではどうなるの?

  • A4. たぶんエラーなしで動いちゃうんですけど、想定通りに動くとは限らないです…

apple silliconで64bit arm macに完全移行されたらmacはもう終わりです

まとめ

  • kvの導入障壁を下げることができそう
    • 「まずはこれでお試し!」って言って、 minimal-example を渡せばkvの導入としては手軽だと思います
    • これで試してもらって、気に入ってもらえたら、本格的な環境構築をしてもらう流れにすれば完璧
  • windowsmacOSで独自に環境を構築するよりは環境差異が少ない
  • ubuntuLinuxを利用する際も、実行環境を統一した上で動作可能です
  • ただし、精度保証できているかどうかは、未検証です

正直、interval-simpleなどの軽量な実装のほうがdocker化しやすく、授業などでも扱いやすいかもしれません。