过程
  1. 模型加载LoadModel

    1. aclmdlQuerySize(modelPath, &modelWorkSize_, &modelWeightSize_):获取运行时权值内存大小、工作内存大小

    2. 申请内存:

      1. aclrtMalloc(&modelWorkPtr_, modelWorkSize_, ACL_MEM_MALLOC_HUGE_FIRST)权值内存。
      2. aclrtMalloc(&modelWeightPtr_, modelWeightSize_, ACL_MEM_MALLOC_HUGE_FIRST)工作空间内存。
    3. 加载模型aclmdlLoadFromFileWithMem(modelPath, &modelId_, modelWorkPtr_,modelWorkSize_, modelWeightPtr_, modelWeightSize_)

  2. 创建模型描述CreateModelDesc

    1. 创建变量aclmdlCreateDesc
    2. 获取描述信息aclmdlGetDesc(modelDesc_, modelId_)
  3. 获取模型输入大小GetInputSizeByIndex

    1. 获取输入大小:aclmdlGetInputSizeByIndex(modelDesc_, index)。根据模型描述信息获取指定输入的大小,单位为Byte。
    2. 申请输入内存aclrtMalloc(&picDevBuffer, devBufferSize, ACL_MEM_MALLOC_NORMAL_ONLY)
  4. 创建输入CreateInput

    1. aclmdlGetInputSizeByIndex再次获取,和上次的做比对是否一样

    2. 创建DatasetaclmdlCreateDataset

    3. 创建DataBufferaclCreateDataBuffer(inputDataBuffer, bufferSize)

      1. 之前申请的内存,获取的输入大小
    4. Buf添加到DatasetaclmdlAddDatasetBuffer(input_, inputData)

  5. 创建输入CreateOutput

    1. aclmdlCreateDataset
    2. 获取输出数据个数,根据模型描述aclmdlGetNumOutputs(modelDesc_)
    3. 循环获取每个输出的大小,并申请内存、创建Buf、添加到Dataset:aclmdlGetOutputSizeByIndexaclrtMallocaclCreateDataBufferaclmdlAddDatasetBuffer
  6. 遍历输入数据地址的数组

    1. MemcpyFileToDeviceBuffer函数:读取文件到npu内存

      1. 读取bin文件

      2. 检查

      3. 内存拷贝aclrtMemcpy(picDevBuffer, inputBuffSize, inputBuff, inputBuffSize, ACL_MEMCPY_HOST_TO_DEVICE)

        1. 主机到设备
        2. 设备到设备
  7. 模型推理aclmdlExecute(modelId_, input_, output_)

1. 资源初始化流程

在这里插入图片描述

申请资源:Device、Context、Stream

  • Device上运行:起始就在Device上创建的应用。就没有host、device之间的数据传输的过程
  • Device:硬件上的设备
  • Context:逻辑上的资源集合
  • Stream:处理多个异步任务的执行顺序

2. 模型加载流程

在这里插入图片描述

3. 模型推理流程

在这里插入图片描述

4. 准备数据流程

在这里插入图片描述
在这里插入图片描述

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐