ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

大模型量化与端侧部署实战(一)

大模型量化与端侧部署实战(一) Ubuntu V100 环境下 llama.cpp 实践环境准备与 CUDA 编译本文记录在学校 HPC 服务器上从基础环境准备到成功编译 NVIDIA Tesla V100 CUDA 版llama.cpp的完整过程。本文只保留实际执行步骤不记录中间报错排查过程。当前实践环境操作系统Ubuntu调度系统SlurmGPUNVIDIA Tesla V100-PCIE-32GBCUDA Toolkit12.4Python3.11Conda 环境llm工作目录/slurm/home/zhengjie/xss_llmCMake4.4.3llama.cpp 提交0ee9435后续将在此基础上继续完成Qwen2.5-7B-Instruct ↓ GGUF ↓ 量化 ↓ llama.cpp 推理 ↓ llama-server 部署 ↓ 性能测试一、前期环境准备1.1 创建项目目录所有模型、数据、脚本、日志和实验结果统一放在/slurm/home/zhengjie/xss_llm创建基础目录cd/slurm/home/zhengjie/xss_llmmkdir-pmodelsmkdir-pdatasetsmkdir-pscriptsmkdir-plogsmkdir-poutputsmkdir-pcheckpoints目录结构xss_llm/ ├── checkpoints/ ├── datasets/ ├── logs/ ├── models/ ├── outputs/ └── scripts/1.2 创建 Conda 独立环境创建llm环境conda create-nllmpython3.11-y激活环境conda activate llm检查 Pythonpython--versionwhichpython当前环境Python 3.11.16 /slurm/home/zhengjie/.conda/envs/llm/bin/python为了避免用户目录中的旧 Python 包影响当前环境后续统一执行exportPYTHONNOUSERSITE11.3 安装 PyTorch CUDA 版本安装 PyTorch 2.6.0 CUDA 12.4python-s-mpipinstall--no-cache-dir\torch2.6.0\--index-url https://download.pytorch.org/whl/cu124验证python-s-PY import torch print(PyTorch:, torch.__version__) print(CUDA runtime:, torch.version.cuda) print(PyTorch path:, torch.__file__) print(CUDA available:, torch.cuda.is_available()) PY当前结果PyTorch: 2.6.0cu124 CUDA runtime: 12.4 CUDA available: True1.4 安装大模型基础依赖安装 Transformers、Accelerate 和 Hugging Face 相关依赖python-s-mpipinstall--no-cache-dir\transformers\accelerate\huggingface_hub\safetensors\sentencepiece\protobuf当前主要版本transformers 5.17.0 accelerate 1.15.0 huggingface-hub 1.32.0 safetensors 0.8.0 sentencepiece 0.2.2 protobuf 7.36.21.5 验证 V100 GPU 与 FP16 计算进入已经申请到 GPU 的计算环境后执行nvidia-smi当前 GPUTesla V100-PCIE-32GB检查 PyTorch 是否能够正常访问 GPUpython-s-PY import torch print(CUDA available:, torch.cuda.is_available()) print(GPU:, torch.cuda.get_device_name(0)) print(计算能力:, torch.cuda.get_device_capability(0)) PY当前结果CUDA available: True GPU: Tesla V100-PCIE-32GB 计算能力: (7, 0)V100 的 CUDA Compute Capability 为7.0后续编译llama.cpp时对应 CUDA 架构sm_70验证 FP16 GPU 矩阵乘法python-s-PY import torch a torch.tensor( [[1., 2.], [3., 4.]], devicecuda, dtypetorch.float16 ) b torch.tensor( [[5., 6.], [7., 8.]], devicecuda, dtypetorch.float16 ) c a b print(c) print(设备:, c.device) print(类型:, c.dtype) PY输出tensor([[19., 22.], [43., 50.]], devicecuda:0, dtypetorch.float16) 设备: cuda:0 类型: torch.float16至此PyTorch V100 FP16 环境验证完成。1.6 安装 CMake在llm环境中安装conda activate llm condainstall-cconda-forge cmake-y检查版本cmake--version当前版本cmake version 4.4.31.7 加载 CUDA Toolkit 12.4学校集群通过module提供 CUDA Toolkit。查看可用 CUDAmodule avail cuda可用版本cuda/11.8 cuda/12.4加载 CUDA 12.4module load cuda/12.4检查 CUDA 编译器whichnvcc nvcc--version当前路径/slurm/software/compiler/nvidia/cuda/12.4/bin/nvcc版本Cuda compilation tools, release 12.4, V12.4.99二、下载并编译 llama.cpp2.1 克隆 llama.cpp 源码进入项目目录cd/slurm/home/zhengjie/xss_llm克隆gitclone https://github.com/ggml-org/llama.cpp.git进入源码目录cdllama.cpp查看当前提交gitrev-parse--shortHEAD本次实践使用0ee9435后续做性能测试时建议始终记录llama.cpp的提交编号因为不同版本的参数、功能和性能可能发生变化。2.2 编译前加载环境conda activate llmexportPYTHONNOUSERSITE1module load cuda/12.4检查whichnvcc nvcc--versioncmake--version本次环境NVCC: /slurm/software/compiler/nvidia/cuda/12.4/bin/nvcc CUDA: 12.4 CMake: 4.4.32.3 针对 V100 配置 CUDA 构建进入源码目录cd/slurm/home/zhengjie/xss_llm/llama.cpp使用独立的build-v100构建目录并针对 V100 的sm_70架构配置cmake-S.-Bbuild-v100\-DCMAKE_BUILD_TYPERelease\-DGGML_CUDAON\-DCMAKE_CUDA_ARCHITECTURES70\-DCMAKE_CUDA_COMPILER$(command-vnvcc)参数说明参数作用-S .指定当前目录为源码目录-B build-v100指定独立构建目录CMAKE_BUILD_TYPERelease使用 Release 优化构建GGML_CUDAON启用 CUDA 后端CMAKE_CUDA_ARCHITECTURES70针对 Tesla V100 编译CMAKE_CUDA_COMPILER指定 CUDA 12.4 的nvcc配置完成后Configuring done (8.3s) Generating done (2.0s)2.4 编译四个主要程序使用 4 个 CPU 核心并行编译cmake--buildbuild-v100\--configRelease\--targetllama-cli llama-quantize llama-server llama-bench\-j4四个程序的用途程序用途llama-cli命令行模型推理llama-quantizeGGUF 模型量化llama-serverHTTP 推理服务llama-bench推理性能测试CUDA 核心模板与底层 CUDA 算子的编译是整个过程最耗时的部分完成后最后的链接阶段会明显更快。最终四个目标均成功构建。2.5 检查生成的二进制文件ls-lh\build-v100/bin/llama-cli\build-v100/bin/llama-quantize\build-v100/bin/llama-server\build-v100/bin/llama-bench实际结果-rwxrwxr-x 1 zhengjie zhengjie 18K Sep 22 16:28 build-v100/bin/llama-bench -rwxrwxr-x 1 zhengjie zhengjie 1.4M Sep 22 16:27 build-v100/bin/llama-cli -rwxrwxr-x 1 zhengjie zhengjie 18K Sep 22 16:27 build-v100/bin/llama-quantize -rwxrwxr-x 1 zhengjie zhengjie 18K Sep 22 16:28 build-v100/bin/llama-server2.6 检查 CUDA 动态链接执行ldd build-v100/bin/llama-cli|grep-Eggml-cuda|cudart|cublas可以看到libggml-cuda.so.0 libcudart.so.12 libcublas.so.12 libcublasLt.so.12说明当前llama.cpp已成功启用 CUDA 后端并正确链接 CUDA 12 运行时与 cuBLAS。2.7 检查 llama-cli 版本执行./build-v100/bin/llama-cli--version输出version: 0.4.1-dev (build 1, commit 0ee9435) built with GNU 11.4.0 for Linux x86_64查看帮助./build-v100/bin/llama-cli--help|head-35常用参数包括-t, --threads N -c, --ctx-size N -n, --predict N -b, --batch-size N -ub, --ubatch-size N至此针对 NVIDIA Tesla V100sm_70编译的 CUDA 版本llama.cpp已准备完成。三、针对 V100 编译 CUDA 版 llama.cpp3.1 实践环境与编译目标本次实验采用学校 Ubuntu HPC 服务器使用已创建的llmConda 环境。GPU 为 NVIDIA Tesla V100-PCIE-32GB其 CUDA Compute Capability 为7.0对应的 CUDA 架构为sm_70。项目本次配置工作目录/slurm/home/zhengjie/xss_llmConda 环境llmCUDA Toolkit12.4CMake4.4.3C 编译器GNU 11.4.0llama.cpp 提交0ee9435编译目标llama-cli、llama-quantize、llama-server、llama-bench这里要区分两个概念PyTorch 能调用 CUDA不等于具备编译 CUDA 源码所需的nvcc。编译 llama.cpp 的 CUDA 后端时我们使用学校提供的 CUDA Toolkit 12.4。3.2 加载 CUDA Toolkit在学校允许的计算任务环境中执行编译GPU 推理则必须在已经分配到 GPU 的任务中进行。conda activate llmexportPYTHONNOUSERSITE1module load cuda/12.4cd/slurm/home/zhengjie/xss_llmwhichnvcc nvcc--versioncmake--version实际工具信息/slurm/software/compiler/nvidia/cuda/12.4/bin/nvcc Cuda compilation tools, release 12.4, V12.4.99 cmake version 4.4.33.3 获取源码并固定版本cd/slurm/home/zhengjie/xss_llmgitclone https://github.com/ggml-org/llama.cpp.gitcdllama.cppgitrev-parse--shortHEAD本次实际使用的提交为0ee9435如果本地已经存在llama.cpp/直接进入原目录即可不要重复克隆。做性能实验时要记录提交号避免把不同版本的结果直接混在一起。3.4 用 CMake 配置 V100 CUDA 后端cd/slurm/home/zhengjie/xss_llm/llama.cpp cmake-S.-Bbuild-v100\-DCMAKE_BUILD_TYPERelease\-DGGML_CUDAON\-DCMAKE_CUDA_ARCHITECTURES70\-DCMAKE_CUDA_COMPILER$(command-vnvcc)选项含义-B build-v100使用独立构建目录不与其他配置混用Release启用面向运行的优化构建GGML_CUDAON启用 llama.cpp 的 CUDA 后端CMAKE_CUDA_ARCHITECTURES70针对 V100 的sm_70架构构建CMAKE_CUDA_COMPILER使用 CUDA 12.4 模块中的nvcc本次配置已完成Configuring done和Generating done。3.5 编译四个主程序按已申请的 4 个 CPU 核心设置并行数cmake--buildbuild-v100\--configRelease\--targetllama-cli llama-quantize llama-server llama-bench\-j4程序用途llama-cli命令行模型推理llama-quantize将 GGUF 权重量化为指定类型llama-server启动 HTTP 推理服务llama-bench对模型的输入处理与生成性能做基准测试本次四个目标程序全部编译成功。3.6 验证编译结果查看文件ls-lh\build-v100/bin/llama-cli\build-v100/bin/llama-quantize\build-v100/bin/llama-server\build-v100/bin/llama-bench查看版本./build-v100/bin/llama-cli--version实际输出version: 0.4.1-dev (build 1, commit 0ee9435) built with GNU 11.4.0 for Linux x86_64检查 CUDA 动态库链接ldd build-v100/bin/llama-cli|grep-Eggml-cuda|cudart|cublas本次输出包含libggml-cuda.so.0 libcudart.so.12 libcublas.so.12 libcublasLt.so.12这说明程序成功链接 CUDA 后端及 CUDA 相关运行库。实际推理是否把层卸载到 GPU还应结合 GPU 可见性和运行日志另行确认。四、Qwen2.5-7B GGUF 下载与首次 llama.cpp 推理4.1 明确模型、运行框架和硬件的分工本次选择Qwen2.5-7B-Instruct运行官方提供的Q4_K_MGGUF 量化权重。对象在实验中负责什么Qwen2.5-7B-Instruct已训练好的模型及其权重负责生成回答GGUF保存模型权重、模型参数与分词器等信息的文件格式Q4_K_M模型权重所采用的量化类型llama.cpp加载 GGUF 并执行推理的程序与相关工具V100进行计算的硬件需要特别说明本章使用的是官方已经量化好的 Q4_K_M 模型还没有自行完成 FP16 → GGUF → Q4_K_M 量化。4.2 下载官方 Q4_K_M 模型的两个分片官方模型仓库https://huggingface.co/Qwen/Qwen2.5-7B-Instruct-GGUF模型统一存放在/slurm/home/zhengjie/xss_llm/models/Qwen2.5-7B-Instruct-GGUF/先准备目录conda activate llmexportPYTHONNOUSERSITE1cd/slurm/home/zhengjie/xss_llmmkdir-pmodels/Qwen2.5-7B-Instruct-GGUF使用 Hugging Face CLI 指定下载 Q4_K_M 的两个分片hf download Qwen/Qwen2.5-7B-Instruct-GGUF\qwen2.5-7b-instruct-q4_k_m-00001-of-00002.gguf\qwen2.5-7b-instruct-q4_k_m-00002-of-00002.gguf\--local-dir /slurm/home/zhengjie/xss_llm/models/Qwen2.5-7B-Instruct-GGUF本次实际下载采用了https://hf-mirror.com镜像源两个分片均下载完成。上方保留的是标准下载命令使用镜像时需按所在网络环境另行配置。确认两个分片均存在ls-lh/slurm/home/zhengjie/xss_llm/models/Qwen2.5-7B-Instruct-GGUF/*.gguf文件本次显示大小qwen2.5-7b-instruct-q4_k_m-00001-of-00002.gguf约 3.8 GBqwen2.5-7b-instruct-q4_k_m-00002-of-00002.gguf约 658 MB两个分片共同组成同一个模型不是两个可以分别使用的模型也无需手工cat拼接。调用第一片时llama.cpp 会读取后续分片。4.3 Q4_K_M 究竟是什么意思Q4_K_M可以拆成Q4以约 4-bit 为基础的量化权重编码。Kllama.cpp 的 K 系列分块量化表示包含分块所需的缩放等信息。MMedium 变体并非所有张量都严格使用统一的 4-bit 精度。因此它不是“把所有 FP16 数字直接裁成 4 位”。更准确的理解是利用分块与混合精度表示减少权重体积同时尽量保留模型的生成能力。还应区分GGUF和Q4_K_MGGUF 是文件格式Q4_K_M 是权重的量化类型。7B 表示参数规模约 70 亿不是“7GB 模型”。4.4 运行单轮中文推理在已分配 V100 的 GPU 计算任务中执行conda activate llmexportPYTHONNOUSERSITE1module load cuda/12.4cd/slurm/home/zhengjie/xss_llmMODEL/slurm/home/zhengjie/xss_llm/models/Qwen2.5-7B-Instruct-GGUF/qwen2.5-7b-instruct-q4_k_m-00001-of-00002.gguf./llama.cpp/build-v100/bin/llama-cli\-m$MODEL\-ngl99\-c2048\-t4\-n128\--temp0\--single-turn\-p请用通俗易懂的语言解释什么是大语言模型控制在100字以内。常用参数参数本次含义-m指定第一片 GGUF 模型文件-ngl 99尽可能将模型层卸载到 GPU实际层数以日志为准-c 2048上下文大小 2048 Token-t 4使用 4 个 CPU 线程-n 128最多生成 128 个 Token--temp 0使用确定性较强的贪心式生成设置--single-turn回答单轮后退出便于脚本化测试-p输入问题本次运行使用源码提交0ee9435不要照搬旧版llama.cpp的交互参数。4.5 首次推理结果本次模型已经成功生成中文回答并在回答一轮后退出。实际回答大语言模型是一种人工智能模型能理解和生成人类般的文字内容像聊天、写文章一样非常智能灵活。它经过大量数据训练能回答问题、创作文字还能不断学习进步。三次运行的速度记录次数Prompt 处理速度Generation 生成速度第 1 次507.5 tokens/s76.8 tokens/s第 2 次710.6 tokens/s78.5 tokens/s第 3 次711.5 tokens/s78.1 tokens/s其中Prompt processing处理已经给定的输入 Token。Generation模型逐步生成新的 Tokentokens/s不等于“汉字数/秒”。这三次数据是短问题的首次运行记录尚不能替代固定输入长度和生成长度的正式基准测试。4.6 保存实验日志mkdir-p/slurm/home/zhengjie/xss_llm/logs ./llama.cpp/build-v100/bin/llama-cli\-m$MODEL\-ngl99\-c2048\-t4\-n128\--temp0\--single-turn\-p请用通俗易懂的语言解释什么是大语言模型控制在100字以内。\21|tee/slurm/home/zhengjie/xss_llm/logs/qwen2.5-7b-q4km-first-run.logtee会同时显示终端输出并保存日志便于后续写博客、检查参数和比较实验。4.7 本章小结与后续实践至此已经完成V100 CUDA 编译环境 ↓ llama.cpp 四个程序成功编译 ↓ 下载官方 Qwen2.5-7B Q4_K_M GGUF两个分片 ↓ llama-cli 单轮中文推理 ↓ 记录 Prompt 和 Generation 速度下一步将使用llama-bench建立固定条件的Q4_K_M 性能基线然后再下载高精度模型、转换 GGUF、自己量化并比较不同格式。最终通过llama-server完成推理服务部署。
返回列表