百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

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

bigegpt 2024-09-22 00:39 4 浏览

使用 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)

  • Microsoft.ML.OnnxRuntimeGenAI.Managed:

    • 这是完全托管的版本,适用于纯 .NET 环境

    • 不依赖原生程式库,确保跨平台的一致性,适合在不需要特定硬件加速的场景下使用

  • Microsoft.ML.OnnxRuntimeGenAI.Cuda:

    • 这个版本专门针对使用 NVIDIA CUDA GPU 进行硬件加速

    • 适合需要高性能运算的深度学习模型,在 NVIDIA GPU 上可获得显著的性能提升

  • 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 对象。

    • 生成器配置了特定参数,一次生成一个令牌的响应。

    • 每个令牌都被解码回文本并打印到控制台,形成聊天机器人的响应。

    • 循环将继续进行,直到用户决定通过输入空字符串退出。

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

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

    相关推荐

    pyproject.toml到底是什么东西?(py trim)

    最近,在Twitter上有一个Python项目的维护者,他的项目因为构建失败而出现了一些bug(这个特别的项目不提供wheel,只提供sdist)。最终,发现这个bug是由于这个项目使用了一个pypr...

    BDP服务平台SDK for Python3发布(bdp数据平台)

    下载地址https://github.com/imysm/opends-sdk-python3.git说明最近在开发和bdp平台有关的项目,用到了bdp的python的sdk,但是官方是基于p...

    Python-for-Android (p4a):(python-for-android p4a windows)

    一、Python-for-Android(p4a)简介Python-for-Android(p4a),一个强大的开发工具,能够将你的Python应用程序打包成可在Android设备上运行...

    Qt for Python—Qt Designer 概览

    前言本系列第三篇文章(QtforPython学习笔记—应用程序初探)、第四篇文章(QtforPython学习笔记—应用程序再探)中均是使用纯代码方式来开发PySide6GUI应用程序...

    Python:判断质数(jmu-python-判断质数)

    #Python:判断质数defisPrime(n):foriinrange(2,n):ifn%i==0:return0re...

    为什么那么多人讨厌Python(为什么python这么难)

    Python那么棒,为什么那么多人讨厌它呢?我整理了一下,主要有这些原因:用缩进替代大括号许多人抱怨Python完全依赖于缩进来创建代码块,代码多一点就很难看到函数在哪里结束,那么你就需要把一个函数拆...

    一文了解 Python 中带有 else 的循环语句 for-else/while-else

    在本文中,我们将向您介绍如何在python中使用带有else的for/while循环语句。可能许多人对循环和else一起使用感到困惑,因为在if-else选择结构中else正常...

    python的numpy向量化语句为什么会比for快?

    我们先来看看,python之类语言的for循环,和其它语言相比,额外付出了什么。我们知道,python是解释执行的。举例来说,执行x=1234+5678,对编译型语言,是从内存读入两个shor...

    开眼界!Python遍历文件可以这样做

    来源:【公众号】Python技术Python对于文件夹或者文件的遍历一般有两种操作方法,一种是至二级利用其封装好的walk方法操作:import osfor root,d...

    告别简单format()!Python Formatter类让你的代码更专业

    Python中Formatter类是string模块中的一个重要类,它实现了Python字符串格式化的底层机制,允许开发者创建自定义的格式化行为。通过深入理解Formatter类的工作原理和使用方法,...

    python学习——038如何将for循环改写成列表推导式

    在Python里,列表推导式是一种能够简洁生成列表的表达式,可用于替换普通的for循环。下面是列表推导式的基本语法和常见应用场景。基本语法result=[]foriteminite...

    详谈for循环和while循环的区别(for循环语句与while循环语句有什么区别)

    初九,潜龙勿用在刚开始使用python循环语句时,经常会遇到for循环和while循环的混用,不清楚该如何选择;今天就对这2个循环语句做深入的分析,让大家更好地了解这2个循环语句以方便后续学习的加深。...

    Python编程基础:循环结构for和while

    Python中的循环结构包括两个,一是遍历循环(for循环),一是条件循环(while循环)。遍历循环遍历循环(for循环)会挨个访问序列或可迭代对象的元素,并执行里面的代码块。foriinra...

    学习编程第154天 python编程 for循环输出菱形图

    今天学习的是刘金玉老师零基础Python教程第38期,主要内容是python编程for循环输出菱形※。(一)利用for循环输出菱形形状的*号图形1.思路:将菱形分解为上下两个部分三角形图案,分别利用...

    python 10个堪称完美的for循环实践

    在Python中,for循环的高效使用能显著提升代码性能和可读性。以下是10个堪称完美的for循环实践,涵盖数据处理、算法优化和Pythonic编程风格:1.遍历列表同时获取索引(enumerate...