non vorrei lavorare

昔はおもにプログラミングやガジェット系、今は?

IJuliaをHerokuの無料枠で動かした

こんばんは、息子二人ともインフルエンザで義父にもヘルプで来てもらいっています。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等動かない。

成果物

f:id:kjw_junichi:20160307211631p:plain

関連記事

11年前の記事

5年前の記事

2年前の記事

2年後の記事