4. MacaRT Python API

4.1. 部署ONNX模型

MacaRT支持使用Python API将ONNX模型部署到曦云系列GPU上,并完成推理。

4.1.1. 创建Session

操作步骤

  1. 执行以下命令,创建Session。

    import onnxruntime as ort
    provider_options=[{'device_id':0}]
    session = ort.InferenceSession(your_onnx_model_path, providers=["MACAExecutionProvider"],provider_options=provider_options)
    

4.1.2. 获取模型图的输入输出信息

操作步骤

  1. 执行以下命令,获取模型图的输入输出信息。

    input_nodes = session.get_inputs()
    input_names = [i_n.name for i_n in input_nodes]
    output_nodes = session.get_outputs()
    output_names = [o_n.name for o_n in output_nodes]
    

4.1.3. 构建模型输入字典

操作步骤

  1. 准备输入数据。假设已创建一个包含所有模型输入数据的List,List中的元素为模型的每个输入的 numpy 数据,且输入List的变量名为 input_data_list

  2. 构建输入字典。

    input_dict ={}
    for i_d, i_n in zip(input_data_list, input_names):
       input_dict[i_n] = i_d
    

4.1.4. 获取模型输出

操作步骤

  1. 执行以下命令,获取模型输出。

    output_data = session.run([], input_dict )
    

4.2. 绑定输入输出设备

有多个模型且模型间存在数据拷贝时,绑定输入输出内存信息,可帮助减少模型之间不必要的输入输出数据拷贝。

MacaRT Python API也支持将模型的输入或输出绑定到可分页内存、固页内存和显存上。

4.2.1. 绑定输入输出数据到可分页内存上

操作步骤

  1. 操作步骤同 4.1.1 创建Session

  2. 操作步骤同 4.1.2 获取模型图的输入输出信息

  3. 操作步骤同 4.1.3 构建模型输入字典

  4. 执行以下命令,使用IOBinding获取模型输出。

    io_binding = session.io_binding()
    for key in input_dict.keys():
       io_binding.bind_ortvalue_input(key,ort.OrtValue.ortvalue_from_numpy(input_dict[key], "cpu",0))
    for o_n in output_names:
       io_binding.bind_output(o_n,"cpu")
    session.run_with_iobinding(io_binding)
    output = io_binding.get_outputs()
    

4.2.2. 绑定输入输出数据到固页内存上

操作步骤

  1. 操作步骤同 4.1.1 创建Session

  2. 操作步骤同 4.1.2 获取模型图的输入输出信息

  3. 操作步骤同 4.1.3 构建模型输入字典

  4. 执行以下命令,使用IOBinding获取模型输出。

    io_binding = session.io_binding()
    for key in input_dict.keys():
       io_binding.bind_ortvalue_input(key,ort.OrtValue.ortvalue_from_numpy(input_dict[key], "maca_pinned",gpu_id))
    for o_n in ouput_names:
       io_binding.bind_output(o_n,"maca_pinned")
    session.run_with_iobinding(io_binding)
    output = io_binding.get_outputs()
    

4.2.3. 绑定输入输出数据到显存上

操作步骤

  1. 操作步骤同 4.1.1 创建Session

  2. 操作步骤同 4.1.2 获取模型图的输入输出信息

  3. 操作步骤同 4.1.3 构建模型输入字典

  4. 执行以下命令,使用IOBinding获取模型输出。

    io_binding = session.io_binding()
    for key in input_dict.keys():
       io_binding.bind_ortvalue_input(key,ort.OrtValue.ortvalue_from_numpy(input_dict[key], "maca",gpu_id))
    for o_n in output_names:
       io_binding.bind_output(o_n,"maca",device_id = gpu_id)
    session.run_with_iobinding(io_binding)
    output = io_binding.get_outputs()
    

4.3. 动态Batch推理

操作步骤

  1. 准备输入数据。如下所示,其中 input_* 代表由模型图的其中一个输入,且每一个输入数据的 BatchSize 都为N。

    input_data = [input_0,input_1,...,input_N]
    
  2. 操作步骤同 4.1.1 创建Session

  3. 操作步骤同 4.1.2 获取模型图的输入输出信息

  4. 使用IOBinding获取输出。

    io_binding = session.io_binding()
    for i_n,b_d in zip(input_names,input_data):
       io_binding.bind_ortvalue_input(i_n,ort.OrtValue.ortvalue_from_numpy(b_d, "cpu",0))
    for o_n in ouput_names:
       io_binding.bind_output(o_n,"cpu")
    session.run_with_iobinding(io_binding)
    output = io_binding.get_outputs()
    

4.4. 提升曦云系列GPU推理性能

使用MacaRT将ONNX模型部署到曦云系列GPU上时,MacaEP的配置信息 provider_options 会直接影响MacaRT的推理速度。 相关配置信息的介绍,参见 3.4 提升曦云系列GPU推理性能

4.4.1. 设备ID设置

操作步骤

  1. 执行以下命令,配置 device_id 来指定 gpu_id,以管理多个GPU。

    provider_options=[{'device_id': your_gpu_id }]