[Core ML] ML Programとは何なのか
2021年にリリースされたcoremltools 5.0で、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がモデルをロードした後、モデルを実行する計算ユニットがテンソルの型を推測する。
最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/