2407077_ja-JP

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

2407077_ja-JP

2407077_ja-JP

IMX93 M33 SDK ethosu_apps_rpmsg:モデルの結果を得るにはどうすればいいですか?

SDKバージョン26では。ethosu_apps_rpmsg は、ethosu から結果を取得する方法を示しませんでした。
どうすればいいですか?

InferenceProcess::InferenceJob job("job", networkModel, ifm, ofm, expectedOutput, pmuEventConfig, 0,
&ethosu_drv, 0, nullptr, 0, 0, false);
job.invalidate();
InferenceProcess::InferenceProcess inferenceprocess(inferenceProcessTensorArena, TENSOR_ARENA_SIZE);
bool failed = inferenceprocess.runJob(job);
job.clean();

この計算の出力はどうやって取得できますか?

Re: imx93 m33 sdk ethosu_apps_rpmsg: how to get the result of model?

推論結果は、ジョブに渡すOFM バッファ(コンストラクタ内の ofm) に格納されます。expectedOutputはSDK例の検証パスのみを対象としています。計算結果が返される場所ではありません。i.MX93 Ethos-Uフローは、完了した推論結果を出力特徴マップバッファに書き込み、Linux/RPMsgフローではOFMが入力された後に応答をCortex-Aに返送します。

あなたのコードにとって重要な部分は次のとおりです。

InferenceProcess::InferenceJob job(

「仕事」

ネットワークモデル、

    ifm、

    ofm,              // <-- 出力バッファ

    expectedOutput,   // <-- 参照/検証データ、結果ではない

pmuEventConfig、

0、

    &ethosu_drv、

0、

nullptr、

0、

0、

間違い);


job.invalidate();


bool failed = inferenceprocess.runJob(job);


job.clean();


(!failed)の場合

{

    // ofmから結果を読み込む

}

概念的には:

コピー

(!failed)の場合

{

    // 出力テンソル 0

uint8_t *outputData = ofm[0].data();

size_t outputSize = ofm[0].size();


    for (size_t i = 0; i < outputSize; i++)

    {

PRINTF("ofm[%u] = %d\r\n", i, outputData[i]);

    }

}

ofmのSDKの種類によってはアクセスが少し異なる場合がありますが、ルールは同じです:InferenceJobに渡した同じofmバッファから読み込むこと。

モデル出力が量子化されている場合、ofmのバイトは通常int8_tかuint8_tで、最終的な浮動小数点数の値ではありません。出力テンソルの量子化パラメータを使用して変換します。

float real_value = (quantized_value - zero_point) * scale;

例えば、int8 の出力の場合:

int8_t *out = reinterpret_cast(ofm[0].data());


for (size_t i = 0; i < outputSize; i++)

{

float y = (static_cast(out[i]) - output_zero_point) * output_scale;

PRINTF("out[%u] q=%d real=%f\r\n", i, out[i], y);

}

RPMsgの場合、ethosu_apps_rpmsg主にCortex-M33のファームウェアサービスであることを覚えておいてください。Cortex-Aからのリクエストを受け取り、Ethos-Uジョブを実行し、結果をOFMバッファに書き込み、RPMsg で応答を返します。Cortex-A/Linux側では、ドキュメント化されたAPIパスはOFMバッファにアクセスするために使われています。例えばinf->getOfmBuffers()などです。

SO:

  • M33側直接テスト: runJob()が正常に完了した後、ofm[0]を読み取ります。
  • Aコア/Linux RPMsg推論:出力はコンソール出力ではなく、Linux側推論オブジェクトのOFMバッファから取得ethosu_apps_rpmsg。
  • expectedOutputを結果として使用しないでください。これは、サンプルが正しさを比較するために使用される、基準となる出力(ゴールデン出力)にすぎません。

計算の出力はすでにOFMに入っています;runJob(job)が成功した後、ofm[0]を読み取り、モデルの出力テンソル型に従って解釈・反量子化します。

タグ(1)
評価なし
バージョン履歴
最終更新日:
金曜日
更新者: