この記事は、Elixir Advent Calendar 2022 8の22日目です
昨日は、@RyoWakabayashi さんで「Livebook から Amazon DynamoDB の NoSQL データベースを操作する」でした
piacere です、ご覧いただいてありがとございます
この2年間で、Elixirの機械学習環境が凄まじく発展し、プロダクションに実戦投入しても問題無いフェーズに入ったので、「Eixirで機械学習に初挑戦」をテーマにシリーズコラムをお届けします
入門者向けに「機械学習とは何か?」や、機械学習の中で出てくる数々のキーワード解説もしていきますので、AI・MLの知識が無いWeb開発者/IoT開発者の方や、PythonでAI・MLを学んだけどイマイチ入らなかった方、Elixir経験者だけどNx/Axon/Livebook等の新テクノロジーに追いつけていない方にも、スッと入りやすい内容としてまとめていこうと思います
前回までは、Kaggleを題材に「データ前処理」のテクニックを学びましたが、今回は、本シリーズの最終回ということで、より幅広い内容をお届けします
具体的には、すでにElixirで実現できているAI・ML領域を紹介する「パート1」と、Elixirで「AI・MLシステム構築」を行うことのメリットを強調する「パート2」、2023年にElixirで攻略するAI・ML領域の「パート3」の三部構成となります
Elixir Advent Calendar 総勢16本、熱い冬ヽ(=´▽`=)ノ
例年に無い盛り上がりを見せています … 応援/購読よろしくお願いします
https://qiita.com/advent-calendar/2022/elixir
本シリーズの目次
①:基礎知識とLivebook+Nx+Axonによる機械学習入門
|> ②:機械学習コードの解説と「学習データの可視化」「学習過程のアニメ化」
|> ③:「予測」の可視化と「精度」の変化要因、「学習過程グラフ」の読み方
|> ④:データ処理に強いElixirでKaggle挑戦(前編)…「データ前処理」基礎編
|> ⑤:データ処理に強いElixirでKaggle挑戦(後編)…「統計」と「EDA」でKaggleに挑む
|> ⑥:いま、Elixir AI・MLで何が出来る? → Elixirのメリット→2023年に攻略する領域
パート1:Elixirで実現できているAI・ML領域
ここでは、様々なElixir AI・MLについて書かれたコラムを紹介することで、Elixirでも充分に機械学習やディープラーニング、統計分析などが実現できていることを示そうと思います
なお、@the_haigo さん/@torifukukaiou さん/@RyoWakabayashi さん/@GeekMasahiro さんが、Elixir Advent Calendar 2022やTwitterで素晴らしいコラム/実証の数々をリリースしてくれたおかげで、この章は成り立っています
皆さんの研鑽のおかげで、Elixirの可能性と未来を見ることができます … この場をお借りして感謝を申し上げます
そして、「Elixirの先端を追うのは私だけじゃ無い」と実感させてくれたおかげで、私はElixir AI・MLの後進を育てるために本講義シリーズを書こうと決心できたのです
a)いま流行りの「お絵描きAI」をカンタンに実装できます
「Bumblebee」を使うことで、テキストに沿った画像を生成する、いわゆる「お絵描きAI」を実現できます
Livebook上から入力したテキストに沿った画像生成が可能です
この講座シリーズで何回も扱ってきたLivebookの[Smart]Cellでワンタッチ生成することもできます
b)話題の「ChatGPT」に繋がるGPT-2で文章補完できます
これまた「Bumblebee」により、途中で途切れた文章の先を補完してくれます
c)顔認識ができます
OpenCVラッパーである「Evision」を使って、顔認識を行うことができます
他にも、様々な画像加工が可能です
d)物体検知ができます(YOLO)
Pythonでもお馴染みの物体検知モデルである「YOLO」も、「Evision」にて実現できます
手動実装することもできます
e)手書き文字識別ができます
ディープラーニングの「Hello World」とも言われる「MNIST手書き文字認識」は、ごくごく普通に実装できます … ニューラルネットワーク層の構築や学習の書き味は、PythonのKerasと同じようなコードを、Elixirのパイプで書けるようなフィーリングです
また、「Scidata」を使えば、MNISTデータセット等の典型的な11種類のデータセットをロードできます
Livebookで、PythonのJupyterNotebook/Colaboratoryと同じ感覚のWeb上 AI・MLコーディングやビジュアライゼーションが叶います
f)画像識別ができます(ONNXモデル利用、自前CNN実装)
Pythonでもお馴染みの「ResNet」や「VGG16」による1,000種類の画像識別も、ONNXモデルを「AxonOnnx」によりインポートすることで実現できます
CNNベースの画像処理がPython同様に組み立てられ、Livebook上で表示できるのは、これまでのElixirには無かった世界観です
もちろん、ONNXモデル利用だけで無く、自前のCNN実装で「ResNet」を実装することもできます
g)GPU/TPUが使えます
高速に学習するためのGPU(CUDA、ROCm)とTPUの利用は、「EXLA」をAxonやdefnのコンフィグでcompiler: EXLA
と追記するだけで利用できます
https://github.com/elixir-nx/nx/tree/main/exla
また、LibTorch C++を使えるようにする「TorchX」でもCUDA GPUを利用できます
https://github.com/elixir-nx/nx/tree/main/torchx
h)データ/統計分析とデータ前処理、グラフ表示ができます
Pythonで言うところのPandasに相当する「Explorer」を使えば、様々なデータ/統計分析とデータ前処理ができます
また、Livebookライブラリ「VegaLite」を使うことで、Pythonのmatplotlib同様、ステキに様々なグラフが可視化できます
そして、ExplorerとKinoの組み合わせを行うと下記のようなデータ分析/ビジュアライゼーションができます
i)画像識別の前処理/後処理を自動的に行ってくれます
「Bumblebee」を使えば、上記でやっていたような画像の前処理/後処理をコーディングすること無く、Nx.Serving
が自動的に処理してくれます
j)GANによる画像生成ができます
画像生成のサンプルであるMNIST GANが、Axonのサンプルに入っています
k)BERTによる文章の穴埋め/ネガポジ判定ができます
自然言語処理に革命をもたらした「BERT」による文章の穴埋めが、「Bumblebee」によって実現できます
文章のネガポジ判定も可能です
l)RoBERTaによる質問への回答もできます
「RoBERTa」による質疑応答も、「Bumblebee」で動かせます
m)bert-base-NERによる固有名詞の抽出ができます
「bert-base-NER」での固有名詞の抽出も、「Bumblebee」で動かせます
n)RNNも実装できます
RNNによるテキスト生成が、Axonのサンプルに入っています
o)AutoEncoderも実装できます
Fashkon MNISTによる画像復元が、Axonのサンプルに入っています
p)Livebook上でパイプの実行順ソートやOn/Offができます
Livebookは、パイプで書かれた処理の実行順ソートが可能です
遊び方は、下記コラムをご覧ください
Livebookは他にも、リアルタイムグラフ描画をしたり、シーケンス図を描いたり、地図表示をしたり、モブプログラミングができまます(下記コラム参照)
q)強化学習も動いてます
死なないスーパーマリオ等で有名な、強化学習の「DQN」も動き、Elixirのパワーで並行・並列化されており、コチラの発展も楽しみです
パート2:ElixirでAI・ML開発を行うメリット
Elixir AI・MLが、思った以上にかなり広い領域をすでにカバーできている … ということを実感できたでしょうか?
ここからは、実際にElixirでAI・ML開発に携わっていくことのメリットをまとめたいと思います
①言語仕様がシンプル/本質に集中できる/後発AI・MLの優位性
Elixirは、言語仕様そのものがシンプルで、可読性が高く、本質的なコード開発に集中しやすい … という特徴を持っています
これにより、Web開発やバッチ開発、保守・エンハンスにおける快適さがもたらされますが、それはAI・ML開発においても発揮されていると捉えています
実際、Elixir/Nx/Axonでディープラーニングモデルやデータ前処理を作ると、Pythonで書いたときよりも書き味が良く、その要因を挙げると下記のような部分でしょうか
- Enumとパイプによる直感的で高度なデータ処理
- 関数パターンマッチでデータ処理関数のパターンを書き分けやすい
- 学習結果がモデルに梱包されず、ステートとして返るので複数モデル操作が扱いやすい
- 後発として、KerasやPyTorch等の「いいとこどり」をしている「Axon」
- Pythonで構築されたONNXモデルも扱える「AxonOnnx」
- JupyterNotebook/Colaboratoryとほぼ同じUXの「Livebook」
- Pandas相当を叶える「Explorer」
- OpenCVでの画像処理をカバーする「Evision」
- BERTやViT、Stable Diffusionなどの先端モデルを凄まじく簡単に扱える「Bumblebee」
素のElixirが持つ良さと、KerasやPyTorchでこなれたディープラーニングFWを組み合わせて使えるようなフィーリングです
②AI・ML以外の処理で性能問題を抱えない
Pythonで構築したシステムは、AI・ML部分はNumPy等がC++で構築されていることから高速処理を叶えますが、ソレ以外の処理部分で性能課題を抱えることが多いのが、実務領域における共通認識です
そのため、私自身も過去4年で何度か、Python/Django・FlaskのWeb UIを含むAI・ML既存システムをElixir/Phoenixでリプレイスする案件を手掛けました
Elixirは、C++やHaskellほどの速度は出ないものの、この手の課題を抱えることが無い位の性能を持っているため、システム地続きで構築する際には優位性を発揮します
③システムの並行・並列化/分散化/エッジサーバ化が容易
Eixirは、軽量プロセスとアクターモデルの恩恵で、並行・並列処理をシンプルに叶えるメカニズムが標準で提供されており、それを更に簡単に扱える「Flow」や「GenStage」といったる並行・並列ライブラリにより、本講義シリーズの「データ前処理」で何度も扱ったEnum
でのデータ処理をいともカンタンに並行・並列化できます
実際に画像処理をFlowで並列化すると、下記コラムのようなことができます
また、「Broadway」を使えば、キューイングベースの並行処理も叶えられ、「Broadway Dashboard」でその過程をビジュアル化することもできます
並行マップ操作を叶える @zacky1972 さん作の「PelemayFp」もあります
また、分散化/エッジサーバ化については、Elixir標準機能でもかなりのことが叶えられます … 過去のAdvent Calendarでまとめた下記コラムをご覧ください
画像処理を分散化するサンプルは以下の通りです
「libcluster」を使えば、IPアドレスベースの分散もカンタンに叶います
libclusterによる分散インフラ構築は、下記の @RyoWakabayashi さんと @mokichi さんのコラムをご参考ください
④大量データを扱うのに向いている
大量のデータを扱う場合は、下記のようにEnum.to_list
を行わず、処理中にStream
として扱えば、データの実体化を遅らせることができるため、メモリ利用を最適化したり、処理を高速化できます
def header_and_csv_datas(path) do
[hd | tl] =
File.stream!(path)
|> CSV.decode!()
- # |> Enum.to_list()
header =
hd
|> Enum.map(&(&1 |> String.downcase() |> String.to_atom()))
{header, tl}
end
stream_train_label_raw = File.stream!("train.csv")
|> CSV.decode!
header = stream_train_label_raw
|> Enum.take(1)
|> hd
|> Enum.map(& &1 |> String.downcase |> String.to_atom)
stream_train_label_maps = stream_train_label_raw
|> Stream.drop(1)
|> Stream.map(& List.zip([header, &1]) |> Enum.into(%{}))
データの実体化を遅延(正確にはデータ変換の実行遅延)させることができ、Enum.take
などで必要なデータだけをヘルシーに取り出すこともできます
遅延によるメリットは、Sparkの「RDD」が同様の遅延データ(Elixir同様、イミュータブルデータでもある)であるため、詳しく知りたい方は、下記コラムなどをご参考いただくと良いでしょう
⑤習得/育成が容易でチーム開発に向いている
Elixirは、言語仕様のシンプルさと、パイプやパターンマッチなどにより、「本質的なコード開発」に集中しやすい点は上記①でも述べましたが、これは、Elixirの習得/育成が容易で、チーム開発に向いていることも意味します
実際にプロダクション開発やOSS開発を手掛けるとすぐに実感しますが、Elixirには「他の言語に戻ろう」と全く思えなくなるほどの快適さや爽快感、そして楽しさに溢れています
私も他の言語では、新人や見習いを育てたいとは全く思いませんが、Elixirに関しては例外で、自身が経営する企業や事業、コンサルティング先企業、技術顧問先企業、あと大学や高専で見習いEixir層の育成を手掛けており、充分な投資対効果を実感しています
また、もっと分かりやすい別の例としては、600名規模の企業研修を提供する @Yoosuke さんも、Javaだと3週間かかる研修内容を、Elixirでは5日でこなせることを実証しています
また、それは必ずしもエンジニア候補やIT従事者だけに限らず、高校生やママさん、非IT人材に対しても適用できるようで、下記スライドや、私が現在、非IT人材の見習い層を育成しているのがその一端です
⑥フレンドリーで強力な「大人のコミュニティ」が存在している
技術コミュニティは、すぐ常連化してしまい、入門者が立ち入りにくい構造になりやすかったり、特に関数型言語コミュニティは「怖い」雰囲気を醸しガチですが、Elixirコミュニティは、国内/海外ともに入門者にもフレンドリーで、親切な大人がたくさんいる「大人のコミュニティ」です
また優しいだけで無く、強力な実装力や推進力、先端テクノロジーを追うパワー、海外進出といった全てを叶えている、稀有な「大人が本当に楽しめるコミュニティ」でもあります
加えて、国内では毎月20件を超えるLTイベントやもくもく会が開催されるほどの活発さと、全国28箇所ものサブコミュニティも存在し、世界的に見ても1国の言語コミュニティとしては大規模なコミュニティでは無いかと思います
その中でも、アクティブなコミュニティは下記スライドに活動紹介があるのでご参考ください
また、Discord「elixirで機械学習(nx+axon)」では、Elixir AI・ML入門者向けチャンネルもありますし、Android/iOS両スマホネイティブアプリをビルドできる「ElixirDesktop」のチャンネルや、サーバサイドでSPAが書ける「LiveView」のチャンネル、Elixirそのものの入門者向けチャンネル「piyopiyo.ex」もあるので、良ければ下記からjoinしてください
⑥AI・MLをVR/AR/メタバースやデジタルツインに接続する
ココが、私がElixirで叶えたいことの本丸です
下記コラム内にも記載していますが、AI・ML/データサイエンスの本丸は、「現実」では無く「メタバース」がミックスされた世界なのでは無いかと思っており、VR・ARとAI・MLの両方をElixirで叶えることが、理想的な組み合わせだと捉えています
たとえば、「VARK」というVRバーチャル音楽ライブプラットフォームの裏側では、MMORPGなどで強力さが実証されているElixirをエンジンとして採用しています
こうしたElixirの有用性を、弊社では、toB ARプラットフォームのバックエンドとして活かしています
その先にあるのは「デジタルツイン」であり、デジタルツインを真に支えられるのは、低レイテンシや並行・分散、エッジ/エッジサーバ/クラウドの間を自由行き来できる特性をすでに叶えているElixirだけだと確信しています
なお、私が描いている「VR/AR/メタバースやデジタルツインの世界観」の全体像は、下記3つのコラムに詰め込みまくっているので、ぜひ読んでみてください
また、その下支えとなる「世界中のスマホをGPUファームとして構成する」というコンセプトや、「ネイバーフッドコンピューティング」というコンセプトを下記コラムで提唱していますが、これもElixirの大きなコンピューティング領域になると想定しています
パート3:2023年、Elixirで攻略するAI・ML領域
さて、ここまではElixirでAI・MLを行うメリットを共有してきましたが、一方で、Pythonには存在するけど、Elixirに不足している領域をどう攻略していくかが、ひとまず直近の課題になると思っています
-
個別処理の拡充
-
ニューラルネットワーク以外の機械学習(SVM、RandomForest、ナイーブベイズなど)
- Nx配下のOSSである「Scholar」で実装が進んでいます
- データ前処理を叶えるモジュール(Imputer、標準化、NMF/PCA/ICAなど)
- Explorerベース
- 素のElixirベース
- ビジュアライズ(混同行列、項目間相関、予実比較グラフなど)
- 検証(ホールドアウト、K-fold、Leave-one-outなど)
-
ニューラルネットワーク以外の機械学習(SVM、RandomForest、ナイーブベイズなど)
- フレームワーク利用の拡大
-
利用例の増殖
- Kaggle攻略
- プロダクション採用
- 論文での利用
-
Elixir AI・MLスキル人材の育成・登用
- Elixir AI・MLコミュニティ発足
- 案件獲得
- スクール設立
ただ個人的には、2~3年後のElixir AI・MLに、何の心配も持っていません
なぜなら2~3年前には、Elixir AI・MLは、影も形も無かったのに、上記したような凄まじい発展を遂げているのですから …
そして、このあたりがクリアになった暁には、「パート2」の「⑥AI・MLをVR/AR/メタバースやデジタルツインに接続する」で書いた領域を攻めまくる未来が訪れるでしょう
終わり
今回は、すでにElixirで実現できているAI・ML領域を紹介する「パート1」と、Elixirで「AI・MLシステム構築」を行うことのメリットを強調する「パート2」、2023年にElixirで攻略するAI・ML領域の「パート3」の三部構成でお伝えしてきました
ElixirによるAI・ML開発の凄まじい可能性や、ワクワクするような未来が見えてきたでしょうか?
2023年は、ElixirにとってAI・MLが本当にエキサイティングになる最初の年だと思います … 良かったら、本シリーズコラムをきっかけに、Elixir AI・MLを始めてみませんか?
Discordには、Elixir AI・ML入門者向けチャンネル「elixirで機械学習(nx+axon)」もありますので、そちらでフォローもします
これで「Eixirで機械学習に初挑戦」をテーマとした全6回のElixir AI・ML入門講座は終了となります
最後までお読みいただき、ありがとうございます
主催/運営しているElixirコミュニティ紹介
4. LiveView JP : A place to mob-program in LiveView, LiveBook+Nx+Axon, and elixir-desktop
5. Neos.ex : A place to connecting Elixir and NeosVR to create a new world
Elixir生誕10周年を祝い、"Elixirの現在" に追いつける
Elixir界隈に激震をもたらした2021年の大変動を記したコラム群を、全11本のカテゴリで日々アップデートしています
本コラムも、第3弾「Elixir/Livebook+NxでPythonっぽくAI・ML」に追加しています
Elixir生誕10周年祭■第1弾:Elixir/Phoenixで会員制サイト構築は瞬殺
|> Elixir生誕10周年祭■第2弾:Elixir/LiveViewでJS不要のSPA+Tailwind UI
|> Elixir生誕10周年祭■第3弾:Elixir/Livebook+NxでPythonっぽくAI・M
|> Elixir生誕10周年祭■第4弾:ElixirDesktopスマホネイティブアプリ開発
|> Elixir生誕10周年祭■第5弾:ElixirでWebAssemblyにトライ
|> Elixir生誕10周年祭■第6弾:Elixir/WebSocketでVR/AR/メタバース連携
|> Elixir生誕10周年祭■第7弾:Elixirでエッジコンピューティング開発
|> Elixir生誕10周年祭■第8弾:Elixirで海外進出を目指す
|> Elixir生誕10周年祭■第9弾:ElixirでWeb3/DID/DAO
|> Elixir生誕10周年祭■第10弾:Elixir/Phoenix 1.7プレビュー
|> Elixir生誕10周年祭■第11弾:Elixir Chip(専用プロセッサ)を作る