リモートでデバッグできる Julia 環境を Docker で用意する
この記事のまとめ:
- Julia のコードの実行、デバッグをできる Docker イメージを作成します
- Juno、VS Code でリモートマシン上でデバッグ機能の検証をします
背景
これまで Julia のコードを動かす環境として、Jupyter Notebook で Julia を動かせる Docker コンテナーを利用していました。
これはにはいくつか理由があり、実行環境や(Julia 以外の)パッケージバージョンなどをほかのコードに影響を与えずに変更したい、その環境に再現性を持たせたい、Linux 環境で動かしたい(操作マシンは Windows )などの背景からそのようにしてきました。 ただし、少し大きな規模のコーディングをしようすると Jupyter Notebook では IDE としての機能に不満を感じてきました。 特にデバッグ方法に限界があると感じてきました。
現状、デバッガーが使える Julia の IDE というと Juno と VS Code の Julia Extension くらいしか思いつきません。 なお、Julia のデバッガーとしては Debugger.jl、JuliaInterpreter.jl、Rebugger.jl、Infiltrator.jl などがあります。今回はローカルで IDE を動かし、リモート上で Julia で実行・デバッグができることを目指します。
そこで、 Juno を調べてみるとリモートマシン上の Julia に接続できることがわかりました。 また、VS Code ではもともと Remote - SSH を使ってリモートマシンで作業する機能がありますので、Julia Extension を使って Julia の IDE としてどこまで使えそうか試してみました。
結論からいうと、Juno のデバッガーにはリモート実行時に問題があり、VS Code もこまごました問題があります。 そのため、今のところ リモートで実行できるデバッガー込みの最良の IDE はない と言わざる得ない状況かもしれません。 ローカル環境で Juno を使うのが一番無難で快適かもしれません。
今回使用するファイル類は次のリポジトリーにあります。
なお、本記事では Juno 自体や VS Code の Julia Extension 自体の説明はございません。 それぞれのインストールはすでに終わっているものとして扱います。 Juno や VS Code Julia Extension のセットアップ等はさまざまな記事がすでにありますので、そういった記事をお探しください。
Juno 編
Juno で実施することは次のとおりです。
- Juno からリモート接続でき、Julia を実行できる Docker イメージを作成する
- Juno からリモート上の Docker コンテナーに接続する
- Juno で上記環境でデバッグを試す
VS Code 編はこれらの後にあります。
Juno からリモート接続でき、Julia を実行できる Docker イメージを作成する
Juno でリモートマシンに接続するためには、Atom の拡張の ftp-remote-edit をいうものを使います。 ftp-remote-edit は SSH でリモートマシンに接続するため、Julia 用の Docker コンテナーには SSH サーバーを立ち上げておく必要があります。
Docker コンテナーでメインのプロセス以外に SSH サーバーを立ち上げることは、コンテナーの概念からいうとタブーな領域に入ります。 ただし、今回はあくまでも一時的な開発の作業場としての利用であって、恒常的にサービスを提供するものではありません。 そんな言い訳を自分にしながら Docker イメージを作ります。
ベースとなる Dockerfile はリポジトリーをご覧ください。
SSH でアクセスできるユーザーとして julian を作り、パスワードとして “julia” を設定しています。
このイメージの実行を行う docker-compose.yml も同様にリポジトリーをご覧ください。
これを使って、Juno から接続するので Docker イメージをビルドしてコンテナーを立ち上げます。
Juno から立ち上げたコンテナーにリモート接続する
公式の説明だとリモート接続の方法に少し情報が足りていないので補いつつ、流れを見ていきます。
- Atom に ftp-remote-edit をインストールします。
- ftp-remote-edit で使用するサーバーの設定をします。
- メニューバーの Packages → Command Palette (もしくは
Ctrl+Shift+P
)を開きます。 - Ftp Remote Edit: Edit Servers を開き、画像のように設定して Save します。
- IP address : コンテナーを立ち上げたサーバーの IP アドレス
- Password : Dockerfile で設定した jovyan のパスワード(Dockerfile を変更していなければ ”jovyan” です)
- メニューバーの Packages → Command Palette (もしくは
- ftp-remote-edit でコンテナー内のファイルにアクセスできるようにします。
- Juno のメニューバー(画面左側)の Start Remote Julia Process を押します
- ポップアップが出てくるので Toggle Remote Tree View を押します
- 設定したサーバー内のファイル一覧が開ければ問題ないです
- リモートターミナルを開きます。
- メニューバーの Juno → New Remote Terminal を押します
- “Server Configuration Requested” のポップアップが出てきますが “Accept” で問題ないです。
- リモートの REPL を起動する。
- Juno のメニューバー(画面左側)の Start Remote Julia Process を押すと REPL が起動します。なお、リモートターミナルを先に開かないとうまく REPL が起動しないので注意が必要です。
Juno のリモート環境でデバッガーを試す
work/debug_juno.jl
に Juno 用のテストコードを用意しています。
Juno.@enter func(args)
の構文で任意の関数のデバッグが Juno 上でのデバッガーでできます。
ただ、その動くはずなのですが、デバッガーが起動して関数の開始位置まではいってくれるものの、ブレークポイントで止まってくれません…。
なお、ブレークポイントは使えないものの Next Line で1行1行進めていくことはできます。
また、この状態で Plot Plane にグラフを表示することもできます。
リモート環境ではなく、ローカルでの実行ではブレークポイントで止まるので、おそらく Juno パッケージのデバッガー機能の問題だと思います。 これ以上の検証は難しいと考え、ここで検証はあきらめました。
VS Code 編
VS Code で実施することは次のとおりです。
- VS Code からリモート接続でき、Julia を実行できる Docker イメージを作成する
- VS Code からリモート上の Docker コンテナーに接続する
- VS Code で上記環境でデバッガーを試す
なお、VS Code の Julia 用の拡張機能は Juno に出遅れた感もありましたが、だいぶ環境が整ってきています。ただし、デバッグ関連については “an experimental debugger” となっており(2020.07.17 現在)使用方法等が今後変わる可能性がありますのでご注意ください。
https://discourse.julialang.org/t/ann-vs-code-extension-v0-15-released-with-debugger/36415
VS Code からリモート接続でき、Julia を実行できる Docker イメージを作成する
Juno 用に sshd を動かす Docker イメージを作成してしまったので、VS Code であれば Remote - SSH Extension を使えば、特に問題なくリモートで作業ができます。
正直これまでは、Docker コンテナー内で sshd を動かすことを避けてきたのですが、Juno 用にやってしまったので、もうどうでもよくなりました…。
基本的には Juno 用に作成した Docker イメージを使って VS Code から SSH 接続しても問題ないのですが、Juno 用の Docker イメージには Atom.jl と Juno.jl をインストールするようになっているので、VS Code にはこれらは不要です。 一方で、Atom.jl をインストールしない場合、JuliaInterpreter.jl をインストールする必要があります。 これは、VS Code のデバッガー機能は JuliaInterpreter.jl ベースということですが、Atom.jl には JuliaInterpreter.jl が依存パッケージとしてインストールされるようになっているためです。
Juno と同じように docker-compose でビルドして、コンテナーを立ち上げます。
VS Code からリモート上の Docker コンテナーに接続する
コンテナーといっても SSH で接続するだけですので、VS Code の Remote - SSH でリモートマシンに接続する要領とまったく同じです。 Remote - SSH でのリモート接続の方法については公式マニュアルや、解説記事等に従ってください。
VS Code のリモート環境でデバッガーを試す
まず、VS Code の Julia Extension をリモートマシン側にインストールする必要があります。 この Extension はローカルマシン側ではなく、リモートマシン側にインストールする必要があるので、コンテナーを作成し直す度にインストールし直す必要があります。
Julia Extension をインストールしてしまえば、デバッガーも含めてすぐに使える状態です。 簡単にデバッグしてみましたが、ブレークポイントでのちゃんと止まってくれ、そのときの変数の値も参照できます。
ただし、いろいろ検証してみると、まだまだ完成度が低いところも見受けられました。
- デバッガーの起動時間
- デバッグを開始しても実行されるまでにとても時間がかかります。初回は数分、以降も 30 秒ほどかかります。初回はコンパイルのためにしかたないとして、それ以降も 30 秒はちょっと長すぎます。
- デバッガーなしでの実行不可
- デバッガーありでは動くのに、デバッガーなしでの実行ではなぜか Extension がクラッシュします。VS Code 上の REPL での実行には問題がないので、単純にコードを実行させたい場合には、REPL で実行するしかできません。
- DEBUG CONSOLE から Plote Pane へのグラフ表示不可
これらは、Julia v1.15.0、Julia Extension 0.17.7 で検証したものです。 今後解消される可能性はあると思うので今後のアップデートに期待しましょう。
今回は以上です。 最後まで読んでいただき、ありがとうございます。
コメント
コメントを投稿