4. MacaRT Python API
4.1. 部署ONNX模型
MacaRT支持使用Python API将ONNX模型部署到曦云系列GPU上,并完成推理。
4.1.1. 创建Session
操作步骤
执行以下命令,创建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. 获取模型图的输入输出信息
操作步骤
执行以下命令,获取模型图的输入输出信息。
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. 构建模型输入字典
操作步骤
准备输入数据。假设已创建一个包含所有模型输入数据的List,List中的元素为模型的每个输入的
numpy数据,且输入List的变量名为input_data_list。构建输入字典。
input_dict ={} for i_d, i_n in zip(input_data_list, input_names): input_dict[i_n] = i_d
4.1.4. 获取模型输出
操作步骤
执行以下命令,获取模型输出。
output_data = session.run([], input_dict )
4.2. 绑定输入输出设备
有多个模型且模型间存在数据拷贝时,绑定输入输出内存信息,可帮助减少模型之间不必要的输入输出数据拷贝。
MacaRT Python API也支持将模型的输入或输出绑定到可分页内存、固页内存和显存上。
4.2.1. 绑定输入输出数据到可分页内存上
操作步骤
操作步骤同 4.1.2 获取模型图的输入输出信息。
执行以下命令,使用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. 绑定输入输出数据到固页内存上
操作步骤
操作步骤同 4.1.2 获取模型图的输入输出信息。
执行以下命令,使用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. 绑定输入输出数据到显存上
操作步骤
操作步骤同 4.1.2 获取模型图的输入输出信息。
执行以下命令,使用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推理
操作步骤
准备输入数据。如下所示,其中
input_*代表由模型图的其中一个输入,且每一个输入数据的BatchSize都为N。input_data = [input_0,input_1,...,input_N]
操作步骤同 4.1.2 获取模型图的输入输出信息。
使用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设置
操作步骤
执行以下命令,配置
device_id来指定gpu_id,以管理多个GPU。provider_options=[{'device_id': your_gpu_id }]