ジュリアとは?数値計算への新しいアプローチ

Juliaは、数値計算用の無料のオープンソース、高レベル、高性能、動的プログラミング言語です。ネイティブマシンコードを生成するLLVMに基づくJITコンパイラーと、複数の特殊化による型の安定性を実装する設計のおかげで、動的言語の開発の利便性と、コンパイルされた静的型付け言語のパフォーマンスを備えています。ディスパッチ。効率的なコードに簡単にコンパイルできます。

2012年にJuliaの最初のリリースを発表したブログ投稿で、言語の作者であるJeff Bezanson、Stefan Karpinski、Viral Shah、Alan Edelmanは、貪欲だったために3年間Juliaを作成したと述べています。彼らはMatlab、Lisp、Python、Ruby、Perl、Mathematica、R、Cの間のトレードオフにうんざりしていて、科学計算、機械学習、データマイニング、大規模線形代数に適した単一の言語を望んでいました。 、並列コンピューティング、および分散コンピューティング。

ジュリアは誰のためですか?ジュリアは、研究科学者やエンジニアにとって魅力的であるだけでなく、データサイエンティストや金融アナリストやクォンツにとっても魅力的です。

この言語の設計者と他の2人は、2015年7月に「Juliaを使いやすく、展開しやすく、拡張しやすい製品を開発する」ためにJuliaComputingを設立しました。この記事の執筆時点で、同社には28人のスタッフがおり、国立研究所から銀行、エコノミスト、自動運転車の研究者に至るまで顧客がいます。Julia Computingは、GitHubでJuliaオープンソースリポジトリを維持することに加えて、無料バージョンと有料バージョンの両方で提供されるJuliaProなどの商用製品を提供しています。

なぜジュリア?

ジュリアは、「使いやすさ、パワー、効率性の前例のない組み合わせを単一の言語で作成することを目指しています。」効率の問題については、以下のグラフを検討してください。

ジュリアコンピューティング

ジュリアベンチマーク

ここで見ているのは、Juliaコードは、いくつかの種類の操作ではCよりも高速であり、他の操作ではCよりも数倍遅くないということです。これを、たとえばRと比較してください。Rは、一部の操作でCよりも約1,000倍遅くなる可能性があります。

Juliaの最も遅いテストの1つは、フィボナッチ再帰であることに注意してください。これは、Juliaが現在末尾再帰の最適化を欠いているためです。再帰は本質的にループよりも遅いです。本番環境で実行する実際のJuliaプログラムの場合、そのようなアルゴリズムのループ(反復)形式を実装する必要があります。

JuliaJITコンパイル

純粋なインタープリターとは対照的に、JIT(ジャストインタイム)コンパイラーアプローチにはコストがかかります。コンパイラーは、コードを実行する前に、ソースコードを解析し、マシンコードを生成する必要があります。これは、各関数とマクロがセッションで初めて実行されるときに、Juliaプログラムの起動時間が顕著になることを意味します。したがって、以下のスクリーンショットでは、2回目に100万個のランダムな浮動小数点数を生成するときに、最初の実行よりも1桁短い時間がかかることがわかります。JuliaライブラリはJuliaで記述されているため、@timeマクロとrand()関数の両方をコードで初めてコンパイルする必要がありました。

ジュリア> @time rand(10 ^ 6);

  0.62081秒(14.44 kの割り当て:8.415 MiB)

ジュリア> @time rand(10 ^ 6);

  0.004881秒(7つの割り当て:7.630 MiB)

Juliaファンは、Python、R、さらにはMatlabの使いやすさをさまざまに主張しています。Julia言語はエレガントで強力であり、科学計算に向けられており、ライブラリは幅広い高度なプログラミング機能を提供しているため、これらの比較には精査が必要です。

ジュリアの例

Julia言語の簡単な例として、次のマンデルブロ集合ベンチマークコードについて考えてみます。

ご覧のとおり、テストとタイミングのマクロと同様に、複素数演算が言語に組み込まれています。ご覧のとおり、Cのような言語を悩ます末尾のセミコロンと、Lispのような言語を悩ますネストされた括弧はJuliaにはありません。これmandelperf()は、61行目と62行目で2回呼び出されていることに注意してください。最初の呼び出しは、結果が正しいかどうかをテストし、JITコンパイルを実行します。2番目の呼び出しがタイミングを取得します。

ジュリアプログラミング

ジュリアには、言及する価値のある他の多くの機能があります。1つは、ユーザー定義型は組み込み型と同じくらい高速でコンパクトです。実際、渡された引数型用にコンパイルされていることを除いて、ジェネリック型のように動作する抽象型を宣言できます。

もう1つは、Juliaに組み込まれているコードのベクトル化により、プログラマーがパフォーマンスのためにコードをベクトル化する必要がないということです。通常のベクトル化解除されたコードは高速です。コンパイラーは、基盤となるCPUに存在する場合、SIMD命令とレジスターを利用し、ハードウェアが許す限りループをベクトル化するために順次プロセスでループを展開できます。@simd注釈を使用して、ループをベクトル化可能としてマークできます。

ジュリア並列処理

Juliaは、リモート参照とリモート呼び出しの2つのプリミティブを使用して、並列処理と分散計算用にも設計されました。リモート参照には、との2つの種類が Future あり RemoteChannelます。 AFutureはJavaScriptに相当しますpromise; aRemoteChannelは書き換え可能であり、UnixpipeやGoなどのプロセス間通信に使用できますchannel。 (たとえば、あなたが複数のプロセスでジュリアを開始していると仮定するとjulia -p 8、このようなインテルCore i7プロセッサーとして8コアCPUのため)、することができます@spawnまたはremotecall()機能非同期的に別のジュリア・プロセス上で実行するために呼び出し、後であなたが同期して使用したいときに返さ結果。fetch()Future

複数のコアで実行する必要がない場合はTask()、Juliaではaと呼ばれ、他のいくつかの言語ではコルーチンと呼ばれる軽量の「グリーン」スレッドを利用できます。ATask()あるいは@taskと連携して動作しChannel、単一のプロセスのバージョンです、RemoteChannel

ジュリア型システム

Juliaには、目立たないが強力な型システムがあり、デフォルトでは実行時の型推論で動的ですが、オプションの型注釈を使用できます。これはTypeScriptに似ています。例えば:

ジュリア>(1 + 2):: AbstractFloat

エラー:TypeError:typeassert:AbstractFloatが必要で、Int64を取得しました

ジュリア>(1 + 2):: Int

3

ここでは、互換性のないタイプを最初にアサートしてエラーを発生させ、互換性のあるタイプを2回目にアサートしています。

ジュリアストリングス

Juliaは、UTF-8形式で格納されたUnicode文字列と文字を効率的にサポートし、ASCII文字も効率的にサポートします。UTF-8では、0x80(128)未満のコードポイントが単一の文字でエンコードされるためです。それ以外の場合、UTF-8は可変長エンコーディングであるため、Julia文字列の長さが最後の文字インデックスと等しいと想定することはできません。

UTF-8を完全にサポートするということは、とりわけ、ギリシャ文字を使用して変数を簡単に定義できることを意味します。これにより、科学的なJuliaコードを数式の教科書の説明に非常によく似たものにすることができますsin(2π)transcode()関数は、他のUnicodeエンコーディングへとからUTF-8に変換するために設けられています。

CおよびFortran関数

Juliaは、ラッパーや特別なAPIを必要とせずに、C関数とFortran関数を直接呼び出すことができますが、Fortranコンパイラーによって発行される「装飾された」関数名を知っている必要があります。外部CまたはFortran関数は共有ライブラリにある必要があります。ccall()実際の呼び出しにはJulia関数を使用します。たとえば、Unixライクなシステムでは、次のJuliaコードを使用してgetenv、libcの関数を使用して環境変数の値を取得できます。

関数getenv(var :: AbstractString)

     val = ccall((:getenv、 "libc")、

                 Cstring、(Cstring、)、var)

     val == C_NULLの場合

         error( "getenv:undefined variable:"、var)

     終わり

     unsafe_string(val)

終わり

ジュリア> getenv( "SHELL")

「/ bin / bash」

ジュリアマクロ

Juliaには、CおよびC ++で使用されるマクロプリプロセッサとは異なり、Lispのようなマクロがあります。Juliaには、リフレクション、コード生成、シンボル(eg :foo)および式(eg :(a+b*c+1))オブジェクト、、eval()および生成された関数など、他のメタプログラミング機能もあります。Juliaマクロは解析時に評価されます。

一方、生成された関数は、関数のコンパイル前に、パラメーターのタイプがわかっている場合に展開されます。生成された関数は、パラメトリック多態性をサポートするための実行時ディスパッチの必要性を排除することにより、ジェネリック関数(C ++およびJavaで実装)の柔軟性と強く型付けされた関数の効率を備えています。

GPUサポート

Juliaは、MXNetディープラーニングパッケージ、ArrayFire GPUアレイライブラリ、cuBLASおよびcuDNN線形代数とディープニューラルネットワークライブラリ、および汎用GPUコンピューティング用のCUDAフレームワークを使用したGPUサポートを提供しています。Juliaラッパーとそれぞれのライブラリを次の図に示します。

ジュリアコンピューティング

JuliaProとJunoIDE

Windows、MacOS、汎用Linux、または汎用FreeBSD用の無料のオープンソースJuliaコマンドラインをJulia言語サイトからダウンロードできます。JuliaソースコードリポジトリのクローンをGitHubから作成できます。

または、JuliaComputingからJuliaProをダウンロードすることもできます。コンパイラーに加えて、JuliaProは、AtomベースのJuno IDE(以下に表示)と、視覚化とプロットを含む160を超える厳選されたパッケージを提供します。

無料のJuliaProにあるものに加えて、エンタープライズサポート、定量的ファイナンス機能、データベースサポート、および時系列分析のサブスクリプションを追加できます。JuliaRunは、クラスターまたはクラウド用のスケーラブルなサーバーです。

JupyterノートブックとIJulia

JunoをJuliaIDEとして使用することに加えて、Julia拡張機能を備えたVisual Studio Code(すぐ下に表示)、およびIJuliaカーネルを備えたJupyterノートブック(下の2番目と3番目のスクリーンショットに表示)を使用できます。Python 2または(できれば)Python3用のJupyterノートブックをAnacondaまたはpipとともにインストールする必要がある場合があります。

JuliaBox

ローカルマシンにインストールしなくても、Julia Computingの別の製品であるJuliaBox(以下に表示)を使用して、JupyterノートブックでJuliaをオンラインで実行できます。JuliaBoxには現在300以上のパッケージが含まれており、Julia 0.6.2を実行し、数十のチュートリアルJupyterノートブックが含まれています。チュートリアルフォルダのトップレベルのリストを以下に示します。JuliaBoxアクセスの無料レベルでは、3つのCPUコアで90分のセッションが可能です。月額$ 14の個人サブスクリプションでは、5つのコアで4時間のセッションが提供されます。月額70ドルのプロサブスクリプションでは、32コアで8時間のセッションが提供されます。2018年6月現在、GPUアクセスはまだ利用できません。

Juliaパッケージ

ジュリアは「Pythonのように歩きますが、Cのように動作します。」同僚のSerdarYegulalpが2017年12月に書いたように、JuliaはデータサイエンスプログラミングのためにPythonに挑戦し始めており、どちらの言語にも利点があります。ジュリアでのデータサイエンスへの急速なサポートの兆候として、ZachariasVoulgarisとAnshulJoshiによるJuliafor Data Scienceというタイトルの本がすでに2冊あることを考慮してください。ただし、どちらの品質についても話すことはできません。 1。

以下に示すJuliaObserverの全体的に最も評価の高いJuliaパッケージを見ると、Jupyterノートブック用のJuliaカーネル、Gadflyグラフィックパッケージ(ggplot2Rと同様)、一般的なプロットインターフェイス、いくつかのディープラーニングと機械が表示されます。学習パッケージ、微分方程式ソルバー、DataFrames、New York Fed動的確率的一般平衡(DSGE)モデル、最適化モデリング言語、PythonおよびC ++へのインターフェイス。この一般的なリストをもう少し下に行くと、QuantEcon、PyPlot、ScikitLearn、バイオインフォマティクスパッケージ、関数型プログラミング用のレイジーリストの実装もあります。

Juliaパッケージがニーズに十分でなく、Pythonインターフェースが目的の場所に到達しない場合は、R(RCall)およびMatlabへの汎用インターフェースを提供するパッケージをインストールすることもできます。

金融アナリストとクォンツのためのジュリア

以下のスクリーンショットに示すように、クォンツと金融アナリストは、作業をスピードアップするための多くの無料パッケージを見つけるでしょう。さらに、Julia Computingは、Miletus(金融契約用のDSL)、  JuliaDB(高性能のインメモリおよび分散データベース)、  JuliaInXL(ExcelシートからJuliaを呼び出す)、およびBloomberg接続(実際のアクセス)で 構成されるJuliaFinスイートを提供します。-時間および過去の市場データ)。