前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >RISC-V 软件移植及优化锦标赛 S2311 个人总结

RISC-V 软件移植及优化锦标赛 S2311 个人总结

原创
作者头像
TomoriNao
发布2024-03-08 23:03:18
1270
发布2024-03-08 23:03:18
举报
文章被收录于专栏:每月技术成长

赛题解读

在 Milk-v duo上运行 Baby LLaMA 2 并实现 文本转语音功能

在未进行任何优化的情况下,Baby LLaMA 2 在运行15M参数的模型时,仅占用了部分CPU和内存资源(资源占用率均低于30%),但生成 token 的速度极慢,无法达到流畅生成故事的需求,本题需要采取各种手段优化其运行速度

思路

  • 提高CPU利用率 得知 Milk-v duo 实际上具有双核,但官方镜像仅在大核上运行linux, 若能启用小核将能够通过多线程提高程序运行速度。 原本以为仅需要修改 linux kernel 配置,启用 SMP 即可顺利启用小核,但实际上,还需要修改对应的设备树才可能启用小核,但设备树涉及知识盲区,故采取其他措施
  • 优化矩阵乘法 程序在运行时,涉及大量矩阵运算,消耗资源最多的是矩阵乘法,可以通过将大矩阵分解为小矩阵再进行运算的方式,提高 cache 命中率 从而提高程序效率(后来了解到可以通过 激光法 或 Strassen算法 来减少矩阵乘次数),但实际效果有限
  • 使用 vector 指令集 通过 vector 指令集 ,实现同时进行多个浮点数的计算,极大地减少运算时间。 查阅资料可知,C906 有 32 个 128 位 向量寄存器,每个向量寄存器可储存四位浮点数,且提供了 intrinsic 来避免手工编写大量汇编指令,可以通过 vector 指令集使用向量乘和向量加来提高程序运行效率
  • 提高内存使用率 最开始不理解为什么程序内存使用率这么低(模型文件大小甚至超过总内存大小),在阅读其他人提交的 PR 后,发现是由于程序使用mmap进行内存映射,而不是将文件一次性加载到内存中,导致运行时需要进行频繁的文件IO,极大地拖慢了整体运行速度,可以通过设置 swap 分区,一次性加载文件等方式缓解 io 导致的性能问题。 猜想:可以启用 kernel 的 zram 特性,将文件一次性全部加载到内存中(甚至不需要设置 swap)
  • 优化模型 浮点数的运算显著慢于整数,只要将模型量化为 int8 即可大幅提高程序运行速度,同时因为程序无法一次性加载导致的文件 IO 也可以同时解决 猜想:是否能够以 半精度浮点数 的形式表示权重?这将在提高程序运行效率的同时,保持较好的精度,得到更合理的输出。(C/C++ 23 已经支持半精度浮点数,但编译器的适配显然不可能如此迅速,因此,即使 CPU 支持 半精度浮点,也无法通过程序使用该特性来优化)

总结

由于开始优化时,离提交截止时间已经较近,因此没有将所有的设想全部实现一遍,但通过本次尝试,我熟悉了 risc v Vector 指令集的操作,了解到了 Baby LLaMA 2 这个有趣的项目,体验到了在嵌入式设备上进行性能优化的思维方式,了解到了 C 程序如何运行模型文件

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 赛题解读
  • 思路
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档