Update README.md
通过深度利用 RISC-V Vector (RVV) 扩展,我们重构并向量化了 ggml 的关键算子,用于 llama-7b-chat–hf 的 4-bit 量化模型。经 perf 驱动的瓶颈定位与验证,采用向量化流水线、运行时 VLEN 自适应与精度优先策略,在保证数值结果完全精确(比特/语义等价验证)的前提下,实现了推理吞吐量和延迟的显著提升。
主要优化的算子 ggml_vec_dot_q4_0_q8_0(Q4_0 与 Q8_0 量化向量点积)
原实现瓶颈:
Q4_0 为 4-bit 非字节对齐封装,原算法逐位/逐块串行解包,指令级并行度低;
在整数累加与浮点缩放间频繁来回切换,导致流水线停顿;
标量/简单循环限制了 ILP,无法隐藏内存与计算延迟。
优化方案:
并行化数据解包:利用 RVV 位操作(vand/vsrl/vslideup 等)在向量寄存器内并行完成 4-bit 解包与符号扩展,避免回落到标量域。
FP32 浮点向量累加器:引入宽带 float32 向量累加器(如 vfloat32m4_t),将中间结果直接提升/转换为 fp32 并在向量域累加,维持连续的浮点数据流。
高效流水线与循环展开:设计“拓宽乘法 -> 浮点转换 -> 融合乘加”的流水线(vwmul -> vfcvt -> vfmacc),并使用 4 路循环展开并发处理多个数据块以隐藏延迟。
向量规约:最终使用 vfredusum 等向量规约指令高效得到标量结果。
ggml_vec_dot_f16(FP16 浮点向量点积)
直接用 fp16 累加时,长向量累加极易发生精度丢失或数值溢出,影响最终正确性。
FP32 精度累加:强制将所有 fp16 乘积提升到 fp32 并在 fp32 向量累加器中进行累加,保证数值稳定性与精确复现。
向量化类型提升:批量将 fp16 提升为 fp32(向量化转换,必要时借助临时缓冲),在向量域完成计算。
并行融合乘加:用 vfmacc_vv 等指令在 fp32 上做并行乘加。
向量规约:用 vfredusum 完成高效求和得到最终结果。
工程化、验证与可移植性
perf-driven 优化:以真实 perf 分析定位热点,集中资源优化被高频调用的点积与 GEMM。
TileLang-RVV 自动生成后端:引入 TileLang DSL + RVV 后端(TileLang-RVV),能从高层描述自动生成高性能 RVV Intrinsics C 代码,大幅提升开发/迭代效率,生成代码在性能上接近手写优化并对尾部/非对齐情形稳定。
运行时硬件自适应:程序启动时查询 VLEN 并动态调整计算粒度与循环展开,保证在不同 RISC-V 规格上都能发挥接近理论性能。
与玄铁矩阵扩展 / csi-nn 兼容:对需要的 GEMM 路径集成了对玄铁矩阵扩展的 tile 化优化,并在 SG2044 等平台上用 csi-nn 做 fp32 GEMM 加速验证。
数值严苛验证:通过大规模随机测试集比对向量化内核与标量内核,按“比特级/语义等价”验证数值正确性,确保优化不改变结果。
意义与成果(简要)
在不牺牲数值精度的前提下,解决了 ggml 在 RISC-V 平台上因量化格式与标量实现导致的性能短板;
将串行解包与低精度累加的瓶颈转化为高吞吐量的向量化流水线;
提供了一套可复用、可自动生成且易维护的算子实现路径,推动 RISC-V 在端侧大模型推理领域的实际可用性与生态建设。
本项目展示了利用 RISC-V Vector Extension (RVV) 1.0 指令集对 llama.cpp 项目进行深度优化所取得的显著性能成果。通过在先进的 SG2044 64核 RISC-V 开发板上进行测试,我们验证了 RVV 在加速大语言模型(LLM)推理方面的巨大潜力,为 RISC-V 架构在 AI 推理领域的应用提供了强有力的性能基准和实践指南。
llama.cpp
您可以按照以下步骤复现本次性能测试。
克隆 llama.cpp 仓库并进入项目目录。
git clone https://github.com/ggml-org/llama.cpp.git cd llama.cpp
(注意:为保证结果一致性,本项目测试基于 commit 18f6a1ef1cdb2cb99de2b92cb56e1794ab6cd008)
18f6a1ef1cdb2cb99de2b92cb56e1794ab6cd008
创建一个构建目录,并使用 CMake 进行编译。关键在于开启 GGML_RVV 优化选项。
GGML_RVV
mkdir build && cd build cmake .. -DGGML_RVV=ON \ -DCMAKE_BUILD_TYPE=RelWithDebInfo \ -DBUILD_SHARED_LIBS=OFF \ -DGGML_BLAS_VENDOR=OpenBLAS make -j64
使用编译好的 llama-cli 程序运行模型推理。请确保您已经下载了相应的 GGUF 模型文件(例如 llama-2-7b-chat.Q4_0.gguf)。
llama-cli
llama-2-7b-chat.Q4_0.gguf
./bin/llama-cli -m /path/to/your/model.gguf
延迟越低,用户体验越好。RVV 优化在所有场景下均显著降低了处理时间。
单线程性能对比
64线程性能对比
吞吐量越高,系统处理能力越强。RVV 优化大幅提升了单位时间内的 token 处理数量。
吞吐量提升幅度
这是本次优化的一个关键成果:用更少的资源,实现更强的性能。
研究发现,RVV 优化版本的 44 线程配置 是性能与资源的“黄金平衡点”。与基准版本的 64 线程配置相比:
这一结果证明,RVV 优化不仅提升了速度,更能显著提高硬件的计算效率,直接转化为数据中心和边缘设备的功耗节省和成本降低。
RVV 向量扩展是释放 RISC-V 架构在 AI 推理领域潜力的关键技术。本项目通过在 llama.cpp 上的成功实践,清晰地展示了 RVV 优化能够为大语言模型推理带来数量级的性能提升和能效改善。这为在 RISC-V 平台上部署高性能、低成本的 AI 应用奠定了坚实的基础。
DeepSeek等模型的兴起推动了端侧大模型的发展,而RISC-V架构凭借其开放性和可扩展性,在端侧推理终端中逐步占据一席之地。优化RISC-V端侧大模型推理技术,不仅能提升推理性能,还能推动RISC-V操作系统AI生态的完善,加速RISC-V智能操作系统的发展。 本赛题旨在通过优化大模型应用中的核心算子,在 RISC-V 架构上实现高效的推理性能,充分利用RISC-V向量和矩阵扩展指令集,以及多核计算体系架构,进一步提升大模型推理的计算速度和吞吐量。 推理框架方面,参赛者可以选择llama.cpp开源框架。操作系统环境为开源操作系统,要求参赛者基于此系统进行开发,提供全方位的优化方案。
李可 li_ke@hl-it.cn
©Copyright 2023 CCF 开源发展委员会 Powered by Trustie& IntelliDE 京ICP备13000930号
赛题题目:面向大模型应用的RISC-V向量和矩阵扩展算子优化
项目简介
通过深度利用 RISC-V Vector (RVV) 扩展,我们重构并向量化了 ggml 的关键算子,用于 llama-7b-chat–hf 的 4-bit 量化模型。经 perf 驱动的瓶颈定位与验证,采用向量化流水线、运行时 VLEN 自适应与精度优先策略,在保证数值结果完全精确(比特/语义等价验证)的前提下,实现了推理吞吐量和延迟的显著提升。
主要优化的算子 ggml_vec_dot_q4_0_q8_0(Q4_0 与 Q8_0 量化向量点积)
原实现瓶颈:
Q4_0 为 4-bit 非字节对齐封装,原算法逐位/逐块串行解包,指令级并行度低;
在整数累加与浮点缩放间频繁来回切换,导致流水线停顿;
标量/简单循环限制了 ILP,无法隐藏内存与计算延迟。
优化方案:
并行化数据解包:利用 RVV 位操作(vand/vsrl/vslideup 等)在向量寄存器内并行完成 4-bit 解包与符号扩展,避免回落到标量域。
FP32 浮点向量累加器:引入宽带 float32 向量累加器(如 vfloat32m4_t),将中间结果直接提升/转换为 fp32 并在向量域累加,维持连续的浮点数据流。
高效流水线与循环展开:设计“拓宽乘法 -> 浮点转换 -> 融合乘加”的流水线(vwmul -> vfcvt -> vfmacc),并使用 4 路循环展开并发处理多个数据块以隐藏延迟。
向量规约:最终使用 vfredusum 等向量规约指令高效得到标量结果。
ggml_vec_dot_f16(FP16 浮点向量点积)
原实现瓶颈:
直接用 fp16 累加时,长向量累加极易发生精度丢失或数值溢出,影响最终正确性。
优化方案:
FP32 精度累加:强制将所有 fp16 乘积提升到 fp32 并在 fp32 向量累加器中进行累加,保证数值稳定性与精确复现。
向量化类型提升:批量将 fp16 提升为 fp32(向量化转换,必要时借助临时缓冲),在向量域完成计算。
并行融合乘加:用 vfmacc_vv 等指令在 fp32 上做并行乘加。
向量规约:用 vfredusum 完成高效求和得到最终结果。
工程化、验证与可移植性
perf-driven 优化:以真实 perf 分析定位热点,集中资源优化被高频调用的点积与 GEMM。
TileLang-RVV 自动生成后端:引入 TileLang DSL + RVV 后端(TileLang-RVV),能从高层描述自动生成高性能 RVV Intrinsics C 代码,大幅提升开发/迭代效率,生成代码在性能上接近手写优化并对尾部/非对齐情形稳定。
运行时硬件自适应:程序启动时查询 VLEN 并动态调整计算粒度与循环展开,保证在不同 RISC-V 规格上都能发挥接近理论性能。
与玄铁矩阵扩展 / csi-nn 兼容:对需要的 GEMM 路径集成了对玄铁矩阵扩展的 tile 化优化,并在 SG2044 等平台上用 csi-nn 做 fp32 GEMM 加速验证。
数值严苛验证:通过大规模随机测试集比对向量化内核与标量内核,按“比特级/语义等价”验证数值正确性,确保优化不改变结果。
意义与成果(简要)
在不牺牲数值精度的前提下,解决了 ggml 在 RISC-V 平台上因量化格式与标量实现导致的性能短板;
将串行解包与低精度累加的瓶颈转化为高吞吐量的向量化流水线;
提供了一套可复用、可自动生成且易维护的算子实现路径,推动 RISC-V 在端侧大模型推理领域的实际可用性与生态建设。
🚀 核心亮点
本项目展示了利用 RISC-V Vector Extension (RVV) 1.0 指令集对
llama.cpp项目进行深度优化所取得的显著性能成果。通过在先进的 SG2044 64核 RISC-V 开发板上进行测试,我们验证了 RVV 在加速大语言模型(LLM)推理方面的巨大潜力,为 RISC-V 架构在 AI 推理领域的应用提供了强有力的性能基准和实践指南。🔬 测试平台配置
🛠️ 如何开始
您可以按照以下步骤复现本次性能测试。
1. 获取源代码
克隆
llama.cpp仓库并进入项目目录。(注意:为保证结果一致性,本项目测试基于 commit
18f6a1ef1cdb2cb99de2b92cb56e1794ab6cd008)2. 编译源代码
创建一个构建目录,并使用 CMake 进行编译。关键在于开启
GGML_RVV优化选项。3. 运行推理
使用编译好的
llama-cli程序运行模型推理。请确保您已经下载了相应的 GGUF 模型文件(例如llama-2-7b-chat.Q4_0.gguf)。📊 性能基准测试结果
1. 延迟(Latency)测试
延迟越低,用户体验越好。RVV 优化在所有场景下均显著降低了处理时间。
单线程性能对比
64线程性能对比
2. 吞吐量(Throughput)测试
吞吐量越高,系统处理能力越强。RVV 优化大幅提升了单位时间内的 token 处理数量。
吞吐量提升幅度
3. CPU 占用率与资源效率分析
这是本次优化的一个关键成果:用更少的资源,实现更强的性能。
研究发现,RVV 优化版本的 44 线程配置 是性能与资源的“黄金平衡点”。与基准版本的 64 线程配置相比:
这一结果证明,RVV 优化不仅提升了速度,更能显著提高硬件的计算效率,直接转化为数据中心和边缘设备的功耗节省和成本降低。
结论
RVV 向量扩展是释放 RISC-V 架构在 AI 推理领域潜力的关键技术。本项目通过在
llama.cpp上的成功实践,清晰地展示了 RVV 优化能够为大语言模型推理带来数量级的性能提升和能效改善。这为在 RISC-V 平台上部署高性能、低成本的 AI 应用奠定了坚实的基础。赛题说明:
DeepSeek等模型的兴起推动了端侧大模型的发展,而RISC-V架构凭借其开放性和可扩展性,在端侧推理终端中逐步占据一席之地。优化RISC-V端侧大模型推理技术,不仅能提升推理性能,还能推动RISC-V操作系统AI生态的完善,加速RISC-V智能操作系统的发展。 本赛题旨在通过优化大模型应用中的核心算子,在 RISC-V 架构上实现高效的推理性能,充分利用RISC-V向量和矩阵扩展指令集,以及多核计算体系架构,进一步提升大模型推理的计算速度和吞吐量。 推理框架方面,参赛者可以选择llama.cpp开源框架。操作系统环境为开源操作系统,要求参赛者基于此系统进行开发,提供全方位的优化方案。
赛题要求:
评分标准:
功能完整性(40%):
性能优化(30%):
代码规范性(20%):
文档质量(10%):
赛题联系人:
李可 li_ke@hl-it.cn
参考资料:
参赛资源支持: