こんばんは、息子二人ともインフルエンザで義父にもヘルプで来てもらいっています。2月を乗り越え、もうインフルエンザは大丈夫だろうと勝手に安心していた@kjunichiです。
背景
最近、herokuを触ることが増え、herokuのことが何となく分かってきた気がするので、 IJuliaを動かしてみようと試みた。
ダメだったこと
JuliaLangのソースからビルドしたら、ローカルのdocker-machineでは動くのだが、 herokuのデプロイすると動かない。CPUチェックでNG。この箇所のコードをコメントアウトしたが、 エラー(https://gist.github.com/kjunichi/3622508c037a6e8aaa66)
上手く行った方法
JuliaLangの公式バイナリのtarボールを/app配下に展開してこれを使ったらJulia本体は動いた。
IJuliaを動かすまで
JuliaLang本体は公式のバイナリで動くことが分かったが、IJuliaを動かすまで、いろいろあった。
nettle問題
2016-03-06T01:21:50.137500+00:00 app[web.1]: [I 01:21:50.137 NotebookApp] KernelRestarter: restarting kernel (1/5) 2016-03-06T01:21:50.137632+00:00 app[web.1]: WARNING:root:kernel 3e721c54-603a-4c1a-9dd1-99afbc15e662 restarted 2016-03-06T01:21:50.838820+00:00 app[web.1]: INFO: Precompiling module Nettle... 2016-03-06T01:21:54.266149+00:00 app[web.1]: ERROR: LoadError: LoadError: Unable to load 2016-03-06T01:21:54.266184+00:00 app[web.1]: nettle (/usr/lib/x86_64-linux-gnu/libnettle.so) 2016-03-06T01:21:54.266182+00:00 app[web.1]: 2016-03-06T01:21:54.266185+00:00 app[web.1]: 2016-03-06T01:21:54.266186+00:00 app[web.1]: Please re-run Pkg.build(package), and restart Julia. 2016-03-06T01:21:54.266187+00:00 app[web.1]: [inlined code] from none:2 2016-03-06T01:21:54.266188+00:00 app[web.1]: in anonymous at no file:0 2016-03-06T01:21:54.266189+00:00 app[web.1]: while loading /app/.julia/v0.4/Nettle/src/../deps/deps.jl, in expression starting on line 13 2016-03-06T01:21:54.266189+00:00 app[web.1]: while loading /app/.julia/v0.4/Nettle/src/Nettle.jl, in expression starting on line 8 2016-03-06T01:21:54.427233+00:00 app[web.1]: ERROR: LoadError: LoadError: Failed to precompile Nettle to /app/.julia/lib/v0.4/Nettle.ji 2016-03-06T01:21:54.427243+00:00 app[web.1]: in compilecache at loading.jl:384 2016-03-06T01:21:54.427244+00:00 app[web.1]: while loading /app/.julia/v0.4/IJulia/src/IJulia.jl, in expression starting on line 18
どうやら、Herokuにはlibnettleが入っていない模様。ソースからビルドして、/app配下に入れる作戦もあったが、 お手軽に、/usr/lib/x86_64-linux-gnu/libnettle.soをHerokuデプロイ後も参照できるディレクトリである/app/julia/libにコピーして、JuliaLangのNettleパッケージの依存チェックdep.jlのパスをこれに合わせて変更した。
cp /usr/lib/x86_64-linux-gnu/libnettle.so* /app/julia/lib perl -pi -e 's#/usr/lib/x86_64-linux-gnu/libnettle.so#/app/julia/lib/libnettle.so#g' \ /app/.julia/v0.4/Nettle/deps/deps.jl
これで、IJuliaに必要なNettleが動くようになった。
パッケージ管理が動かなかった
IJuliaが動いたものの、今度はPkg.addが動かなかった。
herokuにデプロイする際、.gitディレクトリは無視される模様。この状態では、 Pkg.addが失敗する。
解決方法
~/.julia/v0.4 配下をtgzで固めて、デプロイ後にこれを展開することで、.gitディレクトリ問題を 解決。
しかし、これだけでは、足りず、~/.julia/.cacheへのシンボリックリンクが~/.julia/v0.4/.cache にあり、 これにケチがつけられる。
rm v0.4/.cache ln /app/.julia/.cache /app/.julia/v0.4/.cache
とtarの展開時に作成されたシンボリックリンクを削除し、ハードリンクを手動で作成して対応。
herokuの容量制限との戦い
dockerのコンテナとしてHerokuにデプロイする場合、コンテナサイズが300MBまでという制限がある。 この制限が結構きつくて、ダメもとで、bin配下は--strip-all、lib配下は--strip-debugして、 容量削減に努めたが、PyPlotすら、入れられなかった。
PyPlot等メジャーなパッケージもherokuデプロイ後、Pkg.addして入れ必要がある。 この際、
ENV["PYTHON"]=""
をしないと、既存の/usr/bin/pythonを発見され、これだと上手くPyPlot等動かない。
成果物
関連記事
- アメッシュの画像を表示するslackのボットをbotkitを使ってDockerイメージにしてherokuで動かした
- mruby-juliaでPythonもmrubyから呼び出せるようになった
- aobenchをjuliaでやってみた
- 1/7がつくる楕円をJulia言語でプロットする
- Julia言語で任意の点を散布図を描画するには
- Windows(MSVC)でmrubyからGPU対応のTensorflowを動かせた
- Juliaでaobenchを使って並列処理を試した その1
- こどものマイクラで占領された自作Xeon PCをリモートから操作してIJuliaを入れてブラウザから使うまで