SDKバージョン26では。ethosu_apps_rpmsg は、ethosu から結果を取得する方法を示しませんでした。
どうすればいいですか?
推論結果は、ジョブに渡すOFM バッファ(コンストラクタ内の ofm) に格納されます。expectedOutputはSDK例の検証パスのみを対象としています。計算結果が返される場所ではありません。i.MX93 Ethos-Uフローは、完了した推論結果を出力特徴マップバッファに書き込み、Linux/RPMsgフローではOFMが入力された後に応答をCortex-Aに返送します。
あなたのコードにとって重要な部分は次のとおりです。
InferenceProcess::InferenceJob job(
「仕事」
ネットワークモデル、
ifm、
ofm, // <-- 出力バッファ
expectedOutput, // <-- 参照/検証データ、結果ではない
pmuEventConfig、
0、
ðosu_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
for (size_t i = 0; i < outputSize; i++)
{
float y = (static_cast
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:
計算の出力はすでにOFMに入っています;runJob(job)が成功した後、ofm[0]を読み取り、モデルの出力テンソル型に従って解釈・反量子化します。