/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
Makefileggml/src/CMakeLists.txtggml/src/ggml-rpc/CMakeLists.txtloongarch64-asserts/setEnv.shonce.sh1. 部署指南
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-lasx3.1.4 全面的库链接更新
补丁系统性地为项目中所有可执行目标添加
stdc++fs链接:测试框架
文件:
tests/CMakeLists.txt操作: 4处修改工具可执行文件
文件: 多个工具CMakeLists.txt文件 操作: 跨工具的17处修改
修改的文件:
tools/batched-bench/CMakeLists.txttools/cvector-generator/CMakeLists.txttools/gguf-split/CMakeLists.txttools/imatrix/CMakeLists.txttools/llama-bench/CMakeLists.txttools/main/CMakeLists.txttools/mtmd/CMakeLists.txt(5处修改)tools/perplexity/CMakeLists.txttools/quantize/CMakeLists.txttools/rpc/CMakeLists.txttools/run/CMakeLists.txttools/server/CMakeLists.txttools/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实现微秒级精度