0
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

Organization

Elixir1.12.0-otp-24のMix.install/2でNxライブラリを試してみる

Elixirの最新バージョン1.12の正式版(1.12.0)が、2021年5月19日にリリースされました。

特徴としては、以下があります。

  • 現時点(2021年5月23時点)でErlangの最新バージョン「Eralng/OTP24」もサポートしている。
  • Mixの追加機能として、Elixirのスクリプトファイル(.exs files)内で依存ライブラリ(Hex)を動かせるようになった。

前者は、最新のErlang環境を試したい人には朗報でしょう。
後者も、1.12より前のバージョンでは、依存ライブラリを利用するにはMixプロジェクトを作成する必要がありました。慣れてしまえば手間ではないですが、スクリプトベースでさっと動作確認をしたいときには少し面倒さを感じてましたので、手軽に実施できるのは喜ばしいですね。

そんなわけで、この2つの動きを確認してみようと思い立ちました。
手順については、以下の通り。

  • Erlang24をインストールする後、Elixir1.12をインストールする。(otpは24を指定)
  • *.exsファイルで、Mix.installを利用する
  • Mix.installでインストールした依存ライブラリの動作確認をする。

依存ライブラリには、タイトル通りに「Nxライブラリ」を利用します。
Nxはmulti-dimensional tensors library(多次元テンソルライブラリ。)です。

端的に言えば、行列計算ができるライブラリです。ですが、最終的にはディープラーニングができるようになるライブラリと受け取ることもできます。

Nxライブラリについて知りたい方は、 @piacerex さんの書かれたこちらの記事が参考になると思われます。

Mix.install/2でNxライブラリを動かす。

ということで、サクッとErlang24Elixir 1.12.0-otp-24のインストールを完了させます。
参考情報程度ですが、インストール手順を後述しておきます。

Elixir 1.12.0-otp-24のインストールが完了したら、次のようなexsファイルを作成します。

簡単にソースコードを説明すると、次の通り。

  • 1行目のMix.installでNxライブラリをインストール。1
  • リストを要素にもつリストaを作成。2行2列の行列になることを想定。
  • 「Example 1.1」で、行列の形式に変換
  • 「Example 1.2」で、変換した行列式がm行n列かを確認
  • 「Example 2」で、ソフトマックス関数を実施
practice.exs
Mix.install([{:nx, "~> 0.1.0-dev", github: "elixir-nx/nx", branch: "main", sparse: "nx"}])

a = [[1, 2], [3, 4]]

#Example 1.1:
IO.puts("Example 1.1: create a tensor")

a
|> Nx.tensor()
|> IO.inspect()

#Example 1.2:
IO.puts("Example 1.2:tensor shape")

a
|> Nx.tensor()
|> Nx.shape()
|> IO.inspect()

#Example2
IO.puts("Example 2:softmax function")

divide = fn e -> Nx.divide(e, Nx.sum(e)) end

a
|> Nx.tensor()
|> Nx.exp()
|> divide.()
|> IO.inspect()

ファイルをセーブして、elixir practice.exsで実行。
実行には少し時間(体感10-30秒程度)がかかります。

$elixir practice.exs

実行結果は以下の通り。

Example 1.1: create a tensor
#Nx.Tensor<
  s64[2][2]
  [
    [1, 2],
    [3, 4]
  ]
>

Example 1.2:tensor shape
{2, 2}

Example 2:softmax function
#Nx.Tensor<
  f32[2][2]
  [
    [0.032058604061603546, 0.08714432269334793],
    [0.23688282072544098, 0.6439142227172852]
  ]
>

実行結果を確認してみると...

  • 「Example 1.1」では、行列の形式に変換されているのが確認できました。
  • 「Example 1.2」では、1.1で変換した行列式が「2行2列」であることを確認できました
  • 「Example 2」では、ソフトマックス関数は行列の総和が1になるはずなので、「0.032058+0.087144+0.236882+0.643914→0.999998 ≒ 1」ということで成立。

うん、いい感じ。

参考情報:Erlang / Elixir のインストール

今回はElixir1.12.0-otp-24をターゲットとするので、Erlangのバージョン24をインストール後に、Elixir1.12.0-otp-24をインストールします。

両者のインストールには、asdfを利用します。
asdfは複数のバージョンを管理できるので、重宝しますね。
個人的にすごく気に入っています。
本記事では、asdf、及びErlangとElixirのプラグインは適用ずみ、という前提で記載しています。

なお、Catalina + asdfの組み合わせだと、Erlangのインストールでエラーになるケースがあるようです。その場合、@zacky1972 氏の書かれたこちらの記事が参考になると思われます。

asdf のバージョンアップ

asdf自体を最新にアップデートしておきます。

$ asdf update

asdfのpluginのアップデート

プラグインのアップデートを行います。
こちらは、既にErlangやElixirのpluginを適用している場合に限ります。

$ asdf plugin update --all

Eralng 24.0.1 のインストール

$ asdf list all erlang
〜(中略)〜
23.3.4
23.3.4.1
24.0-rc1
24.0-rc2
24.0-rc3
24.0
24.0.1
$
$ asdf install erlang 24.0.1
asdf_24.0.1 is not a kerl-managed Erlang/OTP installation
The asdf_24.0.1 build has been deleted
Extracting source code
Building Erlang/OTP 24.0.1 (asdf_24.0.1), please wait...
Erlang 24.0.1 has been installed. Activate globally with:

〜(中略)〜

    asdf global erlang 24.0.1

Activate locally in the current folder with:

    asdf local erlang 24.0.1
$
$ asdf list erlang
〜(略)〜
  24.0.1

Erlangのインストールにはしばらく時間がかかります。(マシン性能にもよりますが、10-15分くらいは見込んで良いかも)

Elixir 1.12.0-otp-24 のインストール

$ asdf list all elixir
〜(中略)〜
1.12.0
1.12.0-otp-22
1.12.0-otp-23
1.12.0-otp-24
1.12.0-rc.0
1.12.0-rc.0-otp-21
1.12.0-rc.0-otp-22
1.12.0-rc.0-otp-23
1.12.0-rc.0-otp-24
1.12.0-rc.1
1.12.0-rc.1-otp-22
1.12.0-rc.1-otp-23
1.12.0-rc.1-otp-24
$
$ asdf install elixir 1.12.0-otp-24
==> Checking whether specified Elixir release exists...
==> Downloading 1.12.0-otp-24 to /Users/kawamuraryuuta/.asdf/downloads/elixir/1.12.0-otp-24/elixir-precompiled-1.12.0-otp-24.zip
==> Copying release into place
$
$ asdf list elixir
〜(中略)〜
  1.12.0-otp-24

Eralng 24.0.1 と Elixir 1.12.0-otp-24 を利用するように設定

$ asdf global erlang 24.0.1
$ asdf global elixir 1.12.0-otp-24

カレントディレクトリ配下に設定したい場合には、asdf localで対応

$ asdf local erlang 24.0.1
$ asdf local elixir 1.12.0-otp-24

asdf currentで指定したバージョンになっていることを確認する。

$ asdf current
elixir          1.12.0-otp-24   /Users/<username>/work/elixir/ex_1.12.0-OTP24/.tool-versions
erlang          24.0.1          /Users/<username>/work/elixir/ex_1.12.0-OTP24/.tool-versions

まとめ

今回は、Elixir1.12の新機能「Mix.install/2」を利用して、Nxライブラリを動かしてみました。
動き出すのに少し起動時間がネックではありますが、Mixプロジェクトをわざわざ作らずに動作確認できるのはお手軽で重宝しそうな予感です。


  1. インストール先は、環境変数MIX_INSTALL_DIRで指定するか、デフォルトの場合mixが利用するキャッシュディレクトリ(MacOSの場合/Users/<username>/Library/Caches/mix/installs)となります。@torifukukaiou 氏の書かれた記事が参考になります。 https://qiita.com/torifukukaiou/items/c600b6d496683442c254 

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
0
Help us understand the problem. What are the problem?