Posted at

coreMLでuseCPUOnlyにするやり方

More than 1 year has passed since last update.


useCPUOnlyオプション

coreMLは基本的にデバイスの情報から自分で判断してCPUを利用するかGPUを利用するか判断します。ただ、場合によっては敢えてCPUに計算させたいときもあると思います。例えばデバイス毎の計算速度を測りたいとか、GPUのリソースを他で使いたいとか、泣く泣くGPUを使うのを辞めざるを得ない時とか。。。


How to

ぐぐっても useCPUOnly を使うと良いよ! みたいな事が書いてあるのですが、mlmodelファイルを読み込んでできたクラスからの使い方がいまいちわからず悩んだので備忘録として書いておきます。正直最適な使い方してるかは怪しいです。

xcodeで読み込んだmlmodelのモデル名をSampleModelとしています。またxcodeのバージョンは9.3です。

let mlmodel = SampleModel()

let opt = MLPredictionOptions()
opt.useCPUOnly = true

let input = SampleModelInput([必要なデータで初期化])

let result = mlmodel.model.prediction(from: input, options: opt)
// ここで返ってくる結果はSampleModelOutput型ではなく、MLFeatureProviderクラスなので文字列キーで値を取得します
let output1 = result.featureValue(for: "mlmodelファイルの出力名1")?.multiArrayValue
let output2 = result.featureValue(for: "mlmodelファイルの出力名2")?.multiArrayValue
... [必要なだけOutputを取得]

こんな感じでCPU実行ができます。

敢えてしなければ mlmodel.prediction をダイレクトで呼んだほうがOutputも定義どおりの型で返ってくるので面倒じゃないですし、特にこの書き方する意味はないです。

ちなみにSampleModelInputSampleModelOutputのような自動生成される入出力用のクラスはMLFeatureProviderというクラスを継承しています。この事実に気が付けないとAppleの公式リファレンスを見てもMLPredictionOptionsからモデルのpredictionまで繋がらなくて何したら良いのか全然把握できませんでした。