香橙派AIpro开发板评测:香橙派AIpro也能MindSpore+Jupyter Notebook开发呀和Qwen2-0.5B-Instruct-GGUF部署

香橙派AIpro开发板评测:香橙派AIpro也能MindSpore+Jupyter Notebook开发呀和Qwen2-0.5B-Instruct-GGUF部署

前言

以前就是用华为云的昇腾卡训练模型,今天看到香橙派推出一款 Orange Ai Pro 的板子,他们的口号是:为AI而生,采用昇腾AI技术路线,8T算力,迫不及待的下单入手体验一把,中国芯的家族又迎来了一位重量级嘉宾。点赞!点赞!点赞!

硬件介绍

硬件配置参考图

硬件配置参考图给的超级详细,拨码开关这种小细节,都给出了,对新手小白极其友好

请添加图片描述
在这里插入图片描述

硬件实物图

我选择tf卡启动,所以将拨码开关滑动到右边

3.png

固件烧录

固件下载

可以到官网

(orangepi.cn/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-AIpro.html)直接下载对应的固件

4.png

烧录固件

最常规的烧录方式,tf卡插入读卡器,用balenaEtcher工具烧录,等待Success即可

5.png

初步体验

登陆

我是通过Micro USB串口调试口登陆的,启动过程需要等待一段时间

6.png

用户名: HwHiAiUser,密码:Mind@123,后面需要超级用户时候,也可以root登陆,密码依然是:Mind@123,或者用sudo也可以

7.png

基本信息

可以看到存储容量32G,内存8G,aarch64架构

8.png

网络信息

可以直接把wan口接到路由器,会自动给eth0分配IP,网络环境准备OK

9.png

MindSpore测试

昇思MindSpore是由华为于2019年8月推出的新一代全场景AI框架,2020年3月28日,华为宣布昇思MindSpore正式开源。昇思MindSpore是一个全场景AI框架,旨在实现易开发、高效执行、全场景统一部署三大目标。

MindSpore是和PyTorch、TensorFlow同等地位的深度学习框架,同时相比后2者,MindSpore的出发点就是旨在支持从边缘设备到云端的全场景部署,这点对我们嵌入式端更友好。

而且香橙派AIpro采用昇腾技术路线,在底层就支持了CANN框架,和NVIDIA的CUDA框架是同等地位。CANN(Compute Architecture for Neural Networks)是华为为昇腾(Ascend)系列AI处理器设计的全栈AI软硬件协同计算框架,它提供了对昇腾AI处理器的底层访问,CANN 中的算子库(Operator Library)提供了大量预优化的AI算子,可以加速模型的训练和推理过程。

因为深度学习涉及到的模型参数少则千万,多则数以亿计,如果在底层算子方面没有工业级别的优化,会非常浪费内存、计算资源

这也是香橙派AIpro的精华所在,华为MindSpore可以直接部署在上面

执行下面代码,导入Mindspore环境

python -c \
"import mindspore;mindspore.set_context(device_target='Ascend');mindspore.run_check()"

看到如下输出,[Ascend] successfully!,则说明能正常使用

10.png

启动 Jupyter Lab

进入samples目录

cd samples

启动对应服务,192.168.123.119这个IP是我的香橙派AIpro获取的IP地址

 ./start_notebook.sh 192.168.123.119

11.png

网页访问

这个时候,保证我的电脑和香橙派AIpro在同一个局域网内,则输入对应的ip:192.168.123.119:8888,带上对应token,则可网页访问

12.png

体验OCR

现在已经进入Jupyter Lab的环境了,熟悉Jupyter Lab根本不会察觉到现在是在香橙派AIpro还是云端,接下来就是鼠标点点点,愉快的体验MindSpore的强大了

13.png

还是蛮快的,7ms就完成了,在香橙派AIpro实现ocr不仅仅能避免因为网络延时影响,而且对用户的隐私更有保障,一些私有的数据不必上云

14.png

OCR代码分析

导入一些基础的库,重点是最后2行,是用于加载和运行在Ascend芯片上部署的机器学习模型,
管理Ascend芯片上的资源,如内存分配、设备初始化等

import os
import time
import argparse
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
from acllite_model import AclLiteModel as Model
from acllite_resource import AclLiteResource as AclResource

模型导入和处理,定义CTCLabelConverter类,用于文本和数据编码,这个类使用了CTC(Connectionist Temporal Classification)损失函数的特性

# om模型和图片的位置
MODEL_PATH = './cnnctc.om'
IMAGE_PATH = './predict.png'
# 初始化acl资源
acl_resource = AclResource()
acl_resource.init()
#导入本地om模型
print('load model....')
model = Model(MODEL_PATH)
print('load model finished....')
# 文本与数据编码
class CTCLabelConverter():
    def __init__(self, character):
        dict_character = list(character)
        self.dict = {}
        for i, char in enumerate(dict_character):
            self.dict[char] = i + 1
        self.character = ['[blank]'] + dict_character
        self.dict['[blank]'] = 0
    #将文本转换为数字编码
    def encode(self, text):
        length = [len(s) for s in text]
        text = ''.join(text)
        text = [self.dict[char] for char in text]
        return np.array(text), np.array(length)
    # 将数字编码转换为文本
    def decode(self, text_index, length):
        texts = []
        index = 0
        for l in length:
            t = text_index[index:index + l]
            char_list = []
            for i in range(l):
                if t[i] != self.dict['[blank]'] and (
                        not (i > 0 and t[i - 1] == t[i])):
                    char_list.append(self.character[t[i]])
            text = ''.join(char_list)
            texts.append(text)
            index += l
        return texts

这里就是包含了图像预处理、模型推理、以及结果解码的部分

# 导入和处理目标图片
img_PIL = Image.open(IMAGE_PATH).convert('RGB')
img = img_PIL.resize((100, 32), resample=3)
img = np.array(img, dtype=np.float32)
img = np.expand_dims(img, axis=0)
img = np.transpose(img, [0, 3, 1, 2])
# 定义推理的时间
start = time.time()
model_predict = model.execute([img])[0]
end = time.time()
print(f'infer use time:{(end-start)*1000}ms')
# 初始化文本编码函数
character = '0123456789abcdefghijklmnopqrstuvwxyz'
converter = CTCLabelConverter(character)
# 推理过程
preds_size = np.array([model_predict.shape[1]])
preds_index = np.argmax(model_predict, 2)
preds_index = np.reshape(preds_index, [-1])
preds_str = converter.decode(preds_index, preds_size)
print('Predict: ', preds_str)

体验曝光增强

在分辨率为512 * 512 的情况下,266ms完成,效果很明显,图片效果好了很多

15.png

npu实时信息

16.png

Qwen-GGUF部署

除了昇腾芯片,本身香橙派AIpro也足够强,成功把Qwen0.5B的gguf格式文件的大模型部署

下载llama.cpp

执行命令

git clone https://github.com/ggerganov/llama.cpp.git

17.png

进入llama.cpp,执行命令,需要等待一段时间,执行命令的时间比较长

make

下载大模型

from modelscope import snapshot_download 
model_dir = snapshot_download('qwen/Qwen2-0.5B-Instruct-GGUF')

18.png

用 llama-server 工具启动对应的服务
调用对应的服务,在0.5B大模型的情况下,Qwen模型还是可以通过深圳关联到大梅沙、莲花山,效果还是值得认可的

19.png

使用总结

1、第一次在香橙派AIpro使用Jupyter Lab,这种集成环境确实让我惊艳到了,以前都是阿里云PAI上使用,但是这次在香橙派AIpro使用,没有感到区别,这种集成环境的搭建,必须给香橙派AIpro点赞;

2、Micro USB 接口的调试串口,非常利于调试,以前那种杜邦线收发地三个口,不仅容易掉,而且容易插错,这种调试接口,不仅常见,而且易于使用

3、里面提供的基于MindSpore的例子,很容易上手,代码结构也很清晰;

4、感觉美中不足的,虽然8+32已经很大了,但是想要体验一些大模型,还是不够,需要使用swap;

Orange Pi论坛(http://forum.orangepi.cn/)、昇腾社区(hiascend.com)上面也有很多好玩的模型,后面会继续尝试把模型部署到香橙派上,再与大家分享,也希望大家多多给一些建议。

### 如何在香橙 AI Pro 上运行 ONNX 模型 #### 准备工作 为了能够在香橙 AI Pro 上顺利运行 ONNX 模型,需先完成一系列准备工作。这包括但不限于安装必要的依赖库以及准备相应的环境。 对于模型转换部分,在将 HuggingFace 平台上的预训练模型导出成 ONNX 格式时,默认情况下会设定 `kv-cache` 的长度为 1024[^2]。此操作可以通过特定命令实现: ```bash python3 export/export_onnx.py --hf_model_dir="./download/Qwen2-1.5B-Instruct" --onnx_model_path="./output/onnx/qwen2_1.5b_chat.onnx" --kv_cache_length=1024 ``` 这段脚本的作用是从指定目录加载模型并将其保存到目标路径下作为 `.onnx` 文件,同时设置了缓存大小参数以适应不同应用场景的需求。 #### 安装依赖项 确保设备已正确安装了支持 ONNX 运行所需的软件包,比如 onnxruntime 或其他兼容框架。这些工具允许硬件加速执行神经网络计算任务,并且通常提供了简单易用的应用程序接口(API),方便集成至现有项目当中。 #### 加载与推理 一旦完成了上述步骤之后,则可通过编写简单的 Python 脚本来调用 ONNX Runtime 来读取之前创建好的 ONNX 文件并进行预测运算。下面给出了一段用于测试目的的小例子代码片段: ```python import onnxruntime as ort import numpy as np # 初始化 session 输入数据 session = ort.InferenceSession("./output/onnx/qwen2_1.5b_chat.onnx") input_name = session.get_inputs()[0].name dummy_input = np.random.randn(1, 3, 224, 224).astype(np.float32) # 执行前向传播获得输出结果 outputs = session.run(None, {input_name: dummy_input}) print(outputs) ``` 该实例展示了如何利用 OnnxRuntime 创建一个会话对象来处理来自文件系统的 ONNX 模型;接着定义了一个随机生成的张量作为模拟输入传递给模型;最后获取到了经过推断后的输出值列表。 通过这种方式可以在资源受限环境下有效地部署大型语言或其他类型的机器学习模型,即使是在像香橙这样的小型开发板上也不例外[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋名山码民

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值