ソートリーダー
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によって書かれた推論エンジンで、Appleデバイスでさまざまなモデルを実行できます。レイヤーはハードウェアに最適化されており、サポートされているレイヤーのリストはかなり長いので、こちらが優れた出発点となります。ただし、Tensorflow Liteなどの他のオプションも利用可能です。
CoreMLで可能なことを確認する最も良い方法は、Netronなどのビューアーを使用して、すでに変換されたモデルを確認することです。Appleは、公式にサポートされているモデルの一部をリストしていますが、コミュニティ主導のモデル動物園もあります。サポートされている操作のリストは常に変化しているため、Core ML Toolsのソースコードを確認することが役立ちます。たとえば、PyTorchモデルを変換したい場合は、ここに必要なレイヤーを探すことができます。
さらに、一部の新しいアーキテクチャには、一部のレイヤーに手書きのCUDAコードが含まれている場合があります。このような場合、CoreMLが事前に定義されたレイヤーを提供することはできません。ただし、GPUコードの書き方に精通した熟練したエンジニアがいる場合は、独自の実装を提供することができます。
全体的に見て、ここでの最良のアドバイスは、トレーニングする前に早期にモデルをCoreMLに変換することです。如果您已经拥有一个没有立即转换的模型,则可以在DLフレームワークまたはCore ML Toolsコンバーターのソースコードでニューラルネットワーク定義を変更して、カスタムレイヤーをCoreML推論に書く必要なく有効なCoreMLモデルを生成することができます。
検証
推論エンジンのバグ
すべての可能なレイヤーの組み合わせをテストすることはできないため、推論エンジンには常にバグが存在します。たとえば、CoreMLで膨張収縮が非常に多くのメモリを使用していることがあり、ゼロでパディングされた大きなカーネルを持つ実装が不正であることを示しています。別の一般的なバグは、一部のモデルアーキテクチャーに対する不正確なモデル出力です。
この場合、操作の順序が要因となる可能性があります。活性化と畳み込み、または残差接続が最初に来るかどうかによって、結果が異なる可能性があります。すべてが正常に機能していることを保証する唯一の方法は、モデルを取り出し、意図したデバイスで実行して、デスクトップバージョンと比較することです。このテストには、少なくとも半分にトレーニングされたモデルが利用可能であることが役立ちます。そうでない場合、数値エラーが悪くランダムに初期化されたモデルに蓄積する可能性があります。最終的にトレーニングされたモデルは正常に機能しますが、デバイスとデスクトップの結果はランダムに初期化されたモデルではかなり異なる可能性があります。
精度の低下
iPhoneは、推論に広範囲にわたって半精度の精度を使用しています。いくつかのモデルは浮動小数点表現のビット数が少ないことによる精度の低下はありませんが、他のモデルは苦労する可能性があります。デスクトップでモデルを半精度で評価し、テストメトリックを計算することで、精度の低下を近似することができます。さらに良い方法は、実際のデバイスで実行して、モデルが意図したとおりに正確であるかどうかを確認することです。
プロファイリング
さまざまなiPhoneモデルには、異なるハードウェア能力があります。最新のモデルには、全体的なパフォーマンスを大幅に向上させることができる改良されたNeural Engineプロセッサがあります。これらは特定の操作に最適化されており、CoreMLはCPU、GPU、Neural Engine間で仕事を賢く分配することができます。AppleのGPUも時間の経過とともに改善されてきましたので、異なるiPhoneモデル間でパフォーマンスの変動が見られるのは正常です。最小限のサポートデバイスでモデルをテストして、最大の互換性と古いデバイスでの適切なパフォーマンスを確保することは良い考えです。
CoreMLは、 intermediateレイヤーと計算をインプレースで最適化して削除することもできます。これにより、パフォーマンスが大幅に向上する可能性があります。別の要素として考慮する必要があるのは、デスクトップでパフォーマンスが悪いモデルは、実際にはiOSで推論が速い可能性があるということです。したがって、さまざまなアーキテクチャーを試す価値があります。
さらに最適化するには、Xcodeには、CoreMLモデル用のテンプレートが付属するNice Instrumentsツールがあり、モデル推論の遅延原因についてより包括的な洞察を提供できます。
結論
誰もが、iOS用のMLモデルを開発する際のすべての可能な落とし穴を予測することはできません。しかし、ある程度の間違いは、注意を払うことで避けることができます。MLモデルを変換、検証、プロファイリングを開始して、モデルが正常に機能し、ビジネス要件を満たすことを確認し、上記のヒントに従って、できるだけ早く成功を収めることができます。












