This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] SK-AM62A-LP:当模型有多个输出时、edge-tidl-tools TIDLRT_invoke 卡住

Guru**** 2551110 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1228655/sk-am62a-lp-edge-tidl-tools-tidlrt_invoke-stuck-when-the-model-has-multiple-outputs

器件型号:SK-AM62A-LP

大家好、

  我使用 TIDLRT 去政治我的模型 AM62A . 当模型有多个输出时、TIDLRT_invoke 卡住。 这是我的模型。

  这是目标日志。

    关于内存 malloc、我的代码类似这样。

  sTIDLRT_Tensor_t *in[16];
  sTIDLRT_Tensor_t *out[16];

  sTIDLRT_Tensor_t in_tensor;
  sTIDLRT_Tensor_t out_tensor;
  sTIDLRT_Tensor_t out_tensor2;

  int32_t j = 0;
  in[j] = &in_tensor;
  status = TIDLRT_setTensorDefault(in[j]);
  //in[j]->layout = TIDLRT_LT_NHWC;
  in[j]->layout = TIDLRT_LT_NCHW;
  //strcpy((char *)in[j]->name, tensor->name);
  in[j]->elementType = TIDLRT_Uint8;
  int32_t in_tensor_szie = 32 * 32 * 3 * sizeof(uint8_t);

  if (device_mem)
  {
      in[j]->ptr =  TIDLRT_allocSharedMem(64, in_tensor_szie);
      in[j]->memType = TIDLRT_MEM_SHARED;
  }
  else
  {
      in[j]->ptr =  malloc(in_tensor_szie);
  }
  
  memcpy(in[j]->ptr,input_data,input_size);
  for (size_t idx = 0; idx < 8; idx++)
  {
    printf("%x ",input_data[idx]);
  }
  printf("\n");

  out[j] = &out_tensor;
  status = TIDLRT_setTensorDefault(out[j]);
  out[j]->layout = TIDLRT_LT_NCHW;
  //strcpy((char *)in[j]->name, tensor->name);
  out[j]->elementType = TIDLRT_Float32;
  int32_t out_tensor_szie = 2 * 34 * 34 * sizeof(float);

  if (device_mem)
  { 
      out[j]->ptr =  TIDLRT_allocSharedMem(64, out_tensor_szie);
      out[j]->memType = TIDLRT_MEM_SHARED;
  }
  else
  {
      out[j]->ptr =  malloc(out_tensor_szie);
  }
  j = 1;
  out_tensor_szie = 8 * 34 * 34 * sizeof(float);
  out[j] = &out_tensor2;
  status = TIDLRT_setTensorDefault(out[j]);
  out[j]->layout = TIDLRT_LT_NCHW;
  //strcpy((char *)in[j]->name, tensor->name);
  out[j]->elementType = TIDLRT_Float32;
  //int32_t out_tensor_szie = 1001 * sizeof(float);
  
  if (device_mem)
  { 
      out[j]->ptr =  TIDLRT_allocSharedMem(64, out_tensor_szie);
      out[j]->memType = TIDLRT_MEM_SHARED;
  }
  else
  {
      out[j]->ptr =  malloc(out_tensor_szie);
  }

  LOG(INFO) << "invoked \n";

  struct timeval start_time, stop_time;
  gettimeofday(&start_time, nullptr);
  int loop_count = 1;
  for (int i = 0; i < loop_count; i++)
  {
    TIDLRT_invoke(handle, in, out);
  }

  gettimeofday(&stop_time, nullptr);

   我找不到原因。  

   您能否使用 TIDL-RT?为部署多个输出提供示例代码?

谢谢!

亨利

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Henry:

    感谢您的提问、我们将为您的问题找到解决方案。 您能否提供一些有关这方面的其他信息?

    1.你知道这是在哪条线上卡住了吗?

    。 模型有多个输出时 TIDLRT_invoke 卡住[/引号]

    2.在屏幕截图的结尾处,是不是停止了,没有进展?

    3、您是如何开发在这里制作的模型的? 我看到了 Netron 的屏幕截图、并且想知道模型采用的是什么格式。 我们还可以使用用于开源运行时的 API 来调用该模型。 它还将有助于查看对该模型进行编译的

    4.我只看到 malloc 代码的片段、但没有看到模型的 TIDL 初始化代码。 您还可以展示一下吗? 我也不确定"device_mem"在这里是什么意思。 请提出意见

    5.这看起来像是一个小模型,用于测试功能。 您是否尝试运行具有奇异输出的类似模型以确保程序的所有其他组件正常工作?

    我还建议检查"status"的值。

    示例代码在 edgeai-tidl-tools 中: github.com/.../classification.cpp

    此致!
    雷塞

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、 Reese

    我尝试了一个单输出模型、其中最后一层是卷积层、内核大小为1、跨度为1、填充为1。 但是、我发现它也滞留在 TIDLRT_invoke 函数中。 内核大小为1、跨度为1、填充为1的卷积可能会导致该问题、但这并不重要、因为它只是一个我用于测试目的的模型。

    另一方面、我还尝试了一种双输出模型、其中输出层是卷积层、内核大小为3、跨度为1、填充为1、我发现它可以成功运行。

    感谢您的建议。

    最佳

    亨利

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Henry:

    我明白了。 您可以使用多输出模型、但 K1S1P1卷积是否出现故障? 我想知道这是否由于内核大小为1的填充而失败-它实际上是对 NULL 数据进行操作。 我认为这也会使输入的尺寸从 C1xHxW 变为 C2x (H+2) x (W+2)、这可能会使模型感到困惑。

    这可能是模型编译中未被发现的临界情况、但让我们先确认一下。 请尝试使用 K1S1P0替换此端口。 我们在 MobileNet 模型中有欠卷积、因此1x1内核应该可以使用。

    此致!
    雷塞