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 对象。
  • 生成器配置了特定参数,一次生成一个令牌的响应。
  • 每个令牌都被解码回文本并打印到控制台,形成聊天机器人的响应。
  • 循环将继续进行,直到用户决定通过输入空字符串退出。

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

  • 加载模型:通过类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 示例。

使用 C# 和 ONNX 來玩转Phi-3 SLM的更多相关文章

  1. 一起來玩鳥 Starling Framework 簡介

    開場 Starling Framework是一套Flash 2D遊戲開發"工具",是使用Flash最新的Stage3D API建構出來的一套Framework.最大優點在於使用GP ...

  2. 一起來玩鳥 Starling Framework(8)BitmapFont

    所謂BitmapFont,就是事先將我們會用到的字型,會用到的字,輸出成一張圖片,類似Sprite sheet,以及一個xml格式的Data file,然後我們一次將這文字圖片轉成Texture,up ...

  3. 一起來玩鳥 Starling Framework(9)Particle

    最後,來看看Starling裡一個很炫的功能:Particle.Particle屬於extension,所以要另外下載檔案:Starling-Extension-Particle-System.下載之 ...

  4. 一起來玩鳥 Starling Framework(6)Juggler、Tween、以及DelayCall

    這篇開始來講Starling裡的Animation.Juggle是個簡單的Class,用來控制動畫的進行.他負責管理經由add()加進來的實現IAnimatable介面的物件,然後當Juggler的a ...

  5. 一起來玩鳥 Starling Framework(7)MovieClip

    承上一篇,我們接著來講最後一個IAnimatable類別,MovieClip.Starling的MovieClip跟native的MovieClip不太一樣,它只能接收一個Vector.<Tex ...

  6. 一起來玩鳥 Starling Framework(5)Multi-Touch

    這篇來談談Starling的Multi-Touch.前一篇也提到,Multi-Touch一樣是監聽TouchEvent.TOUCH,然後由TouchEvent的e.getTouches()取回多點的資 ...

  7. 一起來玩鳥 Starling Framework(4)TouchEvent,Touch,以及TouchPhase

    這一篇來介紹一下TouchEvent.我們先來談單點的touch,下一篇再介紹MultiTouch.翻過Starling文件的應該會發現,Starling裡面沒有MouseEvent,而是整合在Tou ...

  8. 一起來玩鳥 Starling Framework(3)Button!

    週末夜來介紹個簡單的DisplayObject就好.不論是在電腦上或行動裝置上,跟使用者互動次數最多的,大概就是按鈕了.因此,Starling有個Button類別,來做出這個常用的互動元件. 同樣是因 ...

  9. 一起來玩鳥 Starling Framework(2)效能測試以及Image與Texture

    上一篇我們放了一個Quad與TextField在舞台上慢慢轉.眼尖的可能會發現轉起來邊緣有點鋸齒,這可以透過設定Starling的反鋸齒來解決,在Main.as裡,新增了_starling之後,可以加 ...

  10. 一起來玩鳥 Starling Framework(1)一定要的Hello World!

    雖然已經一堆Hello World的介紹文章跟影片了,但中文資料畢竟是比較少,所以不能免俗的來一篇中文版Hello World.首先開啟一個AS3.0專案,fps不用客氣,設為60,Starling很 ...

随机推荐

  1. kettle从入门到精通 第六十课 ETL之kettle for循环处理每条数据,so easy!

    1.kettle原生是支持for循环处理的,无需通过javascript脚本或者java脚本开发for循环控制.当然如果想通过脚本挑战下也是可以的. 本节课主要讲解如何通过kettle中的job来实现 ...

  2. docker综合应用

    1.容器资源限制 官网文档 https://docs.docker.com/config/containers/resource_constraints/ 2.docker内存限制 -m或者--mem ...

  3. JVM性能分析与故障排查

    引言 JVM调优 程序在上线前的测试或运行中有时会出现一些大大小小的JVM问题,比如cpu load过高.请求延迟.tps降低等,甚至出现内存泄漏(每次垃圾收集使用的时间越来越长,垃圾收集频率越来越高 ...

  4. python pymysql 数据库查询操作

    import pymysql db= pymysql.connect(host="", user='', database="", password='') c ...

  5. 测试网络的小工具WinMTR

    ping网络的小工具 搜集了两个版本中文版和英文版 中文版---- WinMTR中文版.rarhttps://www.aliyundrive.com/s/bZqmokL5dTt提取码: k6v7 英文 ...

  6. k8s安装prometheus

    安装 在目标集群上,执行如下命令: kubectl apply -f https://github.com/512team/dhorse/raw/main/conf/kubernetes-promet ...

  7. NVIDIA Jetson AGX Xavier 从刷机之后到配置环境

    特殊的配置环境需求: cuda-10.2.python 3.6.9.torch 1.7.0.torchversion 0.8.1,剩下的顺其自然即可(逃. 顺便说一句,里面的指令请一行一行仔细复制粘贴 ...

  8. 开源一个RAG大模型本地知识库问答机器人

    弹指间,2009年大学毕业到现在2024年,已经15年过去了. 前2天,看到自己14年在博客园写的一个博客,哪个时候是工作之余创业 感兴趣的朋友可以看看我10年前发的一篇博客https://www.c ...

  9. C#语言编写的仅有8KB大小的简易贪吃蛇开源游戏

    前言 今天大姚给大家分享一款由C#语言编写的仅有8KB大小的简易贪吃蛇开源游戏:SeeSharpSnake. 项目特点 该仓库中的项目文件和脚本可以用多种不同的配置构建相同的游戏,每个配置生成的输出大 ...

  10. vulnhub - Geisha

    vulnhub - Geisha 描述 Machine Name: Geisha Author : SunCSR Goal: Get the root flag of the target. Diff ...