如何在手机端跑大模型?

news2024/11/22 18:29:44

最近新入手了一台 arm 开发板,内置安装了 Android 13 系统。

昨天把网络问题给解决了:安卓连接 WIFI 但无法上网?盘点踩过的那些坑

今日分享,继续带大家实操:如何把大模型(LLM)部署到移动端(arm 架构)。

有小伙伴问:手头没有 arm 开发板怎么办?

准备一台 Android 手机就行。

为了得到一个丝滑的 Linux 开发环境,我们先来了解下 AidLux。

1. AidLux 简介

AidLux 是啥?

一个智能物联网(AIoT)应用开发和部署平台,它运行在 arm 架构的 CPU 上,通过 Linux 内核共享,将 Android 与 Linux 完美融合,面向物联网支持90%以上接口和外设。

Android 也是基于 Linux 内核,从上图可以发现,Android 开发需要 C++ java python 全栈,而安装 AidLux 后,你就拥有了一个丝滑的 Linux 环境,因此只会 python 也 OK。

AidLux 怎么安装?

任意品牌手机,应用商店搜索 AidLux ,一键安装!

安装完成后,打开 APP,你会看到如下界面,找到 Cloud IP 图标,确保浏览器和手机/开发板在同一个局域网内,浏览器输入下面的 URL 打开 Web 界面,登录密码为 aidlux。

至此,你的一台 Linux 服务器已经准备就绪!

2. 开发准备

2.1 远程登录

如果要进行开发,最好能实现 VS Code 远程登录,不了解如何操作的小伙伴,可参考这篇教程:【保姆级教程】Windows 远程登陆 Linux 服务器的两种方式:SSH + VS Code

ssh config 配置示例如下,开发板直接用 22 端口,手机需要改用 9022 端口:

Host aibox
  HostName 192.168.10.2
  Port 22
  User aidlux

登录密码默认为 aidlux,当然如果不想每次都输入密码的话,可以改用密钥认证,具体可参考上面教程。

2.2 Docker 安装

为了快速跑通各种 AI 应用,免不了要安装 Docker !

Docker 是一个开源的应用容器引擎,将应用及其依赖打包到镜像中,随时移植到容器中,无需关心操作系统的底层。不了解如何安装使用的小伙伴,可参考这篇教程:【保姆级教程】Linux系统如何玩转Docker

3. Ollama 安装

Linux 主机上如何安装 Ollama,之前出过一篇教程:本地部署大模型?Ollama 部署和实战,看这篇就够了

本文假设你已安装好 Docker,我们可以采用如下指令,一键安装好 Ollama + OpenWebUI:

sudo docker run -d -p 1001:8080 -p 1002:11434 -v ollama:/root/.ollama -v open-webui:/app/backend/data --name ollama-webui --restart always ghcr.io/open-webui/open-webui:ollama

上述指令中,我们需要映射两个端口出来:

  • 1001:8080 – webui 的前端界面端口;
  • 1002:11434 – ollama 模型的后端调用端口。

注:如果容器已经在运行,你无法直接修改容器的端口映射。需要停止并删除现有容器,再重新创建。

所以,上述指令中,我们要用 -v 参数来持久化数据,这样重新创建容器就不会导致数据丢失。

浏览器中,输入 your_ip:1001,打开映射的前端界面端口,如果没什么问题,你应该看到如下界面:

注册一个账号后,进来就可以和 LLM 愉快对话了?

NO!Ollana 中还没有部署任何模型~

3.1 大语言模型部署

要安装模型,首先需要进入容器:

sudo docker exec -it ollama-webui /bin/bash

在本地部署大模型?Ollama 部署和实战,看这篇就够了中,为了快速跑通流程,我们采用的 qwen2:0.5B,速度倒是快,不过由于参数量较小,稍微复杂一点的指令,就尴尬了。。。

这次,我们部署 qwen2:7B 来试试(确保至少 8GB 的 RAM):

root@9345c935de06:/app/backend# ollama run qwen2
pulling manifest 
pulling 43f7a214e532...   2% ▕      ▏  73 MB/4.4 GB  3.2 MB/s  22m43s

稍等片刻,模型下载成功,再去 your_ip:1001 看看吧!终于,大模型已经在你的手机上跑起来了。

除了前端,当然我们还希望能在后端调用大模型。

No Problem,容器中 Ollama 已自动启动后端 API。

我们来写下接口调用示例代码:

def test_ollama():
    url = 'http://localhost:1002/api/chat'
    data = {
        "model": "qwen2",
        "messages": [
            { "role": "user", "content": "why is the sky blue?" }
        ],
        "stream": False
    }
    response = requests.post(url, json=data)
    print(response.text)

请求被拒绝了?已经把主机的 1002 映射到容器的 11434 了啊?

Yes,不过这里有个坑,我们一起来排查下,在容器中执行:

sudo apt update
sudo apt install net-tools
netstat -ntlp

可以看到有两个端口正在被监听:

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:11434         0.0.0.0:*               LISTEN      10/ollama           
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      1/python3

但是,有没有发现:容器内的 11434 端口在 127.0.0.1 上监听,这意味着它只接受来自容器内部的请求。因此,你在宿主机上尝试通过映射的 1002 端口访问,无法成功!

怎么解决?

先把 ollama 的进程杀了,然后指定环境变量 OLLAMA_HOST=0.0.0.0,再重新启动!

kill 10
export OLLAMA_HOST=0.0.0.0
nohup ollama serve > log.txt 2>&1 &

再来打开 your_ip:1002 看看吧!

搞定!这时再用上面的示例代码,就可以请求成功了。

如果还希望接入兼容 OpenAI 格式的应用,可以考虑将 Ollama 的模型接入 OneAPI。

不了解 OneAPI 的小伙伴可参考这篇教程:OneAPI-接口管理和分发神器:所有大模型一键封装成OpenAI协议。

我们先用下面指令部署 OneAPI:

sudo docker run --name oneapi -d --restart always -p 1003:3000 -e TZ=Asia/Shanghai -v oneapi:/data justsong/one-api

浏览器中输入 your_ip:1003,进入 OneAPI 管理界面,然后新建一个渠道,名称就叫 ollama,输入你在 ollama 容器中已经安装好的模型:

最后的代理,注意要填主机的 IP 地址,localhost 是不行的。

至此,你的本地大模型,已经无缝兼容 OpenAI 格式的 LLM 应用啦。

3.2 多模态大模型部署

除了众多大模型之外,Ollma 中还集成了视觉多模态模型。

而提到多模态模型,就不得不致敬下 LLaVA,它结合了视觉编码器和大语言模型 Vicuna,可用于通用视觉和语言理解,已更新至 1.6 版本。

Ollma 中一键安装:

ollama run llava

安装成功后,我们来到 WebUI 试试吧:

上面这个简单的任务,足足运行了近 4 分钟!

看来,在端侧跑多模态大模型,还任重道远啊~

接下来,我们来写下后端接口调用示例代码:

def test_llava():
    url = 'http://localhost:1002/api/generate'
    data = {
        "model": "llava",
        "prompt": "What is in this picture?",
        "images": [encode_image('test.png')],
        "stream": False
    }
    response = requests.post(url, json=data)
    print(response.json())

注意:传入的图像,需要使用 base64 编码。

返回结果如下:

{"model":"llava","created_at":"2024-09-10T12:52:53.284208538Z","response":" The image shows a stylized illustration of a pink deer or antelope standing on two legs. It appears to be a cartoon representation, with the animal's body simplified and rendered in shades of pink against a black background. The deer has large eyes, a small nose, and what looks like a tufted tail. ","done":true,"done_reason":"stop","context":[733,],"total_duration":227969591111,"load_duration":32525521,"prompt_eval_count":1,"prompt_eval_duration":197885547000,"eval_count":73,"eval_duration":30043357000}

除了速度不能忍之外,效果还是可以滴~

写在最后

本文通过 AidLux + Ollama 带大家快速跑通端侧部署大模型的流程,为实现端侧 LLM 应用提供了一种可能性。

下一篇,我们将继续探索更多的 LLM 工具链,为端侧 LLM 应用构建好基础设施。

如果本文对你有帮助,不妨点个免费的赞收藏备用。


为方便大家交流,新建了一个 AI 交流群,欢迎感兴趣的小伙伴加入。

最近打造的微信机器人小爱(AI)也在群里,想进群体验的朋友,公众号后台「联系我」即可,拉你进群。

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

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

相关文章

文章资讯职场话题网站源码整站资源自带2000+数据

介绍: 数据有点多,数据资源包比较大,压缩后还有250m左右。值钱的是数据,网站上传后直接可用,爽飞了 环境:NGINX1.18 mysql5.6 php7.2 代码下载

JUC学习笔记(三)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 八、共享模型之工具--JUC8.1 AQS 原理1. 概述2 实现不可重入锁自定义同步器自定义锁 3.心得起源目标设计1) state 设计2)阻塞恢复设计3)队列…

学习笔记 韩顺平 零基础30天学会Java(2024.9.16)

P563 自定义泛型方法 当调用方法时,要传入参数,因为当传入参数时,编译器就可以确定泛型代表的类型 泛型方法和方法使用了泛型是不一样的 泛型方法可以使用类声明的泛型,也可以使用自己的泛型 P564 泛型方法练习 P565 泛型的继承和…

Python编码系列—Python适配器模式:无缝集成的桥梁

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

二叉树OJ题——另一棵树的子树

文章目录 一、题目链接二、解题思路三、解题代码 一、题目链接 另一棵树的子树 题目描述:判断当前树A是否是树B的子树。 二、解题思路 时间复杂度:O(n*m) 三、解题代码

Learn ComputeShader 15 Grass

1.Using Blender to create a single grass clump 首先blender与unity的坐标轴不同,z轴向上,不是y轴 通过小键盘的数字键可以快速切换视图,选中物体以后按下小键盘的点可以将物体聚焦于屏幕中心 首先我们创建一个平面,宽度为0.2…

AI替代插画师跟设计师?不用焦虑!

一个固定的工作流, 一个训练好的lora模型 输入一段提示词 二三十秒的时间,就能生成一张精致美观有韵味的中秋国风插画 这张不喜欢,改下提示词重新生成一张不一样的。还是二十几秒 同样的插画,你用手绘,从起稿到上…

大数据新视界 --大数据大厂之MongoDB与大数据:灵活文档数据库的应用场景

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

【设计模式-外观】

这里写自定义目录标题 定义UML图角色作用代码使用场景 定义 为子系统中一组相关接口提供一致界面,定义一个高级接口,使得子系统更加容易使用。 UML图 角色作用 外观(Facade)角色:这是外观模式的核心,它知…

MongoDB的详细安装教程

6、MongoDB安装 6.1 为什么使用MongoDB 性能好大规模数据存储(可拓展性)可靠安全(本地复制、自动故障转移)方便存储复杂数据结构 6.2 下载安装 【1】下载地址,这里下载的是5.0版本的,否则配置环境变量之…

【电路笔记】-差分运算放大器

差分运算放大器 文章目录 差分运算放大器1、概述2、差分运算放大器表示2.1 差分模式2.2 减法器模式3、差分放大器示例3.1 相关电阻3.2 惠斯通桥3.3 光/温度检测4、仪表放大器5、总结1、概述 在之前的文章中,我们讨论了反相运算放大器和同相运算放大器,我们考虑了在运算放大器…

revisiting拉普拉斯模板

二维向量的二阶微分是Hessian矩阵,拉普拉斯算子是将两个独立的二阶微分求和,对二阶微分的近似。 我不认同冈萨雷斯的8邻域拉普拉斯模板。 MATLAB图像处理工具箱中fspecial函数’laplacian’参数给的拉普拉斯模板: 对于数字滤波器&#xff…

中秋前夕-我居然使用技术来鞭策兄弟

中秋前夕-我居然使用技术来鞭策兄弟 前言 最近在带领一些小伙伴在完成功能,因为人数不少,那么我们如何统计大家有没有摸鱼偷懒呢? 聪明的朋友们可以想到,利用git的提交记录统计。 因为git提交时,会给我们带上一些关…

高德2.0 多边形覆盖物无法选中编辑

多边形覆盖物无法选中编辑。先检查一下数据的类型得是<number[]>,里面是字符串的虽然显示没问题&#xff0c;但是不能选中编辑。 &#xff08;在项目中排查了加载时机&#xff0c;事件监听…等等种种原因&#xff0c;就是没发现问题。突然想到可能是数据就有问题&#xf…

ROS组合导航笔记:融合传感器数据

使用机器人定位包&#xff08;robot_localization package&#xff09;来合并来自不同传感器的数据&#xff0c;以改进机器人定位时的姿态估计。 基本概念 在现实生活中操作机器人时&#xff0c;有时我们需要处理不够准确的传感器数据。如果我们想要实现机器人的高精度定位&am…

初探全同态加密1 —— FHE的定义与历史回顾

文章目录 一、加密体系1、什么是加密体系2、加密体系的属性 Properties 二、同态加密&#xff1a;偶然的特殊性质三、同态加密体系的分类四、部分同态加密 Partially Homomorphic Encryption1、加法同态加密算法 —— ElGamal 加密算法1.1、ElGamal 的大致步骤1.2、ElGamal 的加…

vue3+vite项目中使用阿里图标库(svg)图标

前端项目中有很多地方会用到小图标&#xff0c;阿里的 iconfont 是一个不错的选择&#xff0c;同时&#xff0c; 它上面的 svg 矢量图标占用资源更少加载更快是一个不错的选择&#xff0c; 下面我们就来说一说&#xff0c;项目中如何来使用 svg 图标 安装插件 vite-plugin-svg…

RP2040 C SDK SysTick滴答定时器功能使用

RP2040 C SDK SysTick滴答定时器功能使用 ✨更好的阅读体验请移步到&#xff1a;飞书-云文档&#xff1a;https://u1etqmuwl9z.feishu.cn/wiki/VkoHwPGqHierOEkY651cZvaOntg?fromfrom_copylink RP2040的SysTick滴答定时器为24位的&#xff0c;计数方式为倒计时&#xff0c;扩展…

基于对数变换的图像美白增强,Matlab实现

博主简介&#xff1a;matlab图像处理&#xff08;QQ:3249726188&#xff09; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于对数变换的图像美白增强&#xff0c;用matlab实现。 一、案例背景和算法介绍 这次案例是美白算法&…

Stable Diffusion Web UI基础插件推荐

通过前面知识的介绍&#xff0c;我们对使用 Web UI 进行绘画有了基本了解&#xff0c;在平时我们使用中&#xff0c;有很多好用的插件&#xff0c;通过这些插件我们创作能够事半功倍&#xff0c;下面我就推荐一下在平时经常使用到的插件&#xff0c;希望这篇文章能够帮助大家更…