/usr/local/bin/llama-cli -m ../models/Llama-3.2-1B-Instruct.Q4_K_M.gguf -p "say hello to me" --no-warmup
# 或
/usr/local/bin/llama-cli -m ../models/Llama-3.2-1B-Instruct.Q4_K_M.gguf -p "say hello to me"
llama_perf_sampler_print: sampling time = 72.14 ms / 29 runs ( 2.49 ms per token, 402.02 tokens per second)
llama_perf_context_print: load time = 31424.47 ms
llama_perf_context_print: prompt eval time = 404154.08 ms / 55 tokens ( 7348.26 ms per token, 0.14 tokens per second)
llama_perf_context_print: eval time = 313707.92 ms / 20 runs (15685.40 ms per token, 0.06 tokens per second)
llama_perf_context_print: total time = 4271548.15 ms / 75 tokens
Interrupted by user
llama.cpp for Loongarch64
1. 部署指南
1.1 构建编译
推荐创建系统的 workspace 目录,并在创建的目录内创建相关项目工作目录。
之后的构建流程:
克隆仓库(免当前设备已有对于llama.cpp的工作,这里重命名为 llama.cpp-loongarch64,也可以直接在原来的目录,创建新分支后进行):
应用补丁:
替换文件:
将 ggml-cpu 放到 ggml/src 文件夹中替换原文件;将 src 放到仓库根目录替换原 src 文件夹;将 main 文件夹放到 tools 文件夹中替换原文件
构建:
构建完成后,已测试可在 loongarch64 设备上运行的
llama.cpp
默认位于(成功执行会提示实际位置):将其
intall
目录的 内容 拷贝到目标设备的/usr/local/
即可。该流程在新设备的重新构建编译测试成功:
2. 测试报告
2.1 内容测试
按照前面的流程,编译成功的
~/workspace/llama.cpp-loongarch64/build-loongarch64/install/bin/llama-cli
移动到目标 loongarch64 设备的/usr/local/bin/llama-cli
。执行尝试:(-m 后面是模型.gguf的路径位置):
2.2 测试结果
执行成功的板上输出:
执行成功的运行时间等记录:
1+1询问:
1+1出结果:
这里用时 [10分33.60 - 6分10.22 = 4分23.38]
相同的询问,为初始化后的第二次询问,计算机(i5-11320H)用时 4秒,龙芯 2K0300B 用时 4分23.38秒。
结束的 perf print:
3. 技术方案
3.1 补丁说明
3.1.1 编译器标志修改
文件:
Makefile
操作: 修改(禁用SIMD标志)
行数: 2行删除,2行新增
目的: 禁用LASX(LoongArch高级SIMD扩展)编译器标志。补丁中的注释说明:
这是避免SIMD兼容性问题的保守编译方法。
3.1.2 库链接修改
文件:
ggml/src/CMakeLists.txt
操作: 修改(增强库链接) 行数: 1行删除,3行新增
目的: 为所有平台添加
stdc++fs
(C++文件系统库)链接,Linux系统采用条件链接。这确保文件系统操作在不同环境中正常工作。文件:
ggml/src/ggml-rpc/CMakeLists.txt
操作: 修改(Windows库链接)
行数: 1行删除,1行新增
目的: 为Windows构建的RPC组件添加
stdc++fs
链接。3.1.3 工具链基础设施
文件:
loongarch64-asserts/setEnv.sh
操作: 创建(新文件) 行数: +5行新增
目的: 环境设置脚本,功能包括:
文件:
once.sh
操作: 创建(新可执行脚本) 行数: +29行新增
目的: 自动化构建脚本,功能包括:
-mno-lsx -mno-lasx
3.1.4 全面的库链接更新
补丁系统性地为项目中所有可执行目标添加
stdc++fs
链接:测试框架
文件:
tests/CMakeLists.txt
操作: 4处修改工具可执行文件
文件: 多个工具CMakeLists.txt文件 操作: 跨工具的17处修改
修改的文件:
tools/batched-bench/CMakeLists.txt
tools/cvector-generator/CMakeLists.txt
tools/gguf-split/CMakeLists.txt
tools/imatrix/CMakeLists.txt
tools/llama-bench/CMakeLists.txt
tools/main/CMakeLists.txt
tools/mtmd/CMakeLists.txt
(5处修改)tools/perplexity/CMakeLists.txt
tools/quantize/CMakeLists.txt
tools/rpc/CMakeLists.txt
tools/run/CMakeLists.txt
tools/server/CMakeLists.txt
tools/tokenize/CMakeLists.txt
模式: 所有修改都遵循相同的模式:
目的: 确保所有可执行文件都能访问C++文件系统库功能,这对以下方面至关重要:
3.2 函数修改说明
3.2.1 LoongArch64特定量化优化
文件:
ggml/src/ggml-cpu/arch/loongarch/quants.c
位置: 第37-77行实现
为什么进行此优化
3.2.2 受限环境的内存管理优化
文件:
src/llama-mmap.cpp
位置: 第279-284行实现
为什么进行此优化
3.2.3. 模型加载优化
文件:
src/llama-model-loader.cpp
位置: 第689-704行实现
为什么进行此优化
3.2.4 构建系统优化
文件:
ggml/src/ggml-cpu/CMakeLists.txt
位置: 第347-362行实现
为什么进行此优化
3.2.5 综合性基准测试系统
文件:
tools/main/main.cpp
位置: 第46-168行(辅助函数),第698-975行(集成)内存使用跟踪
性能指标日志记录
主生成循环中的时序集成
为什么进行此优化
std::chrono::high_resolution_clock
实现微秒级精度