前言
欢迎关注dotnet研习社,前面,我们介绍了ONNX Runtime 是什么,今天我们通过一个示例程序来学习,如何进行开发。
准备工作
环境准备
先用 pip 安装 PyTorch
pip install torch
如果你的电脑有 GPU,可装 torch 的 CUDA 版,比如:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
(CUDA 版本根据你本地显卡和 CUDA 驱动匹配。)
模型生成
先要有一个 ONNX 模型,例如:
- 一个最简单的
y = x * 2
线性模型。 - 或者 Python 用 PyTorch 训练个最简单的模型导出 ONNX。
下面是 Python 生成最小模型示例
# -*- coding: utf-8 -*-
# save_dummy.onnx: 输入一个 float 数组,输出它们乘以 2
import torch
import torch.nn as nn
class DoubleModel(nn.Module):
def forward(self, x):
return x * 2
model = DoubleModel()
x = torch.randn(1, 1, 5) # 假设输入长度5
torch.onnx.export(model, x, "double_model.onnx", input_names=["input"], output_names=["output"])
在终端执行:
python export_double_model.py
运行完后,你会得到一个 double_model.onnx
。
新建 C# Console 项目
这里用最简单的 ConsoleApp 演示,WinForms/WPF 只是多了 UI 部分,核心是一样的。
在项目里安装 NuGet 包
dotnet add package Microsoft.ML.OnnxRuntime
核心 C# 推理代码
Copy double_model.onnx文件到输出目录。
创建一个新文件 Program.cs
:
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.ML.OnnxRuntime;
using Microsoft.ML.OnnxRuntime.Tensors;
namespace OnnxRuntimeDemo
{
class Program
{
static void Main(string[] args)
{
// 加载 ONNX 模型
using var session = new InferenceSession("double_model.onnx");
// 构造输入数据:1 x 1 x 5
var inputData = new float[] { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f };
var tensor = new DenseTensor<float>(new[] { 1, 1, 5 });
for (int i = 0; i < inputData.Length; i++)
{
tensor[0, 0, i] = inputData[i];
}
// 创建输入
var inputs = new List<NamedOnnxValue>
{
NamedOnnxValue.CreateFromTensor("input", tensor)
};
// 推理
using IDisposableReadOnlyCollection<DisposableNamedOnnxValue> results = session.Run(inputs);
// 输出结果
var output = results.First().AsEnumerable<float>().ToArray();
Console.WriteLine("输入: " + string.Join(",", inputData));
Console.WriteLine("输出: " + string.Join(",", output));
}
}
}
完整示例文件
运行效果
说明 ONNX 模型加载成功,推理执行无误。
WinForms / WPF 怎么接?
在 WinForms 或 WPF 中也是一样:
- 只要把这段推理逻辑放到
Button.Click
事件里, - 或者封装成
OnnxPredictor
类, - 用文本框输入数据、用图表/标签显示输出即可。
关键点总结
✔ ONNX Runtime 是核心库:Microsoft.ML.OnnxRuntime
✔ 输入用 DenseTensor:注意 shape 要和训练时一致
✔ 输入名字对得上:要跟 Python 导出的 input_names
一致
✔ 跨平台可用:Windows、Linux、ARM 都能跑