使用 C# 和 ONNX 來玩转Phi-3 SLM_加载

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)
  1. Microsoft.ML.OnnxRuntimeGenAI.Managed:
  • 这是完全托管的版本,适用于纯 .NET 环境
  • 不依赖原生程式库,确保跨平台的一致性,适合在不需要特定硬件加速的场景下使用
  1. Microsoft.ML.OnnxRuntimeGenAI.Cuda:
  • 这个版本专门针对使用 NVIDIA CUDA GPU 进行硬件加速
  • 适合需要高性能运算的深度学习模型,在 NVIDIA GPU 上可获得显著的性能提升
  1. 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 Small
  • Phi-3-small-8k-instruct-onnx (cuda)
  • Phi-3-small-128k-instruct-onnx (cuda)
  • Phi-3 Medium

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

使用 C# 和 ONNX 來玩转Phi-3 SLM_加载_02

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

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