使用 ONNX Runtime 在 iPhone 上运行 Phi-3-mini

news2025/1/19 8:18:57

更多科技分享,请关注公众号:ONE生产力

之前我们介绍了微软最新开源的小规模模型Phi-3-mini,其计算资源占用极少,非常适合嵌入式应用和移动智能终端。今天我们将探讨在iPhone上,通过ONNX Runtime运行Phi-3-mini模型。

什么是ONNX Runtime

在人工智能时代,AI模型的可移植性非常重要。ONNX Runtime可以轻松地将训练好的模型部署到不同的设备上。开发者不需要关注推理框架,使用统一的API就可以完成模型推理。在生成式AI的时代,ONNX Runtime也进行了代码优化。通过优化后的ONNX Runtime,可以在不同的终端上推理量化的生成性AI模型。在ONNX Runtime的生成性AI中,你可以通过Python、C#、C/C++的API进行AI模型推理。当然,iPhone上的部署可以利用C++的ONNX Runtime API来实现生成性AI的推理。

操作步骤

准备工作

  1. macOS 14+
  2. Xcode 15+
  3. iOS SDK 17.x
  4. 安装 Python 3.10+(建议使用 Conda)
  5. 安装 Python 库 - python-flatbuffers
  6. 安装 CMake

编译ONNX Runtime for iOS

git clone https://github.com/microsoft/onnxruntime.git



cd onnxruntime



./build.sh --build_shared_lib --ios --skip_tests --parallel --build_dir ./build_ios --ios --apple_sysroot iphoneos --osx_arch arm64 --apple_deploy_target 17.4 --cmake_generator Xcode --config Release

注意:

1、在编译之前,您必须确保Xcode配置正确,并在终端上进行设置:

sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer

2、ONNX Runtime需要根据不同的平台进行编译。对于iOS,您可以基于arm64/x86_64进行编译。

3、建议直接使用最新的iOS SDK进行编译。当然,您也可以降低版本以兼容过去的SDK。这样可以确保您的应用与最新的操作系统特性和安全性能保持同步,同时也能支持旧版本的设备。

编译Generative AI with ONNX Runtime for iOS

git clone https://github.com/microsoft/onnxruntime-genai



cd onnxruntime-genai



git checkout yguo/ios-build-genai





mkdir ort



cd ort



mkdir include



mkdir lib



cd ../





cp ../onnxruntime/include/onnxruntime/core/session/onnxruntime_c_api.h ort/include

cp ../onnxruntime/build_ios/Release/Release-iphoneos/libonnxruntime*.dylib* ort/lib



python3 build.py --parallel --build_dir ./build_ios_simulator --ios --ios_sysroot iphoneos --osx_arch arm64 --apple_deployment_target 17.4 --cmake_generator Xcode

在Xcode中创建应用

将ONNX量化的INT4模型复制到App应用程序项目中

我们需要导入ONNX格式的INT4量化模型,首先需要下载它。

下载完成后,您需要将其添加到Xcode项目的“资源”目录中。

在ViewControllers添加C++ API

1、将相应的 C++ 头文件添加到项目中

2、在 Xcode 中添加 onnxruntime-genai.dylib

3、直接使用 C 示例上的代码在此示例中进行测试。也可以直接添加更多运行(如ChatUI)

4、因为需要调用C++,所以请将 ViewController.m 更改为 ViewController.mm

NSString *llmPath = [[NSBundle mainBundle] resourcePath];

    char const *modelPath = llmPath.cString;



    auto model =  OgaModel::Create(modelPath);



    auto tokenizer = OgaTokenizer::Create(*model);



    const char* prompt = "<|system|>You are a helpful AI assistant.<|end|><|user|>Can you introduce yourself?<|end|><|assistant|>";



    auto sequences = OgaSequences::Create();

    tokenizer->Encode(prompt, *sequences);



    auto params = OgaGeneratorParams::Create(*model);

    params->SetSearchOption("max_length", 100);

    params->SetInputSequences(*sequences);



    auto output_sequences = model->Generate(*params);

    const auto output_sequence_length = output_sequences->SequenceCount(0);

    const auto* output_sequence_data = output_sequences->SequenceData(0);

    auto out_string = tokenizer->Decode(output_sequence_data, output_sequence_length);

   

auto tmp = out_string;

运行效果

在iPhone 12(A14)上,Phi-3-mini运行速度依然可以接受,如果使用更新的设备,或能获得硬件加速支持,我相信运行效果能够更佳。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1682329.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

教你五行代码实现大批量文件重命名

问题背景 文件夹里的大量文件&#xff0c;命名很乱&#xff0c;并且要重新命名为固定长度顺序的文件很麻烦。这里采用5行python实现大批量文件按要求统一命名。 现有文件夹列表 tulips 代码实现 main.py import os path rtulips/ for num, file in enumerate(os.listdir(…

unity制作app(7)--panel control

根据用户的状态&#xff0c;在界面中显示不同的panel 1.新建一个脚本PanelControl&#xff0c;控制各个脚本的显示与隐藏 2.实现第一个逻辑判断功能&#xff1a;如果没有登记过信息&#xff0c;就直接跳转到登记界面&#xff0c;如果登记过&#xff0c;跳转到住界面。许多需要…

apifox接口调试工具的使用,代替postman

官网链接&#xff1a;Apifox &#xff08;代替postman工具&#xff09; 下载apifox工具 使用步骤 安装本地下载的apifox.exx 登录apifox 接口调用

DDNS配置详解

正文共&#xff1a;1111 字 8 图&#xff0c;预估阅读时间&#xff1a;1 分钟 前面配置了DDNS&#xff08;拨号有公网IP地址了&#xff0c;肯定要通过DDNS用起来啊&#xff01;&#xff09;&#xff0c;有不少小伙伴咨询具体的配置问题。为了方便大家深入理解DDNS的技术原理&am…

翻译《The Old New Thing》- Stupid debugger tricks: Calling functions and methods

Stupid debugger tricks: Calling functions and methods - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20070427-00/?p27083 Raymond Chen 2007年04月27日 一个比较笨的调试技巧&#xff1a;调用函数和方法 在过去&#xff0c;如果你想在…

系统架构师考试(二)

敏捷方法 CMMI代表Capability Maturity Model Integration&#xff0c;是一种用于评估和改进组织软件工程和系统工程的模型。CMMI提供一个框架&#xff0c;帮助组织评估其软件和系统工程的成熟度&#xff0c;该模型基于过程成熟度模型&#xff08;CMM&#xff09;和集成项目管理…

DE2-115串口通信

目录 一、 内容概要二、 Hello Nios-II2.1 Nios-II编程2.1.1 硬件Ⅰ 搭建环境Ⅱ 编写代码 2.1.2 软件2.1.3 烧录Ⅰ硬件Ⅱ 软件 2.2 verilog编程 三、 心得体会 一、 内容概要 分别用Verilog和Nios软件编程, 实现DE2-115开发板串口输出“Hello Nios-II”字符到笔记本电脑串口助…

利用宝塔面板搭建nodejs网站(不使用pm2)

利用宝塔面板搭建nodejs网站&#xff08;不使用pm2&#xff09; 1. 准备代码文件2. 将代码上传至云主机3. 云主机配置3.1 绑定域名3.2 利用面板配置node环境3.3 利用面板增加node项目 4. 打开端口 暂时只演示http的。https类似&#xff0c;需要添加证书。 1. 准备代码文件 清单…

SpringBoot环境隔离Profiles

前言 通常我们开发不可能只有一个生产环境&#xff0c;还会有其它的开发&#xff0c;测试&#xff0c;预发布环境等等。为了更好的管理每个环境的配置项&#xff0c;springboot也提供了对应的环境隔离的方法。 直接上干货 知识点 激活环境方法 1&#xff0c;在application…

伪头部校验

本章问题 UDP和TCP的伪首部只用于计算校验和&#xff0c;在UDP和TCP的报文中是不存在的&#xff0c;为什么要引入伪首部呢&#xff1f;为什么伪首部的要有这些字段&#xff1f;这里我们就先看一下TCP和UDP的首部格式。 TCP和UDP首部 源端口目的端口&#xff1a;是0-65535任…

CSP认证刷题笔记(3)最大矩形(13年CSP认证第三题)

文章目录 题目描述基本思路求解代码 题目描述 在横轴上放了n个相邻的矩形&#xff0c;每个矩形的宽度是1&#xff0c;而第i&#xff08;1≤i≤n&#xff09;个矩形的高度是 hi。这n个矩形构成了一个直方图。例如&#xff0c;下图中六个矩形的高度就分别是3,1,6,5,2,3。 请找出…

聚苯并咪唑(PBI)为超高性能工程塑料 未来应用前景较好

聚苯并咪唑&#xff08;PBI&#xff09;为超高性能工程塑料 未来应用前景较好 聚苯并咪唑&#xff08;简称PBI&#xff09;&#xff0c;是一类以苯并咪唑基团作为结构重复单元的杂环聚合物。聚苯并咪唑不溶于水&#xff0c;溶于强极性溶剂&#xff0c;具有耐高温、耐腐蚀、抗辐…

学习C语言的重要性以及如何学好

配套视频&#xff1a;https://www.bilibili.com/video/BV1kw4m1Q7AV/?spm_id_from333.999.0.0 一、C语言在互联网领域重要的开源项目 https://github.com/mysql/mysql-server 数据库开源项目【互联网重型开源项目】 编程语言&#xff1a;C/C/ASM 部分汇编代码 开源项目核心…

Verilog基础语法——条件语句if-else与case

Verilog基础语法——条件语句case、if-else 写在前面一、if-else语句二、case语句2.1 case语句2.2 casez语句2.3 casex语句 写在后面 写在前面 在Verilog语法中&#xff0c;常用的条件语句有if-else语句和case语句&#xff0c;用于判断条件是否为真&#xff0c;并执行判断条件后…

使用docker安装doccano

使用docker安装doccano 1 介绍 数据标注的工具比较多&#xff0c;比较出名的有Doccano、Label Studio等。 Label Studio &#xff1a;图像标注、文本标注、音频标注、视频标注、时间序列标注&#xff0c;功能比较多。 Doccano&#xff1a;主要是针对文本的标注&#xff0c;…

平芯微PW4057H中文规格书

产品概述&#xff08;百度翻译&#xff09; PW4057H 是可以通过外部电阻编程的恒流/恒压充电的充电管理电路。该器件内部包括功率晶体管应用时不需要外部的电流检测电阻和阻流二极管。 PW4057H 只需要极少的外围元器件&#xff0c;并且符合 USB 总线技术规范&#xff0c;非常适…

英睿达硬盘数据恢复方法:从丢失到找回的详细指南

在数字化时代&#xff0c;硬盘作为我们存储重要数据的关键设备&#xff0c;承载着大量的个人、工作甚至商业信息。然而&#xff0c;无论是由于意外删除、格式化、病毒感染还是硬件故障&#xff0c;硬盘数据丢失的情况时有发生。英睿达硬盘作为市场上的知名品牌&#xff0c;其数…

后仿真中的必懂VCS仿真选项之 +ignorempcond

当多个输入同时改变时&#xff0c;VCS支持延迟注释。它忽略条件检查&#xff0c;并从适用的延迟中插入最小的延迟。 当多个输入同时改变时&#xff0c;它们会对特定的输出信号产生影响。 如果没有匹配的条件弧线从输入(切换)延伸到输出&#xff0c;那么VCS不会标注零延迟。 …

ITSM的服务台如何让工作更流畅

在现代企业的信息技术管理框架内&#xff0c;IT服务管理&#xff08;IT Service Management, ITSM&#xff09;体系扮演着至关重要的角色&#xff0c;而其中的服务台则是这一复杂体系的心脏地带。服务台不仅仅是解答技术疑问的一线窗口&#xff0c;更是企业IT运维效率与用户满意…

STM32_IIC通信

IIC通信 • I2C&#xff08;Inter IC Bus&#xff09;是由Philips公司开发的一种通用数据总线 • 两根通信线&#xff1a;SCL&#xff08;串行时钟线&#xff09;、SDA&#xff08;串行数据线&#xff09; • 同步&#xff0c;半双工 • 带数据应答 • 支持总线挂载多…