diff --git a/source/_posts/大模型.md b/source/_posts/大模型.md index 32b1800..193c775 100644 --- a/source/_posts/大模型.md +++ b/source/_posts/大模型.md @@ -121,11 +121,35 @@ export PATH="$PATH:/mnt/c/Program Files/Ollama" alias ollama='ollama.exe' ``` -# nvidia-smi +# nvidia + +## cuda-toolkit + +### WSL安装 + +1. 下载 **CUDA Toolkit Installer** + + ```shell + wget https://developer.download.nvidia.com/compute/cuda/12.8.1/local_installers/cuda-repo-rhel9-12-8-local-12.8.1_570.124.06-1.x86_64.rpm + sudo rpm -i cuda-repo-rhel9-12-8-local-12.8.1_570.124.06-1.x86_64.rpm + sudo dnf clean all + sudo dnf -y install cuda-toolkit-12-8 + ``` + +2. 配置环境变量 + ```shell + vim ~/.bashrc + + # 文件末尾添加 + # cuda 10.2 + export CUDA_HOME=/usr/local/cuda + export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64 + export PATH=$PATH:$CUDA_HOME/bin + ``` -> nvidia-smi是nvidia 的系统管理界面 ,其中smi是System management interface的缩写,它可以收集各种级别的信息,查看显存使用情况。此外, 可以启用和禁用 GPU 配置选项 (如 ECC 内存功能)。 ## nvidia-smi +> nvidia-smi是nvidia 的系统管理界面 ,其中smi是System management interface的缩写,它可以收集各种级别的信息,查看显存使用情况。此外, 可以启用和禁用 GPU 配置选项 (如 ECC 内存功能)。 ```shell nvidia-smi @@ -220,7 +244,33 @@ modelscope download --model deepseek-ai/DeepSeek-R1-Distill-Qwen-7B README.md -- > +## 问题 +1. conda激活[虚拟环境](https://so.csdn.net/so/search?q=虚拟环境&spm=1001.2101.3001.7020),只显示环境名称,不再显示用户名和当前文件夹 + + ```shell + #在个人环境下修改 + conda activate gatkenv + + conda env config vars set PS1='($CONDA_DEFAULT_ENV)[\u@\h \W]$' + #重启环境就ok了 + + conda deactivate + + conda activate gatkenv + + #在所有的虚拟环境下修改,这个命令的意思是在~/.condarc下添加一行 + + conda config --set env_prompt "({default_env})[\u@\h \W]$" + + #取消设置 + + conda config --remove-key env_prompt + ``` + + + +2. # Jupyter Notebook @@ -242,3 +292,120 @@ jupyter notebook --allow-root # UnSloth +# LLama.cpp + +> `llama.cpp`是一个基于纯`C/C++`实现的高性能大语言模型推理引擎,专为优化本地及云端部署而设计。其核心目标在于通过底层硬件加速和量化技术,实现在多样化硬件平台上的高效推理,同时保持低资源占用与易用性。 + +## 编译llama.cpp + +首先从`Github`上下载`llama.cpp`的源码: + +```text +git clone https://github.com/ggml-org/llama.cpp +cd llama.cpp +``` + +`llama.cpp`支持多种硬件平台,可根据实际的硬件配置情况选择合适的编译参数进行编译,具体可以参考文档`docs/build.md`。 + +**安装CMAKE** + +```shell +wget https://github.com/Kitware/CMake/releases/download/v4.0.0-rc4/cmake-4.0.0-rc4-linux-x86_64.sh +chmod -R 777 cmake-4.0.0-rc4-linux-x86_64.sh +./cmake-4.0.0-rc4-linux-x86_64.sh +mv cmake-4.0.0-rc4-linux-x86_64/ /usr/local/cmake +echo 'export PATH="/usr/local/cmake/bin:$PATH"' >> ~/.bashrc +source ~/.bashrc + +sudo dnf install gcc-toolset-13-gcc gcc-toolset-13-gcc-c++ +source /opt/rh/gcc-toolset-13/enable +``` + +**编译CPU版本** + +```text +cmake -B build +cmake --build build --config Release -j 8 +``` + +**编译GPU版本** + +编译英伟达`GPU`版本需要先装好驱动和`CUDA`,然后执行下面的命令进行编译 + +```text +cmake -B build -DGGML_CUDA=ON -DGGML_CUDA_ENABLE_UNIFIED_MEMORY=1 +cmake --build build --config Release -j 8 +``` + +> 编译完成后,可执行文件和库文件被存放在`build/bin`目录下。 + +## 模型下载与转换 + +首先从魔搭社区下载模型: + +```text +pip install modelscope +modelscope download --model deepseek-ai/DeepSeek-R1-Distill-Qwen-7B --local_dir DeepSeek-R1-Distill-Qwen-7B +``` + +下载好的模型是以`HuggingFace`的`safetensors`格式存放的,而`llama.cpp`使用的是`GGUF`格式,因此需要先要把模型转换为`GGUF`格式: + +```text +# 安装python依赖库 +pip install -r requirements.txt +# 转换模型 +python convert_hf_to_gguf.py DeepSeek-R1-Distill-Qwen-7B/ +``` + +转换成功后,在该目录下会生成一个`FP16`精度、`GGUF`格式的模型文件`DeepSeek-R1-Distill-Qwen-7B-F16.gguf`。 + +## 模型量化 + +`FP16`精度的模型跑起来可能会有点慢,我们可以对模型进行量化以提升推理速度。 + +`llama.cpp`主要采用了分块量化(`Block-wise Quantization`)和`K-Quantization`算法来实现模型压缩与加速,其核心策略包括以下关键技术: + +1. **分块量化(Block-wise Quantization)** + 该方法将权重矩阵划分为固定大小的子块(如`32`或`64`元素为一组),每个子块独立进行量化。通过为每个子块分配独立的缩放因子(`Scale`)和零点(`Zero Point`),有效减少量化误差。例如,`Q4_K_M`表示每个权重用`4`比特存储,且子块内采用动态范围调整。 +2. **K-Quantization(混合精度量化)** + 在子块内部进一步划分更小的单元(称为“超块”),根据数值分布动态选择量化参数。例如,`Q4_K_M`将超块拆分为多个子单元,每个子单元使用不同位数的缩放因子(如`6bit`的缩放因子和`4bit`的量化值),通过混合精度平衡精度与压缩率。 +3. **重要性矩阵(Imatrix)优化** + 通过分析模型推理过程中各层激活值的重要性,动态调整量化策略。高重要性区域保留更高精度(如`FP16`),低重要性区域采用激进量化(如`Q2_K`),从而在整体模型性能损失可控的前提下实现高效压缩。 +4. **量化类型分级策略** + 提供`Q2_K`至`Q8_K`等多种量化级别,其中字母后缀(如`_M`、`_S`)表示优化级别: +5. **Q4_K_M**:中等优化级别,平衡推理速度与精度(常用推荐)。 +6. **Q5_K_S**:轻量化级别,侧重减少内存占用 + +典型场景下,`Q4_K_M`相比`FP16`模型可减少`70%`内存占用,推理速度提升`2-3`倍,同时保持`95%`以上的原始模型精度。实际部署时需根据硬件资源(如`GPU`显存容量)和任务需求(如生成文本长度)选择量化策略。 + +执行下面的命令可将`FP16`精度的模型采用`Q4_K_M`的量化策略进行量化: + +```text +./build/bin/llama-quantize DeepSeek-R1-Distill-Qwen-7B/DeepSeek-R1-Distill-Qwen-7B-F16.gguf DeepSeek-R1-Distill-Qwen-7B/DeepSeek-R1-Distill-Qwen-7B-Q4_K_M.gguf Q4_K_M +``` + +量化完成后,模型文件由`15.2G`减少到`4.7G`。 + +## 运行模型 + +模型量化完后,我们就可以运行模型来试试效果了。`llama.cpp`提供了多种运行模型的方式: + +### 命令行方式 + +执行下面的命令就可以在命令行与模型进行对话了: + +```text +./build/bin/llama-cli -m DeepSeek-R1-Distill-Qwen-7B/DeepSeek-R1-Distill-Qwen-7B-Q4_K_M.gguf -cnv +``` + +### HTTP Server方式 + +由于模型是以`Markdown`格式输出内容,因此用命令行的方式看着不太方便。`llama.cpp`还提供`HTTP Server`的方式运行,交互性要好很多。 + +首先在终端执行命令 + +```text +./build/bin/llama-server -m DeepSeek-R1-Distill-Qwen-7B/DeepSeek-R1-Distill-Qwen-7B-Q4_K_M.gguf --port 8088 +``` + +然后打开浏览器,输入地址`http://127.0.0.1:8088`就可以在网页上与模型进行交互了,非常方便!