0

在 Android 神经网络 API 文档中说:从文件描述符创建一个共享内存对象。

但是我在 TFL 源代码上找不到任何指定此文件格式的地方:

分配.cc:

MMAPAllocation::MMAPAllocation(const char* filename,
                               ErrorReporter* error_reporter)
    : Allocation(error_reporter), mmapped_buffer_(MAP_FAILED) {
  mmap_fd_ = open(filename, O_RDONLY);
  if (mmap_fd_ == -1) {
    error_reporter_->Report("Could not open '%s'.", filename);
    return;
  }
  struct stat sb;
  fstat(mmap_fd_, &sb);
  buffer_size_bytes_ = sb.st_size;
  mmapped_buffer_ =
      mmap(nullptr, buffer_size_bytes_, PROT_READ, MAP_SHARED, mmap_fd_, 0);
  if (mmapped_buffer_ == MAP_FAILED) {
    error_reporter_->Report("Mmap of '%s' failed.", filename);
    return;
  }
}

nnapi_delegate.cc

NNAPIAllocation::NNAPIAllocation(const char* filename,
                                 ErrorReporter* error_reporter)
    : MMAPAllocation(filename, error_reporter) {
  if (mmapped_buffer_ != MAP_FAILED)
    CHECK_NN(ANeuralNetworksMemory_createFromFd(buffer_size_bytes_, PROT_READ,
                                                mmap_fd_, 0, &handle_));
}

这意味着,TFL 打开文件,并将此文件提供给 NNAPI。我需要的是这个存储张量的文件的格式是什么,它是像 TFL 格式的 flatbuffers 文件吗?

编辑:这是来自 NNAPI 文档的示例:

ANeuralNetworksMemory* mem1 = NULL;
int fd = open("training_data", O_RDONLY);
ANeuralNetworksMemory_createFromFd(file_size, PROT_READ, fd, 0, &mem1);

这个文件training_data,它的内容必须如何结构化才能让 NNAPI 理解?

4

2 回答 2

1

模型文件的加载和解析是分开完成的。这使得不同内存模型和不同文件格式之间的混合和匹配变得更容易。它还可以将这些构建块用于其他功能,例如从文件加载输入。

ANeuralNetworksMemory_createFromFd() 仅用于将模型文件加载到内存中。

FlatBufferModel::BuildFromFile() 获取代表模型的分配(内存块)。这是调用 ANeuralNetworksMemory_createFromFd() 的地方。然后它会更新一个 FlatBufferModel 对象。这会调用 schema 子目录中的 tflite::GetModel()。schema 子目录从加载到内存中的 .tflite 模型中反序列化 flat-buffer-model。

当 NNAPIDelegate::Invoke() 被调用时,模式模型对象用于使用像 ANeuralNetworksModel_addOperand() 这样的调用在 Android-NN 层中构建模型。

于 2018-04-06T23:56:17.753 回答
1

ANeuralNetworksMemory_createFromFd(file_size, PROT_READ, fd , 0, & mem1 ) - 此 API 将模型文件映射到 ANeuralNetworksMemory。

映射的地址存储在mem1中(通过引用传递!)

此外,通过指向适当的偏移值读取存储在mem1(ANeuralNetworksMemory 对象)中的训练值,并将其复制到神经网络模型的张量中。

 ANeuralNetworksModel_setOperandValueFromMemory(model_, tensor0, mem1, offset, size);
 ANeuralNetworksModel_setOperandValueFromMemory(model_, tensor1, mem1, offset+size, size);
  • tensor0 - 指向偏移量
  • tensor1 - 指向偏移量+大小
于 2020-01-08T10:56:23.060 回答