📦

Core MLの新しいモデルファイルフォーマット、ML Packageとは何なのか

2023/12/12に公開

先日、「Core MLの新しいモデルタイプ、ML Programとは何なのか」 という記事を書いた。同時期に登場したのが ML Packages というモデルフォーマット。端的にいうと従来の .mlmodel に取って代わるCore MLモデルの新ファイルフォーマットで、拡張子が .mlpackage になるのだが、どう変わったのか、何が利点なのかといったことがWWDC21の「Tune your Core ML models」というセッションで解説されていたのでまとめておく。

https://developer.apple.com/videos/play/wwdc2021/10038/

mlmodelはどうだったか

ML Packagesがどういうファイルフォーマットかを説明するために、「Tune your Core ML models」ではまず .mlmodel について解説されている。

An ML Model is just a single file that you simply add to an Xcode project and write code that works with it, just like any other API.
(MLモデルは、他のAPIと同じように、Xcodeプロジェクトに追加して、それを使って動作するコードを書くだけの単一のファイルです。)

Each Core ML model file consists of several components. The metadata stores information such as the author, license, version, and a short description. The interface defines the model’s inputs and outputs. The architecture defines the model’s internal structure. Finally, the last section stores the massive array of values that the model learned during the training phase.
(各Core MLモデルファイルは、いくつかのコンポーネントから構成されています。メタデータは、作者、ライセンス、バージョン、短い説明などの情報を格納します。インターフェースは,モデルの入出力を定義します.アーキテクチャは、モデルの内部構造を定義します。最後に,学習フェーズでモデルが学習した膨大な値の配列が格納されます。)

An ML Model file encodes all these sections into a protobuf binary format, which file systems and source control software see as a single binary file. Source control software can’t tell that the binary model file is actually a combination of several distinct components.
(MLモデルファイルは、これらすべてのセクションをprotobufバイナリフォーマットにエンコードし、ファイルシステムやソース管理ソフトウェアが1つのバイナリファイルとして見ることができます。ソース管理ソフトは、バイナリモデルファイルが実際にはいくつかの異なるコンポーネントの組み合わせであることを見分けることができません。)

ML Packagesになるとどう変わるか

To solve that, Core ML is adding a new model format that breaks these components into separate files, using macOS’ built-in package functionality. Which brings us to the new Core ML Model Package.
(これを解決するために、Core MLは、macOSの組み込みパッケージ機能を使って、これらのコンポーネントを別々のファイルに分割する新しいモデル形式を追加しています。それが、新しいCore MLモデルパッケージです。)

It’s a container that stores each of a model’s components in its own file, separating out its architecture, weights, and metadata.
(これは、モデルの各コンポーネントを、アーキテクチャ、重み、メタデータを分離して、それぞれのファイルに格納するコンテナです。)

By separating these components, model packages allow you to easily edit metadata and track changes with source control.
(これらのコンポーネントを分離することで、モデルパッケージはメタデータの編集やソース管理による変更点の追跡を容易にします。)

They also compile more efficiently and provide more flexibility for tools which read and write models.
(また、より効率的にコンパイルすることができ、モデルを読み書きするツールに柔軟性を与えることができます。)

つまり、ML Packagesは以下のファイル群からなる(macOSのファイルシステムにおける)パッケージであり、

  • Metadataを保持するJSONファイル

  • モデルのインターフェースとアーキテクチャを定義するProtobuf (Protocol Buffers) 形式のファイル

  • 学習パラメータを保持するバイナリファイル

主な利点は、

  • メタデータの編集が簡単になる(JSONなので)

  • メタデータをGit等で管理できるようになる(JSONなので)

  • より効率的にコンパイルすることができる

といったところである、と。

メタデータの編集

ML Package形式のモデルはXcodeで直接メタデータを編集することもできる。(mlmodelの場合はcoremltoolsでCLIから編集する必要があった)

これはJSONファイルを編集することになるので、差分をGitで管理することができる。

これまでのML Model形式であれば、たとえば62MBのバイナリのmlmodelファイルを変更した場合、それが数バイトであっても62MBのバイナリ差分が発生してしまっていた。しかし、ML Package形式であれば、特に小さなテキストの変更については、より効率的に簡単に作業することができる。

ML ProgramとML Package

先日の記事で書いたML Programという新しいモデルタイプは、ML Packageでのみサポートされる。

https://zenn.dev/shu223/articles/coreml_mlprogram

ML Packageはモデルを表現する方式として従来のNeural NetworkもML Programもサポートするが、ML ModelはML Programをサポートしていない。

iOSアドベントカレンダー

本記事はiOS Advent Calendar 2023 シリーズ2の2日目 [1]の記事です。
https://qiita.com/advent-calendar/2023/ios

脚注
  1. 12/12時点で空いていたので書きました。 ↩︎

Discussion