onnx系列教程0x01—ONNXRuntime安装
1.版本选择
CPU版本:
pip install onnxruntime -i https://mirrors.aliyun.com/pypi/simple
GPU版本:
pip install onnxruntime-gpu[cuda,cudnn] -i https://mirrors.aliyun.com/pypi/simple
其实安装一个onnxruntime-gpu版本就行了,因为gpu版本已经包括了cpu的版本
cudnn的安装就是下载一些cudnn的.so文件,然后配置在系统变量中比
conda install -c nvidia cudnnfind ~/miniconda3 -name "libcudnn.so*"export LD_LIBRARY_PATH=$CONDA_PREFIX/lib:$LD_LIBRARY_PATH2.安装测试
下面是一些测试的代码
import onnxruntime as ortmodel="resnet152.onnx"so=ort.SessionOptions()so.log_severity_level=0session=ort.InferenceSession( model, sess_options=so, providers=["CUDAExecutionProvider" ])print(session.get_providers())print("inputs:", session.get_inputs()[0].shape)可以看到gpu的版本可以显示出多个provider
3.性能测试
onnxrunrime-gpu 和 onnxrunrime 不能同时安装??? 有点神奇
豆包说的,假的
因为onnxruntime需要用到gpu,也就是配套的cuda、cudnn都是需要的,所以我感觉在linux系统中配置要好一些,在windows里面配环境确实有点难搞。
小模型不能体现出模型的差异出来,所以还是要弄一个大的模型出来
下面的链接可以下载:
https://github.com/onnx/models/blob/main/validated/vision/classification/resnet/model/resnet152-v1-7.onnx
是resnet151模型
python代码:
import timeimport numpy as npimport onnxruntime as ortMODEL_PATH = "resnet152-v1-7.onnx" # 改成你的ONNX文件路径WARMUP_COUNT = 10TEST_COUNT = 100def create_input(session):"""根据模型输入信息自动生成随机数据""" input_data = {}for input_info in session.get_inputs(): shape = []for dim in input_info.shape: # 动态维度默认设置成1if isinstance(dim, int) and dim > 0: shape.append(dim)else: shape.append(1)if input_info.type == "tensor(float)": data = np.random.rand(*shape).astype(np.float32) elif input_info.type == "tensor(float16)": data = np.random.rand(*shape).astype(np.float16) elif input_info.type == "tensor(int64)": data = np.random.randint(0, 10, shape).astype(np.int64) elif input_info.type == "tensor(int32)": data = np.random.randint(0, 10, shape).astype(np.int32)else: raise ValueError("暂不支持的输入类型:" + input_info.type) input_data[input_info.name] = data print("输入名称:{},Shape:{},类型:{}".format( input_info.name, shape, input_info.type ) )return input_datadef test(session, input_data, name): # 预热for _ in range(WARMUP_COUNT): session.run(None, input_data) start = time.perf_counter()for _ in range(TEST_COUNT): session.run(None, input_data) end = time.perf_counter() total_time = end - start avg_time = total_time / TEST_COUNT print("\n{}测试结果".format(name)) print("总耗时:{:.4f} 秒".format(total_time)) print("平均耗时:{:.4f} 毫秒".format(avg_time * 1000)) print("每秒推理次数:{:.2f}".format(1 / avg_time))return avg_timeprint("ONNX Runtime版本:", ort.__version__)print("可用Provider:", ort.get_available_providers())# 创建CPU Sessioncpu_session = ort.InferenceSession( MODEL_PATH, providers=["CPUExecutionProvider"])# 使用CPU Session读取模型输入并生成随机数据input_data = create_input(cpu_session)# 测试CPUcpu_time = test( cpu_session, input_data,"CPU")# 判断GPU是否可用if"CUDAExecutionProvider"in ort.get_available_providers(): gpu_session = ort.InferenceSession( MODEL_PATH, providers=["CUDAExecutionProvider"] ) # 测试GPU gpu_time = test( gpu_session, input_data,"GPU" ) print("\n性能对比") print("GPU加速比:{:.2f} 倍".format(cpu_time / gpu_time))else: print("\n没有检测到CUDAExecutionProvider") print("请检查onnxruntime-gpu、CUDA和cuDNN是否安装正确")输出内容:
(base) xws@xws:~/projects/onnx$ python onnx_test.py ONNX Runtime版本: 1.28.0可用Provider: ['TensorrtExecutionProvider', 'CUDAExecutionProvider', 'CPUExecutionProvider']输入名称:data,Shape:[1, 3, 224, 224],类型:tensor(float)CPU测试结果总耗时:3.2703 秒平均耗时:32.7029 毫秒每秒推理次数:30.58GPU测试结果总耗时:0.6379 秒平均耗时:6.3792 毫秒每秒推理次数:156.76性能对比GPU加速比:5.13 倍
夜雨聆风