0%

推理

摘要

  • 深度学习模型部署 推理部分相关学习笔记

深度学习模型部署 推理

深度学习模型的部署推理是整个工作流的核心部分。推理过程将经过前处理的数据输入到模型中,并对模型输出进行后处理以获得最终结果。以下是推理阶段的主要步骤和实现方式。


推理的主要步骤

1. 加载模型

  • 根据部署环境,选择合适的模型格式和加载方式。
  • 常见模型格式:
    • PyTorch:.pt.pth
    • TensorFlow:.pb、SavedModel
    • ONNX:.onnx
    • TensorRT:.engine
    • OpenVINO IR:.xml + .bin

2. 准备推理环境

  • 确保运行时支持:
    • CPU:使用通用深度学习框架。
    • GPU:确保安装了合适的驱动和 CUDA/cuDNN 等加速库。
    • 专用硬件:TPU、FPGA、ASIC 需要匹配的 SDK。

3. 输入数据格式适配

  • 模型输入需要特定的格式(如 NCHWNHWC)。
  • 确保输入张量的形状、数据类型与模型要求一致。

4. 模型推理

  • 将输入数据传递给模型,执行前向计算。
  • 输出通常是概率分布、特征向量、分类结果等。

5. 后处理

  • 将模型的输出结果转换为易于理解的形式。
    • 分类模型:取最大概率的类别。
    • 目标检测模型:解码边界框,筛选高置信度结果。
    • NLP 模型:解析序列输出,转换为自然语言。

示例代码

以下是一个典型的推理示例,使用 PyTorch 和 ONNX Runtime。

1. PyTorch 推理

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
26
27
28
import torch
import torchvision.transforms as transforms
from PIL import Image

# 加载模型
model = torch.load("model.pth")
model.eval() # 设置为评估模式

# 前处理
def preprocess(image_path):
transform = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
image = Image.open(image_path).convert('RGB')
return transform(image).unsqueeze(0)

# 推理
def infer(image_path):
input_tensor = preprocess(image_path)
with torch.no_grad():
output = model(input_tensor)
_, predicted = torch.max(output, 1)
return predicted.item()

result = infer("test_image.jpg")
print(f"Predicted class: {result}")

2. ONNX Runtime 推理

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 onnxruntime as ort
import numpy as np
import cv2

# 加载模型
ort_session = ort.InferenceSession("model.onnx")

# 前处理
def preprocess(image_path):
image = cv2.imread(image_path)
image = cv2.resize(image, (224, 224))
image = image.astype(np.float32) / 255.0
image = (image - np.array([0.485, 0.456, 0.406])) / np.array([0.229, 0.224, 0.225])
image = np.transpose(image, (2, 0, 1)) # HWC -> CHW
return np.expand_dims(image, axis=0)

# 推理
def infer(image_path):
input_tensor = preprocess(image_path)
outputs = ort_session.run(None, {"input": input_tensor})
predicted_class = np.argmax(outputs[0])
return predicted_class

result = infer("test_image.jpg")
print(f"Predicted class: {result}")

推理平台和框架支持

1. 本地部署

  • PyTorch、TensorFlow:支持灵活开发,适合研究和小规模部署。
  • ONNX Runtime:跨平台、高性能,支持多种硬件加速。

2. 加速工具

  • NVIDIA TensorRT:GPU 推理加速。
  • OpenVINO:针对 Intel CPU、GPU 和 FPGA 的优化。
  • TVM:硬件无关的编译器。

3. 云端部署

  • AWS SageMaker、Google Vertex AI、Azure ML:一站式云部署。
  • 使用 TensorFlow Serving、TorchServe 进行 API 部署。

4. 边缘设备

  • TensorFlow Lite、PyTorch Mobile:优化后的轻量化模型。
  • 专用 SDK:如 NVIDIA Jetson、Coral Edge TPU。

推理优化

  1. Batch 推理

    • 合并多条输入数据,提升吞吐量。
    • 示例:
      1
      2
      batch_inputs = np.stack([input1, input2])
      outputs = model(batch_inputs)
  2. 量化

    • 将模型权重从 float32 转换为 int8float16,减少计算资源。
    • 工具:TensorRT、Post-Training Quantization。
  3. 动态尺寸支持

    • 部分模型支持动态输入形状,可适配不同大小的输入数据。
  4. 模型剪枝与蒸馏

    • 剪枝:移除冗余权重,减小模型规模。
    • 蒸馏:通过小模型学习大模型输出,提升小模型的表现。
  5. 硬件优化

    • 使用特定硬件的优化库(如 cuDNN、MKL-DNN)。

常见问题与解决

  1. 推理速度慢

    • 优化方法:
      • 使用批量推理。
      • 部署在支持硬件加速的设备上。
      • 使用 TensorRT 或 OpenVINO 优化。
  2. 内存不足

    • 解决方法:
      • 使用量化模型。
      • 减少输入批量大小。
      • 使用分布式推理。
  3. 结果不一致

    • 确保前处理、后处理与训练时一致。
    • 检查不同推理框架间的实现差异(如 ONNX 转换时可能丢失操作)。

如果有更具体的部署场景(如特定框架或硬件),可以进一步提供建议!

感谢老板支持!敬礼(^^ゞ