首页 > 编程语言 >使用 C# 和 ONNX 來玩转Phi-3 SLM

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

时间:2024-08-04 17:27:33浏览次数:8  
标签:Phi C# ONNX 模型 AI onnx Microsoft

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 示例。

标签:Phi,C#,ONNX,模型,AI,onnx,Microsoft
From: https://www.cnblogs.com/shanyou/p/18342014

相关文章

  • 云计算第二阶段:----监控与服务安全SECURITY
    本模块内容,主要讲述服务器的安全防护与配置软件相关知识。分为网络防护软件介绍、配置与使用用,网络安全相关知识浅度解析。涉及软件有prometheus,graphna,zabbix。网络安全方面涉及基于debianlinux系统的kali版本liunx的介绍与简单使用。SECURITYDAY1环境准备:主机......
  • 134. 加油站【 力扣(LeetCode) 】
    一、题目描述  在一条环路上有n个加油站,其中第i个加油站有汽油gas[i]升。  你有一辆油箱容量无限的的汽车,从第i个加油站开往第i+1个加油站需要消耗汽油cost[i]升。你从其中的一个加油站出发,开始时油箱为空。  给定两个整数数组gas和cost,如果你可以......
  • 135. 分发糖果【 力扣(LeetCode) 】
    一、题目描述  n个孩子站成一排。给你一个整数数组ratings表示每个孩子的评分。  你需要按照以下要求,给这些孩子分发糖果:每个孩子至少分配到1个糖果。相邻两个孩子评分更高的孩子会获得更多的糖果。  请你给每个孩子分发糖果,计算并返回需要准备的最少糖果数......
  • 基于STM32-OLED多级菜单(LCD等等屏幕均可移植)
    一,内容概括:不使用长篇大论1:多级菜单介绍2:实现思路3:代码编写4:总结二,正文1.多级菜单介绍:想必大家看到这里,也知道多级菜单大概是什么;对于还不太清楚的朋友说明以下,多级菜单就是将一块屏幕原本只能显示一种内容,扩展到可以显示很多内容。依据自己的设定显示内容。2.实现思路......
  • C++3级
    虚拟星辰大家好,我是新人,这是我的第一个博客,6月29日的3级认证T1题目大致是这样的:小杨发明了一套密码系统,具体来说,他把字母的顺序向后移了N位。比如说,原来的字母顺序是:ABCDEFGHIJKLMNOPQRSTUVWXYZ当N为1时,字母顺序变为:BCDEFGHIJKLMNOPQRSTUVWXYZA当N为2时,字母顺序变为:CDEF......
  • 使用python对Excel表格某个区域保存为图片
    实际工作中,我们经常会把表格某个区域(如:A1:F5)或某个图形保存为图片,如何用python自动做到这一点?不知屏幕前的小伙伴有没有遇到过类似的需求,此刻脑海里有木有一丢丢思路。python操作excel的第三方库有很多,个个都有各自的绝招和擅长的应用场景,简单罗列一下:pyexcel:pyexcel是......
  • 从 0 开始安装和运行 Cangjie (仓颉)
    标准方法参照配置开发环境的描述,下载CangjieforDevEcoStudio插件DevEcoStudioNEXTDeveloperBeta2-CangjiePlugin(5.0.3.500)。然后在DevEcoStudioNEXTDeveloperBeta2中从本地磁盘安装插件,选择下载好的"devecostudio-cangjie-plugin-windows-5.0.3.500.zip"......
  • (reading report)Careers in Science and Engineering A Student Planning Guide to G
    Chapter1Whatareyourcareergoals? howwelldoyourownskillsandpersonalitymatchthecareeryouimagine?面对新问题、新难题或新需求的挑战,你是否感到兴奋?自然世界的复杂性促使人们去理解它吗?如果是这样的话,科学和工程的学习——尽管严格——将为你提供实......
  • Educational Codeforces Round 168 (Rated for Div. 2)
    题目链接:EducationalCodeforcesRound168(RatedforDiv.2)总结:题目较简单,但是发挥很一般。A,B题一直读假题,卡了半个小时;C题用char存int,难绷了。A.StrongPasswordtag:模拟voidsolve(){strings;cin>>s;for(inti=1;i<s.size();i++){......
  • C语言--++a,a++的区别
    //前缀形式:int&int::operator++()//这里返回的是一个引用形式,就是说函数返回值也可以作为一个左值使用{//函数本身无参,意味着是在自身空间内增加1的*this+=1;//增加return*this;//取回值}//后缀形式:constintint::operator++(int)//函数返回值是一......