首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

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

编程知识
2024年08月04日 16:31

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 有以下几种可以下载:

上面的模型名称中,会标注 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 示例。

From:https://www.cnblogs.com/shanyou/p/18342014
本文地址: http://www.shuzixingkong.net/article/772
0评论
提交 加载更多评论
其他文章 使用Aspire优雅的进行全栈开发——WinUI使用Semantic Kernel调用智普清言LLM总结Asp.Net Core通过Playwright解析的网页内容
前言 这算是一篇学习记录博客了,主要是学习语义内核(Semantic Kernel)的实践,以及Aspire进行全栈开发的上手体验,我是采用Aspire同时启动API服务,Blazor前端服务以及WinUI的桌面端项目,同时进行三个项目的代码修改,整体感觉很方便,如果代码都修改了只需要启动Aspir
使用Aspire优雅的进行全栈开发——WinUI使用Semantic Kernel调用智普清言LLM总结Asp.Net Core通过Playwright解析的网页内容 使用Aspire优雅的进行全栈开发——WinUI使用Semantic Kernel调用智普清言LLM总结Asp.Net Core通过Playwright解析的网页内容 使用Aspire优雅的进行全栈开发——WinUI使用Semantic Kernel调用智普清言LLM总结Asp.Net Core通过Playwright解析的网页内容
位段 -- 内存布局详解C语言
目录位段的介绍位段使用示例:位段的内存分配Example内存分配解析: ## 位段 位段的介绍 位段(二进制位):就是按位存储 位段(bit-field)是C语言中的一种特殊数据类型,它允许将一个字节分成几个部分,并为每个部分指定特定的位数,以便在内存中存储和访问这些部分。 其中位段相较于结构体有两
位段 -- 内存布局详解C语言
HTML 编辑器
使用像Notepad(在Windows上)或TextEdit(在MacOS上)这样的基本文本编辑器来学习HTML是一个非常棒的开始。这些工具虽然简单,但足以让你编写并查看基本的HTML代码,帮助你理解HTML的结构和语法。下面我将详细解释每一步,确保你能成功创建并查看你的第一张HTML网页。 步骤一
ComfyUI插件:ComfyUI layer style 节点(四)
前言: 学习ComfyUI是一场持久战,而ComfyUI layer style 是一组专为图片设计制作且集成了Photoshop功能的强大节点。该节点几乎将PhotoShop的全部功能迁移到ComfyUI,诸如提供仿照Adobe Photoshop的图层样式、提供调整颜色功能(亮度、饱和度、对比度
ComfyUI插件:ComfyUI layer style 节点(四) ComfyUI插件:ComfyUI layer style 节点(四) ComfyUI插件:ComfyUI layer style 节点(四)
使用python对Excel表格某个区域保存为图片
实际工作中,我们经常会把表格某个区域(如:A1:F5)或某个图形保存为图片,如何用python自动做到这一点?不知屏幕前的小伙伴有没有遇到过类似的需求,此刻脑海里有木有一丢丢思路。 python操作excel的第三方库有很多,个个都有各自的绝招和擅长的应用场景,简单罗列一下: pyexcel:pye
使用python对Excel表格某个区域保存为图片 使用python对Excel表格某个区域保存为图片
三.mysql问答合集
目录三.MySQL3.1 关系型和非关系型数据库的区别关系型数据库非关系型数据库3.2 登录数据库的方式,如何远程登录3.3 MySQL的服务结构,当客户端发起请求后,处理过程3.4 如何设置或者重置MySQL密码3.5 DDL,DML,DQL,DCL等SQL语句的写法DDL数据定义语句DCL数据控
三.mysql问答合集 三.mysql问答合集 三.mysql问答合集
Jenkins API用户认证方式
1、概述 Jenkins的API可以通过用户名+密码或者用户名+Token的方式来进行认证,这篇文章以具体示例来说明具体的使用方式。 2、Jenkins环境 本文示例基于Jenkins 2.452.3版本进行演示,详细的环境构建可参考《Centos7下安装配置最新版本Jenkins(2.452.3)
Jenkins API用户认证方式 Jenkins API用户认证方式 Jenkins API用户认证方式
代码随想录Day4
24.两两交换链表中的节点 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例 1: 输入:head = [1,2,3,4] 输出:[2,1,4,3] 示例 2: 输入:head = [] 输出:[] 示例 3:
代码随想录Day4 代码随想录Day4 代码随想录Day4