Morikatron Engineer Blog

モリカトロン開発者ブログ

juliaをコンパイルして実行可能ファイルを作る

こんにちは、モリカトロン株式会社・AIエンジニアの舒(ジョ)と申します。

最近、社内の研究で経路探索のアルゴリズムを実装していたのですが、Pythonで実装すると非常に遅かったので、Pythonに似ているけどより高速に 処理できそうな「Julia」というプログラミング言語を使って実装しなおすことがありました。

ということで今回は最近使い始めた「Julia」を紹介します。

以下の内容は Windows 環境を想定しています。

Juliaとは

Julia は、高度な計算や数値解析のために開発されたプログラミング言語で、マサチューセッツ工科大学の研究者 Jeff Bezanson らによって2009年に開発され、2012年にオープンソース化されました。
開発者によると、C言語の速さやR言語の統計の扱いやすさ、Perlの自然な文字列処理、Matlabの線形代数など他の言語のいいところだけを組み合わせることを目指した言語だそうです。

julialang.org

Python との大きな違いはプログラムを JIT コンパイルするところで、これにより Python よりも高速な処理に期待できます。

Juliaのインストール

下記の公式サイトにアクセスしてJuliaのインストーラーをダウンロードできます。 自分が使っているVersionはVersion 1.6.5です。

julialang.org

インストール後、インストールしたフォルダのパスなどを環境変数に設定して下さい。 (例)

 JULIA_PATH="C:(Juliaインストールフォルダ)"
 PATH=%JULIA_PATH%\bin;%PATH%

JuliaのショートカットをダブルクリックしてJuliaを起動します。

以下のようにJuliaのプロンプト画面が起動しますので、ここにコマンドを入力して処理を実行させます。

VS Code上で開発環境を整える

コマンドプロンプトで直接処理を記述するだけというのは扱いづらいので、VSCodeを使った開発環境も構築しました。

Julia拡張を導入する

  1. VS CodeでJuliaを扱うための拡張機能をインストール
  2. VS Code内、左のバーから拡張機能をクリックし、「Julia」で検索を行うと、画像のような拡張機能が見つかるので、こちらをインストール
  3. 設定ページ内にExexutable Pathという項目があるので、こちらに先ほどインストールしたJuliaのpathを設定
  4. VS Code上で Test.jl を開いた状態で Shift+Enter を押す( VS Code上でREPLというJuliaのコマンドラインが現れ、実行結果が表示されます。)

パッケージの導入方法

JuliaにはPythonにおけるpipのようなパッケージ管理の機能が用意されています。 Juliaでプログラミングする際にはほぼ必須の機能なのでこれについても軽く紹介しておきます。

  1. Juliaを起動
  2. using Pkg」と入力して、Pkgツールを呼び出す
  3. kg.add("package")」のように入力して指定のパッケージをインストール

パラメータ 詳細
Pkg.add( package ) 指定された登録パッケージをダウンロードしてインストールします。
Pkg.checkout( package branch ) 指定された登録済みパッケージのブランチを調べてください。 branchはオプションで、デフォルトは"master"です。
Pkg.clone( url ) 指定されたURLのGitリポジトリをパッケージとしてパッケージ化します。
Pkg.dir( package ) 指定されたパッケージのディスク上の場所を取得します。
Pkg.pin( package version ) 指定したバージョンにパッケージを残します。 versionはオプションで、デフォルトはパッケージの現在のバージョンです。
Pkg.rm( package ) 指定されたパッケージを必要なパッケージのリストから削除します。

PythonとJuliaの連携

PythonではなくJuliaで記述する方が処理が高速になる可能性が高いですが、プログラムのすべてをPythonからJuliaに置き換えるというのは非常に大変な作業になってしまいます。 今まで書いたコードは出来るだけそのまま使い、高速に処理する必要がある部分だけJuliaで記述できる方がありがたいです。

このような場合、pyjuliaというPythonモジュールを使う事で簡単にPythonとJuliaの連携を行うことが可能です。

PythonからJuliaのコードを呼び出すモジュールがpyjuliaで、JuliaからPythonを呼び出すJuliaPyというパッケージもあります。

github.com

事前処理

  1. pip install julia でPyJuliaをインストール

     pip install julia   
    
  2. Python 上で下記コマンドを実行

     import julia  
     julia.install()  
    

PythonからJuliaを呼び出す

  1. 呼び出すJuliaのプログラムを用意 (ファイル名は Test.jl )

     function test_function(text)  
         println(text)  
     end  
    
  2. Python側プログラムでJuliaのプログラムをインクルードして実行

     from julia import Main as jl  
     jl.include("Test.jl")  
     jl.test_function("hello world!")  
     jl.close  
    

このプログラムの実行結果は以下のようになります。

julia> "hello world!"

注意点

マルチスレッドとの相性が悪い

pyjuliaはスレッドセーフではないため、複数のスレッドで使用することが出来ません。

github.com

pyinstallerでビルドすることができない

pyinstallerを利用してPythonプログラムを配布しようとする場合にpyjuliaは利用できないようです。
このような場合にはjuliaファイルを別途コンパイルしておき、それをPythonから呼び出すようにする必要があります。

stackoverflow.com

Juliaのソースコードをコンパイルする

先ほど少し書きましたが、Pythonのプログラムを配布したい場合にpyinstallerを使う場合があります。 そういった場合に必要になるJuliaのソースコードのコンパイル方法も紹介しておきます。

github.com

Juliaのプログラムを準備

事前に、コンパイルしたいJuliaのプログラムを用意しておきます。 (ファイル名は Test.jl とします)

function test_function(text)
   println(text)
end
test_function("hellow world!")

PackageCompilerインストール

次にコンパイラ「PackageCompiler」をインストールします。

  1. Juliaを起動
  2. using Pkg と入力して、Pkgツールの呼び出す
  3. Pkg.add("PackageCompiler") と入力して、PackageCompilerをインストール

Juliaのソースコードをコンパイルする

  1. Juliaを起動
  2. pwd()関数を使用して、作業ディレクトリを確認

    作業ディレクトリを変更したい場合は cd()関数を使用してディレクトリを変更してください julia> cd("path") # 作業ディレクトリを変更できます

  3. パッケージ化されたファイルのサイズを減らすために、独立した環境を作成

    • 上記命令を実行すると、作業ディレクトリに「 Hello 」フォルダが生成されます。
  4. キーボードの「 ] 」キーを押して、Pkgツールに入ります。
  5. 環境を先ほど作成した「 Hello 」に切り替えます。
  6. Pkgの状態で、必要な外部パッケージを「 Hello 」環境に追加します。
  7. 作業ディレクトリ\Hello\ 以下にある「 Project.toml 」を開き、コンパイル情報を編集
  8. 作業ディレクトリ\Hello\src\ 以下にある「 Hello.jl 」に、最初に作成した「 Test.jl 」の内容をコピーしてビルド用ファイルを準備

    ここでは元のすべてのコードを1つの関数の内部に置く必要があります。

  9. Juliaのプロンプト画面に以下のコードを入力してビルドを実行

     create_app("pkg_ob_name", "path_name")
    

  10. 作業ディレクトリ\Hello_build\src\bin\Hello.exe」が生成されるので、実行を確認

参考

https://qiita.com/syoyo/items/5b8639b206b232984ffa https://github.com/JuliaPy/pyjulia https://qiita.com/ttabata/items/b05bb43d06239f968035 https://qiita.com/ttabata/items/3afc8cef40d1e98a7b17 https://qiita.com/SatoshiTerasaki/items/9d775c294a10c1f2edfe https://www.youtube.com/watch?v=jjJ2xHpxwHg https://www.kimoton.com/entry/20210414/1618372800