「Elixir実践入門」の所感（第12章〜第15章まで）

日本国内のElixir界隈で活躍されている方々の共著として出版された「Elixir実践入門」が届いたので、読み進めています。

https://gihyo.jp/book/2024/978-4-297-14014-4

第12章から第15章まで読み進めたので、それぞれの章について所感を書いてみます。
ちなみに、今回の12章から15章は、いわゆる「**Elixirにおける機械学習の実践入門**」という位置付けで捉えておけば良いでしょう。

章としては取り扱われていないのですが、機能上、全体的に「[Livebook](https://livebook.dev/)」を活用しているのが読み取れました。なので、結果的にLivebookのノウハウも溜まっていきますね。

また、最後の15章では、12-14章で得たノウハウを使った画像分類のWebアプリケーションを作成しています。
内容がわからなかったとしても、一度は写経して動かしてみる、というのはやってみるのは本を読んだ後の復習として役立つと思います。

...とそんな前置きで、所感を記載していきます。


なお、1章から6章、7章から11章の所感については、先日Qiitaに投稿済みなので、興味があればあわせてお読みください。

https://qiita.com/MzRyuKa/items/11be87a3981eaab4e4e1

https://qiita.com/MzRyuKa/items/90f200aa1d43eb3e3278

また、自分はElixirを取り扱った技術同人誌を書いてたりもするので、自分の書いた内容との比較もしてたりしますが、それは、読者視点の他に（レベルは違えど）"書き手"という観点での考えもあり記載しています。


## 第12章:行列演算ライブラリNxの概要

[行列演算ライブラリであるNx](https://hexdocs.pm/nx/intro-to-nx.html)は、Elixirの作者であるJosé Valim 氏が関わっているライブラリです。
「**N**umerical **E**lixir」から、Nxと命名されたとか。

そんなNxについての概要が記載されている章となります。

Elixirはもともとは行列計算に最適化はされていなかったのですが、Elixirの起動元であるErlang側に手を入れたり、JITコンパイラによりCPU/GPU/TPUでも高速に動くようにするなど行われていったことにより、性能面で十分に成果を出せるようになってきています。

Nxの用途としては、行列演算を利用した、画像処理、統計処理、機械学習、深層学習（ディープラーニング）などがあります。
後の章で出てくる「Axon」はディープラーニング用のフレームワークであったりします。

### Nxの特徴：APIとバックエンドの分割

Nxの特徴として、**API**と**バックエンド部分**の分割があります。
役割は以下です。
- API部分: Elixir側から関数を呼び出す部分
- バックエンド部分: 実際に行列演算を行う部分

バックエンド部分が切り分けられることで、開発／本番といった実行環境に合わせた対応がプログラム修正なしでコンフィグの設定の変更のみで実行できるようになるそうです。

バックエンド部分は、以下の4パターンあると記述されていました。
自分は、Nxをローカル環境でしか触ったことがありませんでした。ですので、「**BinaryBackend**」でしか利用したことしかありません。
後の章で、バックエンド部分でEXLAやTorchを利用した例があると嬉しいですね。

- BinaryBackend: 純Elixir製のバックエンド。JITライブラリは利用しないが、ライブラリ追加なしで利用できる。 
- EXLA.Backend: **EXLA**というライブラリを利用し、CPUとGPUの切り替え可能。TensorFlowを利用する。
- Torch.Backend: **Torchx**というライブラリを利用し、CPUとGPUの切り替え可能。PyTorchのC++ライブラリであるlibTorchを利用する。
- Evision.Backend: EvisionというOpen CVのElixirラッパーを利用する、用途はOpenCVの利用に特化。CPUとGPUの切り替え可能。

### Nxの基本的な使い方

行列データ（＝テンソル）を扱うための関数が色々と列挙しております。

大きな括りとして、「行列の生成」「行列の取得」「行列の演算」「行列の変形」「行列からの値の取得」「行列データの変換」に分けて記載されています。
前者の二つは基本部分、後者の三つは応用部分といったところでしょうか。
関数の説明によっては、どういう時に利用するのかについても触れられている関数もあります。

関数自体はNxの公式ドキュメントを見ても読み取れたりはしますが、日本で説明されていると理解が捗ります。特に、エラーとなる例も記載してくれているので親切ですね。

一方で、実行例が多いことも関係し、実行式とその結果の表記が連続して記述されていると、結果の方が（背景が黒のために）目立ってしまっていました。
そのため、読んでいて「あれ？式はどれだっけ？」と迷子になってしまうこともありました。これは、内容というよりも、表現方法の課題でしょうかね。空行なり、説明文が1つ挟まるだけでも、追いやすくなると思いました。


## 第13章:Axonの概要と機械学習システム開発の進め方

この章も個人的にお勧めな部分です。

「Axon」はディープラーニング用のフレームワークです。
名前は以前から知っていたのですが、敷居が高く感じていたので、ずーっと概要しか知らない状態が続いていました。
本章では、Axonモデルの構築、学習、基本的な使い方が書かれています。
せっかくなので手を動かしながら、ここの章を読んで理解を深めることにしました。

実施内容は、「SciDataによるデータのダウンロード」「Nxによるデータの整形」「Axonによるモデルの構築」「Axon.Loopによるモデルの学習と可視化」となっています。
このように、ディープラーニングの流れを体感できるのは良いなと思いました。

正直なところ、内容の理解はまだ追いついていませんが、動くものを見ると、学習意欲が高まってくる気がしています。


![スクリーンショット 2024-03-17 22.49.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316636/596fc413-3f34-129f-aabc-6f836890cbee.png)

![スクリーンショット 2024-03-17 22.49.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316636/9872fbc8-bec8-8567-301d-db64723e836f.png)

![スクリーンショット 2024-03-17 22.50.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316636/b1738baa-1db6-aeb5-a023-dcdeb84aa2ed.png)



書籍の通りにLivebookで入力していけば、補完もしてくれるしすぐに確認もできます。
あえて言えば、Livebookのインストールとかもあるとよかったかな、感も。

NxやAxonの処理は、拙著「[Livebook超入門](https://techbookfest.org/product/5vaRvKawK3ZaWmzjyt28VK?productVariantID=qa4MPYzAFcj6pKD0EYRsBh)」にも追記しておきたい内容だなーと思いました。


## 第14章:機械学習向けのライブラリ

Livebook上で利用できる、機械学習向けのツールやライブラリの紹介という印象のある章。

[Kino](https://github.com/livebook-dev/kino)、[StbImage](https://github.com/elixir-nx/stb_image)、[Evision](https://github.com/cocoa-xu/evision)、[Bumblebee](https://github.com/elixir-nx/bumblebee)というライブラリ紹介し、それぞれの基本的な使い方を説明している内容。

Kinoについては、Livebookのスマートセルに大きく関わる部分でもあるので、各スマートセルがどんな機能を有しているのかの説明となっている。そのため、機械学習に関係なくLivebookの機能を知りたければ読むのが良いと感じた。

また、個人的には、Evisionの使い方があったのが嬉しかった。
EvisionはOpen CVをラッパーしており、LivebookとNxで利用しやすいようにされているとのこと。そのため、画像処理をLivebook上でやりやすいというのがわかった。
アプリケーションでは画像を扱うことも多いでしょうから、機械学習ではなくても利用機会はあると思いました。

ちょっと気になったのは、Bumblebeeの利用について。
Bumblebeeの利用には、[Hugging Face](https://huggingface.co/)の学習モデルが必要になるが、肝心のHuggin Faceが何か、どうやったら学習モデルを取得できるのか、などの説明があったほうが初心者には優しいかな、とは思いました。
とはいえ、あくまで、利用するのは学習モデルのデータだけなので、誌面の都合もあり、カットも致し方なしかな、とも感じました。
こういう部分を補って"Bumblebeeを利用してみた"などのブログ記事があると、重宝されるかも。

全体を通して、**Livebook**という章がどこかにあったら、ここの章の内容がピッタリだなと感じました。

## 第15章:実践的なAxonアプリケーションの開発

12-14章のノウハウ＋Webアプリケーション構築のノウハウを用いて、"画像分類"を行うWebアプリケーションを実際に構築する内容となっています。
ページ数自体は12ページと少ないながら、実践で培われたノウハウが詰まっているといった印象を受けました。

本章の構成は、大きく「**入力となる画像の扱い**」と「**出力となる画像の生成方法**」に分かれています。

「**入力となる画像の扱い**」では、「画像アップロード機能」と「アップロードした画像のプレビュー機能」について触れられています。
ここは機械学習に関係なく、画像アップロード機能の実践コードが記載されていると言えます。
イベントの検知方法(フォームの変更、ドラッグイベントによる画像アップロード)や連続画像アップロードの防止などのノウハウが確認できます。

同時に、コード記述量が少なさ（追記コード量は大体100行前後。しかも、heexファイルなのでいわゆるタグによる改行が多い）にちょっと感動。Phoenix LiveViewの恩恵を受けているんだなー、と感じられました。

「**出力となる画像の生成方法**」については、Bumblebeeを利用して[ResNet](https://qiita.com/tchih11/items/377cbf9162e78a639958)の学習モデルを読み込み、推論結果を表示する処理が記載されています。
「画像分類に適した形にする方法」、「学習モデルの読み込み方法」、「推論結果の表示方法」など、自分には全く知見がなかった内容だったので、興味深く読めました。

本章の内容に対しては、また手を動かせてはいないのですが、やっておきたい内容だなと考えています。


## まとめ

今回は、「**Elixirにおける機械学習の実践入門**」の位置付けに該当する章を読み進めて所感を書きました。
Axonはさっぱりわからん、機械学習の知見が低いの状態で読み進めた章でしたので、ページ数に対して読み進めるのが正直に言えば難しかったという部分はありました。

それでも、新しく習得できるノウハウですので、前向きには読みするめることができました。
自分は技術同人誌でLivebookについての書籍を書いているのですが、これらの章で書かれていた内容を咀嚼して、次の執筆に活かせないかな、なんて考えたりもしました。


さて、次は、IoT寄りの内容が書かれている章（第16章〜第19章）に挑戦です。
ぶっちゃけ、[Nerves](https://nerves-project.org/)を利用したIoT実践開発、という位置付けですね。
こちらについてはある程度の知見は持っているのですが、"実践"という観点では、やっぱりノウハウの差はあるんだろうな、っていうのがあります。センサー機器との連携や取得したデータの活かし方など、そんな内容が読めるのだろうな、とワクワクしてたりします。