Skip to content

项目概览与构建系统 — 练习

练习 1:从源码编译 llama.cpp

将 llama.cpp 克隆到本地,使用 CMake 编译一个仅 CPU 后端的版本:

bash
cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build --config Release -j$(nproc)

验证编译产物:确认 llama-clillama-server 已生成。

参考答案

编译完成后,在 build/bin/ 目录下应能找到:

  • llama-cli — 命令行推理工具
  • llama-server — OpenAI 兼容 API 服务器

可以运行 ./build/bin/llama-cli --help 验证是否正常工作。

练习 2:梳理模块依赖关系

阅读 CMakeLists.txt,画出 ggmlllamatools 的依赖链。思考:

  • llama 库链接了哪些 ggml 的子库?
  • llama-server 相比 llama-cli 多依赖了什么?
参考答案

依赖链:

  • ggml (核心张量) + ggml-base + ggml-cpu (+ 可选 ggml-cuda/ggml-metal)
  • llama 链接上述 ggml 子库
  • llama-cli 链接 llama + common
  • llama-server 额外链接 HTTP 库(如 libcurl)、JSON 解析等

tools/server/CMakeLists.txt 中可以看到 server 的额外依赖。

练习 3:探索 C API 的生命周期

阅读 include/llama.h,列出一次完整推理调用的 API 调用顺序(从模型加载到 token 生成)。

参考答案

完整生命周期:

  1. llama_model_default_params() — 获取默认模型参数
  2. llama_model_load_from_file() — 加载 GGUF 模型
  3. llama_context_default_params() — 获取默认上下文参数
  4. llama_init_from_model() — 创建推理上下文
  5. llama_tokenize() — 文本转 token
  6. llama_batch_get_one() — 创建 batch
  7. llama_decode() — 执行前向传播
  8. llama_sampler_chain_init() — 创建采样器链
  9. llama_sampler_chain_add() — 添加采样器
  10. llama_sampler_sample() — 采样下一个 token
  11. llama_token_to_piece() — token 转文本
  12. 重复 6-11 直到生成结束
  13. llama_sampler_free() / llama_free() / llama_model_free() — 清理

拓展挑战

  • 编译 CUDA 后端并在 GPU 上运行推理
  • 使用 llama-bench 对比不同量化级别的性能
  • 阅读 examples/simple/simple.cpp 理解最小推理示例