記事

Core ML Appのサイズの縮小

Appバンドル内でCore MLモデルが使用するストレージを減らします。

概要

Core MLを使い始める一番簡単な方法は、機械学習モデルをAppにバンドルすることです。モデルが高度になってくると、サイズが大きくなり、かなりのストレージ容量を占める場合があります。ニューラルネットワークベースのモデルの場合は、重みパラメータに低精度表現を使ってフットプリントを小さくすることを検討します。モデルが半精度を使えないニューラルネットワークの場合や、さらにAppのサイズを小さくする必要がある場合は、Appにモデルをバンドルするのではなく、ユーザーのデバイス上でモデルをダウンロードしコンパイルする機能を追加します。

半精度モデルへの変換

Core ML Tools(英語)は、ニューラルネットワークモデルの浮動小数点の重みを単精度から半精度の値に変換する機能を提供します(表現に使用されるビット数が32から16に減ります)。このような変換によってネットワークのサイズを大幅に削減できます。ネットワークサイズの大部分は、多くの場合、ネットワーク内のコネクションウェイトに由来しています。

リスト1

Core ML Toolsを使った低精度モデルへの変換

# Load a model, lower its precision, and then save the smaller model.
model_spec = coremltools.utils.load_spec('./exampleModel.mlmodel')
model_fp16_spec = coremltools.utils.convert_neural_network_spec_weights_to_fp16(model_spec)
coremltools.utils.save_spec(model_fp16_spec, 'exampleModelFP16.mlmodel')

ニューラルネットワーク、またはニューラルネットワークを埋め込んでいるパイプラインモデルのみ半精度に変換できます。モデル内にあるすべての単精度の重みパラメータを、半精度に変換する必要があります。

半精度浮動小数点値を使うと、浮動小数点値の精度が下がるだけでなく、取りうる値の範囲も小さくなります。ユーザーにこのオプションを適用する前に、モデルの動作が劣化しないことを確認してください。

半精度に変換されるモデルは、iOS 11.2以降、macOS 10.13.2以降、tvOS 11.2以降、またはwatchOS 4.2以降のOSバージョンが必要です。

低精度モデルへの変換

Core ML Tools 2.0は、モデルの精度を8ビット、4ビット、2ビット、または1ビットに下げる新しいユーティリティを導入しました。このツールには、最初のモデルと精度を下げたモデルとの動作の差を評価する機能が含まれています。これらのユーティリティの使い方について詳しくは、Core ML Toolsによるニューラルネットワークの量子化(英語)のドキュメントを参照してください。

低精度モデルは、iOS 12以降、macOS 10.14以降、tvOS 12以降、またはwatchOS 5以降のOSバージョンが必要です。

モデルのダウンロードとコンパイル

Appのサイズを小さくする別の方法として、Appがユーザーのデバイス上にモデルをダウンロードし、バックグラウンドでコンパイルするようにできます。例えば、ユーザーが、Appでサポートされるモデルのサブセットだけを使用する場合、利用可能なすべてのモデルをAppにバンドルする必要はありません。その代わりに、ユーザーの動作に基づいて後でモデルをダウンロードできます。ユーザーのデバイスにモデルをダウンロードしてコンパイルする(英語)を参照してください。