エッジ対応の機械学習アプリケーションの迅速な展開方法

著者 Stephen Evanczuk

DigiKeyの北米担当編集者の提供

機械学習(ML)はスマート製品を生み出す大きな可能性を秘めていますが、ニューラルネットワーク(NN)のモデリングやエッジ向けMLアプリケーションの作成に関する複雑さと課題があるため、開発者が有用なソリューションを迅速に提供することには限界があります。すぐに利用可能なツールにより、一般的にMLモデルの作成が手軽になりましたが、従来のML開発手法は、モノのインターネット(IoT)、自動車、産業用システムなどの組み込みアプリケーションにおいて、ソリューション固有の要件を満たすようには設計されていません。

この記事では、NNモデリングについて簡単に紹介します。その後、エッジ対応のMLアプリケーションをより効果的に実現するNXP Semiconductorsの包括的なMLプラットフォームを紹介し、その使用方法を解説します。

NNモデリングの概要

MLアルゴリズムは、アプリケーション開発のための劇的に異なる選択肢を開発者に提供します。開発者は、画像分類のような問題を明示的に解決するためのソフトウェアコードを書くのではなく、画像に含まれるエンティティの実際の名前(またはクラス)を注釈付けした画像などのデータセットを提示することで、NNモデルをトレーニングします。トレーニングプロセスでは、さまざまな方法を使用して、各ニューロンやレイヤの重みやバイアス値といったモデルのパラメータをそれぞれ算出し、モデルが入力画像の正しいクラスをかなり正確に予測できるようにします(図1)。

この完全接続ネットワークのようなNNが入力オブジェクトを分類する画像(クリックして拡大)図1:この完全接続ネットワークのようなNNは、トレーニング時に設定された重みとバイアスのパラメータを使用して、入力オブジェクトを分類します。(画像提供:NXP Semiconductors)

MLの研究者は、図1に示す一般的な完全接続NN以外にも、さまざまなNNアーキテクチャを進化させてきました。たとえば、画像分類アプリケーションでは、一般的に畳み込みニューラルネットワーク(CNN)を使用します。これは画像認識を、画像の主な特長を見つける初期段階と、トレーニング中に確立した複数のクラスのいずれかに属する可能性を予測する分類段階に分割する特殊なアーキテクチャです(図2)。

畳み込みニューラルネットワーク(CNN)の図(クリックして拡大)図2:MLの専門家は、画像認識のような特定のタスクを行うために、この畳み込みニューラルネットワーク(CNN)のような特殊なNNアーキテクチャを使用します。(画像提供:NXP Semiconductors)

これまで、適切なモデルアーキテクチャやトレーニング方法の選択はMLの専門家に限られていましたが、複数のオープンソースツールや商用ツールが利用可能になったことで、大規模展開のためのモデル開発が劇的に簡素化されました。現在、開発者は数行のコードでモデルを定義し(リスト1)、オープンソースのNetronモデルビューアなどのツールを使用してモデルのグラフィカル表現を生成し(図3)、各レイヤの定義や接続を確認することができます。

コピー
def model_create(shape_in, shape_out):
    from keras.regularizers import l2
    
    tf.random.set_seed(RANDOM_SEED)
 
    model = tf.keras.Sequential()
    model.add(tf.keras.Input(shape=shape_in, name='acceleration'))
    model.add(tf.keras.layers.Conv2D(8, (4, 1), activation='relu'))
    model.add(tf.keras.layers.Conv2D(8, (4, 1), activation='relu'))
    
    model.add(tf.keras.layers.Dropout(0.5))
    
    model.add(tf.keras.layers.MaxPool2D((8, 1), padding='valid'))
    model.add(tf.keras.layers.Flatten())
    
    model.add(tf.keras.layers.Dense(64, kernel_regularizer=l2(1e-4), bias_regularizer=l2(1e-4), activation='relu'))
    model.add(tf.keras.layers.Dropout(0.5))
    model.add(tf.keras.layers.Dense(32, kernel_regularizer=l2(1e-4), bias_regularizer=l2(1e-4), activation='relu'))
    model.add(tf.keras.layers.Dropout(0.5))
    model.add(tf.keras.layers.Dense(shape_out, activation='softmax'))
    model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['acc'])
    
    return model

リスト1:開発者はわずか数行のコードでNNモデルを定義できます。(コード提供: NXP Semiconductors)

リスト1で定義されたモデルのグラフィカル表現の画像(クリックして拡大)図3:Netronビューアによって生成されたモデルのグラフィカル表現(リスト1で定義)は、開発者が各レイヤの機能と接続を文書化するのに役立ちます。(画像提供:ステファン・エバンチュク、リスト1に示すNXPモデルのソースコードでNetronを実行)

最終的な展開では、トレーニング中にのみ必要なモデル構造をその他のツールで取り除き、他の最適化を行って効率的な推論モデルを作成します。

スマート製品向けのMLベースのアプリケーション開発が困難だった理由

IoTやその他のスマート製品向けモデルの定義とトレーニングは、企業規模の機械学習アプリケーションのモデル作成と同様のワークフローに従います。しかし、そのような類似性の範囲を超えてエッジ向けのMLアプリケーションを開発するには、さらに複数の課題があります。設計者は、モデル開発に加え、マイクロコントローラ(MCU)ベースの製品を動作させるために必要なメインアプリケーションの開発という身近な課題にも直面します。その結果、MLをエッジに導入するために、相互に関連する2つのワークフローを管理する必要が生じます(図4)。

図4:エッジ向けMLベースアプリケーションの開発では、MLモデルのトレーニング、検証、展開に必要なMLワークフローにより、一般的な組み込みMCUの開発ワークフローが拡張されます。(画像提供:NXP Semiconductors)

MCUプロジェクトのワークフローは組み込み開発者にとって馴染み深いものですが、MLプロジェクトでは、開発者が最適なML推論モデルを作成する際に、MCUベースのアプリケーションに要件が追加される場合があります。実際、MLプロジェクトでは、組み込みデバイスの要件に劇的な影響が及びます。モデルの実行に一般的に伴う計算負荷やメモリ要件が大きいため、IoT製品やスマート製品で使用するマイクロコントローラのリソースを超えてしまうことがあります。リソース要件を抑えるために、MLの専門家はモデルネットワークのプルーニング、圧縮、低精度の量子化、またはシングルビットのパラメータや中間値などの手法を適用します。

しかし、開発者はこのような最適化手法を使用しても、従来のマイクロコントローラに対し、MLアルゴリズムに伴う大量の数学演算を処理するのに必要な性能が不足していると感じる場合があります。一方、高性能なアプリケーションプロセッサを使用すれば、MLの計算負荷に対応できます。しかし、そのアプローチでは、レイテンシの増加や非決定的な応答が発生し、組み込み設計のリアルタイム特性が損なわれる可能性があります。

エッジ向けに最適化されたMLモデルの提供には、ハードウェア選定の課題に加え、組み込み開発に固有の課題もあります。企業規模のMLアプリケーションのために開発された膨大な数のツールや手法は、組み込み開発者のアプリケーションや動作環境ではうまく拡張できない可能性があります。MLベースのデバイスの迅速な展開を期待する熟練の組み込み開発者でさえ、利用できる豊富なNNモデルのアーキテクチャ、ツール、フレームワーク、ワークフローの中から効果的なソリューションを見つけるのに苦労しているのが現状です。

NXPは、エッジMLの開発において、ハードウェア性能とモデル実装の両面に対応しています。ハードウェアレベルでは、NXPの高性能i.MX RT1170クロスオーバーマイクロコントローラが、エッジMLの幅広い性能要件を満たします。このハードウェア基盤を最大限に活用するため、NXPのeIQ(エッジインテリジェンス)MLソフトウェア開発環境とアプリケーションソフトウェアパックは、経験の浅いML開発者と熟練のML開発者の両方に対し、エッジ対応のMLアプリケーションを作成するための効果的なソリューションを提供します。

エッジ対応のMLアプリケーションを開発するための効果的なプラットフォーム

NXPのi.MX RTクロスオーバープロセッサでは、従来の組み込みマイクロコントローラのリアルタイムで低レイテンシの応答を、高性能アプリケーションプロセッサの実行能力と組み合わせています。NXPのi.MX RT1170クロスオーバープロセッサシリーズでは、電力効率の高いArm® Cortex®-M4プロセッサと高性能なArm Cortex-M7プロセッサを、組み込みデバイスにおけるMLベースのソリューションなど、要求の厳しいアプリケーションの実行に必要な幅広い機能ブロックやペリフェラルと統合しています(図5)。

図5:NXPのi.MX RT1170クロスオーバープロセッサでは、従来のマイクロコントローラの電力効率性能を、アプリケーションプロセッサの高性能処理能力と組み合わせています。(画像提供:NXP Semiconductors)

NXPのeIQ環境は、NXPのMCUXpresso SDKおよびYocto開発環境に完全に統合されており、NXPのマイクロプロセッサやマイクロコントローラを搭載した組み込みシステムへの推論モデルの実装を容易にするように特別設計されています。eIQ環境に含まれるeIQ Toolkitは、eIQ Portal、eIQ Model Tool、コマンドラインツールなど複数のツールを通じて、自分のデータベースの持ち込み(BYOD)ワークフローや自分のモデルの重みの持ち込み(BYOM)ワークフローをサポートします(図6)。

図6:NXPのeIQ Toolkitは、モデルを作成する必要のあるBYOD開発者と、独自の既存モデルをターゲットシステムに展開する必要のあるBYOM開発者をサポートします。(画像提供:NXP Semiconductors)

MLモデル開発の専門家と初心者の両方に対してBYODワークフローをサポートするように設計されたeIQ Portalは、開発者がモデル開発ワークフローの各ステージをより簡単に完了できるよう、グラフィカルユーザーインターフェース(GUI)を提供します。

開発の初期段階では、eIQ Portalのデータセットキュレーターツールにより、データのインポート、接続されたカメラからのデータ取り込み、またはリモートデバイスからのデータ取り込みを行えます(図7)。

図7:eIQ Portalのデータセットキュレーターツールは、トレーニングデータの準備という重要なタスクを容易にします。(画像提供:NXP Semiconductors)

開発者はデータセットキュレーターツールを使用して、画像全体または指定した境界ボックス内の特定の領域をラベル付けすることで、データセット内の各アイテムを注釈付け(ラベル付け)します。強化機能は、画像をぼかしたり、ランダムなノイズを加えたり、輝度やコントラストなどの特性を変えたりすることで、データセットに必要な多様性を提供するのに役立ちます。

次の段階では、 eIQ Portalは、開発者がアプリケーションに最適なモデルのタイプを選択するのを支援します。モデルのタイプについて不確かな開発者のために、アプリケーションおよびハードウェア基盤のタイプに応じて選定プロセスを案内するモデル選定ウィザードが用意されています。必要なモデルのタイプを既に知っている開発者は、eIQのインストール時に提供されるカスタムモデルや、その他のカスタム実装を選択できます。

eIQ Portalは、トレーニングパラメータを変更するための直感的なGUIを提供し、トレーニング段階ごとにモデルの予測精度の変化を表示することで、開発者を次の重要なトレーニング段階へと導きます(図8)。

図8:開発者はeIQ Portalのトレーニングツールを使用して、各段階におけるトレーニング精度の向上を観察し、必要に応じて変更します。(画像提供:NXP Semiconductors)

次の段階では、eIQ PortalのGUIによってモデルを検証できます。この段階では、モデルはターゲットアーキテクチャ上で動作するように変換され、実際の性能が決まります。検証が完了すると、検証画面には、ML検証の基本ツールである混同行列が表示されます。これにより、入力オブジェクトの実際のクラスとモデルが予測したクラスを比較できます(図9)。

図9:eIQ Portalの検証ツールは、ターゲットアーキテクチャ上でモデルを実行した結果として生じる混同行列を提供します。(画像提供:NXP Semiconductors)

最終的な展開では、この環境はプロセッサに応じて、以下のようなターゲット推論エンジンの選択肢を開発者に提供します。

  • Arm CMSIS-NN(Cortexマイクロコントローラソフトウェアインターフェース規格、ニューラルネットワーク) - Arm Cortex-Mプロセッサコア上で性能を最大化し、ニューラルネットワークのメモリフットプリントを最小化するために開発されたニューラルネットワークカーネル
  • Arm NN SDK(ニューラルネットワーク、ソフトウェア開発キット) - 既存のニューラルネットワークのフレームワークとArm Cortex-Aプロセッサなどの間の橋渡しをするために設計されたツールと推論エンジンのセット
  • DeepViewRT - NXP独自のi.MX RTクロスオーバーMCU用の推論エンジン
  • Glow NN - MetaのGlow(グラフ低下)コンパイラをベースに、NXPがCMSIS-NNカーネルまたはArm NNライブラリへの関数呼び出しを使用したり、独自のネイティブライブラリからコードをコンパイルしたりして、Arm Cortex-Mコア用に最適化したもの
  • ONXX Runtime - Arm Cortex-Aプロセッサの性能を最適化するために設計されたMicrosoft Researchのツール
  • TensorFlow Lite for Microcontrollers - i.MX RTクロスオーバーMCU上で機械学習モデルを実行するために最適化されたTensorFlow Liteの小型バージョン
  • TensorFlow Lite - 小型システムへのサポートを提供するTensorFlowのバージョン

BYOMワークフローの場合、開発者はeIQ Model Toolを使用して、モデル解析とレイヤごとの時間プロファイリングに直接移行できます。BYODとBYOMワークフローの両方において、開発者はeIQコマンドラインツールを使用できます。このツールは、ツール機能へのアクセスや、GUIから直接利用できないeIQ機能へのアクセスを提供します。

eIQ Toolkitは、この記事で紹介した機能以外にも、モデル変換や最適化など、この記事の範囲をはるかに超える幅広い機能をサポートしています。しかし、エッジ対応のMLアプリケーションを迅速に試作する場合、開発者はeIQ環境の高度な機能の多くを採用する必要がほとんどなく、一般的に開発や展開を素早く進められます。実際、NXPが提供する専用のApplication Software(App SW)Packは、開発者がすぐに評価したり、独自のカスタムアプリケーションのベースとして使用したりできる完全なアプリケーションを提供します。

App SW Packを使用してモデル開発を迅速に評価する方法

NXPのApp SW Packは、プロダクション対応のソースコード、ドライバ、ミドルウェア、ツールを組み合わせたMLベースの完全なアプリケーションを提供します。たとえば、NXPのML State Monitor App SW Packは、センサ入力に基づいて複雑なシステムの状態を判断するというよくある問題に対して、MLベースのソリューションを即座に提供します(図10)。

図10:開発者は、ML State Monitor App SW PackのようなNXPのApp SW Packを迅速な評価に使用したり、カスタムコード開発のベースとして使用したりできます。(画像提供:NXP Semiconductors)

ML State Monitor App SW Packは、ファンが以下4つの状態のいずれで動作しているかを検出することを目的としたアプリケーションの完全なソリューションを実装しています。

  • ON
  • OFF
  • CLOGGED:ファンがオンになっているが、空気流が妨げられている場合
  • FRICTION:ファンがオンになっているが、1つまたは複数のファンブレードが動作中に過剰な摩擦を受けている場合

モデル開発者にとって同様に重要なこととして、ML State Monitor App SW Packには、MLモデルだけでなく、これら4つの状態で動作するファンによる加速度計の測定値を示す完全なデータセットも含まれています。

開発者は、ML State Monitor App SW Packで提供されるコード、モデル、データを学習することで、センサデータを使用したモデルのトレーニング、推論モデルの作成、検証用センサデータセットに対する推論の検証などを行う方法を理解できます。実際、App SW Packに含まれるNXPのML_State_Monitor.ipynb Jupyter Notebookは、ハードウェア展開の前にモデル開発ワークフローをよく学習するための、すぐに利用できるツールを提供します。

Jupyter Notebookはブラウザベースの対話型Python実行プラットフォームであり、開発者はPythonコードの実行結果をすぐに表示できます。Jupyter Notebookを実行すると、Pythonコードのブロックが生成され、そのコードブロックの実行結果がすぐに表示されます。これらの結果は、単なる静的な表示ではなく、コードを実行して得られた実際の結果です。たとえば、開発者がNXPのML_State_Monitor.ipynb Jupyter Notebookを実行すると、入力データセットの概要をすぐに表示できます(図11)。

図11:NXPのML_State_Monitor.ipynb Jupyter Notebookにより、開発者はML State Monitor App SW Packで提供されるトレーニングデータを表示しながら、ニューラルネットワークモデルの開発ワークフローに沿って対話形式で作業できます。[注:表示の都合により、コードはここで切り捨てています。](画像提供: ステファン・エバンチュク、NXPのML_State_Monitor.ipynb Jupyter Notebookを実行中)

Notebookのコードの次のセクションでは、入力データを時系列と周波数の別々のプロットとして提示するグラフィカル表示をユーザーに提供します(図12)。

図12:Jupyter Notebookは、サンプルのファン状態データセットの時系列および周波数表示を開発者に提供します(OFF:緑、ON:赤、 CLOGGED:青、FRICTION:黄色)。[注:表示の都合により、コードはここで切り捨てています。](画像提供: ステファン・エバンチュク、NXPのML_State_Monitor.ipynb Jupyter Notebookを実行中)

コードの実行がリスト1で示したのと同じモデル作成関数の定義model_create()に到達するまで、さらなるデータの解析、正規化、整形などの準備を提供するコードセクションが追加されています。その次のコードセクションでは、このmodel_create()関数を実行し、簡単な検証のためのサマリーを表示します(図13)。

図13:NXPのML_State_Monitor.ipynb Jupyter Notebookは、リスト1に示したモデルを作成し、モデルのサマリー情報を表示します。(画像提供: ステファン・エバンチュク、NXPのML_State_Monitor.ipynb Jupyter Notebookを実行中)

ML_State_Monitor.ipynb Jupyter Notebookは、モデルのトレーニングと評価のコードセクションに従って、全データセット、トレーニングデータセット、検証データセット(トレーニングデータセットから除外したデータセットのサブセット)の各混同行列を表示します。この場合、完全なデータセットの混同行列は、ある程度の誤差はあるものの、良好な精度を示しています。最も顕著な誤差は、ごく一部のデータセットについて、実際には元のデータセットで注釈されているCLOGGED状態であるのに、ON状態であるとモデルが誤認していることです(図14)。

図14:開発者は、このように全データセットの混同行列を表示できます。(画像提供: ステファン・エバンチュク、NXPのML_State_Monitor.ipynb Jupyter Notebookを実行中)

後のコードセクションでは、eIQ開発環境がサポートするさまざまな推論エンジンで使用されるさまざまなモデルタイプやフォーマットにモデルがエクスポートされます(図15)。

図15:NXPのML_State_Monitor.ipynb Jupyter Notebookは、トレーニング済みモデルをさまざまなモデルタイプやフォーマットで保存できることを実証しています。(画像提供: ステファン・エバンチュク、NXPのML_State_Monitor.ipynb Jupyter Notebookを実行中)

推論エンジンの選択は、特定の性能要件を満たすために極めて重要です。NXPはこのアプリケーションにおいて、996MHzで動作するモデルと156MHzで動作するモデルの複数の推論エンジンを対象に、モデルサイズ、コードサイズ、推論時間(単一の入力オブジェクトに対する推論の完了に要する時間)を測定しました(図16、17)。

図16:モデルタイプの選択は、モデルサイズに大きな影響を与えますが、ここで示す大きな違いは、より大きなモデルには当てはまらない可能性があります。(画像提供:NXP Semiconductors)

図17:入力オブジェクトをRAMやフラッシュメモリからロードした場合、またはプロセッサを996MHzや156MHzの高い周波数で動作させた場合は、入力オブジェクトの評価に対して推論時間が大幅に異なることがあります。(画像提供:NXP Semiconductors)

NXPが指摘するように、このサンプルアプリケーションでは非常に小さなモデルを使用したため、これらの図に示されるかなりはっきりした違いは、複雑な分類に使用する大きなモデルではあまり顕著でないかもしれません。

状態監視のためのシステムソリューションの構築

NXPのML State Monitoring App SW Packは、モデル開発ワークフローをインタラクティブに探索できるJupyter Notebookに加え、NXPのMIMXRT1170-EVK評価ボードの設計を実装するための完全なソースコードも提供します。NXPのMIMXRT1176DVMAAクロスオーバーMCUを中心に構築された評価ボードは、追加メモリと複数のインターフェースを備えた包括的なハードウェアプラットフォームを提供します(図18)。

図18:NXPのMIMXRT1170-EVK評価ボードは、NXPのi.MX RT1170シリーズ クロスオーバーMCUをベースとしたアプリケーション開発のための包括的なハードウェアプラットフォームを提供します。(画像提供:NXP Semiconductors)

開発者は、MIMXRT1170-EVK評価ボードと、NXPが提供するオプションのFRDM-STBC-AGM01センサボード、Arduinoのシールドおよび、Adafruit4468などの適切な5VブラシレスDCファンを重ねることにより、NXPのファン状態アプリケーションを使用してファンの状態を予測できるようになります(図19)。

図19:開発者は、MIMXRT1170-EVK評価ボード上に構築したシンプルなスタックで、NXPのファン状態サンプルアプリケーションをテストできます。(画像提供:NXP Semiconductors)

開発者はMCUXpresso統合開発環境(IDE)を使用して、ファン状態のデータを簡単に取得して保存するアプリケーションを構成したり、取得したデータに対してTensorFlow推論エンジン、DeepViewRT推論エンジン、またはGlow推論エンジンを使用してすぐに推論を実行したりできます(リスト2)。

コピー
/* Action to be performed */
#define SENSOR_COLLECT_LOG_EXT                  1   // Collect and log data externally
#define SENSOR_COLLECT_RUN_INFERENCE            2   // Collect data and run inference
 
/* Inference engine to be used */
#define SENSOR_COLLECT_INFENG_TENSORFLOW        1   // TensorFlow
#define SENSOR_COLLECT_INFENG_DEEPVIEWRT        2   // DeepViewRT
#define SENSOR_COLLECT_INFENG_GLOW              3   // Glow
 
/* Data format to be used to feed the model */
#define SENSOR_COLLECT_DATA_FORMAT_BLOCKS       1   // Blocks of samples
#define SENSOR_COLLECT_DATA_FORMAT_INTERLEAVED  2   // Interleaved samples
 
 
/* Parameters to be configured by the user: */
/* Configure the action to be performed */
#define SENSOR_COLLECT_ACTION                   SENSOR_COLLECT_RUN_INFERENCE
 
#if SENSOR_COLLECT_ACTION == SENSOR_COLLECT_LOG_EXT
/* If the SD card log is not enabled the sensor data will be streamed to the terminal */
#define SENSOR_COLLECT_LOG_EXT_SDCARD           1   // Redirect the log to SD card, otherwise print to console

リスト2:開発者はsensor_collect.hヘッダファイルに含まれる定義を変更することで、NXPのML State Monitorサンプルアプリケーションを簡単に構成できます。(コード提供: NXP Semiconductors)

このアプリケーションは、分かりやすい処理の流れで動作します。main.cのメインルーチンは、sensor_collect.cモジュールに配置されたルーチンである、MainTaskと呼ばれるタスクを作成します。

コピー
void MainTask(void *pvParameters)
{
    status_t status = kStatus_Success;
 
    printf("MainTask started\r\n");
 
#if !SENSOR_FEED_VALIDATION_DATA
    status = SENSOR_Init();
    if (status != kStatus_Success)
    {
        goto main_task_exit;
    }
#endif
 
    g_sensorCollectQueue = xQueueCreate(SENSOR_COLLECT_QUEUE_ITEMS, sizeof(sensor_data_t));
    if (NULL == g_sensorCollectQueue)
    {
        printf("collect queue create failed!\r\n");
        status = kStatus_Fail;
        goto main_task_exit;
    }
 
#if SENSOR_COLLECT_ACTION == SENSOR_COLLECT_LOG_EXT
    uint8_t captClassLabelIdx;
    CAPT_Init(&captClassLabelIdx, &g_SensorCollectDuration_us, &g_SensorCollectDuration_samples);
    g_SensorCollectLabel = labels[captClassLabelIdx];
 
    if (xTaskCreate(SENSOR_Collect_LogExt_Task, "SENSOR_Collect_LogExt_Task", 4096, NULL, configMAX_PRIORITIES - 1, NULL) != pdPASS)
    {
        printf("SENSOR_Collect_LogExt_Task creation failed!\r\n");
        status = kStatus_Fail;
        goto main_task_exit;
    }
#elif SENSOR_COLLECT_ACTION == SENSOR_COLLECT_RUN_INFERENCE
    if (xTaskCreate(SENSOR_Collect_RunInf_Task, "SENSOR_Collect_RunInf_Task", 4096, NULL, configMAX_PRIORITIES - 1, NULL) != pdPASS)
    {
        printf("SENSOR_Collect_RunInf_Task creation failed!\r\n");
        status = kStatus_Fail;
        goto main_task_exit;
    }
#endif

リスト3:NXPのML State Monitorサンプルアプリケーションでは、MainTaskがサブタスクを呼び出し、データを取得したり推論を実行したりします。(コード提供: NXP Semiconductors)

MainTaskは、sensor_collect.hでユーザーが設定した定義に従い、さまざまな初期化タスクを実行してから、2つのサブタスクのうち1つを起動します。

  • SENSOR_COLLECT_ACTIONがSENSOR_COLLECT_LOG_EXTに設定されている場合、MainTaskはサブタスクSENSOR_Collect_LogExt_Task()を開始します。これにより、データを収集し、設定に応じてSDカードに保存します。
  • SENSOR_COLLECT_ACTIONがSENSOR_COLLECT_RUN_INFERENCEに設定されている場合、MainTaskはサブタスクSENSOR_Collect_RunInf_Task()を起動します。これにより、収集したデータに対してsensor_collect.hで定義された推論エンジン (Glow、DeepViewRT、またはTensorFlow) が実行されます。SENSOR_EVALUATE_MODELが定義されている場合は、性能と分類予測の結果が表示されます。
コピー
if SENSOR_COLLECT_ACTION == SENSOR_COLLECT_LOG_EXT
void SENSOR_Collect_LogExt_Task(void *pvParameters)
{
[code deleted for simplicity]
    while (1)
    {
[code deleted for simplicity]
            bufSizeLog = snprintf(buf, bufSize, "%s,%ld,%d,%d,%d,%d,%d,%d,%d\r\n", g_SensorCollectLabel, (uint32_t)(sensorData.ts_us/1000),
                    sensorData.rawDataSensor.accel[0], sensorData.rawDataSensor.accel[1], sensorData.rawDataSensor.accel[2],
                    sensorData.rawDataSensor.mag[0], sensorData.rawDataSensor.mag[1], sensorData.rawDataSensor.mag[2],
                    sensorData.temperature);
 
#if SENSOR_COLLECT_LOG_EXT_SDCARD
                SDCARD_CaptureData(sensorData.ts_us, sensorData.sampleNum, g_SensorCollectDuration_samples, buf, bufSizeLog);
#else
                printf("%.*s", bufSizeLog, buf);
[code deleted for simplicity]
    }
 
    vTaskDelete(NULL);
}
#elif SENSOR_COLLECT_ACTION == SENSOR_COLLECT_RUN_INFERENCE
[code deleted for simplicity]
 
void SENSOR_Collect_RunInf_Task(void *pvParameters)
{
[code deleted for simplicity]
    while (1)
    {
[code deleted for simplicity]
                /* Run Inference */
                tinf_us = 0;
                SNS_MODEL_RunInference((void*)g_clsfInputData, sizeof(g_clsfInputData), (int8_t*)&predClass, &tinf_us, SENSOR_COLLECT_INFENG_VERBOSE_EN);
 
[code deleted for simplicity]
#if SENSOR_EVALUATE_MODEL
                /* Evaluate performance */
                validation.predCount++;
                if (validation.classTarget == predClass)
                {
                    validation.predCountOk++;
                }
                PRINTF("\rInference %d?%d | t %ld us | count: %d/%d/%d | %s      ",
                       validation.classTarget, predClass, tinf_us, validation.predCountOk,
                       validation.predCount, validation.predSize, labels[predClass]);
 
                tinfTotal_us += tinf_us;
                if (validation.predCount >= validation.predSize)
                {
                    printf("\r\nPrediction Accuracy for class %s %.2f%%\r\n", labels[validation.classTarget],
                            (float)(validation.predCountOk * 100)/validation.predCount);
                    printf("Average Inference Time %.1f (us)\r\n", (float)tinfTotal_us/validation.predCount);
                    tinfTotal_us = 0;
                }
#endif
 
    }
 
exit_task:
    vTaskDelete(NULL);
}
#endif  /* SENSOR_COLLECT_ACTION */

リスト4:NXPのML State Monitorサンプルアプリケーションは、センサデータを取得し、取得したデータに対して選択した推論エンジンを実行するための基本設計パターンを示します。(コード提供: NXP Semiconductors)

NXPのML State Monitor App SW Packは、必要なドライバやミドルウェア一式とともに完全なソースコードを提供するため、開発者はアプリケーションを簡単に拡張して機能を追加したり、独自のカスタム開発の出発点として使用したりすることができます。

まとめ

IoTなどのアプリケーションにおいてスマート製品のエッジでMLを実装すると、強力な機能セットを提供できますが、企業規模のアプリケーション向けに開発されたMLツールや手法の適用に開発者が苦慮する場合が多くなります。クロスオーバープロセッサと専用のモデル開発ソフトウェアで構成されるNXPの開発プラットフォームを利用することで、ML専門家とML経験の少ない開発者の両方が、効率的なエッジ性能の要件を満たすために特別設計されたMLアプリケーションをより効果的に作成できるようになります。

DigiKey logo

免責条項:このウェブサイト上で、さまざまな著者および/またはフォーラム参加者によって表明された意見、信念や視点は、DigiKeyの意見、信念および視点またはDigiKeyの公式な方針を必ずしも反映するものではありません。

著者について

Image of Stephen Evanczuk

Stephen Evanczuk

Stephen Evanczuk氏は、IoTを含むハードウェア、ソフトウェア、システム、アプリケーションなど幅広いトピックについて、20年以上にわたってエレクトロニクス業界および電子業界に関する記事を書いたり経験を積んできました。彼はニューロンネットワークで神経科学のPh.Dを受け、大規模に分散された安全システムとアルゴリズム加速法に関して航空宇宙産業に従事しました。現在、彼は技術や工学に関する記事を書いていないときに、認知と推薦システムへの深い学びの応用に取り組んでいます。

出版者について

DigiKeyの北米担当編集者