mlmodelファイルフォーマット
Core MLモデルファイル(.mlmodel)は、Protocol Buffersをベースとするオープンなフォーマットで、モデル仕様はcoremltoolsリポジトリで公開されています。
https://github.com/apple/coremltools/tree/master/mlmodel/format
このリポジトリの`mlmodel/format`配下にある.protoファイル群によって、Protocol Buffersとしてのmlmodelファイルフォーマットが定義されています。
Core ML Toolsで変換したモデルは最終的にmlmodelファイルとしてエクスポートされ、iOSのCore MLフレームワークはmlmodelファイルをもとに処理を行います。モデルのアーキテクチャやパラメータ等、Core MLがその機能を遂行するにあたって必要な情報はすべてこのmlmodelファイルに集約されているわけです。すなわち、Core MLとして何ができて何ができないかはこのmlmodelファイルフォーマットの定義を見れば把握できる、といえます。WWDC等でCore MLの新機能が発表されたら、これらの定義群を見ることでより具体的に新機能の実態を把握できることでしょう。
またこの定義群の読み方を理解しておけば、mlmodelファイルからどんな情報を取り出せるかがわかるので、デバッグや最適化にも役立つという側面もあります。
というわけで今後もCore MLまわりをキャッチアップしていくなら、ここをおさえておくことは非常に意義があります。
## Protocol Buffers(protobuf)とは
Protocol Buffers(略称protobuf)はGoogleが開発したシリアライズフォーマットで、フリーソフトウェアとしてオープンソースライセンスで公開されています。
.protoでスキーマを定義し、これを用いてデータのシリアライズ・デシリアライズを行います。
.protoの例を示します。
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phones = 4;
}
message AddressBook {
repeated Person people = 1;
}
データ構造は`message`として定義され、各`message`にはデータを格納する`field`の名前と型が定義されます。上の例でいうと`Person`,や`PhoneNumber`が`message`で、`Person`は型が`string`、名前が`name`の`field`を持っています。
`= 1`のように`field`に付記されている数値は`field`に値を代入しているのではなく、`tag`と呼ばれ、各`field`を識別するためのIDを表しています。
`repeated`とついている`field`は任意の数だけ(ゼロを含む)保持できることを意味します。上の例でいうと`phones`は`repeated`なので、任意の数の`PhoneNumber`型の値を保持することができます。`repeated`な`field`は動的なサイズの配列と考えることができます。
## coremltoolsとprotobuf
`coremltools`を扱う中で、`Model_pb2`や`FeatureTypes_pb2`といった型を何度も扱ってきたかと思います。これらのソースはcoremltoolsリポジトリの`coremltools/proto`ディレクトリ配下に格納されています。
このソースを開いてみると、ヘッダ部分に次のように書かれています:
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: Model.proto
このテキストは、これら`*_pb2.py`ファイル群は人手で書かれたソースコードではなく、.protoファイル群からprotobufコンパイラによって生成されたものであることを示しています。
実際に手元で試してみましょう。
最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/