使用 C# 和 ONNX 來玩转Phi-3 SLM

news/2025/3/18 3:20:06/文章来源:https://www.cnblogs.com/shanyou/p/18342014

Phi3getstarted

LLM 席卷世界刷新 AI 的认知之后,由于 LLM 需要的硬件要求实在太高,很难在普通设备上运行,因此 SLM 逐漸受到重視,Phi-3 SLM 是由 Microsoft 所开发的模型,可以在你的电脑、手机等设备来运行,小型语言模型 (SLM) 和 ONNX 的结合改变了 AI 互操作性的游戏规则。让我们展示如何在使用 C# 和 ONNX 的 .NET 应用程序中利用 Phi-3 模型的强大功能,微软在github上有个Microsoft Phi-3 Cookbook。

Phi-3 SLM介绍
Phi 系列的模型是由 Microsoft 所推出的 SLM (Small Language Model,小型语言模型),而 Phi-3 SLM 则是目前最新的版本,强调在语言理解、推理、数学及写程式等能力,且在执行效能与能力上做了一定程度的平衡,让我们有机会能够将语言模型放到使用者的设备上运行。

Phi-3 模型(包括 Phi-3-mini、Phi-3-small 和 Phi-3-medium)也针对 ONNX Runtime 进行了优化,不仅支持在 Windows 运行,也能跨平台,甚至也针对 NVIDIA GPU 进行了优化,让这个模型更加灵活且具可移植性。

ONNX Runtime简介

ONNX 或开放神经网络交换是一个开放的标准,用于操作机器学习模型,并在不同的框架间进行互操作,允许 AI 模型在不同的框架和硬件之间具有可移植性和互操作性。它使开发人员能够将同一模型与各种工具、运行时和编译器一起使用,使其成为 AI 开发的基石。ONNX 支持广泛的运营商并提供可扩展性,这对于不断发展的 AI 需求至关重要。

ONNX Runtime 则是跨平台的机器学习模型加速器,具有弹性界面来整合硬件特定连结库。 ONNX Runtime 可以搭配来自 PyTorch、Tensorflow/Keras、TFLite、 scikit-learn 和其他架构的模型,更详细信息请参阅 ONNX Runtime 文件

本地 AI 开发从 ONNX 中受益匪浅,因为它能够简化模型部署并增强性能。ONNX 为机器学习模型提供了一种通用格式,方便了不同框架之间的交流,并针对各种硬件环境进行了优化。

对于 C# 开发人员来说,这特别有用,因为我们有一组专门为处理 ONNX 模型而创建的库。示例:Microsoft.ML.OnnxRuntime。而关于ONNX Runtime的Generative AI.NET库,会有以下四个套件,分别的用途:

  1. Microsoft.ML.OnnxRuntimeGenAI:
    • 这是 ONNX Runtime 的通用套件,包含运行 ONNX 模型所需的核心功能
    • 支持 CPU 运行,并且可以扩展支持其他硬件加速(例如 GPU)
  2. Microsoft.ML.OnnxRuntimeGenAI.Managed:
    • 这是完全托管的版本,适用于纯 .NET 环境
    • 不依赖原生程式库,确保跨平台的一致性,适合在不需要特定硬件加速的场景下使用
  3. Microsoft.ML.OnnxRuntimeGenAI.Cuda:
    • 这个版本专门针对使用 NVIDIA CUDA GPU 进行硬件加速
    • 适合需要高性能运算的深度学习模型,在 NVIDIA GPU 上可获得显著的性能提升
  4. Microsoft.ML.OnnxRuntimeGenAI.DirectML:
    • 这个版本利用 Microsoft 的 DirectML API,专 Windows 平台设计
    • 支持多种硬件加速设备,包括 NVIDIA 和 AMD GPU,适用於 Windows 环境中的高性能运算需求

这些套件的主要差别在于它们针对不同的硬件加速需求和环境进行优化,选择哪个套件取决于你的应用场景和硬件设置。 一般来说,纯 .NET环境可使用Managed版本,如有GPU且需要用到GPU加速,则选择CUDA或DirectML版本。

从 HuggingFace 下载 LLM 模型

目前 Phi-3 有以下几种可以下载:

  • Phi-3 Mini
    • Phi-3-mini-4k-instruct-onnx (cpu, cuda, directml)
    • Phi-3-mini-4k-instruct-onnx-web(web)
    • Phi-3-mini-128k-instruct-onnx (cpu, cuda, directml)
  • Phi-3 Small
    • Phi-3-small-8k-instruct-onnx (cuda)
    • Phi-3-small-128k-instruct-onnx (cuda)
  • Phi-3 Medium
    • Phi-3-medium-4k-instruct-onnx (cpu, cuda, directml)
    • Phi-3-medium-128k-instruct-onnx (cpu, cuda, directml)

上面的模型名称中,会标注 4k、8k 和 128k,这是表示能组成上下文的 Token 长度,意思就是运行 4k 的模型所需要的资源较少,而 128k 则是能支持更大的上下文长度。我们可以简单把 HuggingFace 当成一个像是 GitHub 的地方,里面存放着各种 Model 的资源,我们可以通过 git 的指令来下载 HuggingFace 上的模型。下载之前,请先确认你的环境有安装 git-lfs,你可以使用 指令git lfs install进行安装。

假设我们要下载的模型是 microsoft/Phi-3-mini-4k-instruct-onnx,下载指令就会试如下:

git clone https://huggingface.co/microsoft/Phi-3-mini-4k-instruct-onnx

使用 ONNX 模型的示例控制台应用程序

在 C# 应用程序中将模型与 ONNX 一起使用的主要步骤是:

  • 存储在 modelPath中的 Phi-3 模型被加载到 Model 对象中。
  • 然后,该模型用于创建一个模型,该模型将负责将我们的文本输入转换为模型可以理解的Tokenizer格式。

例如,这是来自 /src/LabsPhi301/Program.cs 的聊天机器人实现。

  • 聊天机器人在一个连续的循环中运行,等待用户输入。
  • 当用户键入问题时,该问题将与系统提示相结合,形成一个完整的提示。
  • 然后,将完整的提示标记化并传递给 Generator 对象。
  • 生成器配置了特定参数,一次生成一个令牌的响应。
  • 每个令牌都被解码回文本并打印到控制台,形成聊天机器人的响应。
  • 循环将继续进行,直到用户决定通过输入空字符串退出。

image

代码中,主要分成三个部分:

  • 加载模型:通过类Model来加载模型,并通过类Tokenizer来将文字转换成 Token
  • 设定 Prompt:设定 System Prompt 和 User Prompt,并将两者组合成完整的 Prompt
  • 一问一答:透过 类别来生成响应,并将生成的 Token 解码成文字输出Generator

在设定的参数时,会通过类别来做设定,这里我们只设定了和两个参数, 是生成响应的最大长度, 则是控制生成响应的多样性,而ONNX Runtime所提供的设定参数还相当多,完整参数列表请参考官方文件


C# ONNX 和 Phi-3 和 Phi-3 Vision

Phi-3 Cookbook 存储库展示了如何利用这些强大的模型在 .NET 环境中执行问答和图像分析等任务。它包括演示如何在 .NET 应用程序中使用 Phi-3 mini 和 Phi-3-Vision 模型的实验室和示例项目。

项目 描述
实验室Phi301 这是一个示例项目,它使用本地 phi3 模型来提出问题。该项目使用库Microsoft.ML.OnnxRuntime 加载本地 ONNX Phi-3 模型。
实验室Phi302 这是一个使用Semantic Kernel实现控制台聊天的示例项目。
实验室Phi303 这是一个使用本地 phi3 视觉模型来分析图像的示例项目。该项目使用库Microsoft.ML.OnnxRuntime加载本地 ONNX Phi-3 Vision 模型。
实验室Phi304 这是一个使用本地 phi3 视觉模型来分析图像的示例项目。该项目使用库Microsoft.ML.OnnxRuntime加载本地 ONNX Phi-3 Vision 模型。该项目还提供了一个菜单,其中包含与用户交互的不同选项。


总体测试下来,用英文对话可以很正确的回答问题,但改用中文的时候,会有许多奇妙的状况发生。 不过这也是可以预期的,毕竟这种 SLM 模型,基本上都是使用英文作为训练材料,所以对于中文的处理能力就会比较弱。 或许之后可以通过 Fine-tuning 的方式,来提升中文的处理能力,可以再研究看看。

若要了解有关 .NET 和 AI 的详细信息,请查看 .NET 8 和 AI 入门使用新的快速入门教程中的其他 AI 示例。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/777798.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

到底什么是@RestController

@RestController是Spring框架的一个注解,通常用于标识一个类是RESTful服务的Controller。 @RestController经常用来处理HTTP请求,是SpringMVC中用于构建RESTful Web服务的注解,是@Controller注解的变体 通过@RestController注解,SpringMVC可以识别出这个类是一个控制器这个…

【已解决】戴尔 Inspiron 5457 和 5557 启动报错:Invalid configuration information - please run SETUP program.

场景 我使用的是戴尔15-5557的笔记本电脑,在某次开机的时候系统提示:Invalid configuration information - please run SETUP program.虽然的点击Continue可以正常进入系统,但是每次开机都要来上这么一下真的很烦人,于是想着解决一下。 试错过程 1. BIOS调整刚开始以为是自…

6-3使用GPU训练模型

当参数迭代过程成为训练时间的主要瓶颈时,我们通常的方法是应用GPU来进行加速。深度学习的训练过程常常非常耗时,一个模型训练几个小时是家常便饭,训练几天也是常有的事情,有时候甚至要训练几十天。 训练过程的耗时主要来自于两个部分,一部分来自数据准备,另一部分来自参…

从 0 开始安装和运行 Cangjie (仓颉)

在 Windows 上运行你的第一个仓颉应用程序标准方法 参照 配置开发环境 的描述,下载 Cangjie for DevEco Studio 插件 DevEco Studio NEXT Developer Beta2-Cangjie Plugin(5.0.3.500)。然后在 DevEco Studio NEXT Developer Beta2 中从本地磁盘安装插件,选择下载好的 "d…

启动静态文件中间件

在启动项 Program.cs 文件中添加//app.UseStaticFiles(); // 启动静态文件中间件,默认访问wwwroot app.UseStaticFiles(new StaticFileOptions() {//修改默认访问地址为MyStaticFiles文件FileProvider = new PhysicalFileProvider(Path.Combine(builder.Environment.ContentRoo…

变异系数在fNIRS数据分析中有效性讨论

问题变异系数又称CV,它是无量纲的,定义为概率分布离散程度的归一化程度。在概率论中常常用来作为比较两组数据离散程度的指标,其在fNIRS信号这类连续信号中常常用来检测通道的信号质量好坏,阈值包括0.1、0.15和0.25等,阈值越大越宽松,当某个通道的CV值超过设定的阈值时判…

使用python对Excel表格某个区域保存为图片

实际工作中,我们经常会把表格某个区域(如:A1:F5)或某个图形保存为图片,如何用python自动做到这一点?不知屏幕前的小伙伴有没有遇到过类似的需求,此刻脑海里有木有一丢丢思路。python操作excel的第三方库有很多,个个都有各自的绝招和擅长的应用场景,简单罗列一下:pye…

位段 -- 内存布局详解-浅谈C语言

目录位段的介绍位段使用示例:位段的内存分配Example内存分配解析: ## 位段 位段的介绍位段(二进制位):就是按位存储位段(bit-field)是C语言中的一种特殊数据类型,它允许将一个字节分成几个部分,并为每个部分指定特定的位数,以便在内存中存储和访问这些部分。 其中位段相…

chrome查看web socket消息

1. 打开目标页面 2. f12--》网络--》WS,然后刷新页面( 如果不刷页面,就会看不到 websocket 请求,因为 websocket 是长连接,页面加载后只发出一次连接请求,不像 http 接口,不用刷新页面,待会儿也能看到,因为 http 接口是短连接,调用一次发出一次请求 ),如下所示:

位段 -- 内存布局详解C语言

目录位段的介绍位段使用示例:位段的内存分配Example内存分配解析: ## 位段 位段的介绍位段(二进制位):就是按位存储位段(bit-field)是C语言中的一种特殊数据类型,它允许将一个字节分成几个部分,并为每个部分指定特定的位数,以便在内存中存储和访问这些部分。 其中位段相…

Java流程控制04:循环结构

顺序结构的程序语句只能被执行一次。如果您想要同样的操作执行多次,就需要使用循环结构。 Java中有三种主要的循环结构:while 循环 do…while 循环 for 循环1. while 循环 while是最基本的循环,它的结构为: while (布尔表达式) { // 循环内容 }只要布尔表达式为 true,循环…

虚拟机--共享文件夹

在宿主机创建一个文件夹 2.进入VM软件的设置->共享文件夹(从主机的文件夹添加)Linux中共享文件夹位置:/mnt/hgfs/ 路径下