見出し画像

[Core ML] ML Programとは何なのか

2021年にリリースされたcoremltools 5.0で、ML Programなるものがサポートされた。

Added a new kind of Core ML model type, called ML Program.

What's Newの1行目に書かれるぐらい重要なアップデートだが、これが何であるかの情報は少ない。「Core ML Survival Guide」のMatthijs Hollemans氏(CoreMLHelpersの方が知っている人は多いかもしれない)もこの大幅アップデートをもってCore ML周りに関して発信すること/本の更新を止めてしまった…

WWDCでは、WWDC22の「Optimize your Core ML usage」とWWDC21の「Tune your Core ML models」の2セッションでML Programsについて触れられている。

WWDC22のセッションではML Programのモデルタイプに関する新機能についての紹介はあるものの、「ML Programとは何なのか」については解説がない。

WWDC21の上述のセッションでは、ML Program登場年ということもあり、ML Programの基本的な解説があった。というわけでそのセッションの当該パートをベースに「ML Programとは何なのか」についてまとめる。


ML Programとはどのようなものか?

機械学習は数式やグラフ、ネットワークの形で表されたり、またコードで表現されたりするが、

数式、グラフ、ネットワーク、コードでの表現


ML Programというモデルタイプは、この最後のコード表現に沿うものである。

こちらがML Programの例:

これはCore MLのコンバーター(coremltools)が自動生成するので自分で書く必要はないのだが、人間が読めるテキスト形式になっている。

MLプログラムはひとつのmain関数を持ち、このmain関数は、操作シーケンス(ops)から構成される。各opは変数を生成し、この変数は強く型付けされる。

線形演算や畳み込み演算のように重みを持つ演算は、別のバイナリファイルにシリアライズされる。

従来のモデルタイプとの違い

ML Program以前の、従来のCore MLモデル内における表現(公式ではこれをNeural Networkと呼んでいる。文脈によって単に一般的な意味でのニューラルネットワークのことを言っているのか、ML Programに相当するモデル表現手段のことを言っているのかが変わるのでややこしい)との違いを表にまとめたのがこちら:

  • Neural Networkはレイヤーを持ち,ML Programは演算を持つ

  • Neural Networkでは重みはレイヤーに埋め込まれるが、ML Programでは重みは別個にシリアライズされる

  • Neural Networkは中間テンソル型を指定しない

    • 計算ユニットが実行時にその型を決定する

  • 一方、MLプログラムはテンソルを強く型付けする

ML Programの中間テンソル型付けと、そのメリット

従来のモデル表現における中間テンソルの型付け

従来のモデル表現(Neural Network)では、入力・出力の型にFloat32, Double, Int32を指定できる。

したがって、入力・出力テンソルは強く型付けする。

しかし、中間テンソルは強く型付けしない。

モデルにはこれらの中間テンソルの方に関する情報がないので、代わりに、Core MLがモデルをロードした後、モデルを実行する計算ユニットがテンソルの型を推測する。

ここから先は

1,500字 / 4画像

文章やサンプルコードは多少荒削りかもしれませんが、ブログや書籍にはまだ書いていないことを日々大量に載せています。たったの400円で、すぐに購読解除してもその月は過去記事もさかのぼって読めるので、少しでも気になる内容がある方にはオトクかと思います。

技術的なメモやサンプルコード、思いついたアイデア、考えたこと、お金の話等々、頭をよぎった諸々を気軽に垂れ流しています。

最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/