
# 动态shape
在某些推理场景中，模型输入的shape可能是不固定的，因此需要支持用户指定模型的动态shape，并能够在推理中接收多种shape的输入。在CPU上进行模型转换时无需考虑动态shape问题，因为CPU算子支持动态shape；而在Ascend场景上，算子需要指定具体的shape信息，并且在模型转换的编译阶段完成对应shape的编译任务，从而能够在推理时支持多种shape的输入。
#### 动态batch
在模型转换阶段通过--configFile参数指定配置文件，并且在配置文件中配置input_shape及dynamic_dims动态参数。其中input_shape的-1表示动态shape所在的维度，dynamic_dims指定动态维度的取值范围，例如"\[1\~4\],\[8\],\[16\]"表示该动态维度支持1、2、3、4、8、6共六种大小。
```
# config.ini
[ascend_context]
input_shape=input.1:[-1,3,224,224]
dynamic_dims=[1~4],[8],[16]
```
在执行convert_lite命令时，指定--configFile=config.ini即可自动编译指定的动态shape。
```
# shell
converter_lite --modelFile=resnet50.onnx --fmk=ONNX --device=Ascend --outputFile=resnet50_dynamic --saveType=MINDIR --configFile=config.ini
```
**注意：**推理应用开发时，需要使用模型的Resize功能，改变输入的shape。而且Resize操作需要在数据从host端复制到device端之前执行，下面是一个简单的示例，展示如何在推理应用时使用动态Shape。
```
import mindspore_lite as mslite
import numpy as np
from PIL import Image
# 设置目标设备上下文为Ascend，指定device_id为0。
context = mslite.Context()
context.target = ["ascend"]
context.ascend.device_id = 0
# 构建模型。
model = mslite.Model()
model.build_from_file("./resnet50_dynamic.mindir", mslite.ModelType.MINDIR, context)
data = np.random.rand(8, 3, 224, 224).astype(np.float32)
inputs = model.get_inputs()
model.resize(inputs, [list(data.shape)])
inputs[0].set_data_from_numpy(data)
# 前向推理，并将结果从device侧传到host侧。
outputs = model.predict(inputs)[0].get_data_to_numpy()
print(outputs.shape)  # (8, 1000)
```
#### 动态分辨率
动态分辨率可以用于设置输入图片的动态分辨率参数。适用于执行推理时，每次处理图片宽和高不固定的场景，该参数需要与input_shape配合使用，input_shape中-1的位置为动态分辨率所在的维度。使用方法可参考[Ascend配置文件说明](https://www.mindspore.cn/lite/docs/zh-CN/r2.0/use/cloud_infer/converter_tool_ascend.html#动态分辨率)。
