
# 导入模型
导入模型功能包括：
- 初始化已存在的模型，根据模型ID生成模型对象。
- 创建模型。模型对象的属性，请参见[查询模型详情](https://support.huaweicloud.com/sdkreference-modelarts/modelarts_04_0197.html)。
#### 示例模型文件
以[PyTorch](https://support.huaweicloud.com/usermanual-standard-modelarts/inference-modelarts-0078.html#section2)为例，编写模型文件。PyTorch模型包结构可参考[模型包规范介绍](https://support.huaweicloud.com/usermanual-standard-modelarts/inference-modelarts-0055.html)。
```
OBS桶/目录名
├── resnet
│   ├── model 必选：固定子目录名称，用于放置模型相关文件
│   │  ├──<<自定义Python包>>  可选：用户自有的Python包，在模型推理代码中可以直接引用
│   │  ├──mnist_mlp.pt 必选，pytorch模型保存文件，保存为“state_dict”，存有权重变量等信息。
│   │  ├──config.json 必选：模型配置文件，文件名称固定为config.json，只允许放置一个
│   │  ├──customize_service.py 必选：模型推理代码，文件名称固定为customize_service.py，只允许放置一个，customize_service.py依赖的文件可以直接放model目录下
```
#### 示例代码
在ModelArts Notebook平台，Session鉴权无需输入鉴权参数。其它平台的Session鉴权请参见[Session鉴权](https://support.huaweicloud.com/sdkreference-modelarts/modelarts_04_0123.html)。
```
from modelarts.session import Session
from modelarts.model import Model
from modelarts.config.model_config import ServiceConfig, Params, Dependencies, Packages
session = Session()
```
- **方式1：初始化已存在模型**
  ```
  model_instance = Model(session, model_id="your_model_id")
  ```
  

- **方式2：创建模型**
  - 基于预置镜像和OBS路径创建模型
    ```
    model_location = "/your_obs_bucket/model_path"            # 修改为真实的模型文件OBS路径 
    execution_code = "/your_obs_bucket/model_path/customize_service.py"
    runtime = "python3.7"
    model_instance = Model(
                            session,
                            model_name="input_model_name",    # （可选）模型名称
                            model_version="1.0.0",            # （可选）模型版本
                            source_location=model_location,   # 模型文件所在的OBS路径，如："/your_obs_bucket/model_path"
                            model_type="PyTorch",             # 模型类型
                            execution_code=execution_code,    # （可选）存放执行脚本的OBS路径，如："/your_obs_bucket/model_path/customize_service.py"
                            runtime=runtime                  # （可选）支持的运行环境
                           )
    ```
    ![](https://support.huaweicloud.com/sdkreference-modelarts/public_sys-resources/note_3.0-zh-cn.png)
    dependencies会覆盖样例中config.json的相关内容，上述无需使用dependencies，dependencies格式样例可参考下方格式定义。
    - **dependencies参数组的定义格式**
      SDK提供了Dependencies类对其定义，dependencies为list，list中的元组对象是Dependencies。
      定义代码如下：
      ```
      dependencies = []
      dependency1 = Dependencies(
            installer="pip",                     # 安装方式，目前支持pip
            packages=packages                   # 依赖包集合, 定义格式参考下文关于packages的定义
      )
      dependencies.append(dependency1)
      ```
      
    
    - **package参数组的定义** **格式**
      SDK提供了Packages类对其定义，packages为list，list中的元组对象是Packages。
      定义代码如下：
      ```
      packages = []
      package1 = Packages(
           package_name="package_name",               # 包名
           package_version="version",                 # 包版本号
           restraint="EXACT"
      )  
      packages.append(package1)
      ```
      ![](https://support.huaweicloud.com/sdkreference-modelarts/public_sys-resources/note_3.0-zh-cn.png)
      dependencies参数组的创建样例：
      ```
      dependencies = []
      packages = [{
          "package_name": "numpy",
          "package_version": "1.15.0",
          "restraint": "EXACT"
          }, {
              "package_name": "h5py",
              "package_version": "2.8.0",
              "restraint": "EXACT"
          }]
      dependency = Dependencies(installer="pip", packages=packages)
      dependencies.append(dependency)
      ```
      
     
  
  - 基于自定义镜像创建模型 适用于推理服务的脚本已经内置在自定义镜像中，镜像启动时会自动拉起服务的场景。
    ```
    from modelarts.session import Session
    from modelarts.model import Model
    session = Session()
    image_path = "custom_image_path"       # 自定义镜像的swr路径
    model_instance = Model(
                            session, 
                            model_name="your_model_name",               # 模型名称
                            model_version="0.1.0",                      # 模型版本
                            source_location="image_path",                 # 模型文件路径
                            model_type="Image"                         # 模型类型
                          )
    ```
    
   
 
#### 参数说明
表1初始化模型场景参数说明 
| 参数       | 是否必选 | 参数类型   | 描述                                                                                                      |
|:---|:---|:---|:---|
| session  | 是    | Object | 会话对象，初始化方法参考[Session鉴权](https://support.huaweicloud.com/sdkreference-modelarts/modelarts_04_0123.html)。 |
| model_id | 是    | String | 模型ID。                                                                                                   |
   
表2创建模型场景参数说明 
| 参数                   | 是否必选 | 参数类型           | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
|:---|:---|:---|:---|
| session              | 是    | Object         | 会话对象，初始化方法见[Session鉴权](https://support.huaweicloud.com/sdkreference-modelarts/modelarts_04_0123.html)。                                                                                                                                                                                                                                                                                                                                                                                                                             |
| model_name           | 否    | String         | 模型名称，名称只能字母，中文开头，为字母、数字、下划线、中文或者中划线组成的合法字符，支持1-64个字符。如果未输入该参数，系统会自动生成模型name。                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| model_version        | 是    | String         | 模型版本，格式需为"数值.数值.数值"，其中数值为1-2位正整数。版本不可以出现以0开头的版本号形式，如"01.01.01"等。                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| publish              | 否    | Bool           | 是否发布模型。可选值： - True: 发布模型。（默认值）  - False: 不发布模型，创建本地模型，可用来调试相关代码。                                                                                                                                                                  |
| source_location_type | 否    | String         | 模型位置类型。可选值： - OBS_SOURCE：source_location为OBS路径。（默认值）  - LOCAL_SOURCE：source_location为本地路径。                                                                                                                                         |
| source_location      | 是    | String         | 模型文件所在路径，指定到模型文件的父目录。 - 当source_location_type为OBS_SOURCE时，模型文件所在路径为OBS路径，格式为"/obs_bucketname/.../model_file_parent_dir/"。  - 当source_location_type为LOCAL_SOURCE时，模型文件所在路径为本地路径，格式为"/local_path/.../model_file_parent_dir/"。   |
| environment          | 否    | Environment实例  | 描述模型正常运行需要的环境，如使用的python版本、tensorflow版本等。 Environment实例的示例请参见[示例代码](https://support.huaweicloud.com/sdkreference-modelarts/modelarts_04_0223.html#ZH-CN_TOPIC_0000001402224760__section960918534256)。                                                                                                                                                                                                                                                                               |
| source_job_id        | 否    | String         | 来源训练作业的ID，模型是从训练作业产生的可填写，用于溯源；如模型是从第三方元模型导入，则为空，默认值为空。                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| source_job_version   | 否    | String         | 来源训练作业的版本，模型是从训练作业产生的可填写，用于溯源；如模型是从第三方元模型导入，则为空，默认值为空。                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| source_type          | 否    | String         | 模型来源的类型，当前仅可取值auto，用于区分通过自动学习部署过来的模型（不提供模型下载功能）；用户通过训练作业部署的模型不设置此值。默认值为空。                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| model_type           | 是    | String         | 模型类型，取值为：TensorFlow/MXNet/Spark_MLlib/Scikit_Learn/XGBoost/MindSpore/Image/PyTorch。                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| model_algorithm      | 否    | String         | 模型算法，表示模型的算法实现类型，如果已在模型配置文件中配置，则可不填。如：predict_analysis、object_detection 、image_classification。                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| description          | 否    | String         | 模型描述信息，不超过100个字符，且不能包含特殊字符!\<\>=\&'"。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| execution_code       | 否    | String         | 存放执行脚本的OBS路径，如果模型没有输出"customize_service.py"则需要通过该参数指定。推理脚本必须放于模型所在路径（请参见"source_location"参数）的model目录下，名称固定为："customize_service.py"。                                                                                                                                                                                                                                                                                                                                                                                                |
| runtime              | 否    | String         | 支持的运行环境。如果使用了model_type参数，则需要填该参数。不同引擎对应的runtime可参见[支持的常用引擎及其Runtime](https://support.huaweicloud.com/usermanual-standard-modelarts/inference-modelarts-0003.html)。                                                                                                                                                                                                                                                                                                                                                                |
| input_params         | 否    | params结构数组     | 模型推理输入参数列表，默认为空。如果已在模型配置文件中配置apis信息时，则可不填，后台自动从配置文件的apis字段中读取输入参数信息。                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| output_params        | 否    | params结构数组     | 模型推理输出参数列表，默认为空。如果已在模型配置文件中配置apis信息时，则可不填，后台自动从配置文件的apis字段中读取输出参数信息。                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| dependencies         | 否    | dependency结构数组 | 运行代码及模型需安装的依赖包，默认为空。如果已在模型配置文件中配置dependencies信息时，则可不填，后台自动从配置文件的dependencies字段中读取需要安装的依赖包。                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| apis                 | 否    | String         | 模型提供的推理接口列表，默认为空。如果已在模型配置文件中配置apis信息时，则可不填，后台自动从配置文件中的apis字段读取所配置的推理接口信息。                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
   
表3params结构 
| 参数         | 是否必选 | 参数类型   | 描述                                                             |
|:---|:---|:---|:---|
| url        | 是    | String | 模型推理接口的请求路径。                                                   |
| param_name | 是    | String | 参数名，不超过64个字符。                                                  |
| param_type | 是    | String | JSON Schema基本参数类型，有string、object、array、boolean、number、integer。 |
| min        | 否    | Double | 当param_type为int或float时，可选填，默认为空。                               |
| max        | 否    | Double | 当param_type为int或float时，可选填，默认为空。                               |
| param_desc | 否    | String | 参数描述，不超过100个字符，默认为空。                                           |
   
表4dependency结构 
| 参数        | 是否必选 | 参数类型        | 描述               |
|:---|:---|:---|:---|
| installer | 是    | String      | 安装方式，当前只支持"pip"。 |
| packages  | 是    | package结构数组 | 依赖包集合。           |
   
表5package结构 
| 参数              | 是否必选 | 参数类型   | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
|:---|:---|:---|:---|
| package_name    | 是    | String | 依赖包名称。                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| package_version | 否    | String | 依赖包版本。                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| restraint       | 否    | String | 版本过滤条件，当且仅当package_version存在时必填。取值为： - EXACT：等于给定版本  - ATLEAST：不小于给定版本  - ATMOST：不大于给定版本   |
   
表6create_model返回参数说明 
| 参数             | 是否必选 | 参数类型    | 描述                     |
|:---|:---|:---|:---|
| model_instance | 是    | Model对象 | 模型对象，可以调用本章节模型管理的所有接口。 |
   
![](https://support.huaweicloud.com/sdkreference-modelarts/public_sys-resources/note_3.0-zh-cn.png)
给出MXNet实现手写数字识别项目中模型创建实例：
```
from modelarts.session import Session
from modelarts.model import Model
session = Session()
model_instance = Model(session,
                       model_name="digit_recognition",
                       model_version="1.0.0",
                       source_location=model_location,
                       model_type="MXNet",
                       model_algorithm="image_classification"
                       )
```
