Elixirでディープラーニング③：WSL2無でもWindowsでNxできた（Elixirで任意のGithub forkブランチを取り込む解説付き）


[Elixir Digitalization Implementors／fukuoka.ex／kokura.ex](https://fukuokaex.connpass.com/)のpiacereです
ご覧いただいて、ありがとうございます :bow:

引き続き、Elixirの2021年を占うポジションであるニューラルネットワーク／ディープラーニング用ライブラリ「Nx」についてです

[前回は、defn＋XLAでGPUを動かそうと奮闘して、動かせなかった](https://qiita.com/piacerex/items/cb369ff43b1504f12d86)ので、今回、その続きをしようと思ったのですが、Elixir創始者José Valimから下記ツイートをもらったので、それを試します

<blockquote class="twitter-tweet" data-conversation="none"><p lang="en" dir="ltr">Once this PR is merged, you should be able to compile it outside of WSL: <a href="https://t.co/RPRT98YUaW">https://t.co/RPRT98YUaW</a> :)</p>&mdash; José Valim (@josevalim) <a href="https://twitter.com/josevalim/status/1363056824782626819?ref_src=twsrc%5Etfw">February 20, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

内容が、面白かったり、役に立ったら、「LGTM」よろしくお願いします :wink:

<h3>:ocean::ocean::ocean: Advent Calendar、fukuoka.ex1位、Elixir2位達成ヽ(=´▽`=)ﾉ :ocean::ocean::ocean:</h3>

fukuoka.ex Advent Calendar、Webテクノロジーカテゴリで堂々1位 … 各コラムぜひお読みください
https://qiita.com/advent-calendar/2020/fukuokaex
[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/8a22a81f-2917-6072-10bd-525e0fc24b75.png)](https://qiita.com/advent-calendar/2020/neosvr_reso)

そして、プログラミング言語カテゴリは、1位がRust、2位がElixir、3位がGoとモダン言語揃い踏みでのトップ3、熱いネー:laughing:
https://qiita.com/advent-calendar/2020/elixir
[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/ea185203-c525-c778-dc10-6d2ecc391616.png)](https://qiita.com/advent-calendar/2020/elixir)

# 本コラムの検証環境

本コラムは、以下環境で検証しています（Windowsで実施していますが、Linuxやmacでも動作する想定です）

- Windows 10
- Elixir 1.11.3 　 　　　 ※[<b>最新版のインストール手順はコチラ</b>](https://qiita.com/piacere_ex/items/6714e1440e3f25fb46a1#%E4%BA%8B%E5%89%8D%E6%BA%96%E5%82%99elixir%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)
- git 2.30.1.windows.1　※<b>[最新版のインストール手順はコチラ](https://qiita.com/piacerex/items/1a9cbcc740ca3707eaec#%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%ABpc%E3%81%A7git%E3%82%92%E4%BD%BF%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B)</b>

# Jason GoldbergerさんのNx forkブランチを取り込む

[第1回](https://qiita.com/piacerex/items/db33fbe80751fdd30e48)に書いた通り、Erlangの計算ライブラリ関数``:math.acosh``が呼べないため、Windows版ElixirでNxはビルドできませんでした

この回避改修が、Nxのforkされたブランチ（下記）でコミットされていました

<b>elbow-jason (Jason Goldberger) - GitHub</b>
https://github.com/elbow-jason/nx/tree/jg-check-supported-unary-ops

現時点（2021/2/21 12:30）では、上記改修は、Nx本体レポジトリにマージされていないプルリク（元となったIssueでも他の手段含めて検討中と思われる）のため、今回は、上記ブランチを取り込みたいと思います

なお以降は、Elixirのdepsで、Githubのmaster以外ブランチを取り込む方法の解説にもなっているので、Nxに限らず使えるテクニックとなります

# Jason Goldbergerさん版Nxのインストール

まずElixir PJを作成します（作成済みであれば、ここは飛ばしてOKです）

```
> mix new nx_review
> cd nx_review
```

Jason GoldbergerさんのNx forkブランチをdepsに追加します（既に行ってる方は上書きしてください）

```elixir:mix.exs
defmodule NxReview.MixProject do
  use Mix.Project
…
  defp deps do
    [
      {:nx, "~> 0.1.0-dev", github: "elbow-jason/nx", branch: "jg-check-supported-unary-ops", sparse: "nx"},
    ]
  end
…
```

この指定が、任意のGithub forkブランチを取り込む方法なので、他のElixirプロダクトや、プルリク状態のコードを試す際にこの構文をお使いください

# 続き（以降は前々回と同じ）

ライブラリをインストールします

```
$ mix deps.get
```

ビルドし、iexからNxを使うと、一発で通りました、やった:tada:

```
$ iex -S mix
…
iex> matrix = Nx.tensor( [ [ 0.123, 0.456 ], [ 0.789, 1.234 ] ] )
iex> Nx.divide( Nx.exp( matrix ), Nx.sum( Nx.exp( matrix ) ) )
#Nx.Tensor<
  f64[2][2]
  [
    [0.135520130365152, 0.18907054376721744],
    [0.26378125835705013, 0.4116280675105804]
  ]
>
```

# 最後に

ニューラルネットワーク／ディープラーニング用ライブラリ「Nx」が、WSL2を使わなくても、Windowsで動きました

とはいえ、XLA周りでWindowsは引っかかることが多いと予想され、WSL2に振ったので、今後の展開次第では、WSL2復活もあり得ることは、心に留めといてください

Elixirのdepsで、Githubのmaster以外ブランチを取り込む方法も解説しました

このテクニックは、Nx以外でも応用できるので、ぜひ覚えてください

さてさて次回こそは、NxでGPU駆動を完了させ、ニューラルネットワーク開発入りたいですね

# p.s.このコラムが、面白かったり、役に立ったら…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/67568d54-6584-ad33-77c7-b3b3afe70287.png) や ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/f5b819ef-d655-ef72-294c-b1a9d2c5b563.png) にて、どうぞ応援よろしくお願いします:bow: