.NET 平台上的开源模型训练与推理进展
.NET 平台上的开源模型训练与推理进展
作者:痴者工良
电子书仓库:https://github.com/whuanle/cs_pytorch
Maomi.Torch 项目仓库:https://github.com/whuanle/Maomi.Torch
一、 .NET AI 生态概述
背景介绍
.NET 生态系统已经成为支持多种编程语言、多种平台和大量开发工具的强大生态系统。最近几年,随着人工智能和机器学习的迅猛发展,.NET 平台也相应地发展出了一系列支持模型训练、推理和部署的工具和框架,这使得开发者能够在熟悉的 .NET 环境中更高效地进行 AI 应用开发。
.NET AI 生态图
机器学习和数据科学库(Machine Learning and Data Science Libraries)
MathNet.Numerics
支持: 社区支持,成熟稳定。
Star: 3.6k
Github: https://github.com/mathnet/mathnet-numerics
NET Numerics 是 Math.NET 计划的数值基础,旨在为科学、工程和日常使用中的数值计算提供方法和算法。涵盖的主题包括特殊函数,线性代数,概率模型,随机数,统计,插值,积分,回归,曲线拟合,积分变换 (FFT) 等。
深度学习框架(Deep Learning Frameworks)
ML.NET
支持: Microsoft 官方支持,成熟的项目,生态强势、社区活跃、应用广泛。
Star: 9.1k
Github: https://github.com/dotnet/machinelearning
ML.NET 是一个跨平台的开源机器学习框架,专为 .NET 开发者设计,提供丰富的工具和API,涵盖模型训练、评估和部署等整个流程,支持回归、分类、聚类及自然语言处理等多种任务,帮助开发者在熟悉的 .NET 环境中高效构建和优化 AI 解决方案。
TensorFlow.NET
支持: SciSharp 支持,成熟的项目,社区生态和应用领域都很好。
Star: 3.3k
Github: https://github.com/SciSharp/TensorFlow.NET
TensorFlow.NET 的目标是在 C# 中实现全面的 TensorFlow API,便于 .NET 开发者开发、训练和部署跨平台的机器学习模型。
TorchSharp
支持: dotnet 开源社区支持,不成熟,生态较差、跟不上发展、应用领域太少、应用开发局限。
Star: 1.5k
Github: https://github.com/dotnet/TorchSharp
TorchSharp 通过绑定 libtorch 实现利用与 Pytorch 类似功能的深度学习框架。
AI 推理平台和工具(AI Inference Platforms and Tools)
ONNX Runtime
支持: Microsoft 官方支持,成熟的项目,生态强势、社区活跃、应用广泛,支持 C#、C++、Python 等。
Star: 16k
Github: https://github.com/microsoft/onnxruntime
ONNX 运行时是一个跨平台的推理和训练机器学习加速器,可以提供更快的客户体验和更低的成本,它能够通过灵活的接口集成特定硬件库,支持的模型包括来自 PyTorch、TensorFlow/Keras、TFLite 和 Scikit-Learn 等框架。
其它
LLamaSharp: https://github.com/SciSharp/LLamaSharp
OllamaSharp: https://github.com/awaescher/OllamaSharp
AI SDK 和 框架(AI SDKs and Frameworks)
Semantic Kernel
社区:Microsoft 官方支持,生态非常好,功能强劲,支持 C#、Python 等语言。
Star: 23k
Github: https://github.com/microsoft/semantic-kernel
Semantic Kernel是一个 SDK,它集成了大型语言模型 (LLM) ,如 OpenAI、 Azure OpenAI 和 Hugging Face。
kernel memory
社区:Microsoft 官方支持,生态较好,功能强劲。
Star: 1.8k
Github: https://github.com/microsoft/kernel-memory
此存储库提供了特定 AI 和 LLM 应用场景中的 Memory 的最佳实践和参考实现,主要包括文档处理、内容检索、RAG 等能力。
AI 应用(AI Application)
AntSK : https://github.com/AIDotNet/AntSK
fast-wiki: https://github.com/AIDotNet/fast-wiki
二、TorchSharp
TorchSharp简介
TorchSharp 是由 .NET 开源基金会主导开发的项目,旨在为 .NET 社区带来 PyTorch 类似的深度学习开发体验,目前主要在主要提供图像识别领域接口,在自然语言处理、语音识别和合成领域没有成熟的案例。
为什么使用 PyTorch
- 目前 Pytorch 是 AI 社区中使用最广泛的深度学习框架,有强大的社区支持和丰富的资源,包括教程、示例和预训练模型。
- 拥有丰富的生态系统和工具,如 torchvision、torchaudio 和 torchtext,用于各种数据处理任务。
- Pytorch 拥有高度模块化和可扩展的设计,使其易于研究和开发。
- 与其他流行框架(如 TensorFlow、Onnx Runtime)的互操作性较强,方便迁移和集成。
- 深入的硬件支持,从 GPU 到 TPU,再到基于 AI 的专用加速器。
- 被许多世界顶尖的研究机构和工业界公司使用和认可,确保其前沿技术和稳定性。
在主流 AI 模型仓库中大多数 Pytorch 格式的模型。
https://www.modelscope.cn/models
Pytorch 和 TorchSharp 对比
Pytorch 能力
计算机视觉
视觉检测跟踪
、光学字符识别
、人脸人体
、视觉分类
、视觉编辑
、视觉分割
、视觉生成
、视觉表征
、视觉评价
、底层视觉
、三维视觉
、基础模型应用
、自然语言处理
文本分类
文本生成
、分词
、命名实体识别
、翻译
、文本摘要
、句子相似度
、预训练
、自然语言推理
、文本纠错
、文本向量
、特征抽取
、情感分析
、关系抽取
、零样本分类
、表格问答
、问答
、词性标注
、实体分类
、序列标注
、任务型对话
语音
语音识别
、语音合成
、语音唤醒
、语音降噪
、回声消除
、语音分离
、音频分类
、音频生成
、说话人确认
、说话人日志
、标点预测
、时间戳预测
、语音端点检测
、困惑度计算
、语音语种识别
、音频量化编码
、音视频语音识别
、情绪识别
、逆文本正则化
对比
Pytorch
- 计算机视觉(Computer Vision)
- 自然语言处理 (NLP)
- 生成型人工智能(Generative AI)
- 图形机器学习(Graph Machine Learning)
TorchSharp
- 计算机视觉(Computer Vision)
- 其它能力 TorchVision、TorchAudio、TorchScript 功能不完善,案例非常少。
TorchSharp 进行模型训练的过程
A[数据收集] --> B[数据准备]
B --> C[特征工程]
C --> D[模型选择]
D --> E[模型训练]
E --> F[模型评估]
F --> G[输出模型]
subgraph 训练
A
B
C
D
E
F
end
数据集
├─test
│ ├─airplane
│ ├─automobile
│ ├─bird
│ ├─cat
│ ├─deer
│ ├─dog
│ ├─frog
│ ├─horse
│ ├─ship
│ └─truck
└─train
│ ├─airplane
│ ├─automobile
│ ├─bird
│ ├─cat
│ ├─deer
│ ├─dog
│ ├─frog
│ ├─horse
│ ├─ship
│ └─truck
定义神经网络架构
根据需求设计神经网络架构或使用开源网络架构。
案例代码教程地址:https://torch.whuanle.cn/02.start/02.start_torch.html
using TorchSharp.Modules;
using static TorchSharp.torch;
using nn = TorchSharp.torch.nn;
public class NeuralNetwork : nn.Module<Tensor, Tensor>
{
// 传递给基类的参数是模型的名称
public NeuralNetwork() : base(nameof(NeuralNetwork))
{
flatten = nn.Flatten();
linear_relu_stack = nn.Sequential(
nn.Linear(28 * 28, 512),
nn.ReLU(),
nn.Linear(512, 512),
nn.ReLU(),
nn.Linear(512, 10));
// C# 版本需要调用这个函数,将模型的组件注册到模型中
RegisterComponents();
}
Flatten flatten;
Sequential linear_relu_stack;
public override Tensor forward(Tensor input)
{
// 将输入一层层处理并传递给下一层
var x = flatten.call(input);
var logits = linear_relu_stack.call(x);
return logits;
}
}
TorchSharp 自带的网络架构:
alexnet
googlenet
inception_v3
mobilenet_v2
mobilenet_v3_large
mobilenet_v3_small
resnet18
resnet34
resnet50
wide_resnet50_2
resnext50_32x4d
resnet101
resnext101_32x8d
resnext101_64x4d
wide_resnet101_2
resnet152
vgg11
vgg11_bn
vgg13
vgg13_bn
vgg16
vgg16_bn
vgg19
vgg19_bn
训练模型
static void Train(DataLoader dataloader, NeuralNetwork model, CrossEntropyLoss loss_fn, SGD optimizer)
{
var size = dataloader.dataset.Count;
model.train();
int batch = 0;
foreach (var item in dataloader)
{
var x = item["data"];
var y = item["label"];
// 第一步
// 训练当前图片
var pred = model.call(x);
// 通过损失函数得出与真实结果的误差
var loss = loss_fn.call(pred, y);
// 第二步,反向传播
loss.backward();
// 计算梯度并优化参数
optimizer.step();
// 清空优化器当前的梯度
optimizer.zero_grad();
// 每 100 次打印损失值和当前训练的图片数量
if (batch % 100 == 0)
{
loss = loss.item<float>();
// Pytorch 框架会在 x.shape[0] 存储当前批的位置
var current = (batch + 1) * x.shape[0];
Console.WriteLine("loss: {loss.item<float>(),7} [{current,5}/{size,5}]");
}
batch++;
}
}
TorchSharp 案例
深度学习基础知识和 TorchSharp 教程。
https://github.com/dotnet/TorchSharp/network/dependents
使用 TorchSharp 开的项目。
https://github.com/IntptrMax/YoloSharp
用 TorchSharp 实现 C # 中的 Yolo 模型,支持 yolov8、yolov11,可以直接使用
.pt
模型。
https://github.com/IntptrMax/StableDiffusionSharp/tree/master/StableDiffusionSharp
能够加载 StableDiffusion 的模型(safetensors 格式)并工具提示词生成图像。
未来展望
计算机视觉
- 图像分类
- 目标检测和图像分割
- 物体追踪、人体(身体、面部、手势)分析
- 图像处理、图像生成
语音及音频处理
这类模型使用音频数据来训练模型,这些模型可以识别声音、生成音乐。
- 语音识别
- 语音合成
自然语言处理
大语言模型。
- 机器理解
- 机器翻译
- 语言建模
三、ML.NET简介
ONNX Runtime 是一个高性能推理引擎,用于执行通过 ONNX 格式表示的机器学习模型,提供数据处理、模型训练、模型评估和推理等功能,支持多种机器学习任务。
ML.NET 是一个开源的跨平台机器学习框架,专门为 .NET 开发者提供易用的工具和算法库来构建和部署机器学习模型。
优点:
- 易于集成 :ML.NET 可以轻松集成到现有的 .NET 应用程序中,无需离开 .NET 环境。
- 跨平台支持 :ML.NET 支持在 Windows、Linux 和 macOS 上运行,具备良好的跨平台兼容性。
- 对性能要求不高 :ML.NET 针对性能进行了优化,可以在性能不高的环境中运行,适合各种应用场景。
- CPU 和 GPU 支持 :ML.NET 可以在 CPU 上运行,也可以利用 GPU 进行加速,适合不同硬件条件的应用。
- 嵌入式设备支持 :ML.NET 可以在一些嵌入式设备上运行,提供更广泛的硬件兼容性。
- 扩展性 :ML.NET 允许集成其它机器学习库(如 TensorFlow 和 ONNX),使得开发者可以使用最先进的机器学习技术。
- 自动化机器学习 :ML.NET 包含 AutoML 功能,可以自动化地选择和调优模型,减少了机器学习过程中的人工干预。
- 丰富的算法支持 :ML.NET 支持多种机器学习算法,包括分类、回归、聚类、推荐等多类型算法,满足不同的业务需求。
- 易于使用 :提供了丰富的 API 和文档,开发者可以快速上手,学习曲线相对较低。
- 社区支持 :作为一个开源项目,ML.NET 拥有一个活跃的社区,开发者可以获得支持并参与到项目的改进中。
F[模型文件] --> G[载入模型]
G --> H[输入数据准备]
H --> I[进行推理]
I --> J[输出结果处理]
subgraph 推理
G
H
I
J
end
功能
- 分类(Classification)
- 回归(Regression)
- 聚类(Clustering)
- 推荐系统(Recommendation)
- 排序(Ranking)
- 异常检测(Anomaly Detection)
- 图像处理(Image Processing)
- 文本处理(Text Processing)
- 时间序列预测(Time Series Forecasting)
案例
ML.NET 官方示例
官方仓库: https://github.com/dotnet/machinelearning-samples
- 情绪分析: 使用二进制分类算法分析客户评论情感。
- 产品推荐: 使用矩阵分解算法根据购买历史推荐产品。
- 价格预测: 使用回归算法预测出租车费用。
- 客户细分: 使用聚类分析算法识别客户组。
- 目标检测: 使用 ONNX 模型识别图像中的对象。
- 欺诈检测: 使用二进制分类算法检测欺诈交易。
- 销售高峰检测: 使用异常情况检测模型识别销售高峰。
- 图像分类: 使用 TensorFlow 模型对图像分类。
- 销售预测: 使用回归算法预测未来销量。
Phi 系列模型案例
项目地址: https://github.com/microsoft/PhiCookBook
部署推理 Phi-4-mini-instruct-onnx (32B,int4 量化),CPU:AMD 8745H,内存 32GB。
Hardware | ONNX | PyTorch | speedup |
---|---|---|---|
RTX 4090 GPU | int4: 260.045 tokens/sec fp16: 97.463 tokens/se fp32: 19.320 tokens/sec | fp16: 43.957 tokens/sec | 5x(fp16) |
Intel Xeon Platinum 8272CL CPU | int4: 16.89 tokens/sec | fp32: 1.636 tokens/sec | 10x |
Intel Xeon Platinum 8573B CPU | int4: 23.978 tokens/sec | fp32: 4.479 tokens/sec | 5.35X |
AMD EPYC 7763v CPU | int4: 19.884 tokens/sec | fp32: 1.599 tokens/sec | 12.4x |
Intel Core Ultra 7 165H Laptop CPU | int4: 4.863 tokens/sec | fp32: 1.699 tokens/sec | 2.8x |
Intel i7 processor | int4: 3.474 tokens/sec fp32: 1.800 tokens/sec | fp32: 0.702 tokens/sec | 4.85x |
基于 ML.NET 的开源项目
开源项目:
https://github.com/gerardo-lijs/MachineLearning-ObjectDetect-WPF
https://github.com/dme-compunet/YoloSharp
https://github.com/NickSwardh/YoloDotNet
.NET 平台上的开源模型训练与推理进展的更多相关文章
- 我发起了一个 .Net Core 平台上的 开源项目 ShadowDomain 用于 热更新
大家好, 我发起了一个 .Net Core 平台上的 开源项目 ShadowDomain 用于 热更新 . 简单的说, 原理就是 类似 Asp.net 那样 让 当前 WebApp 运行在一个 A ...
- 我发起了一个 .Net 平台上的 开源项目 知识图谱 Babana Map 和 文本文件搜索引擎 Babana Search
起因 也是 前几天 有 网友 在 群 里发了 知识图谱 相关的文章, 还有 有 网友 问起 NLog -> LogStash -> Elastic Search 的 问题, ...
- 【翻译】借助 NeoCPU 在 CPU 上进行 CNN 模型推理优化
本文翻译自 Yizhi Liu, Yao Wang, Ruofei Yu.. 的 "Optimizing CNN Model Inference on CPUs" 原文链接: h ...
- ML.NET 示例:图像分类模型训练-首选API(基于原生TensorFlow迁移学习)
ML.NET 版本 API 类型 状态 应用程序类型 数据类型 场景 机器学习任务 算法 Microsoft.ML 1.5.0 动态API 最新 控制台应用程序和Web应用程序 图片文件 图像分类 基 ...
- 如何对SAP Leonardo上的机器学习模型进行重新训练
Jerry之前的两篇文章介绍了如何通过Restful API的方式,消费SAP Leonardo上预先训练好的机器学习模型: 如何在Web应用里消费SAP Leonardo的机器学习API 部署在SA ...
- 课程报名 | 基于模型训练平台快速打造 AI 能力
我们常说的 AI 通用能力往往不针对具体的行业应用,而是主要解决日常或者泛化的问题,很多技术企业给出的方案是通用式的,比如通用文字识别,无论识别身份证.驾驶证.行驶证等,任何一张图片训练后的模型都会尽 ...
- 【实践】如何利用tensorflow的object_detection api开源框架训练基于自己数据集的模型(Windows10系统)
如何利用tensorflow的object_detection api开源框架训练基于自己数据集的模型(Windows10系统) 一.环境配置 1. Python3.7.x(注:我用的是3.7.3.安 ...
- GitHub上YOLOv5开源代码的训练数据定义
GitHub上YOLOv5开源代码的训练数据定义 代码地址:https://github.com/ultralytics/YOLOv5 训练数据定义地址:https://github.com/ultr ...
- 在OpenShift平台上验证NVIDIA DGX系统的分布式多节点自动驾驶AI训练
在OpenShift平台上验证NVIDIA DGX系统的分布式多节点自动驾驶AI训练 自动驾驶汽车的深度神经网络(DNN)开发是一项艰巨的工作.本文验证了DGX多节点,多GPU,分布式训练在DXC机器 ...
- Composite C1是一个.Net平台上开源专业的CMS开源项目
CompositeC1 4 发布 Composite C1是一个.Net平台上开源专业的CMS开源项目,很多的功能用户界面,面向任务的支持与各种工具协作.当编辑内容时在用户端体验很友好.编辑器与开发者 ...
随机推荐
- MySQL:执行流程
- Q:jar包启动脚本备份
jarServer.sh #!/bin/bash #APP_NAME必须配置. cd `dirname $0` cd .. DEPLOY_DIR=`pwd` APP_HOME=$DEPLOY_DIR/ ...
- Kyuubi支持Iceberg配置
一.简述 Kyuubi调用Spark来查询iceberg表,修改Spark配置信息即可. 二.服务配置 1.上传jar包到Kyuubi server节点 可以选择emr spark组件后,按照配置组( ...
- Netty高级使用与源码详解
粘包与半包 粘包现象 粘包的问题出现是因为不知道一个用户消息的边界在哪,如果知道了边界在哪,接收方就可以通过边界来划分出有效的用户消息. 服务端代码 public class HelloWorldSe ...
- jenkins+svn+tomcat
1.安装插件即可在源码管理中看见svn的选项subversion2.源码管理中配置svn的工程地址 3.点击Credentials的[添加]配置svn的用户名密码,完成后选取即可 4.配置构建触发器, ...
- go实现设计模式(1)——简介
六大原则 开闭原则(Open Close Principle) 对扩展开放,对修改关闭.对程序进行拓展时,尽量不去修改原有的代码,应该通过扩展实体的行为来实现. 里氏替换原则(Liskov Subst ...
- GIT如何进行团队协作
加入其他开发成员.修改代码并提交 选择库点击管理 点击添加成员邀请用户 以下三种方式都行 加入后如下 第二人如何进行修改文件: 在文件夹中创建本地库git init 建立远程连接 git remote ...
- vim编译和安装clang_complete插件
今天找到一个插件clang_complete可以进行语法补全,可能不是很好用.但是vim上用应该也差不多了 全文按照这个链接去操作, configure的时候我配置的目录是/usr/bin/vimv8 ...
- js提示Cannot read property ‘replace‘ of undefined
JS提示Cannot read property 'replace' of undefined 出现这个错误的原因一般是传的参数为null 在传参之前加个是否为null的判断可以解决异常.
- 【Unity】热更新原理与Xlua配置
[Unity]热更新原理与 Xlua 配置 热更新 直接理解即是让代码可以像资源包一样被运行时更新.当然它其实还一个名称叫热修复,即实现不重新打包项目也能把 Bug 修好,这也正是它常用的地方. 原理 ...