---
title: 模型加载
description: "从模型构建中的说明构建出模型后，需进行模型加载，为模型执行做准备。"
url: https://www.hiascend.com/document/detail/zh/canncommercial/latest/programug/acldevg/aclpythondevg_0031.html
sourcePath: /source/zh/canncommercial/900/programug/acldevg/aclpythondevg_0031.html
indexId: 6cfa4738ecbc06fbf27de21f6a568efe617ff9776414b0edc26a15923885ea5b71
---
# 模型加载

从模型构建中的说明构建出模型后，需进行模型加载，为模型执行做准备。

#### 接口调用流程

开发应用时，如果涉及整网模型推理，则应用程序中必须包含模型加载的代码逻辑，关于模型加载的接口调用流程，请先参见接口调用流程了解整体流程，再查看本节中的流程说明。

本节描述的是整网模型加载的接口调用流程，对于算子模型加载与执行的详细说明请参见单算子调用。

pyacl提供两套模型加载的接口，用户可根据具体使用场景选择对应的模型加载接口：

- 如  图1
所示，根据不同的加载方式（从文件加载、从内存加载等）选择不同的接口，操作相对简单，但需要记住各种方式的加载接口。
- 如  图2
所示，针对不同的加载方式（从文件加载、从内存加载等），只需设置接口中的配置参数，适用各种加载方式，但涉及多个接口配合使用，分别用于创建配置对象、设置对象中的属性值、加载模型。

图1 模型加载流程（通过不同接口区分加载方式）

图2 模型加载流程（通过接口中的配置参数区分加载方式）

关键接口的说明如下：

- 在模型加载前，需要先构建出适配AI处理器的离线模型（*.om文件），构建方式请参见  模型构建
。
- 由用户管理内存时，为确保内存不浪费，在申请工作内存、权值内存前，需要调用  acl.mdl.query_size(https://www.hiascend.comdocument/detail/zh/canncommercial/900/API/ascendgraphapi/aclpythondevg_01_0149.html)
接口查询模型运行时所需工作内存、权值内存的大小。
  如果模型输入数据的Shape不确定，则不能调用acl.mdl.query_size(https://www.hiascend.comdocument/detail/zh/canncommercial/900/API/ascendgraphapi/aclpythondevg_01_0149.html)接口查询内存大小，在加载模型时，就无法由用户管理内存，因此需选择由系统管理内存的模型加载接口（例如，acl.mdl.load_from_file(https://www.hiascend.comdocument/detail/zh/canncommercial/900/API/ascendgraphapi/aclpythondevg_01_0139.html)、acl.mdl.load_from_mem(https://www.hiascend.comdocument/detail/zh/canncommercial/900/API/ascendgraphapi/aclpythondevg_01_0140.html)）。

- 支持以下方式加载模型，模型加载成功后，返回标识模型的模型ID：

  - 通过不同接口区分加载方式，从使用的接口上区分从文件加载，还是从内存加载，以及内存是由系统内部管理，还是由用户管理。

    -       acl.mdl.load_from_file(https://www.hiascend.comdocument/detail/zh/canncommercial/900/API/ascendgraphapi/aclpythondevg_01_0149.html)
：从文件加载离线模型数据，由系统内部管理模型运行的内存。
    -       acl.mdl.load_from_mem(https://www.hiascend.comdocument/detail/zh/canncommercial/900/API/ascendgraphapi/aclpythondevg_01_0140.html)
：从内存加载离线模型数据，由系统内部管理模型运行的内存。
    -       acl.mdl.load_from_file_with_mem(https://www.hiascend.comdocument/detail/zh/canncommercial/900/API/ascendgraphapi/aclpythondevg_01_0141.html)
：从文件加载离线模型数据，由用户自行管理模型运行的内存（包括工作内存和权值内存，工作内存用于模型执行过程中的临时数据，权值内存用于存放权值数据）。
    -       acl.mdl.load_from_mem_with_mem(https://www.hiascend.comdocument/detail/zh/canncommercial/900/API/ascendgraphapi/aclpythondevg_01_0142.html)
：从内存加载离线模型数据，由用户自行管理模型运行的内存（包括工作内存和权值内存）。
  - 通过接口中的配置参数区分加载方式，使用    acl.mdl.set_config_opt(https://www.hiascend.comdocument/detail/zh/canncommercial/900/API/ascendgraphapi/aclpythondevg_01_0162.html)
接口、    acl.mdl.load_with_config(https://www.hiascend.comdocument/detail/zh/canncommercial/900/API/ascendgraphapi/aclpythondevg_01_0163.html)
接口时，是通过配置对象中的属性来区分，在加载模型时是从文件加载还是从内存加载，以及内存是由系统内部管理还是由用户管理。


#### 示例代码

模型加载成功，会返回标识模型的ID，在模型执行时需要使用该ID。

您可以从样例介绍(https://gitee.com/ascend/samples/tree/master/python/level2_simple_inference/1_classification/resnet50_imagenet_classification)中获取完整样例代码。

调用接口后，需增加异常处理的分支，并记录报错日志、提示日志，此处不一一列举。以下是关键步骤的代码示例，不可以直接拷贝运行，仅供参考。

```
# 初始化变量。
model_path = "./model/resnet50.om"
# ......
# 加载离线模型文件（适配昇腾AI处理器的离线模型），由系统管理模型运行的内存(包括权值内存、工作内存)。
# 模型加载成功，返回标识模型的ID。
model_id, ret =
acl.mdl.load_from_file
(model_path)
# ......
```
