PC端配置ONNX和TensorFlow GPU环境学习笔记 - 实践版

PC端配置ONNX和TensorFlow GPU环境学习笔记 - 实践版

1. 深度学习模型格式与部署实践

1.1 在PC端运行ONNX模型的主要方法

  1. ONNX Runtime

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import 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
    • 适合快速部署和测试场景
  2. OpenVINO(Intel平台)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    from 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等)
  3. 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
    25
    import 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 模型格式对比(基于实践经验)

  1. 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环境
  2. 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. 模型转换注意事项

    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
  2. 模型优化和验证

    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的选择

  1. 使用TensorFlow 2.10.0(推荐方案,如需原生Windows支持)

  2. 使用WSL2运行更新版本的TensorFlow

  3. 使用tensorflow-cpu配合TensorFlow-DirectML-Plugin

  4. 环境准备

    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
  5. 版本冲突解决

    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.1
  6. GPU检测与验证

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    import 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 故障排除和性能优化

  1. 常见问题解决方案

    • 内存不足:启用显存动态增长
    • 驱动程序问题:更新到最新的NVIDIA驱动
    • 环境变量问题:检查CUDA和cuDNN路径配置
  2. 性能监控

    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. 实践经验总结

  1. Windows环境问题

    • 版本选择很关键:
      • TensorFlow 2.10.0 + CUDA 11.2 + cuDNN 8.1是Windows原生GPU支持的最后组合
      • 2.11.0及以上版本需要使用WSL2或DirectML方案
    • 环境变量配置复杂
    • 依赖冲突频繁
    • 调试和错误信息不清晰
  2. Ubuntu优势

    • CUDA工具链集成度高
    • 环境配置更简单
  3. 开发建议

    • 记录详细的环境搭建步骤
    • 定期备份工作环境
    • 优先选择Ubuntu进行深度学习开发

注:本笔记基于NVIDIA显卡在Windows 11和Ubuntu系统上的实际配置经验,包含了常见问题的解决方案和实用代码示例。最近更新:补充了TensorFlow版本与CUDA兼容性的重要说明。


PC端配置ONNX和TensorFlow GPU环境学习笔记 - 实践版
https://blakehansen130.github.io/2024/11/19/complete-revised-notes/
发布于
2024年11月19日
许可协议