kvをdocker化すると何が嬉しいか?
こんなものを作ってみました
GitHubのコンテナレジストリを使ってみたかったので kvをdocker化してみました。
知見と問題点をまとめます。
dockerとは?
解説記事は探せばたくさんあるのでここでは後で大事になる点だけ
デモ
- 前提条件: dockerコマンドが利用できること
- ここで書いたように3コマンドでkvが環境構築/実行可能です
- コンパイルのコマンドは下記のように
c++ -I.. -I/usr/local/include /app/main.cc
応用編
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化前
- 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化すると嬉しいこと
テストの自動化
こういったCI/CDで自動テストを実施する時のベースイメージとして利用できます。
記事中では runs-on: ubuntu-latest ←Ubuntuの最新版環境内で処理を実行することを指定
と指定していますが、ここをkvに差し替えることで様々なテスト/ビルドの自動化が行えます。
精度保証付き数値計算のユーザーが自分のプロジェクトに簡単に精度保証付き数値計算のCI・CDによる自動テストを導入することができます。
kubernetesなどのクラスタ上での処理
kvの設計思想とはかけ離れているかもしれませんが、コンテナ化されていればkubernetesなどのクラスタリング環境でkvの計算プログラムを実行することができます。
どんなCPU使ってるかわからない環境で精度保証できるかは謎です!
問題点
最大の疑問: 精度保証できているの?
- A1. 大問題なんですがわからないです…。
dockerはLinuxカーネルを仮想化し、その上でコンテナを動作させます。
自分が見当をつけるとしたら下記のようになります。
- CPU: x86
- ARM他
- 不明です!
大体はubuntuを直接インストールした時と挙動は変わらないはずです
速度は早くなるの?
CPU: x86
どうやってコンパイルオプションつけるの?
- 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の導入としては手軽だと思います
- これで試してもらって、気に入ってもらえたら、本格的な環境構築をしてもらう流れにすれば完璧
- windowsやmacOSで独自に環境を構築するよりは環境差異が少ない
- cygwinやWSL, Visual Studioよりかはクセが無いはずです
- ubuntuやLinuxを利用する際も、実行環境を統一した上で動作可能です
- ただし、精度保証できているかどうかは、未検証です
正直、interval-simpleなどの軽量な実装のほうがdocker化しやすく、授業などでも扱いやすいかもしれません。