香橙派昇腾AIpro ROS具身智能机器人创新实践

香橙派昇腾 AIpro ROS具身智能机器人创新实践


前言

哈喽,大家好!第一次见面请大家多多关照。 因为昇腾的国家级、市级大创要结项同时2024的昇腾AI创新大赛还想干票大的,下半年去商汤实习,应该会比较闲,故此开波首坑!

先说一个我的个人经历吧,和昇腾也是一年多的老朋友了,去年打了23的昇腾AI创新大赛就拿了区银奖没进国,但是赛后竟然有2w的奖金,自此就彻底沦陷昇腾了。由于我本人是人工智能专业,去年做的项目也是“nlp端侧部署”,今年想要基于这个再提升一下,所以就把目光投向了“具身智能”这个领域。


故而,此波开坑将涉及的知识面很广,上有910b集群服务器的大模型训练和微调,夹带ros的机器人感知、建图、导航、规划、决策等,底层涉及嵌入式的layerout和单片机嵌入式开发(谁让咋是智能车出生呢~)
我也不知道自己能不能把这个坑填上,只能说尽力而为哈,望诸位共勉~


一、香橙派AIpro介绍

1.香橙派AIpro简介

香橙派联合华为发布了基于昇腾的Orange Pi AIpro开发板,提供8/20TOPS澎湃算力,能覆盖生态开发板者的主流应用场景,让用户实践各种创新场景,并为其提供配套的软硬件。而价格更是极为亲民,8TOPS、8GB内存的创客价/预售价仅为799元,8TOPS、16GB内存的创客价/预售价仅为999元。20TOPS的顶配也才1999,相比华子确实良心的太多了。Orange Pi AIpro开发板采用昇腾AI技术路线,无论在外观上、性能上还是技术服务支持上都非常优秀,提供8/20TOPS澎湃算力,能覆盖生态开发板者的主流应用场景,让用户实践各种创新场景,并为其提供配套的软硬件。

请添加图片描述
OrangePi AIpro(8-12T)采用昇腾AI技术路线,具体为4核64位处理器+AI处理器,集成图形处理器,支持8-12TOPS AI算力,拥有8GB/16GB LPDDR4X,可以外接32GB/64GB/128GB/256GB eMMC模块,支持双4K高清输出。 Orange Pi AIpro引用了相当丰富的接口,包括两个HDMI输出、GPIO接口、Type-C电源接口、支持SATA/NVMe SSD 2280的M.2插槽、TF插槽、千兆网口、两个USB3.0、一个USB Type-C 3.0、一个Micro USB(串口打印调试功能)、两个MIPI摄像头、一个MIPI屏等,预留电池接口,可广泛适用于AI边缘计算、深度视觉学习及视频流AI分析、视频图像分析、自然语言处理、智能小车、机械臂、人工智能、无人机、云计算、AR/VR、智能安防、智能家居等领域,覆盖 AIoT各个行业。 Orange Pi AIpro支持Ubuntu、openEuler操作系统,满足大多数AI算法原型验证、推理应用开发的需求。

小平手里目前20t和8t的板子都已入坑,谁让咱是昇腾家的铁粉呢~

二、AIpro ros环境搭建

别问为啥用ros1,不直接apt安装,因为本心是想重新看一遍ros的整个实现,考虑把ros算法下移至高性能mcu,这样掉包的时候都能去看源码来加深理解,其次才是本地编译带来的性能加速,主要还是为了督促一下自己学习,要不直接用ros2不香嘛~

参考博客:香橙派AIpro测评:快速部署SLAM算法,性能与体验的完美融合:https://blog.csdn.net/qq_45049500/article/details/140136108

1.编译noetic-ros

直接编译ros的源码坑倒是没什么坑,常见报错都有解决方案哈,我编译的时候有一个报错需要将gcc11回退到gcc9才可以编译通过(8t已经编完投入生产了,等我20t编ros的时候遇到了再分享给大家哈)

参考博客:Ubuntu 22.04源码编译安装ros noetic https://blog.csdn.net/Drknown/article/details/128701624

2.安装编译需要的ros包

这部分就很是头疼,因为我ros工作空间跑的是迁移之前树莓派上的麦轮小车,所以就是编译中遇到一个缺的包补一个包,足足耗时我三天的青春呐¥
这部分很无聊就是缺啥补啥,但就是很容易遇到历史遗留原因造成的bug,详情都等之后20t的板子上见真章哈,大家遇到问题可以评论去交流哈

3.系统镜像备份

当我们把系统的环境配置完了之后首当其冲的一定是要把现在的镜像备份,要不后面系统被自己玩炸了都没地方哭!!!
我也是去找了好多的资料研究怎么去备份和打包这个镜像,但发现最后往往是大道至简,直接ubuntu上两行命令搞定,枉废我试了诸如systemback、winhex、diskgenius等等工具,最可气的是这些克隆完还不能用…

镜像备份代码如下(环境:本地ubuntu物理机 准备:要备份系统的sd卡文件):
注:tf卡的挂载位置大家按自己的来就行,打包后的位置也需要指定本,这个耗时有点长,也没有日志回显,大家耐心等待~

# 通过dd指令将挂载的sd卡打包为镜像文件
dd if=/dev/sda | gzip>/home/aipro_20t/orangepiaipro_20t.gz

请添加图片描述

# 将打包的文件指向需要备份的挂载sd卡(sd卡需要格式化为ext4)
gzip -dc /home/aipro_20t/orangepiaipro_20t.gz  | sudo dd of=/dev/sda

请添加图片描述

参考博客:制作SD卡备份镜像以及还原 https://blog.csdn.net/sinat_33909696/article/details/116430895

三、ros机器人实践

为什么要用ros呢?

ROS(Robot Operating System)是一个适用于机器人的开源框架,这个框架把原本松散的零部件耦合在了一起,为它们提供了通信架构。
ROS虽然叫做操作系统,但是它却要安装在如Linux这种操作系统上才能运行。它的作用只是连接真正的操作系统(如Linux)和使用者自己开发的ROS应用程序(比如自动驾驶的感知、规划、决策等模块),所以它也算是个中间件,在基于ROS的应用程序之间建立起了沟通的桥梁。

实验过程留到后续开专栏再写吧,要不篇幅太长了~

1.添加摄像头(普通usb、D435i)功能包

USB 摄像头是日常使用当中最常见的一种类型,如笔记本内置摄像头等,在 ROS 中使用此类设备非常轻松,可以直接使用 usb_cam 功能包驱动。
Intel RealSense D435i是英特尔公司推出的一款消费级深度相机,包含一个RGB相机、两个红外相机以及一个红外发射器,此外还有一个IMU单元,通过主动立体红外成像获得深度图和对应RGB影像生成RGB-D点云。

2.添加雷达(单线360度激光雷达)功能包

移动机器人在环境中获取障碍物的具体位置、房间的内部轮廓等信息都是非常必要的,这些信息是机器人创建地图、进行导航的基础数据,以及多传感器融合的重要数据。
激光雷达可用于测量机器人和其他物体之间的距离。我使用的是 rplidar A1 雷达,这款雷达适合室内移动机器人使用,可以最快 10Hz 频率检测 360︒范围内的障碍物信息,最远检测信息 6m。具体参数可参考其官网 RPLIDAR A1
针对 rplidar A1 这款激光雷达,ros 中有相应的驱动功能包—rplidar,该功能包的相关话题、参数设置接口可以参考一下链接。
网址:https://github.com/Slamtec/rplidar_ros
rplidar roswiki:http 😕/wiki.ros.org/rplidar
rplidar 主页:http://www.slamtec.com/cn/Lidar
rplidar SDK:https//github.com/Slamtec/rplidar_sdk
rplidar 教程:https://github.com/robopeak/rplidar_ros/wiki

3.实现AIpro与单片机(stm32、rt1064、rt1176、mcx n947)的通信

rosserial

rosserial 是一种 ROS 串行通信协议,通过串行传输介质实现 ROS 的 P2P 通信。这种协议通过简单的添加包头和包尾可以实现了多主题或者服务共享串行通信介质(如串口,网络 socket)。
rosserial 的详细介绍:http://wiki.ros.org/rosserial
rosserial_client 的介绍:http://wiki.ros.org/rosserial_client
rosserial_client 的教程:http://wiki.ros.org/rosserial_client
rosserial 的协议介绍:http://wiki.ros.org/rosserial/Overview/Protocol

协议包格式

使用串口调试助手(波特率:57600, 数据位:8,停止位:1,HEX 显示:开),获取到 STM32 传输的信息如下:
在这里插入图片描述
如上图所示从一个 FF 到下一个 FF 为一帧数据,所包涵的信息如下:
在这里插入图片描述
不同ROS发行版对应不同协议版本字段定义(0xff:ROS Groovy, 0xfe on ROS Hydro, Indigo, and Jade.)。
Topics ID 0-100 为系统功能专用主题使用, 这些主题类似于消息 rosserial_msgs/TopicInfo 中定义的那些特定主题。
长度和 data 的 checksum 字段用于确保包的完整性,data 的 checksum 可以按照如下公式计算:
(Topic ( - 255 ID Topic + Byte Low ID 256)

主题协商

在数据传输之前,PC/平板一侧必须先向 Arduino 或者其它嵌入式设备发送主题查询请求,确定将要发
送或者订阅的主题的名字和消息类型。
主题协商由主题查询请求,响应和主题定义组成。主题查询请求使用的 topic ID 为 0。
主题查询请求类似于如下所示:
0xff 0xfe 0x00 0x00 0xff 0x00 0x00 0xff
主题查询响应包 (消息类型为 rosserial_msgs/TopicInfo) 包含了特定主题信息,使用如下的数据信息:
◼ uint16 topic_id
◼ string topic_name
◼ string message_type
◼ string md5sum
◼ int32 buffer_size
上面的 topic_name 是主题名称,如 “cmd_vel”, message_type 是消息类型,如"geometry_msgs/Twist"。
注意:如果响应包未收到,查询会重发。

同步

相互之间的时间同步通过发送消息 std_msgs::Time 实现。 嵌入式设备可以向 PC/平板发送空的时间消息获取当前时间,响应返回的时间可以用于时间同步(检查时钟偏差)。

移植适用于 mcu 的 roslib(ros 协议)

在 ros 中安装 rosserial_arduino 包以后,可以在 Arduino IDE 中直接使用 ROS,rosserial_arduino提供了 ros 的通信协议,它可以在 Arduino 的 UART 上工作,它可以使Arduino 成为一个完整的 ROS 节点,直接发布和订阅 ROS 消息,发布 TF 转换,并获得 ROS 系统时间。
由于我们使用的是 stm32,Ros 中没有提供类似 rosserial_arduino 的直接用于 stm32 的串口协议包,所以需要将利用 rosserial_arduino 生成的 roslib 修改为适用于 stm32 使用的协议库。而且利用rosserial_arduino 功能包,在我们想要使用自定义消息的时候,生成过程也很方便。同时后续也会为我自己设计的其他系列芯片进行移植demo演示(毕竟之前为了薅nxp的第一颗npu芯片mcx n947工程样片出卖了我的灵魂),这里先放波图安抚芯魂:
请添加图片描述
顺便也水一下aipro的帅照,可怜我几个月饭钱了~
请添加图片描述

4.ros控制机器人执行动作

在任何大型的基于 ROS 的系统中,都有这样的情况:有人想向某个节点发送请求,以执行某些任务,并接收对请求的应答。这可以通过 ROS 服务来实现。但是,在某些情况下,如果服务需要很长时间执行,用户可能希望在执行过程中取消请求,或者得到关于请求进展情况的定期反馈。actionlib 包提供了创建服务器的工具,这些服务器执行可被抢占的长期目标。它还提供了一个客户端接口,以便向服务器发送请求。
actionlib 接口不但可以调度任务的执行,而且具备中断任务、任务状态跟踪与周期性状态反馈、执行过程中间结果反馈的能力。actionlib 使用 client-server 工作模式,ActionClient 和 ActionServer 通过"ROS Action Protocol"进行通信,"ROS Action Protocol"以 ROS 消息方式进行传输。此外 ActionClient 和ActionServer 给用户提供了一些简单的接口,用户使用这些接口可以完成 goal 请求(client-side)和 goal执行(server-side)。actionlib 接口定义了ActionClient(任务请求的客户端)与 ActionServer(任务调度的服务器端)。

ActionClient 与 ActionServer 的交互设计

在这里插入图片描述
在这里插入图片描述
ROS 系统在 action 文件(文件名后缀为.action)中定义了上述 goal、result、feedback 等消息。

ros机器人控制

控制才是机器人的灵魂,目前我手里用的是麦轮车,就以麦轮运动学模型来写控制接口啦,下位机侧需要做一些简单的传感器数据采集以及滤波处理之类,上位机就负责控制任务的话题发布,等之后换上rt1176。mcx n947之类的高性能mcu后,会逐渐将上层算法下移至单片机处理(毕竟单片机就是用来压榨的,但这也是后话了~)

麦克纳姆轮正逆运动学模型:
正运动学模型(forward kinematic model)将得到一系列公式,让我们可以通过四个轮子的速度,计算出底盘的运动状态;而逆运动学模型(inverse kinematic model)得到的公式则是可以根据底盘的运动状态解算出四个轮子的速度。
这里是希望通过底盘运动状态去计算出每个车轮的运动状态,所以用到逆运动学模型。
传统的推导过程虽然严谨,但还是比较繁琐的,这里介绍一种简单的逆运动学计算方式。
全向移动底盘是一个纯线性系统,而刚体运动又可以线性分解为三个分量。那么只需要计算出麦轮底盘在「沿 X 轴平移」、「沿 Y 轴平移」、「绕几何中心自转」时,四个轮子的速度,就可以通过简单的加法,计算出这三种简单运动所合成的「平动+旋转」运动时所需要的四个轮子的转速。而这三种简单运动时,四个轮子的速度可以通过简单的测试,或是推动底盘观察现象得出。这里定义 X、Y、Z 的正方向如下图所:
在这里插入图片描述

推导的逆解公式如下:

//front-left motor
rpm.motor1 = x_rpm_ - y_rpm_ - tan_rpm_;
//rear-left motor
rpm.motor2 = x_rpm_ + y_rpm_ - tan_rpm_;
//front-right motor
rpm.motor3 = x_rpm_ + y_rpm_ + tan_rpm_;
//rear-right motor
rpm.motor4 = x_rpm_ - y_rpm_ + tan_rpm_;

如有对麦轮运动学模型有疑问的,可以去看b站小虎哥《机器人SLAM导航核心技术与实战》:全向底盘运动学解析

以下就是ros机器人控制流程示意图:
请添加图片描述

5.基于cann的识别任务

感知这部分可以做的内容就太多了,可以GLIP或者多模态大模型之类,但为了简单考虑这部分我们就用ffmpeg加速跑个yolo就ok了吧(又不是不能用~),刚好把之前做认证踩的坑都记录一下。

目标检测

通过相机的分割图我们可以获取到所有物体的编号从⽽获取到物体名字,然后结合深度图信息通过坐标转换获取到物体的位置信息,⾼度信息等。但是由于本次仿真平台给出的所有相同类别物体的编号都是⼀样,导致我们⽆法区别同类别的物体。因此我们采⽤DBSCAN算法(Density-BasedSpatial Clustering of Applications with Noise,具有噪声的基于密度的聚类⽅法)将每⼀个物体都检测出来并赋予唯⼀的标识符(ID),以便机器⼈在探索过程中能够识别并处理关键物体,提⾼环境感知的全⾯性和准确性。其实现原理如图5-5所⽰,如果像素点的相互距离⼩于或等于指定的 ϵ ,那么它们将是同⼀类的。换句话说,它是DBSCAN⽤来确定两个点是否相似和属于同⼀类的距离。更⼤的 ϵ 将产⽣更⼤的簇(包含更多的像素点),更⼩的 ϵ 将构建更⼩的簇。在⼀个邻域的半径内MinPts数的邻域被认为是⼀个簇。请记住,初始点包含在MinPts中。⼀个较低的MinPts帮助算法建⽴更多的集群与更多的噪声或离群值。较⾼的MinPts将确保更健壮的集群,但如果集群太⼤,较⼩的集群将被合并到较⼤的集群中。

下图即为DBSCAN算法⽰意图:
DBSCAN算法⽰意图
⽬标检测任务包括识别两类关键物体信息,识别机器⼈需要避开的障碍物,或者需要定位和采集信息的⽬标。

语义地图构建

我们使用语义分割图像结合深度信息⽤于障碍物识别同时也形成了机器⼈对环境语义信息的抽象表⽰,即语义地图构建。机器⼈通过⽬标检测,识别环境中的关键物体,并将其相对位姿转化为世界坐标,将其物体名称和唯⼀ID标识进⾏记忆,主动探索与记忆架构如下所示:
在这里插入图片描述
由于⽬标检测的结果包含了位置信息和类别信息。在语义地图构建阶段,利⽤⽬标检测的边界框坐标信息,深度图像和相机参数,将⽬标检测结果中的位置信息转化为世界坐标。这⼀步骤是通过三⻆测量计算物体在真实世界中的位置,以便在语义地图中准确表⽰⽬标的空间位置。实现坐标转化后,为每个检测到的⽬标分配唯⼀的标识符(ID)。唯⼀ID的分配有助于在语义地图中准确识别和跟踪每个⽬标。最后,将⽬标的世界坐标、物体名称和唯⼀ID标识以字典形式存储。字典的键是⽬标的唯⼀ID,值则包括世界坐标、物体名称,物体⾼度等信息。这样的数据结构⽅便后续的检索和使⽤。
机器⼈每⼀次抵达新的未知区域,重复执⾏数据获取,障碍物识别,⽬标检测和语义地图构建的步骤。机器⼈根据已知和未知区域的变化,不断选择、移动到新的边界点,更新地图信息与语义信息,直⾄整个环境得到充分探索。

四、大模型赋能具身智能

在大模型快速发展的当下,为我们的生产和生活带来了无限可能,同时为机器人的感知、导航、规划、决策等都带来了新的发展机遇,由此具身智能的概念便应运而生,但在端测设备有限的算力下带来了模型能力和推理速度两方面的挑战,我们肯定希望机器人具有较快的响应速度与较高的智能化成功程度,但现实是残酷的,我们期望打造的是电影中的贾维斯,但也不可否认它很有可能成为一个人工智障~

1.本地推理大模型(llama、chatglm、rwkv等)

首先,不是我尬黑,在昇腾的310和910上,小平都是被折磨的不清,现在昇腾肯定比不了nvidia,但昇腾的发展空间与成长潜力是不可否认的,在现在各大npu厂商角逐的盛况下,我绝对有理由相信昇腾是最有实力笑道最后的存在(华子坐拥中国顶级的科学家与海思芯片设计团队,从芯片构架设计与后期的生态维护都绝无二者),所以大家再不要再喷小平是被金钱收买的。
然后回归正题,我们要在310上实现大模型的推理,在之前Atlas 200 AI DK上只能评价跑的一坨,但现在aipro的内存和算力加上来后就和爽多了。

模型压缩

《模型压缩》模型压缩主要是对模型进行剪枝、蒸馏、量化等压缩算法和手段,使得模型更加小、更加轻便、更加利于执行。以此减少后续推理的内存占用以及算力需求。

小伙伴们想要更加详细的了解模型压缩过程,我强烈建议看”ZOMI酱“的详细讲解,汇总链接总结如下:
基本介绍
低比特量化原理
感知量化训练 QAT
训练后量化 PTQ 与部署
模型剪枝
知识蒸馏原理
知识蒸馏算法

计算图

为了高效地训练一个复杂神经网络,框架需要解决诸多问题,例如:如何实现自动求导,如何利用编译期分析对神经网络计算进行化简、合并、变换,如何规划基本计算单元在加速器上的执行,如何将基本处理单元派发(dispatch)到特定的高效后端实现,如何进行内存预分配和管理等。用统一的方式解决这些问题都驱使着框架设计者思考如何为各类神经网络计算提供统一的描述,从而使得在运行神经网络计算之前,能够对整个计算过程尽可能进行推断,在编译期自动为用户程序补全反向计算,规划执行,最大程度地降低运行时开销。

目前主流的 AI 框架都选择使用计算图来抽象神经网络计算,《计算图》实际上,AI 框架主要的职责是把深度学习的表达转换称为计算机能够识别的计算图,计算图作为 AI 框架中核心的数据结构,贯穿 AI 框架的大部分整个生命周期,于是计算图对于 AI 框架的前端核心技术就显得尤为重要。

小伙伴们想要更加详细的了解什么是计算图,我强烈建议看”ZOMI酱“的详细讲解,汇总链接总结如下:
基本介绍
什么是计算图
与自动微分关系
图优化与图执行调度
计算图控制流实现
计算图实现动静统一
计算图的挑战与未来

2.大模型webUI的搭建

一个大模型后端推理成功了,那也要搭载上美美的前端才有灵魂,现在有很多现成好用的包(如streamlit)和很多现成的项目(如nextchat),我本次使用比较推荐nextchat,是基于java搭建的前端界面,界面优雅、插件丰富。

nextchat搭建UI界面(推荐)

由于nextchat是基于java编写的前端项目,我肯定是写不明白的,但是懂使用和添加插件模板就可以啦,用用还是没难度的~
这个还是留给以后实操吧,虽然我几个月前已经很优雅的跑起来了,但是准备不够充分,现在就先鸽了吧~

streamlit搭建UI界面

3.Function calling能力调用

Function calling的核心是我们将Prompts 提示词和可用函数列表一起发送给LLM,Function Calling允许我们以 JSON 格式向 LLM 模型描述函数,并使用模型的固有推理能力来决定在生成响应之前是否调用该函数。模型本身不执行函数,而是生成包含函数名称和执行函数所需的参数的 JSON。
Function calling调用流程图
利⽤Function calling能⼒,可以通过⼤模型实现:
• 在与用户进⾏⾃然语⾔交流时,可以调⽤外部⼯具回答问题;
• 需要调⽤外部⼯具时,将用户请求转换为调⽤⼯具时需要传⼊的参数。

Function calling能⼒可以嵌⼊多轮对话通过聊天API(Chat Completion)进⾏使⽤。实现Function calling能⼒的代码逻辑为:

  1. 在初始请求参数中向⼤模型传递信息,描述开发者所提供的可调⽤⼯具函数的信息。
  2. 解析⼤模型响应的消息类型,若⼤模型决定需要调⽤函数,则根据⼤模型返回的函数信息和函数传
    参调⽤函数,并获得函数执⾏结果。
  3. 将函数返回的结果添加到消息列表中,并再次调⽤⼤模型完成⼀轮对话。

客户端发送的function calling调用流程:

#初始请求参数中向⼤模型传递可调⽤⼯具函数信息
system_item = {"role": "system",
"content": "Answer the following questions as best as you can. Yo
"tools": tools}
params = dict(...,messages=system_item, ...)
...
#解析⼤模型响应的消息类型
response = get_response(**params)
if response.get("function_call")#若需要调⽤⼯具函数,根据⼤模型返回的调⽤信息进⾏调⽤
function_args = json.loads(...)
tool_response = dispatch_tool(function_name, function_args)
#函数调⽤结果添加到消息列表中,再次调⽤⼤模型完成⼀轮对话
params["messages"].append(tool_response)
response = get_response(**params)

Function calling的关键是如何更好的提⽰⼤模型判断是否需要进⾏外部⼯具调⽤并在需要⼯具调⽤时⽣成对
应⼯具函数的参数,使⽤该参数来执⾏调⽤函数,并将其结果返回。
为了解决这个问题,⼀⽅⾯,可以通过构造⼯具调⽤数据集,训练⼤模型意图识别能⼒;另⼀⽅⾯,我们对⼯具设计进⾏微调(主要调整函数功能描述“description”),更好的引导⼤模型进⾏⼯具调⽤。

⼤模型收到的functions信息格式如下:

#function call ⽰例:查询某地的天⽓
{
	"name": "get_weather",
	"description": "Get the weather in a given city",
	"parameters": {
		"type": "object",
		"properties": {
			"city": {
				"type": "string",
				"description": "The city",
			},
		},
		"required": ["city"],
	},
}

4.langchain构建本地知识库

概述

LangChain是一个强大的框架,旨在帮助开发人员使用语言模型构建端到端的应用程序。它提供了一套工具、组件和接口,可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。LangChain 可以轻松管理与语言模型的交互,将多个组件链接在一起,并集成额外的资源,例如 API 和数据库。
在这里插入图片描述

本地知识库搭建

本地知识库搭建的流程如下:
1、准备本地知识库文档目前支持 txt、docx、md、pdf 格式文件,使用Unstructured Loader类加载文件,获取文本信息。
2、对文本进行分割,将大量文本信息切分为chunks
3、选择一种embedding算法,对文本向量化
4、将知识库得到的embedding结果保存到数据库,就不用每次应用都进行前面的步骤
5、将问题也用同样的embedding算法,对问题向量化
6、从数据库中查找和问题向量最相似的N个文本信息
7、得到和问题相关的上下文文本信息
8、获取提示模板
9、得到输入大模型的prompt比如:问题:***,通过以下信息 *** 汇总得到答案。
10、将prompt输入到LLM得到答案

以上只是简单的步骤流程,实际应用中每一步都会有遇到很多问题,比如文本格式如何加载;文本如何分割才能尽可能少的不分开紧密相关上下文;embedding算法的选取;关于提问信息的相关上下文的召回和排序问题;提示模板的形式;大模型的选取等等等等。本文只是尝鲜搭建整套流程,所以不探索这些问题。

参考链接:langchain中文网

5.行为树规划

目前,由于大模型现阶段不具备完善的可解释性与时常出现的幻觉效应,这在我们的机器人中是绝对不允许的,故此我们引入了行为树来约束和规划大模型的行为任务。

五、基于ModelArts的大模型专业能力微调

由于小平目前对Mindspore不是特别熟悉,目前只能做torch_npu的马仔,希望早日鸟枪换炮拥抱昇思~

1.docker镜像制作

昇腾的最新镜像源网址都在这里了,大家可以进去自选合适镜像docker拉取至本地:mirrors.cn-central-221.ovaijisuan.com/mirrors.html

# 将docker镜像拉取本地
docker pull remote_image_address
# 用docker tag 将局点信息和组织名替换成对应版本
docker tag local_image_address swr_image_address
# 用docker push 将修改后的镜像名称推送到局点的swr服务中(这步之前需要login局点的swr组织)
docker push swr_image_address

拉取镜像到本地后,如果需要涉及root权限的环境操作,强烈建议本地配置好后再docker push

2.基于transformers的大模型微调实践

Transformers指的是huggingface开发的大模型库,为huggingface上数以万计的预训练大模型提供预测、训练等服务。目前昇腾是原生支持了transformers的,以及accerlate的分布式加速。‘
最近小平基于transformers在训rwkv架构的海洋大模型的项目,等论文发完后与大家一起分享哈~

昇腾transformers仓库参考:https://gitee.com/ascend/transformers

3.分布式中的数据并行、张量并行、流水线并行

数据并行

数据并行是一种广泛应用于分布式 AI 系统中的技术,旨在通过将数据集划分为多个子集并在不同计算节点上并行处理这些子集,以提高计算效率和速度。在大规模机器学习和深度学习训练过程中,数据并行可以显著加快模型训练速度,减少训练时间,提升模型性能。大部分的数据并行模型中,每个计算节点都会接收到完整的模型副本,但处理不同的数据子集。通过这种方法,计算任务可以被分摊到多个节点上,从而显著提高处理速度和效率。
数据并行的实现方式多种多样,按照同步方式进行分类,包括同步数据并行和异步数据并行。同步数据并行要求所有计算节点在每一轮迭代后同步其参数,确保模型的一致性。而异步数据并行则允许节点独立进行计算和参数更新,从而减少等待时间,但也可能带来参数不一致的问题。按照实现方式进行分类,包括数据并行、分布式数据并行、完全分片的数据并行、异步的数据并行、弹性数据并行以及参数服务器。

张量并行

在大模型的训练中,单个设备往往无法满足计算和存储需求,因此需要借助分布式训练技术。其中,模型并行(Model Parallelism, MP)是一种重要的方法。模型并行的基本思想是将模型的计算任务拆分到不同的设备上执行,以提高训练效率和处理更大规模的模型。下面将重点介绍模型并行中的张量并行。

流水线并行

在大模型的训练中,单个设备往往无法满足计算和存储需求,因此需要借助分布式训练技术。其中,模型并行(Model Parallelism, MP)是一种重要的方法。模型并行的基本思想是将模型的计算任务拆分到不同的设备上执行,以提高训练效率和处理更大规模的模型。模型并行主要分为朴素的模型并行、张量并行和流水线并行。下面将详细介绍模型并行中的流水并行。
同时流水线并行还常用于算子开发中的tilling切分,大家有兴趣都可以多多了解哈。

小伙伴们想要更加详细的了解分布式并行,我强烈建议看”ZOMI酱“的详细讲解,汇总链接总结如下:
基本介绍
数据并行①
数据并行②
张量并行
流水并行
混合并行
昇思MindSpore并行

4.基于分布式框架(deepspeed、accerlate、Megatron-LM)的大模型训练

在了解并行框架之前,我们要理解什么是混合精度训练以及模型的显存占用分析
混合精度训练(Mixed Precision Training):是一种在深度学习中提高训练速度和减少内存占用的技术。通过使用半精度浮点数(16位浮点数,FP16)和单精度浮点数(32位浮点数,FP32)的组合。在不改变模型、不降低模型训练精度的前提下,可以缩短训练时间,降低存储需求,因而能支持更大的 batch size、更大模型和尺寸更大的输入的训练。

deepspeed

DeepSpeed是一个开源的深度学习优化库,它由微软开发并维护,旨在提高大规模模型训练的效率和可扩展性。通过创新的算法和技术,DeepSpeed能够降低训练超大规模模型的复杂性和资源需求,让深度学习训练变得更快、更高效。

DeepSpeed特点和优势:
高效的并行化策略:DeepSpeed支持多种并行化方法,包括数据并行、模型并行和流水线并行。这些方法可以灵活组合,以适应不同规模和复杂度的深度学习模型。通过并行化,DeepSpeed能够显著提高训练速度和可扩展性。
内存优化技术:为了降低内存占用和提高训练效率,DeepSpeed引入了ZeRO(Zero Redundancy Optimizer)技术。ZeRO通过将优化器的状态、梯度和参数在分布式环境中进行分割,从而减少了冗余的内存占用。这使得在有限的内存资源下训练更大的模型成为可能。
混合精度训练支持:DeepSpeed支持混合精度训练,即同时使用单精度和半精度浮点数进行训练。这种方法可以在保持模型性能的同时,减少内存占用和计算时间,降低能耗。
易用性和兼容性:DeepSpeed与PyTorch等主流深度学习框架紧密集成,提供了易用的API和丰富的文档支持。这使得用户能够轻松地将DeepSpeed集成到他们的项目中,并充分利用其提供的优化功能。此外,DeepSpeed还提供了高度优化的数据加载和网络通信工具,以减少通信量并提高多GPU和多节点环境下的训练效率。

在这里插入图片描述
参考链接大模型分布式训练之DeepSpeed:https://blog.csdn.net/David_house/article/details/140721572
详细的视频讲解还得是看“ZOMI酱”的 DeepSpeed介绍

5.提升agent能力的强化对齐

RLHF概述

人类反馈强化学习 (RLHF) 是一种机器学习技术,利用人类的直接反馈来训练“奖励模型”,然后利用该模型通过强化学习来优化人工智能坐席的性能。
RL 算法的目标是优化策略以产生最大奖励。在深度强化学习中,策略以神经网络的形式表示。在训练过程中,神经网络会根据奖励函数不断更新。AI 坐席能够从经验中学习,就像人类一样。
传统强化学习在很多领域取得了骄人的成绩,但在一些复杂任务上,由于很难明确定义什么是“成功”,构建有效的奖励函数就成了难题。RLHF 的主要优势是它能够使用积极的人类反馈代替形式化定义的目标,从而捕捉细微差别和主观性。

RLHF原理

在正式进入强化学习阶段之前,需要利用监督微调 (SFT) 来引导模型,使其生成的响应符合用户的预期格式。为了在强化学习中为奖励函数提供人类反馈,需要一个奖励模型来将人类偏好转化为数字奖励信号。设计有效的奖励模型是 RLHF 的关键一步,因为没有简单的数学或逻辑公式可以切实地定义人类的主观价值。这部分有点类似模型蒸馏的感觉(找个大哥对自己的行为指指点点),业界主流的做法应该就是“薅羊毛”,之前一般都是接openai来做reward model反馈打分。
此阶段的主要目的是为奖励模型提供足够的训练数据,包括来自人类评估者的直接反馈,以帮助模型学习模仿人类依据其偏好将奖励分配给不同种类的模型响应的方式。训练可以在没有人工参与的情况下继续离线进行。
奖励模型必须接收一段文本序列并输出标量奖励值,该值以数值方式预测人类用户对该文本会给予多少奖励(或惩罚)。标量值输出对于奖励模型的输出与 RL 算法其他组成部分的集成至关重要。

RLHF的缺点

①人类偏好数据成本高昂。收集第一手人类反馈的需求可能会造成一个代价高昂的瓶颈,限制 RLHF 流程的可扩展性。
②人类的输入具有高度主观性。要就“高质量”的输出到底是什么达成坚定的共识,几乎是不可能的,因为人类评估者不仅会对所谓的“事实”产生不同的意见,还会对“适当的”模型行为究竟应该如何理解存在分歧。
③人类评估者可能会犯错,甚至故意采取对抗性和恶意行为。人类对模型的引导并不总是出于善意,他们可能怀抱着真诚的反对意见,也可能故意操纵学习过程。

总结

这篇博客是我的系列开坑篇,之后一边实践一边与大家分享,期待与大家一起交流学习,为昇腾的生态发展添砖加瓦~

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值