ソートリーダー
MLの潜在的な落とし穴を回避する:iOSでの非自明な落とし穴のナビゲーション

MLが必要ですか?
機械学習は、パターンを特定するのに優れています。クリーンなデータセットを収集することができれば、通常、超人的なパフォーマンスを持つMLモデルを構築するのに時間がかかるだけです。これは、特にクラシックタスクのような分類、回帰、異常検出などのタスクで尤も真実です。
ビジネスの問題を解決するためにMLを使用する準備ができたら、MLモデルが実行される場所を考慮する必要があります。サーバーインフラストラクチャを実行することは、MLモデルをプライベートに保つことで競合他社が追いつくのが難しくなります。また、サーバーはより幅広いモデルを実行できます。たとえば、GPTモデル(ChatGPTで有名になりました)には、現代のGPUが必要で、消費者向けデバイスは使用できません。一方で、インフラストラクチャの維持はかなり高くつきます。また、ユーザーデータをリモートサーバーに送信して処理することはできない可能性のあるプライバシーに関する懸念もあります。
ただし、顧客のiOSデバイスでMLモデルを実行することが意味があると仮定しましょう。何が間違う可能性がありますか?
プラットフォームの制限
メモリ制限
iOSデバイスには、デスクトップの対象デバイスよりもはるかに少ない利用可能なビデオメモリがあります。たとえば、最近のNvidia RTX 4080 Tiには20 GBの利用可能なメモリがあります。一方、iPhoneには、他のRAMと共有される「統一メモリ」と呼ばれるものがあります。たとえば、iPhone 14 Proには6 GBのRAMがあります。また、メモリの半分以上を割り当てると、iOSはアプリを終了してOSがレスポンスを保つことを保証するため、利用可能なメモリは2〜3 GBしかありません。
研究者は通常、モデルをメモリ使用量よりも精度を優先してトレーニングします。ただし、速度とメモリフットプリントを最適化する方法に関する研究もあります。したがって、要求が少ないモデルを探すか、自分でトレーニングすることができます。
ネットワークレイヤー(操作)サポート
ほとんどのMLとニューラルネットワークは、よく知られたディープラーニングフレームワークから来ており、CoreMLモデルにCore ML Toolsを使用して変換されます。CoreMLは、Apple (AAPL ) が作成したインファレンスエンジンで、さまざまなモデルをAppleデバイスで実行できます。レイヤーはハードウェアに最適化されており、サポートされるレイヤーのリストはかなり長いので、こちらが優れた出発点となります。ただし、Tensorflow Liteなどの他のオプションも利用可能です。
CoreMLで可能なことを確認する最良の方法は、Netronなどのビューアーを使用して、すでに変換されたモデルを確認することです。Appleは、公式にサポートされているモデルの一部をリストしていますが、コミュニティ主導のモデル動物園もあります。サポートされる操作の完全なリストは常に変化しているため、Core ML Toolsのソースコードを確認することが役立ちます。たとえば、PyTorchモデルを変換したい場合は、ここに必要なレイヤーを見つけることができます。
さらに、新しいアーキテクチャには、一部のレイヤーに手書きのCUDAコードが含まれている場合があります。このような状況では、CoreMLが事前に定義されたレイヤーを提供することはできません。しかし、独自の実装を提供することができます。GPUコードを書くことができる熟練したエンジニアがいる場合に限ります。
全体として、ここでの最良のアドバイスは、モデルをトレーニングする前に早くCoreMLに変換することです。モデルがすぐに変換されなかった場合は、DLフレームワークまたはCore ML Toolsコンバーターのソースコードのニューラルネットワーク定義を変更して、カスタムレイヤーをCoreMLに書く必要なく有効なCoreMLモデルを生成することができます。
検証
インファレンスエンジンのバグ
すべての可能なレイヤーの組み合わせをテストすることは不可能なので、インファレンスエンジンには常にバグが存在します。たとえば、CoreMLでは、膨張する畳み込みがゼロでパディングされた大きなカーネルを使用して、メモリを大量に使用することがよくあります。別の一般的なバグは、特定のモデルアーキテクチャの場合に正しくないモデル出力です。
この場合、操作の順序が要因となる可能性があります。活性化と畳み込みまたは残差接続の順序によって、結果が異なる場合があります。すべてが正常に機能していることを保証する唯一の方法は、モデルを実行し、デスクトップバージョンと比較することです。このテストでは、少なくとも半分トレーニングされたモデルが利用可能である必要があります。そうでない場合、ランダムに初期化されたモデルでは数値エラーが蓄積する可能性があります。最終的なトレーニング済みモデルは正常に機能しますが、デバイスとデスクトップの結果は、ランダムに初期化されたモデルではかなり異なる場合があります。
精度の低下
iPhoneは、インファレンスに半精度の精度を広範に使用しています。浮動小数点表現のビット数が少ないため、一部のモデルでは精度の低下が見られます。モデルをデスクトップで半精度で評価し、テストメトリックを計算することで、精度の低下を近似することができます。さらに優れた方法は、実際のデバイスで実行して、モデルの精度が意図したとおりであるかどうかを確認することです。
プロファイリング
さまざまなiPhoneモデルには、異なるハードウェア機能があります。最新のモデルには、全体的なパフォーマンスを大幅に向上させることができる、改良されたニューラルエンジン処理ユニットがあります。これらは、特定の操作に最適化されており、CoreMLはCPU、GPU、ニューラルエンジン間で仕事を賢く分配することができます。AppleのGPUも時間の経過とともに改善されてきましたので、さまざまなiPhoneモデル間でパフォーマンスが変化するのは正常です。最小限のサポートデバイスでモデルをテストして、古いデバイスでの最大の互換性と許容されるパフォーマンスを確保することは良い考えです。
CoreMLは、途中のレイヤーと計算を最適化して、パフォーマンスを大幅に向上させることができます。さらに、デスクトップでパフォーマンスが悪いモデルは、実際にはiOSでインファレンスをより速く実行する可能性があります。したがって、さまざまなアーキテクチャを試す価値があります。
さらに最適化するために、Xcodeには、CoreMLモデル用のテンプレートを備えた素晴らしいInstrumentsツールがあり、モデルインファレンスの遅延原因についてより詳細な洞察を提供できます。
結論
誰もが、iOS用のMLモデルを開発する際のすべての潜在的な落とし穴を予測することはできません。しかし、注意するべきミスはある程度避けられます。MLモデルを早くから変換し、検証し、プロファイリングして、モデルが正常に機能し、ビジネスの要件を満たすことを確認し、上記のヒントに従って、できるだけ早く成功するようにします。












