PC端配置ONNX和TensorFlow GPU环境学习笔记 - 实践版
PC端配置ONNX和TensorFlow GPU环境学习笔记 - 实践版
1. 深度学习模型格式与部署实践
1.1 在PC端运行ONNX模型的主要方法
ONNX Runtime
1
2
3
4
5
6
7
8
9
10
11import onnxruntime as ort
# 加载模型
session = ort.InferenceSession("model.onnx")
# 获取输入名称
input_name = session.get_inputs()[0].name
# 准备输入数据并推理
inputs = {input_name: input_data}
results = session.run(None, inputs)- 优势:开源、高性能、使用简单
- 支持多平台:Windows、Linux、macOS
- 适合快速部署和测试场景
OpenVINO(Intel平台)
1
2
3
4
5
6
7
8
9from openvino.runtime import Core
# 加载并编译模型
core = Core()
model = core.read_model("model.onnx")
compiled_model = core.compile_model(model, "CPU")
# 进行推理
result = compiled_model.infer_new_request({"input_name": input_data})- 适合Intel硬件平台
- 对CPU进行了优化
- 支持多种设备(CPU、GPU、FPGA等)
TensorRT(NVIDIA平台)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25import tensorrt as trt
import pycuda.driver as cuda
import pycuda.autoinit
import numpy as np
# 创建TensorRT引擎
TRT_LOGGER = trt.Logger(trt.Logger.WARNING)
with open("model.engine", "rb") as f, trt.Runtime(TRT_LOGGER) as runtime:
engine = runtime.deserialize_cuda_engine(f.read())
# 创建执行上下文
context = engine.create_execution_context()
# 分配GPU内存
d_input = cuda.mem_alloc(input_data.nbytes)
d_output = cuda.mem_alloc(engine.get_binding_shape(1).size * input_data.dtype.itemsize)
bindings = [int(d_input), int(d_output)]
# 拷贝数据到GPU并执行推理
cuda.memcpy_htod(d_input, input_data)
context.execute_v2(bindings)
# 获取结果
output = np.empty(engine.get_binding_shape(1), dtype=np.float32)
cuda.memcpy_dtoh(output, d_output)- 针对NVIDIA GPU优化
- 支持模型量化和优化
- 性能最优但配置较复杂
1.2 模型格式对比(基于实践经验)
H5格式(Keras原生格式)
1
2
3
4
5
6# 加载H5模型
import tensorflow as tf
model = tf.keras.models.load_model('model.h5')
# 进行预测
predictions = model.predict(input_data)- 保持完整的模型信息和训练状态
- 适合继续训练和模型调优
- 支持TensorFlow的所有功能
- 在Windows上可能需要配置GPU环境
ONNX格式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18# 使用ONNX Runtime推理
import onnxruntime as ort
import numpy as np
# 创建推理会话
session = ort.InferenceSession("model.onnx",
providers=['CUDAExecutionProvider',
'CPUExecutionProvider'])
# 获取输入输出名称
input_name = session.get_inputs()[0].name
output_name = session.get_outputs()[0].name
# 准备输入数据
input_data = np.array([your_input_data], dtype=np.float32)
# 运行推理
results = session.run([output_name], {input_name: input_data})- 跨平台兼容性好
- 可以使用多种推理引擎
- 部署更加灵活
- 可能会有轻微的精度损失
1.3 模型部署到嵌入式设备的实践要点
模型转换注意事项
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17# 从H5转换到ONNX
import keras2onnx
import tf2onnx
# 方法1:使用keras2onnx
onnx_model = keras2onnx.convert_keras(model, model.name)
keras2onnx.save_model(onnx_model, 'model.onnx')
# 方法2:使用tf2onnx
import tensorflow as tf
# 保存为SavedModel格式
tf.saved_model.save(model, "saved_model_path")
# 转换为ONNX
# 使用命令行:
# python -m tf2onnx.convert --saved-model saved_model_path --output model.onnx模型优化和验证
1
2
3
4
5
6
7
8
9
10
11
12# ONNX模型验证
import onnx
# 加载并检查模型
model = onnx.load("model.onnx")
onnx.checker.check_model(model)
# 查看模型输入输出信息
for input in model.graph.input:
print(f"Input: {input.name}, Shape: {input.type.tensor_type.shape}")
for output in model.graph.output:
print(f"Output: {output.name}, Shape: {output.type.tensor_type.shape}")
2. TensorFlow GPU环境配置实践
2.1 Windows环境配置及问题解决
重要版本说明
- 从TensorFlow 2.11.0开始,Windows平台不再支持原生的CUDA构建
- TensorFlow 2.10.0是最后一个在Windows上原生支持GPU的版本
- 必须搭配CUDA 11.2
- 必须搭配cuDNN 8.1
- 不要使用更高版本的CUDA(如11.8),因为不兼容
Windows下使用GPU的选择
使用TensorFlow 2.10.0(推荐方案,如需原生Windows支持)
使用WSL2运行更新版本的TensorFlow
使用tensorflow-cpu配合TensorFlow-DirectML-Plugin
环境准备
1
2
3
4
5
6
7
8
9
10
11
12# 创建新的conda环境
conda create -n tf_gpu python=3.8
conda activate tf_gpu
# 安装TensorFlow
pip install tensorflow==2.10.0
# 安装匹配版本的依赖
pip install keras==2.10.0
pip install tensorboard==2.10.0
pip install tensorflow-estimator==2.10.0
pip install tensorflow-intel==2.10.0版本冲突解决
1
2
3
4
5
6
7
8# 检查已安装包的版本
pip list | findstr "tensorflow keras tensorboard tensorflow-estimator"
# 降级冲突包
pip install package_name==specific_version
# 例如:降级 werkzeug
pip install werkzeug==0.16.1GPU检测与验证
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15import tensorflow as tf
# 检查TensorFlow版本
print(tf.__version__)
# 列出可用的GPU设备
print(tf.config.list_physical_devices('GPU'))
# 检查CUDA是否可用
print(tf.test.is_built_with_cuda())
print(tf.test.is_gpu_available())
# 查看设备信息
from tensorflow.python.client import device_lib
print(device_lib.list_local_devices())
2.2 Ubuntu环境配置(推荐)
详情见《Python虚拟环境与深度学习环境配置详细笔记》,最终因为windows使用tensorflow太麻烦因此还是选择了ubuntu。
2.3 故障排除和性能优化
常见问题解决方案
- 内存不足:启用显存动态增长
- 驱动程序问题:更新到最新的NVIDIA驱动
- 环境变量问题:检查CUDA和cuDNN路径配置
性能监控
1
2
3
4
5
6
7
8
9
10
11
12# GPU使用情况监控
import GPUtil
import time
def monitor_gpu():
while True:
GPUtil.showUtilization()
time.sleep(1)
# 在另一个线程中运行监控
from threading import Thread
Thread(target=monitor_gpu).start()
3. 实践经验总结
Windows环境问题
- 版本选择很关键:
- TensorFlow 2.10.0 + CUDA 11.2 + cuDNN 8.1是Windows原生GPU支持的最后组合
- 2.11.0及以上版本需要使用WSL2或DirectML方案
- 环境变量配置复杂
- 依赖冲突频繁
- 调试和错误信息不清晰
- 版本选择很关键:
Ubuntu优势
- CUDA工具链集成度高
- 环境配置更简单
开发建议
- 记录详细的环境搭建步骤
- 定期备份工作环境
- 优先选择Ubuntu进行深度学习开发
注:本笔记基于NVIDIA显卡在Windows 11和Ubuntu系统上的实际配置经验,包含了常见问题的解决方案和实用代码示例。最近更新:补充了TensorFlow版本与CUDA兼容性的重要说明。
PC端配置ONNX和TensorFlow GPU环境学习笔记 - 实践版
https://blakehansen130.github.io/2024/11/19/complete-revised-notes/