リモートでデバッグできる Julia 環境を Docker で用意する

julia debugging on a remote machine

この記事のまとめ:
  • 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.jlJuliaInterpreter.jlRebugger.jlInfiltrator.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 から立ち上げたコンテナーにリモート接続する

公式の説明だとリモート接続の方法に少し情報が足りていないので補いつつ、流れを見ていきます。

  1. Atom に ftp-remote-edit をインストールします。
  2. ftp-remote-edit で使用するサーバーの設定をします。
    1. メニューバーの Packages → Command Palette (もしくは Ctrl+Shift+P)を開きます。
    2. Ftp Remote Edit: Edit Servers を開き、画像のように設定して Save します。
      1. IP address : コンテナーを立ち上げたサーバーの IP アドレス
      2. Password : Dockerfile で設定した jovyan のパスワード(Dockerfile を変更していなければ ”jovyan” です)

1. Juno FTP Remote Edit

  1. ftp-remote-edit でコンテナー内のファイルにアクセスできるようにします。
    1. Juno のメニューバー(画面左側)の Start Remote Julia Process を押します
    2. ポップアップが出てくるので Toggle Remote Tree View を押します
    3. 設定したサーバー内のファイル一覧が開ければ問題ないです

2. Remote Tree View

  1. リモートターミナルを開きます。
    1. メニューバーの Juno → New Remote Terminal を押します
    2. “Server Configuration Requested” のポップアップが出てきますが “Accept” で問題ないです。

3. Remote Terminal

  1. リモートの REPL を起動する。
    1. Juno のメニューバー(画面左側)の Start Remote Julia Process を押すと REPL が起動します。なお、リモートターミナルを先に開かないとうまく REPL が起動しないので注意が必要です。

4. Remote REPL

Juno のリモート環境でデバッガーを試す

work/debug_juno.jl に Juno 用のテストコードを用意しています。 Juno.@enter func(args) の構文で任意の関数のデバッグが Juno 上でのデバッガーでできます。 ただ、その動くはずなのですが、デバッガーが起動して関数の開始位置まではいってくれるものの、ブレークポイントで止まってくれません…。 なお、ブレークポイントは使えないものの Next Line で1行1行進めていくことはできます。 また、この状態で Plot Plane にグラフを表示することもできます。

5. Debugging on Juno

リモート環境ではなく、ローカルでの実行ではブレークポイントで止まるので、おそらく 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 はローカルマシン側ではなく、リモートマシン側にインストールする必要があるので、コンテナーを作成し直す度にインストールし直す必要があります。

7. VS Code Julia Extension

Julia Extension をインストールしてしまえば、デバッガーも含めてすぐに使える状態です。 簡単にデバッグしてみましたが、ブレークポイントでのちゃんと止まってくれ、そのときの変数の値も参照できます。

8. VS Code Debugging

ただし、いろいろ検証してみると、まだまだ完成度が低いところも見受けられました。

  1. デバッガーの起動時間
    1. デバッグを開始しても実行されるまでにとても時間がかかります。初回は数分、以降も 30 秒ほどかかります。初回はコンパイルのためにしかたないとして、それ以降も 30 秒はちょっと長すぎます。
  2. デバッガーなしでの実行不可
    1. デバッガーありでは動くのに、デバッガーなしでの実行ではなぜか Extension がクラッシュします。VS Code 上の REPL での実行には問題がないので、単純にコードを実行させたい場合には、REPL で実行するしかできません。

9. VS Code Repl Crash

  1. DEBUG CONSOLE から Plote Pane へのグラフ表示不可

これらは、Julia v1.15.0、Julia Extension 0.17.7 で検証したものです。 今後解消される可能性はあると思うので今後のアップデートに期待しましょう。


今回は以上です。 最後まで読んでいただき、ありがとうございます。

コメント

このブログの人気の投稿

LinuxでのnVidia GPUのオーバークロック・電力チューニング方法