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`ディレクトリ配下に格納されています。

画像1

このソースを開いてみると、ヘッダ部分に次のように書かれています:

# Generated by the protocol buffer compiler.  DO NOT EDIT!
# source: Model.proto

このテキストは、これら`*_pb2.py`ファイル群は人手で書かれたソースコードではなく、.protoファイル群からprotobufコンパイラによって生成されたものであることを示しています。

実際に手元で試してみましょう。

ここから先は

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

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

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