はじめに
- Elixir楽しんでいますか
- 話題のNxを触ってみました
-
Introducing Nx - José Valim | Lambda Days 2021
- Elixir作者であるJosé Valimさんの講演
- 2021/02/22(月)に開催予定のautoracex #11ので成果です
- 私の使った環境です
- macOS 10.15.7
- Raspberry Pi 2(令和三年なのに、2です、twoです)
結論
- 公式のExamplesはそのままイゴきました
- 予想通りといえば予想通りですが、パソコン上でうごいたらそのままNervesアプリとして、Raspberry Pi 2等でイゴくというのはいいですよね
- な〜んにもかえなくて、そのままイゴきました
- というか私自身はいまだにNervesアプリのほうで特殊なことをしないと動かなかったというものに出会ったことはありません
参考
- すでによい記事がいくつもできあがっています
- 私も 🌊🌊🌊 🌊🌊🌊に乗ります
- Elixirでディープラーニング①:革新的ライブラリ「Nx」の導入 -- @piacerexさん
- Elixirの革新的ライブラリ「Nx」をMacでも動かしてみた -- @mokichiさん
- Nxで始めるゼロから作るディープラーニング 準備編 -- @the_haigoさん
- Elixirでディープラーニング②:Nxのdefn+XLAでGPUを動か…せなかった(T_T) -- @piacerexさん
- Nxで九九 (Elixir) - @torifukukaiou (私自身の手前味噌)
環境構築
- 楽しむためには少しの準備が必要です
- Nervesの準備をしましょう
- @takasehideki 先生の記事がオススメです
Nervesアプリの開発
- ここから先は、Nervesアプリ開発の経験がおアリの前提で書きます
- おいて行かないでくれ〜 これからだよ〜 という方は、@kentaroさんの「ウェブチカでElixir/Nervesに入門する」がオススメです
Nxの導入
mix.exs
defp deps do
[
# {:dep_from_hexpm, "~> 0.3.0"},
# {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"}
{:nx, "~> 0.1.0-dev", github: "elixir-nx/nx", branch: "main", sparse: "nx"}
]
end
end
- 2021/2/20時点はこんな感じです
- おそらく今後は、hexのほうにも登録されてもっと簡単な指定方法ですむようになるとおもいます
-
mix.exs
を書き換えたらターミナルで以下のコマンドをうって、Nxを導入します
> export MIX_TARGET=rpi2
> mix deps.get
> mix firmware
> mix upload
- 一気にファームウェアの更新までやっちゃいました
- 最初の一回はmicroSDカードをパソコンにさして焼きこむ必要がありますが、以降はネットワーク越しにファームウェアを書き換えることができます
- Nervesアプリ開発を続けているとこれがあたりまえになって、ついついそのありがたみを忘れがちなのですし、これを言葉で説明するのはなかなか難しいのですが、実際にやってみるとものすごく便利です
- 普段の開発でも便利ですし、このへんの仕組みっていうのは、めぐりめぐってNervesHubにつながるものだとおもっています
- NervesHub is an extensible web service that allows you to manage over-the-air (OTA) firmware updates of devices in the field. Built with Phoenix, NervesHub delivers first-class support for hardware deployments directly from the command line.
- 遠く離れたところにあるデバイスのファームウェアをOTAで書き換えられるのってすごくないですか
Run
- 私は現段階ではAI?、ML?、TensorFlow?の区別すらよくわかっていないのでとりあえず写しただけです
Examplesを写してみます
# ssh nerves-rpi2.local
- IExで実行してみます1
iex(pi@nerves-rpi2.local)1> t = Nx.tensor([[1, 2], [3, 4]])
#Nx.Tensor<
s64[2][2]
[
[1, 2],
[3, 4]
]
>
iex(pi@nerves-rpi2.local)2> Nx.shape(t)
{2, 2}
iex(pi@nerves-rpi2.local)3> t = Nx.tensor([[1, 2], [3, 4]])
#Nx.Tensor<
s64[2][2]
[
[1, 2],
[3, 4]
]
>
iex(pi@nerves-rpi2.local)4> Nx.divide(Nx.exp(t), Nx.sum(Nx.exp(t)))
#Nx.Tensor<
f64[2][2]
[
[0.03205860328008499, 0.08714431874203257],
[0.23688281808991013, 0.6439142598879722]
]
>
iex(pi@nerves-rpi2.local)5> defmodule MyModule do
...(pi@nerves-rpi2.local)5> import Nx.Defn
...(pi@nerves-rpi2.local)5>
...(pi@nerves-rpi2.local)5> defn softmax(t) do
...(pi@nerves-rpi2.local)5> Nx.exp(t) / Nx.sum(Nx.exp(t))
...(pi@nerves-rpi2.local)5> end
...(pi@nerves-rpi2.local)5> end
{:module, MyModule,
<<70, 79, 82, 49, 0, 0, 10, 64, 66, 69, 65, 77, 65, 116, 85, 56, 0, 0, 1, 157,
0, 0, 0, 36, 15, 69, 108, 105, 120, 105, 114, 46, 77, 121, 77, 111, 100, 117,
108, 101, 8, 95, 95, 105, 110, 102, 111, ...>>, {:softmax, 1}}
iex(pi@nerves-rpi2.local)6> MyModule.softmax 1
#Nx.Tensor<
f64
1.0
>
- $\huge{イゴいています!}$
九九
- Special Thanks: @kikuyuta 先生
iex(pi@nerves-rpi2.local)12> s = Enum.map(1..9, &List.duplicate(&1, 9)) |> Nx.tensor()
#Nx.Tensor<
s64[9][9]
[
[1, 1, 1, 1, 1, 1, 1, 1, 1],
[2, 2, 2, 2, 2, 2, 2, 2, 2],
[3, 3, 3, 3, 3, 3, 3, 3, 3],
[4, 4, 4, 4, 4, 4, 4, 4, 4],
[5, 5, 5, 5, 5, 5, 5, 5, 5],
[6, 6, 6, 6, 6, 6, 6, 6, 6],
[7, 7, 7, 7, 7, 7, 7, 7, 7],
[8, 8, 8, 8, 8, 8, 8, 8, 8],
[9, 9, 9, 9, 9, 9, 9, 9, 9]
]
>
iex(pi@nerves-rpi2.local)13> t = Nx.transpose(s)
#Nx.Tensor<
s64[9][9]
[
[1, 2, 3, 4, 5, 6, 7, 8, 9],
[1, 2, 3, 4, 5, 6, 7, 8, 9],
[1, 2, 3, 4, 5, 6, 7, 8, 9],
[1, 2, 3, 4, 5, 6, 7, 8, 9],
[1, 2, 3, 4, 5, 6, 7, 8, 9],
[1, 2, 3, 4, 5, 6, 7, 8, 9],
[1, 2, 3, 4, 5, 6, 7, 8, 9],
[1, 2, 3, 4, 5, 6, 7, 8, 9],
[1, 2, 3, 4, 5, 6, 7, 8, 9]
]
>
iex(pi@nerves-rpi2.local)14> Nx.multiply(s,t)
#Nx.Tensor<
s64[9][9]
[
[1, 2, 3, 4, 5, 6, 7, 8, 9],
[2, 4, 6, 8, 10, 12, 14, 16, 18],
[3, 6, 9, 12, 15, 18, 21, 24, 27],
[4, 8, 12, 16, 20, 24, 28, 32, 36],
[5, 10, 15, 20, 25, 30, 35, 40, 45],
[6, 12, 18, 24, 30, 36, 42, 48, 54],
[7, 14, 21, 28, 35, 42, 49, 56, 63],
[8, 16, 24, 32, 40, 48, 56, 64, 72],
[9, 18, 27, 36, 45, 54, 63, 72, 81]
]
>
- $\huge{イゴいています!}$
Wrapping Up
- とりあえず触ってみました
- 触ってみただけです
- 雰囲気すごそうな感じはしています
- まだみなさんと語り合うレベルにはないので周辺知識とかをつけていきたいと強く感じました
- $\huge{2021/02/25(木) 19:00〜}$
- NervesJP #15 Nxを触ってみる回の予習ができました
- Enjoy Elixir
ありがとナイス!
れっつじょいなす(Let's join us)
NervesJP Slackへの参加URL
-
config/target.exs
でhostname
を指定しています。@nishiuchikazumaさんの「nerves.local
の名前をorenonerves.local
にする」を参考にしてください。 ↩