如何用DeepSparse Engine API实现极速模型推理

【免费下载链接】deepsparse Sparsity-aware deep learning inference runtime for CPUs 【免费下载链接】deepsparse 项目地址: https://gitcode.com/gh_mirrors/de/deepsparse

DeepSparse Engine是一款专为CPU优化的稀疏感知深度学习推理运行时,能够在普通CPU上实现接近GPU的性能表现。本文将详细介绍如何使用DeepSparse Engine API构建高效的推理应用,帮助开发者轻松实现极速模型部署。

认识DeepSparse Engine

DeepSparse Engine是Neural Magic推出的高性能推理引擎,通过稀疏化技术和先进的调度算法,能够显著提升CPU上的模型推理速度。其核心优势在于:

  • 稀疏感知优化:专为稀疏模型设计,能充分利用模型中的稀疏性
  • 多流并发处理:支持多流推理,最大化CPU利用率
  • 自动硬件适配:智能检测CPU特性,自动选择最优执行路径
  • 简单易用API:提供直观的Python接口,轻松集成到现有应用

DeepSparse工作流程

图:DeepSparse模型优化与部署工作流程

快速开始:安装与环境准备

要使用DeepSparse Engine,首先需要安装DeepSparse库。推荐使用pip进行安装:

pip install deepsparse

如果需要从源码构建,可以克隆仓库:

git clone https://gitcode.com/gh_mirrors/de/deepsparse
cd deepsparse
pip install .

Engine API核心功能解析

DeepSparse Engine的核心是Engine类,位于src/deepsparse/engine.py。这个类提供了加载模型、配置推理参数和执行推理的完整功能。

1. 创建Engine实例

创建Engine是使用API的第一步,需要指定模型路径和推理参数:

from deepsparse import Engine

# 创建Engine实例
engine = Engine(
    model="path/to/model.onnx",  # ONNX模型路径或SparseZoo模型存根
    batch_size=1,                # 输入批次大小
    num_cores=None,              # 使用的CPU核心数,None表示自动检测
    num_streams=1,               # 并发流数量
    scheduler=None               # 调度器类型,None使用默认调度器
)

Engine构造函数支持多种模型来源,包括本地ONNX文件和SparseZoo模型(通过"zoo:"前缀指定)。

2. 关键属性与参数

Engine提供了丰富的属性来查询和配置推理环境:

  • batch_size: 获取当前设置的批次大小
  • num_cores: 获取使用的CPU核心数
  • num_streams: 获取并发流数量
  • input_shapes/output_shapes: 获取模型输入/输出形状
  • cpu_avx_type: 获取CPU支持的AVX指令集类型
  • cpu_vnni: 检查CPU是否支持VNNI指令集(量化模型加速)

3. 执行推理

Engine提供了多种推理方法,满足不同场景需求:

基本推理

使用run()方法执行基本推理:

import numpy as np

# 生成符合模型输入形状的随机数据
inputs = engine.generate_random_inputs()

# 执行推理
outputs = engine.run(inputs)

# 输出是numpy数组的列表,顺序与ONNX模型定义一致
print(f"输出数量: {len(outputs)}")
print(f"第一个输出形状: {outputs[0].shape}")
计时推理

使用timed_run()方法获取推理结果和耗时:

outputs, inference_time = engine.timed_run(inputs)
print(f"推理耗时: {inference_time:.4f}秒")
批处理推理

对于大批量输入,使用batched_run()方法自动拆分和合并批次:

# 准备一个大批次输入
large_inputs = [np.random.rand(100, 3, 224, 224).astype(np.float32)]

# 自动按engine.batch_size拆分处理
outputs = engine.batched_run(large_inputs)

高级配置与优化

1. 多流推理配置

通过设置num_streams参数启用多流推理,提高CPU利用率:

engine = Engine(
    model="path/to/model.onnx",
    batch_size=1,
    num_streams=4,  # 启用4个并发流
    scheduler="multi_stream"  # 使用多流调度器
)

2. 核心数优化

合理设置num_cores参数可以显著影响性能:

# 使用指定数量的核心
engine = Engine(model="path/to/model.onnx", num_cores=4)

# 查看实际使用的核心数
print(f"实际使用核心数: {engine.num_cores}")

3. 输入形状自定义

通过input_shapes参数自定义模型输入形状:

# 自定义输入形状
engine = Engine(
    model="path/to/model.onnx",
    input_shapes=[[1, 3, 256, 256]]  # 覆盖模型默认输入形状
)

性能监控与基准测试

DeepSparse提供了内置的基准测试功能,可以轻松评估推理性能。运行基准测试后,会生成详细的性能报告:

DeepSparse基准测试输出

图:DeepSparse基准测试JSON输出示例

可以通过以下代码执行基准测试:

from deepsparse.benchmark import benchmark_model

# 运行基准测试
results = benchmark_model(
    model="path/to/model.onnx",
    batch_size=1,
    num_cores=None,
    seconds_to_run=10
)

# 打印关键性能指标
print(f"吞吐量: {results['benchmark_result']['items_per_sec']:.2f} 项/秒")
print(f"延迟中位数: {results['benchmark_result']['median']:.2f} 毫秒")

实际应用示例

图像分类推理

以下是使用DeepSparse Engine进行图像分类的完整示例:

from deepsparse import Engine
import numpy as np
from PIL import Image
import torchvision.transforms as transforms

# 1. 创建Engine实例
engine = Engine(
    model="zoo:cv/classification/resnet_v1-50/pytorch/sparseml/imagenet/pruned-moderate",
    batch_size=1
)

# 2. 准备输入图像
preprocess = transforms.Compose([
    transforms.Resize(256),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])

image = Image.open("input_image.jpg")
input_tensor = preprocess(image).unsqueeze(0)  # 添加批次维度
inputs = [input_tensor.numpy()]

# 3. 执行推理
outputs, time = engine.timed_run(inputs)

# 4. 处理输出
predictions = np.argmax(outputs[0], axis=1)
print(f"预测结果: {predictions[0]}")
print(f"推理耗时: {time:.4f}秒")

常见问题与解决方案

输入数据格式问题

问题:推理时出现输入形状不匹配错误。

解决方案:使用engine.input_shapes查看模型期望的输入形状,确保输入数据匹配:

print("期望输入形状:", engine.input_shapes)

性能未达预期

问题:推理速度不如预期。

解决方案

  1. 检查CPU是否支持AVX2/AVX512指令集:print(engine.cpu_avx_type)
  2. 尝试调整num_streams参数,通常设置为CPU核心数的1-2倍
  3. 对于量化模型,确保CPU支持VNNI:print(engine.cpu_vnni)

模型加载失败

问题:无法加载ONNX模型。

解决方案

  1. 验证ONNX模型完整性:使用ONNX Runtime或Netron可视化工具检查模型
  2. 确保模型输入输出名称与代码中使用的一致:print(engine.input_names, engine.output_names)

总结

DeepSparse Engine API提供了简单而强大的接口,使开发者能够轻松在CPU上实现高性能的模型推理。通过合理配置Engine参数,充分利用CPU硬件特性,可以实现接近GPU的推理性能,同时降低部署成本。

无论是计算机视觉、自然语言处理还是其他深度学习任务,DeepSparse Engine都能提供极速、高效的推理能力,是CPU部署的理想选择。

要了解更多细节,请参考官方文档和源代码:

【免费下载链接】deepsparse Sparsity-aware deep learning inference runtime for CPUs 【免费下载链接】deepsparse 项目地址: https://gitcode.com/gh_mirrors/de/deepsparse

Logo

脑启社区是一个专注类脑智能领域的开发者社区。欢迎加入社区,共建类脑智能生态。社区为开发者提供了丰富的开源类脑工具软件、类脑算法模型及数据集、类脑知识库、类脑技术培训课程以及类脑应用案例等资源。

更多推荐