文章目录
- 一、引言
- ⭐1.1下载镜像烧系统
- ⭐1.2开发板初始化系统配置远程登陆
- 💖 远程ssh
- 💖查看ubuntu桌面
- 💖 远程向日葵
- 二、部署LLMS大模型
- 2.1 快速启动
- 💖拉取代码
- 💖下载mode数据
- 💖启动模型对话
- 三、体验 内置AI 应用样例
- 3.1运行 jupyterLab
- 💖进入sample 启动jupyterLab
- 3.2打开Jupyter Lab页面
- 💖界面操作
- 3.3 释放内存
- 💖 关闭样例
- 3.4运行目标检测样例
- 3.5运行图像曝光增强样例
- 四、总结
一、引言
大家好,我是yma16,在收到香橙派 AIpro 开发版之后开始动手实操,本期分享 【 香橙派 AIpro评测】烧系统运行部署LLMS大模型体验Jupyter Lab AI 应用样例(新手入门)
香橙派 AIpro
Orange Pi AI Pro 开发板是香橙派联合华为精心打造的高性能 AI 开发板,其搭载了昇腾 AI 处理器,可提供 8TOPS INT8 的计算能力,内存提供了 8GB 和 16GB两种版本。可以实现图像、视频等多种数据分析与推理计算,可广泛用于教育、机器人、无人机等场景。
开发版图解
前期的准备工作如下
⭐1.1下载镜像烧系统
官方下载镜像:
http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-AIpro.html
下载unbuntu系统
官方的下载烧录镜像软件
https://etcher.balena.io/#download-etcher
下载昇腾开发一键制卡工具
点击下载
官方的sd卡配置文件可以提前查看内容
################################################################################
# 特别注意!!!
# 该文件用于设置开发板ip,请勿编辑任何无关内容,否则可能导致开发板无法启动
# 建议在两个网口均能直连时再根据需要将一个网口设置为"自动获得ip地址"
# 此时,一个网口连接路由,由路由分配ip,另一个网口直连电脑,用以调试
# 生效标志位:设置为true,则该配置文件生效一次后会自动改成false
# 若修改该文件并希望下次开机重新配置ip,将标志位改成true
setting_flag=true
################################################################################
# 网口0-由路由器分配ip地址(若设置为yes,则该网口的路由和ip不会生效)
eth0_dhcp4=yes
# 网口0-ip地址
eth0_address=192.168.1.100
# 网口0-掩码位数
eth0_mask=24
# 网口0-路由(多个ip配置路由,仅有首个会生效)
eth0_route=
# 网口0-域名地址-首选域名
eth0_dns_pre=8.8.8.8
# 网口0-域名地址-备选域名
eth0_dns_alter=114.114.114.114
################################################################################
# 网口0-由路由器分配ip地址(若设置为yes,则该网口的路由和ip不会生效)
eth1_dhcp4=no
# 网口1-ip地址
eth1_address=192.168.137.100
# 网口1-掩码位数
eth1_mask=24
# 网口1-路由(多个ip配置路由,仅有首个会生效)
eth1_route=192.168.137.1
# 网口1-域名地址-首选域名
eth1_dns_pre=8.8.8.8
# 网口1-域名地址-备选域名
eth1_dns_alter=114.114.114.114
################################################################################
# 网口0-由路由器分配ip地址(若设置为yes,则该网口的路由和ip不会生效)
usb0_dhcp4=no
# typeC-ip地址
usb0_address=192.168.0.2
# typeC-掩码位数
usb0_mask=24
# typeC-路由(多个ip配置路由,仅有首个会生效)
usb0_route=
# typeC-域名地址-首选域名
usb0_dns_pre=
# typeC-域名地址-备选域名
usb0_dns_alter=
选择镜像、选择挂载的内存卡,等待约10分钟(3.0接口)
⭐1.2开发板初始化系统配置远程登陆
将烧好的unbuntu卡放入sd card槽
正面
反面
输入密码 (操作手册有密码:Mind@123)
远程ssh配置
sudo vi /etc/ssh/sshd_config
#增加以下配置允许通过ssh登录
#PermitRootLogin prohibit-password
PermitRootLogin yes
#修改完成后需要重启ssh服务命令如下
sudo service ssh restart
修改root密码
sudo passwd root
验证看root密码
💖 远程ssh
通过热点查看连接设备名称是 orangepi ai的ip
输入指令 查看ip地址
ip addr
切换网络会更改ip
ssh 用户名@ip
输入密码
连接 香橙派 AIpro,连接成功!
💖查看ubuntu桌面
安装的是ubuntu桌面的系统,进入ubuntu 桌面
查看磁盘
df -h
目录 | 空间 |
---|---|
dev/root | 29G |
tempfs | 3.7G+1.5G |
💖 远程向日葵
下载umo的版本即可
二、部署LLMS大模型
使用开源项目ChatGLM3 ManualReset
在gitee查找32G以内的开源大模型
项目地址:https://gitee.com/wan-zutao/chatglm3-manual-reset
可以gitee搜索,找到ChatGLM3 ManualReset该项目,基于香橙派AIpro部署ChatGLM3-6B大语言模型
2.1 快速启动
💖拉取代码
创建chatglm/inference目录拉取该仓库的所有代码
cd /
mkdir -p /chatglm/inference
git clone https://gitee.com/wan-zutao/chatglm3-manual-reset.git chatglm
cd chatglm/inference
💖下载mode数据
运行 脚本下载model数据,中途网络中断可以删除 mode 和 token 目录 重新下载
bash download.sh
拉取仓库过程运行的过程,下载内容超过6G数据量,过程比较慢长
💖启动模型对话
python 运行main脚本启动
main脚本调用chatglm.om(6.3G),响应有点慢
python3 main.py
打印出项目的可以访问地址
访问即可和大模型对话
三、体验 内置AI 应用样例
香橙派 AIpro中预装了 Jupyter Lab 软件。Jupyter Lab 软件是一个基于 web
的交互式开发环境,集成了代码编辑器、终端、文件管理器等功能,使得开发者可以在一个界面中完成各种任务。并且我们在镜像中也预置了一些可以在Jupyter Lab 软件中运行的 AI 应用样例。这些样例都是使用 Python 编写的,并调用了 Python 版本的AscendCL 编程接口
3.1运行 jupyterLab
💖进入sample 启动jupyterLab
进入目录运行sh
cd ~
cd samples
./start_nontebook.sh
3.2打开Jupyter Lab页面
💖界面操作
左侧是ai体验的实例,点击进入目录下的ipynb后缀文件会执行python实例,markdown是可执行的,酷
3.3 释放内存
💖 关闭样例
选择kernel下的shut down allkernets,即可关闭所有运行的样例,避免空间不足
3.4运行目标检测样例
运动目标检测样例
样例代码
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
# 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
运行时间8ms左右:输出parking文字和图片内容一致,符合预期
3.5运行图像曝光增强样例
选择04-HDR 的demo样例
定义资源管理类
import sys
import cv2
import numpy as np
import os
import time
import matplotlib.pyplot as plt
import acl
import acllite_utils as utils
import constants as constants
from acllite_model import AclLiteModel
from acllite_resource import resource_list
class AclLiteResource:
"""
AclLiteResource类
"""
def __init__(self, device_id=0):
self.device_id = device_id
self.context = None
self.stream = None
self.run_mode = None
def init(self):
"""
初始化资源
"""
print("init resource stage:")
ret = acl.init() # acl初始化
ret = acl.rt.set_device(self.device_id) # 指定运算的device
utils.check_ret("acl.rt.set_device", ret)
self.context, ret = acl.rt.create_context(self.device_id) # 创建context
utils.check_ret("acl.rt.create_context", ret)
self.stream, ret = acl.rt.create_stream() # 创建stream
utils.check_ret("acl.rt.create_stream", ret)
self.run_mode, ret = acl.rt.get_run_mode() # 获取运行模式
utils.check_ret("acl.rt.get_run_mode", ret)
print("Init resource success")
def __del__(self):
print("acl resource release all resource")
resource_list.destroy()
if self.stream:
print("acl resource release stream")
acl.rt.destroy_stream(self.stream) # 销毁stream
if self.context:
print("acl resource release context")
acl.rt.destroy_context(self.context) # 释放context
print("Reset acl device ", self.device_id)
acl.rt.reset_device(self.device_id) # 释放device
print("Release acl resource success")
推理功能
path = os.getcwd()
input_w = 512 # 推理输入width
input_h = 512 # 推理输入height
INPUT_DIR = os.path.join(path, 'data/') # 输入路径
OUTPUT_DIR = os.path.join(path, 'out/') # 输出路径
def pre_process(dir_name, input_h, input_w):
"""
预处理
"""
BGR = cv2.imread(dir_name).astype(np.float32)
h = BGR.shape[0]
w = BGR.shape[1]
# 进行归一化、缩放、颜色转换
BGR = BGR / 255.0
BGR = cv2.resize(BGR, (input_h, input_w))
RGB = cv2.cvtColor(BGR, cv2.COLOR_BGR2RGB)
return RGB, h, w
def post_process(input_img, result_list, pic, input_h, input_w):
"""
后处理
"""
o_w, o_h = input_img.shape[:2]
# 获取推理结果,进行形状变换
data = result_list[0].reshape(input_h, input_w, 3)
# 进行缩放、颜色转换
output = (cv2.resize(data, (o_w, o_h)) * 255.0).astype(np.uint8)
output_img = cv2.cvtColor(output, cv2.COLOR_RGB2BGR)
# 保存增强后图像
file_name = os.path.join(OUTPUT_DIR, pic)
cv2.imwrite(file_name, output_img)
# 拼接输入图像和增强后图像,返回进行显示
BGR_U8 = np.concatenate([input_img, output_img], axis=1)
return BGR_U8
def main():
# 创建推理结果存放路径
if not os.path.exists(OUTPUT_DIR):
os.mkdir(OUTPUT_DIR)
# acl初始化
acl_resource = AclLiteResource()
acl_resource.init()
# 加载模型
model_path = os.path.join(path, "model/image_HDR_enhance.om")
model = AclLiteModel(model_path)
# 遍历数据集进行推理
src_dir = os.listdir(INPUT_DIR)
for pic in src_dir:
if not pic.lower().endswith(('.bmp', '.dib', '.png', '.jpg', '.jpeg', '.pbm', '.pgm', '.ppm', '.tif', '.tiff')):
print('it is not a picture, %s, ignore this file and continue,' % pic)
continue
pic_path = os.path.join(INPUT_DIR, pic)
input_img = cv2.imread(pic_path)
# 进行预处理
RGB_image, o_h, o_w = pre_process(pic_path, input_h, input_w)
# 计算推理耗时
start_time = time.time()
# 执行推理
result_list = model.execute([RGB_image, ])
end_time = time.time()
# 打印推理的图片信息和耗时
print('pic:{}'.format(pic))
print('pic_size:{}x{}'.format(o_h, o_w))
print('time:{}ms'.format(int((end_time - start_time) * 1000)))
print('\n')
# 进行后处理
img_result = post_process(input_img, result_list, pic, input_h, input_w)
# 显示输入图像和增强后图像
img_RGB = img_result[:, :, [2, 1, 0]] # RGB
plt.axis('off')
plt.xticks([])
plt.yticks([])
plt.imshow(img_RGB)
plt.show()
结果
acl resource release all resource
AclLiteModel release source success
acl resource release stream
acl resource release context
Reset acl device 0
Release acl resource success
生成的图像增强效果如下:
消耗时间316ms,响应极快
查看生成的out目录下的结果图片,十分清晰
cd out
四、总结
应用场景
香橙派 AIpro 开发板因为比较小巧轻量,内部集合Jupyter Lab 页面,非常方便,对于入门人工智能的开发者非常友好。
试用场景也不仅仅局限于本文的操作,还有以下的多个方向等:
-
原型开发:开发板是原型开发的理想工具。通过连接传感器、执行器和其他外设,开发人员可以快速验证和迭代他们的想法,并评估其可行性。
-
学习和教育:开发板可以作为学生和初学者学习编程和电子技术的工具。它们提供了一个实践的平台,让学习者通过实际操作来理解电子原理和编程概念。
-
项目演示:开发板可以用于演示和展示技术项目。无论是在学术会议上还是在公司内部会议上,通过展示实际的硬件和软件成果,可以增强演示和沟通的效果。
-
物联网应用:开发板是物联网应用开发的重要工具。它们可以用于构建和测试各种物联网设备和传感器网络。
-
自动化控制:开发板可以用于构建自动化控制系统。通过连接和控制传感器和执行器,可以实现各种自动化任务,如智能家居控制、工业自动化等。
香橙派 AIpro的性能体验:
散热:开发板的散热性能良好,持续运行8个小时整个板子的温度都比较低。
噪音:开发板的噪音产生主要来自于风扇,开机过程中存在一点噪音,开机之后噪音就降下来了,影响不大。
负载:开发板的内存和cpu的使用情况状态处于健康状态,能够同时处理的任务或数据量。
烧录系统部署项目过程体验
从拿到板子,然后通过sd卡烧镜像系统,再把sd卡放入香橙派 AIpro,开机之后系统已经安装好了,直接输入密码就可以进入。比以往的安装系统方便快捷不少,不需要一步一步去配置网卡和dns用户名等。
进入开发板有内置的Jupyter Lab 可以在界面上运行ai应用实例,更方便调试运行和对比数据集的结果,相比于传统开发板 香橙派 AIpro更加简单和智能化。