💃

数値解析のためのJulia言語の環境構築に関する備忘録

2022/12/07に公開

1. はじめに

本記事は,数値解析のためのJulia言語の環境構築に関する個人的な備忘録である.Julia言語が最も活躍するシチュエーションは数値解析である.数値解析では,プログラムや解析結果に加えて,解析条件や数式が記述できるJupyter Notebookが有用であるため,ターミナル上で動くJulia環境に加えて,Jupyter Notebook上で動くJulia環境の構築を目指す.また,本備忘録では,汎用的に開発できる環境を意識しており,「Juliaの仮想環境(=プロジェクト)を用いるアプローチ」と「Dockerコンテナ上にJulia開発環境を構築するアプローチ」の2種類の方法を記載する.個人的には,「Juliaの仮想環境を用いたアプローチ」で十分に汎用化できると感じている.なお,macOSでVisual Studio Code (VSCode)を用いた開発を前提としているが,異なるOS上でも同様の開発環境を構築することが可能なはずである.

2. Juliaの仮想環境(=プロジェクト)を用いて開発環境を構築する

まずは下記のURLからローカル環境にJuliaをインストールしてもらいたい.
https://julialang.org/downloads/

Juliaでは,プロジェクトという形式で,ある種の仮想環境を構築することが可能である.このJuliaのプロジェクトでは,複数のスクリプトを包含するだけではなく,スクリプトが依存しているパッケージが利用できる状態を構築することが可能である.Juliaのプロジェクトを構築することで,パッケージの依存環境を意識することなく,第三者がスクリプトを実行することが可能となる.なお,Juliaのプロジェクトは,プログラムをパッケージ化する観点でも有用である.

プロジェクト環境でインストールされたパッケージは,指定されたプロジェクト環境のみで利用可能である.プロジェクト環境外(例えば,デフォルト環境)では,プロジェクト環境でインストールされたパッケージを利用することはできない.一方で,デフォルト環境でインストールされたパッケージは,プロジェクト環境でも利用可能である.汎用的な開発環境を構築する観点では,デフォルト環境は,なるべくクリーンな状態(ほとんど何もパッケージがインストールされていない状態)を保ち,プロジェクト環境内で必要なパッケージをインストールする方針が望ましい.

新しいプロジェクト環境の構築方法は,以下のQiita記事が参考になる.
https://qiita.com/mametank/items/9fc1c9227303d6ca304b

本記事では既に作成済みのプロジェクト環境にて開発を行う方法を紹介する.一例として,以下のGithubからJuliaプロジェクトをクローンしてみよう.
https://github.com/naoyaozaki/LambertProblem.jl

Githubの作業ディレクトリにて,下記のコマンドを実行する.

$ git clone https://github.com/naoyaozaki/LambertProblem.jl.git

クローンされたディレクトリを開くと,最上位のディレクトリにProject.tomlManifest.toml等のファイルが置かれているはずである.Project.tomlManifest.tomlが何なのかはJuliaのプロジェクトと環境のQiita記事を見ていただきたい.このProject.tomlManifest.tomlが置かれているディレクトリを,Juliaプロジェクトのルートディレクトリと呼ぶ.

プロジェクト環境でJuliaを実行するためには,2種類の方法がある.

Juliaを起動した後でプロジェクト環境に入るアプローチ

1つのアプローチはJuliaを起動した後,デフォルト環境からプロジェクト環境へ移動する方法である.まずはJuliaプロジェクトのルートディレクトリにて,ターミナル上でJuliaを起動してもらいたい.

$ julia
               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.8.3 (2022-11-14)
 _/ |\__'_|_|_|\__'_|  |  Official https://julialang.org/ release
|__/                   |

julia> 

Julia起動後に]と入力し(Enterキーは不要),パッケージモードへ移行する.なお,Deleteキーを入力すれば,パッケージモードから起動時のモード(Juliaモード)へ戻る.

パッケージモード上で,activate .と入力すると,プロジェクト環境へ移行することが可能である.

(@v1.8) pkg> activate .
  Activating project at `~/work/LambertProblem.jl`

(LambertProblem) pkg> 

この状態で,(Deleteキーを入力して)Juliaモードに戻ると,プロジェクト環境でインストールされているパッケージを利用することが可能である.

Julia起動時にプロジェクト環境に入るアプローチ

上記のアプローチはJuliaを起動した後でプロジェクト環境に入るアプローチだが,ターミナル上で*.jlファイルを直接実行したいシチュエーションもあるはずである.(2023年1月4日追記:但し,参考記事にも書かれてあるように,ターミナル上でjulia *.jlで実行することは非推奨らしい.)Julia起動時にプロジェクト環境に入るためには,Juliaプロジェクトのルートディレクトリにて,--project=.オプションを付けてJuliaを起動すれば良い.例えば,プロジェクト環境でmyscript.jlファイルを実行するためには,

$ julia --project=. myscript.jl

で実行可能である.あるいは,特定のファイルを実行する必要がなければ,

$ julia --project=.

でJuliaを起動すると,プロジェクト環境でのJuliaモードに入ることが可能である.

Jupyter Notebookでプロジェクト環境を使う

特定のJuliaプロジェクト環境下でJupyter Notebookを利用するためには,プロジェクト環境でIJuliaのパッケージをインストールすれば良い.すなわち,以下のようなコマンドをパッケージモードで実行すれば良い(以下の例ではLambertProblemのプロジェクト環境を想定)

(@v1.8) pkg> activate .
  Activating project at `~/work/LambertProblem.jl`

(LambertProblem) pkg> add IJulia

IJuliaインストール後に,Jupyter NotebookのカーネルでJulia言語を選択すれば良い.なお,Jupyter NotebookをVSCodeで使うための手順は,後述の3章に示す.

Jupyter NotebookでJulia言語を使うために,以下の記事を参考にした.
https://qiita.com/Matthew1101/items/b3ac25fe1bb8bcdcaf8b

3. Dockerコンテナ上にJulia開発環境を構築する

Dockerコンテナ上にJulia開発環境を構築するためには,Docker Hub上にあるJupter Notebook Data Science Stackのコンテナイメージを利用すると便利である.Jupter Notebook Data Science Stackは,Python・R・Juliaが利用できるJupyter Notebook用のコンテナイメージである.本コンテナイメージは,LinuxのUbuntu OSを元に作成されたイメージであり,Dockerコンテナ内の環境構築をする際には,Ubuntu OSのコマンドを利用する必要がある.

Jupter Notebook Data Science Stackのイメージを取得(pull)するためには,ターミナル上で以下のコマンドを実行する.

$ docker pull jupyter/datascience-notebook

docker runを用いて,取得したイメージを元にコンテナを起動する.

$ docker run \
    --user root \
    -p 8888:8888 \
    -d=true \
    --name julia-notebook-test \
    jupyter/datascience-notebook \
    start-notebook.sh

ここで記載したdocker runのオプションに関しては,Docker run リファレンスに詳細が記載されている.--nameオプションで指定しているjulia-notebook-testは,コンテナを識別するための名前であり,適切に設計してもらいたい.

もしコンテナを誤って作成してしまった場合は,以下のコマンドで停止および削除可能である.

$ docker stop julia-notebook-test
$ docker rm julia-notebook-test

コンテナを識別する名前をjulia-notebook-test以外の名前に設定している場合は,上記のコマンドを適宜変更してもらいたい.

コンテナを起動した後は,以下のdocker execで,コンテナ内に入って,コマンド実行が可能である.

$ docker exec -it julia-notebook-test bash

docker execのオプションに関しては,Docker exec リファレンスに詳細が記載されている.bashの代わりに/bin/shを用いることも可能であるため,好みに合わせて変えてもらいたい.

本備忘録では,docker runを用いたアプローチを記述したが,Dockerに慣れているユーザーはdocker-composeを使った方が楽かもしれない.docker-composeを使いたいユーザーは,下記の記事に詳細が記載されている.

https://qiita.com/SolKul/items/32443fb4452f7194bb8c

4. VSCodeを用いたJulia言語の開発環境構築

ここでは,構築されたDockerコンテナ上の環境で,VSCodeを用いたJulia言語の開発環境を構築する.Dockerコンテナを利用しない場合は,下記のStep 1をスキップし,Step 2からスタートすれば良い.

Step 1. 起動させたコンテナのアタッチ

まずはVSCodeの拡張機能(Extensions)でRemote-Containersをインストールする.Remote-Containersインストール後,下図に示すRemote Explorerのサイドバーから起動させたコンテナ(今回の場合は,jupyter/datascience-notebookjulia-notebook-test)を選択し,アタッチ(Attach to Container)する.

Step 2. 作業フォルダを開く

アタッチ後,下図のように作業フォルダを開く(Open Folder).jupyter/datascience-notebookでは,/home/jovyan/work内に作業フォルダを作ることがが推奨されているようである.

Step 3. Jupyter Notebookファイルの作成

作業フォルダを開いた後,サイドバーから新規ファイル作成(New File)を選択し,helloworld.ipynbというJupyter Notebookのファイルを作成する.Jupyter Notebook上でプログラムを実行するためには,適切なカーネルを選択する必要があるが,このままでは,Julia言語のカーネルを選択することができない.

Step 4. 拡張機能からJulia Langage Supportをインストール

そこで,拡張機能(Extensions)から,juliaと検索し,コンテナ内にJulia Language Supportをインストールする.この拡張機能をインストールすることで,Jupyter NotebookからJulia言語のカーネルを選択することが可能となる.

Step 5. Julia言語のカーネルを選択し,Jupyter Notebook上でのJulia実行

.ipynbファイルの中で,Julia言語のカーネルを選択することで,Jupyter Notebook上でJulia言語を実行することができるようになる.Jupyter Notebookのセクションに

print("Hello Wolrd")

を記述して,実行すると,Hello Worldが出力されるはずである.

5. おわりに

本記事では,数値解析のためのJulia言語の環境構築に関する個人的な備忘録を記した.Julia言語は数値解析において,非常に有用な言語だが,Python等と比較しても未だ未だ情報が少ないため,本記事はあえて個人的な備忘録を公開している.さらに良い環境構築方法があるかもしれないため,ここで書いたアプローチを参考に,個人的にお気に入りな設定を探してもらいたい.

Discussion