diff --git a/source/_posts/Hexo.md b/source/_posts/Hexo.md index e40933e..d7657b6 100644 --- a/source/_posts/Hexo.md +++ b/source/_posts/Hexo.md @@ -52,6 +52,50 @@ hexo new [layout] 新建一篇文章。如果没有设置 `layout` 的话,默认使用 [_config.yml](https://hexo.io/zh-cn/docs/configuration) 中的 `default_layout` 参数代替。如果标题包含空格的话,请使用引号括起来。 +## 图片上传 + +### 本地目录 + +**先将 _config.yml 文件中的 post_asset_folder 选项设为 true** + +该操作的目的就是在使用`hexo new xxx`指令新建md文档博文时,在相同路径下同步创建一个`xxx`文件夹,而`xxx`文件夹就是用来存放新建md文档里的图片的 + +![image-20250519143309765](Hexo/image-20250519143309765.png) + +就像这样,新建的md文档和其对于的同名文件夹都在/source/_posts路径下 + +但如果你习惯不用hexo new xxx指令创建新md文档,而是直接打开typora写然后保存到/source/_posts下,这个时候你就需要自己手动创建一个**同名的文件夹**才可以。 + +#### 解决图片路径问题 + +typora的图片插入的语法我是一般不会用的,大多数时候就是复制粘贴图片到md文档里面。这个时候我们再慢慢修改路径到上面我们创建的文件夹下面就太麻烦了。 + +我们可以通过以下设置来舒舒服服按照简单粗暴的复制粘贴插入图片: + +**打开typora,点击文件,点击偏好设置,点击图像** + +![image-20250519143418309](Hexo/image-20250519143418309.png) + +第一个,将图片复制到指定路径./$(filename)的效果就是:**我们粘贴图片到md文档的时候,typora会自动把图片再复制一份到我们上面创建的同名文件夹下** + +这样的好处还有一点,就是也不用我们自己创建同名文件夹了,typora会自己帮我们创建(有的话就复制到这里面)(**但 _config.yml文件中的post_asset_folder选项还是得设为 true,这是必须的**) + +效果就像这样: + +![image-20250519143457653](Hexo/image-20250519143457653.png) + +#### 解决md文档转换到html文档路径不一样的问题 + +转换需要用到**hexo-asset-img**插件 + +在博客的源码文件夹下启动命令行,下载插件hexo-asset-img: + +```shell +yarn add hexo-asset-img +``` + +是**hexo-asset-img**,**不是**其他文章里写的**hexo-asset-image**,这也是我之前用了不好使的原因 + # Butterfly 主题 ## 鼠标样式修改 diff --git a/source/_posts/Hexo/image-20250519143309765.png b/source/_posts/Hexo/image-20250519143309765.png new file mode 100644 index 0000000..be52278 Binary files /dev/null and b/source/_posts/Hexo/image-20250519143309765.png differ diff --git a/source/_posts/Hexo/image-20250519143418309.png b/source/_posts/Hexo/image-20250519143418309.png new file mode 100644 index 0000000..4503b38 Binary files /dev/null and b/source/_posts/Hexo/image-20250519143418309.png differ diff --git a/source/_posts/Hexo/image-20250519143457653.png b/source/_posts/Hexo/image-20250519143457653.png new file mode 100644 index 0000000..b4dc6f8 Binary files /dev/null and b/source/_posts/Hexo/image-20250519143457653.png differ diff --git a/source/_posts/大模型.txt b/source/_posts/大模型.txt deleted file mode 100644 index 6204741..0000000 --- a/source/_posts/大模型.txt +++ /dev/null @@ -1,811 +0,0 @@ ----- - -h2. title: 大模型 -date: 2025-02-18 10:06:57 -tags: - -h1. Ollama - -h2. 1. 安装 - -首先需要下载并安装Ollama,这是运行模型的基础环境。 - -!https://markdownhexo.oss-cn-hangzhou.aliyuncs.com/img/image-20250218102658870.png! - -h2. 2. 下载模型 - -打开命令行终端,根据需要运行以下命令之一来下载对应版本的模型: - -!https://markdownhexo.oss-cn-hangzhou.aliyuncs.com/img/image-20250218104847668.png! - -以DeepSeek为例: - -7B 版本(推荐显存 8G): - -{code:title=none|language=bash|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} -ollama pull deepseek-coder:7b -{code} - -8B 版本(推荐显存 8G): - -{code:title=none|language=bash|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} -ollama run huihui_ai/deepseek-r1-abliterated:8b -{code} - -14B 版本(推荐显存 12G): - -{code:title=none|language=bash|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} -ollama run huihui_ai/deepseek-r1-abliterated:14b -{code} - -32B 版本(推荐显存 32G): - -{code:title=none|language=bash|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} -ollama run huihui_ai/deepseek-r1-abliterated:32b -{code} - -70B 版本(需要高端显卡支持): - -{code:title=none|language=bash|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} -ollama run huihui_ai/deepseek-r1-abliterated:70b -{code} - -h2. 3. Ollama 常用命令 - -在使用 Ollama 时,以下是一些常用的命令操作: - -{code:title=none|language=bash|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} -# 启动 Ollama 服务 -ollama serve - -# 从 Modelfile 创建模型 -ollama create <模型名称> - -# 显示模型信息 -ollama show <模型名称> - -# 运行模型 -ollama run <模型名称> - -# 停止运行中的模型 -ollama stop <模型名称> - -# 从仓库拉取模型 -ollama pull <模型名称> - -# 推送模型到仓库 -ollama push <模型名称> - -# 列出所有已安装的模型 -ollama list - -# 列出正在运行的模型 -ollama ps - -# 复制模型 -ollama cp <源模型> <目标模型> - -# 删除模型 -ollama rm <模型名称> - -# 显示模型文件 -ollama show --modelfile <模型名称> -{code} - -h2. 4. Ollama模型存储目录 - - * macOS: {{~/.ollama/models}} -* Linux: {{/usr/share/ollama/.ollama/models}} -* Windows: {{C:\Users\%username%\.ollama\models}} - -h3. 如何将它们设置为不同的位置? - -如果需要使用不同的目录,可以将环境变量 {{OLLAMA_MODELS}} 设置为你选择的目录。 - -{quote} -注意:在 Linux 上使用标准安装程序时,{{ollama}} 用户需要对指定目录有读写权限。要将目录分配给 {{ollama}} 用户,请运行 {{sudo chown -R ollama:ollama <directory>}}. -{quote} - -请参考[上面的部分|https://ollama.readthedocs.io/faq/#how-do-i-configure-ollama-server]了解如何在你的平台上设置环境变量。 - -!https://markdownhexo.oss-cn-hangzhou.aliyuncs.com/img/image-20250218132430850.png! - -h2. 5. WSL中Ollama使用Windows中的 - -{code:title=none|language=bash|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} -# 编辑环境变量 -vim /etc/profile - -# 文件末尾添加 -export PATH="$PATH:/mnt/c/Program Files/Ollama" -alias ollama='ollama.exe' -{code} - -h1. nvidia - -h2. cuda-toolkit - -h3. WSL安装 - - # 下载 *CUDA Toolkit Installer* - -{code:title=none|language=bash|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} -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 -{code} -# 配置环境变量 - -{code:title=none|language=bash|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} -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 -{code} - -h2. nvidia-smi - -{quote} -nvidia-smi是nvidia 的系统管理界面 ,其中smi是System management interface的缩写,它可以收集各种级别的信息,查看显存使用情况。此外, 可以启用和禁用 GPU 配置选项 (如 ECC 内存功能)。 -{quote} - -{code:title=none|language=bash|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} -nvidia-smi - -+-----------------------------------------------------------------------------------------+ -| NVIDIA-SMI 570.86.09 Driver Version: 571.96 CUDA Version: 12.8 | -|-----------------------------------------+------------------------+----------------------+ -| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC | -| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. | -| | | MIG M. | -|=========================================+========================+======================| -| 0 NVIDIA RTX 4000 Ada Gene... On | 00000000:01:00.0 Off | Off | -| N/A 50C P8 7W / 85W | 4970MiB / 12282MiB | 0% Default | -| | | N/A | -+-----------------------------------------+------------------------+----------------------+ - -+-----------------------------------------------------------------------------------------+ -| Processes: | -| GPU GI CI PID Type Process name GPU Memory | -| ID ID Usage | -|=========================================================================================| -| 0 N/A N/A 16221 C /python3.12 N/A | -+-----------------------------------------------------------------------------------------+ - -{code} - -解释相关参数含义: - -GPU:本机中的GPU编号 - -Name:GPU 类型 - -Persistence-M: - -Fan:风扇转速 - -Temp:温度,单位摄氏度 - -Perf:表征性能状态,从P0到P12,P0表示最大性能,P12表示状态最小性能 - -Pwr:Usage/Cap:能耗表示 - -Bus-Id:涉及GPU总线的相关信息; - -Disp.A:Display Active,表示GPU的显示是否初始化 - -Memory-Usage:显存使用率 - -Volatile GPU-Util:浮动的GPU利用率 - -Uncorr. ECC:关于ECC的东西 - -Compute M.:计算模式 - -Processes 显示每块GPU上每个进程所使用的显存情况。 - -h3. 持续监控 - -{code:title=none|language=bash|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} -# 使用 watch 命令,它可以定时执行指定的命令并刷新输出。例如,每隔 1 秒刷新一次 GPU 状态,可以使用以下命令 -watch -n 1 nvidia-smi -{code} - -h2. nvidia-smi -L - -{code:title=none|language=bash|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} -# 列出所有可用的 NVIDIA 设备 -nvidia-smi -L -GPU 0: NVIDIA RTX 4000 Ada Generation Laptop GPU (UUID: GPU-9856f99a-c32c-fe63-b2ad-7bdee2b12291) -{code} - -h1. ModelScope - -h2. 模型下载 - -h3. 安装 - -{code:title=none|language=bash|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} -pip install modelscope -{code} - -h3. 命令行下载 - -{code:title=none|language=bash|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} -# 下载完整模型库 -modelscope download --model deepseek-ai/DeepSeek-R1-Distill-Qwen-7B -# 下载单个文件到指定本地文件夹(以下载README.md到当前路径下“dir”目录为例) -modelscope download --model deepseek-ai/DeepSeek-R1-Distill-Qwen-7B README.md --local_dir ./dir -{code} - -h4. 指定下载单个文件(以'tokenizer.json'文件为例) - -{code:title=none|language=none|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} - modelscope download --model 'Qwen/Qwen2-7b' tokenizer.json -{code} - -h4. 指定下载多个个文件 - -{code:title=none|language=none|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} - modelscope download --model 'Qwen/Qwen2-7b' tokenizer.json config.json -{code} - -h4. 指定下载某些文件 - -{code:title=none|language=none|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} - modelscope download --model 'Qwen/Qwen2-7b' --include '*.safetensors' -{code} - -h4. 过滤指定文件 - -{code:title=none|language=none|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} - modelscope download --model 'Qwen/Qwen2-7b' --exclude '*.safetensors' -{code} - -h4. 指定下载cache_dir - -{code:title=none|language=none|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} - modelscope download --model 'Qwen/Qwen2-7b' --include '*.json' --cache_dir './cache_dir' -{code} - -模型文件将被下载到{{'cache_dir/Qwen/Qwen2-7b'}}。 - -h4. 指定下载local_dir - -{code:title=none|language=none|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} - modelscope download --model 'Qwen/Qwen2-7b' --include '*.json' --local_dir './local_dir' -{code} - -模型文件将被下载到{{'./local_dir'}}。 - -如果{{cache_dir}}和{{local_dir}}参数同时被指定,{{local_dir}}优先级高,{{cache_dir}}将被忽略。 - -h1. Anaconda - -{quote} - -{quote} - -h2. 常用命令 - -h3. 管理环境 - - # 列出所有的环境 - -{code:title=none|language=bash|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} -conda env list -{code} -# 查看conda下的包 - -{code:title=none|language=|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} -conda list -{code} -# 创建环境 - -{code:title=none|language=bash|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} -conda create -n env-name [list of package] -{code} - --n env-name 是设置新建环境的名字,list of package 是可选项,选择要为该环境安装的包 -如果我们没有指定安装python的版本,conda会安装我们最初安装conda所装的那个版本的python -若创建特定python版本的包环境,需键入 - -{code:title=none|language=bash|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} -conda create -n env-name python=3.6 -{code} -# 激活环境 - -{code:title=none|language=bash|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} -conda activate env-name -{code} - -切换到base环境 - -{code:title=none|language=bash|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} -conda activate base -{code} -# 删除环境 -执行以下命令可以将该指定虚拟环境及其中所安装的包都删除。 - -{code:title=none|language=bash|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} -conda remove --name env_name --all -{code} - -如果只删除虚拟环境中的某个或者某些包则是: - -{code:title=none|language=bash|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} -conda remove --name env_name package_name -{code} - -h2. 问题 - - # conda激活[虚拟环境|https://so.csdn.net/so/search?q=虚拟环境&spm=1001.2101.3001.7020],只显示环境名称,不再显示用户名和当前文件夹 - -{code:title=none|language=bash|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} -##在个人环境下修改 -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 -{code} -# conda 安装后没有将conda置为默认 - -{code:title=none|language=bash|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} -Do you wish to update your shell profile to automatically initialize conda? -This will activate conda on startup and change the command prompt when activated. -If you'd prefer that conda's base environment not be activated on startup, - run the following command when conda is activated: - -conda config --set auto_activate_base false - -You can undo this by running `conda init --reverse $SHELL`? [yes|no] -[no] >>> - -You have chosen to not have conda modify your shell scripts at all. -To activate conda's base environment in your current shell session: - -eval "$(/home/user/miniconda3/bin/conda shell.YOUR_SHELL_NAME hook)" - -To install conda's shell functions for easier access, first activate, then: - -conda init - -Thank you for installing Miniconda3! - -{code} - -则执行以下shell - -{code:title=none|language=bash|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} -## eval "$(/home/user/miniconda3/bin/conda shell.SHELL_NAME hook)" -## bash 下 -eval "$(/home/user/miniconda3/bin/conda shell.bash hook)" -conda init -## zsh 下 -eval "$(/home/user/miniconda3/bin/conda shell.zsh hook)" -conda init -{code} -# - -h1. Jupyter Notebook - -{quote} - -{quote} - -h2. 安装 - -{code:title=none|language=bash|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} -pip install jupyter -{code} - -h2. 运行 - -{code:title=none|language=bash|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} -jupyter notebook -# 若是root用户执行,会出现警告 Running as root is not recommended. Use --allow-root to bypass. 需在后面加上 --allow-root -jupyter notebook --allow-root -{code} - -h1. UnSloth - -h1. vLLM - -h2. 安装 - -{code:title=none|language=bash|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} -conda create -n vLLM python=3.12 -conda activate vLLM -pip install vLLM - -# FlashInfer is optional but required for specific functionalities such as sliding window attention with Gemma 2. -# For CUDA 12.4 & torch 2.4 to support sliding window attention for gemma 2 and llama 3.1 style rope -pip install flashinfer -i https://flashinfer.ai/whl/cu124/torch2.4 -# For other CUDA & torch versions, please check https://docs.flashinfer.ai/installation.html -# 也可下载到本地 -wget https://github.com/flashinfer-ai/flashinfer/releases/download/v0.2.5/flashinfer_python-0.2.5+cu124torch2.6-cp38-abi3-linux_x86_64.whl#sha256=43d767b912c0c43a04be99595e0123eab9385fc72530a2874b5fb08e3145c0be -pip install flashinfer_python-0.2.5+cu124torch2.6-cp38-abi3-linux_x86_64.whl --no-deps -{code} - -h2. 部署 - -h3. deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B - -{code:title=none|language=bash|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} -CUDA_VISIBLE_DEVICES=0 vllm serve /mnt/e/modelscope/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B --port 8102 --max-model-len 2048 --api-key token-abc123 -{code} - - * CUDA_VISIBLE_DEVICES=0: 指定使用的 GPU 设备 ID。 0 表示使用第一块 GPU。如果您有多块 GPU,可以根据需要修改为其他 ID (例如 CUDA_VISIBLE_DEVICES=1,2 使用 GPU 1 和 GPU 2)。如果您只有一块 GPU,通常使用 0 即可。 -* {{/mnt/e/modelscope/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B}}: *模型路径。* 请替换为您在步骤 2 中模型实际保存的路径。 -* {{--port 8102}}: *服务端口号。* {{8102}} 是服务启动后监听的端口。您可以根据需要修改端口号,例如 {{--port 8000}}。在后续代码调用中,需要使用相同的端口号。 -* --max-model-len 16384: 模型最大上下文长度。 16384 表示模型处理的最大输入序列长度。您可以根据您的 GPU 显存大小和需求调整此参数。对于 /mnt/e/modelscope/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B 模型,16384 是一个较大的上下文长度。您可以尝试减小此值以减少显存占用,例如 --max-model-len 2048 或更小。 -* *执行启动命令:* 在终端或命令提示符中执行上述 {{vllm serve}} 命令。 -* *注意 GPU 显存:* 启动 vLLM 服务会占用 GPU 显存。请确保您的 GPU 显存足够运行模型。如果显存不足,可能会导致启动失败或运行缓慢。您可以尝试减小 {{--max-model-len}} 参数或使用更小规模的模型。 - -h3. Qwen/Qwen3-4B - -{code:title=none|language=bash|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} -vllm serve ~/modelscope/Qwen/Qwen3-4B --api-key token-abc123 --enable-reasoning --reasoning-parser deepseek_r1 --max_model_len=2048 --gpu_memory_utilization=0.85 -{code} - -h4. supervisor - -{code:title=none|language=|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} -sudo vim vLLM-Qwen-Qwen3-4B.conf -[program:vLLM-Qwen-Qwen3-4B.conf] -command=zsh -c "source /home/user/miniconda3/bin/activate && source activate vLLM && vllm serve ~/modelscope/Qwen/Qwen3-4B --api-key token-abc123 --enable-reasoning --reasoning-parser deepseek_r1 --max_model_len=2048 --gpu_memory_utilization=0.85" -user=user -autostart=true -autorestart=true -stderr_logfile=/var/log/supervisor/vLLM-Qwen-Qwen3-4B/err.log -stdout_logfile=/var/log/supervisor/vLLM-Qwen-Qwen3-4B/out.log -stopasgroup=true -{code} - -h1. LLama.cpp - -{quote} -{{llama.cpp}}是一个基于纯{{C/C++}}实现的高性能大语言模型推理引擎,专为优化本地及云端部署而设计。其核心目标在于通过底层硬件加速和量化技术,实现在多样化硬件平台上的高效推理,同时保持低资源占用与易用性。 -{quote} - -h2. 编译llama.cpp - -首先从{{Github}}上下载{{llama.cpp}}的源码: - -{code:title=none|language=|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} -git clone https://github.com/ggml-org/llama.cpp -cd llama.cpp -{code} - -{{llama.cpp}}支持多种硬件平台,可根据实际的硬件配置情况选择合适的编译参数进行编译,具体可以参考文档{{docs/build.md}}。 - -*安装CMAKE* - -{code:title=none|language=bash|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} -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 -{code} - -*编译CPU版本* - -{code:title=none|language=|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} -cmake -B build -cmake --build build --config Release -j 8 -{code} - -*编译GPU版本* - -编译英伟达{{GPU}}版本需要先装好驱动和{{CUDA}},然后执行下面的命令进行编译 - -{code:title=none|language=|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} -cmake -B build -DGGML_CUDA=ON -DGGML_CUDA_ENABLE_UNIFIED_MEMORY=1 -cmake --build build --config Release -j 8 -{code} - -{quote} -编译完成后,可执行文件和库文件被存放在{{build/bin}}目录下。 -{quote} - -h2. 模型下载与转换 - -首先从魔搭社区下载模型: - -{code:title=none|language=|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} -pip install modelscope -modelscope download --model deepseek-ai/DeepSeek-R1-Distill-Qwen-7B --local_dir DeepSeek-R1-Distill-Qwen-7B -{code} - -下载好的模型是以{{HuggingFace}}的{{safetensors}}格式存放的,而{{llama.cpp}}使用的是{{GGUF}}格式,因此需要先要把模型转换为{{GGUF}}格式: - -{code:title=none|language=|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} -# 安装python依赖库 -pip install -r requirements.txt -# 转换模型 -python convert_hf_to_gguf.py DeepSeek-R1-Distill-Qwen-7B/ -{code} - -转换成功后,在该目录下会生成一个{{FP16}}精度、{{GGUF}}格式的模型文件{{DeepSeek-R1-Distill-Qwen-7B-F16.gguf}}。 - -h2. 模型量化 - -{{FP16}}精度的模型跑起来可能会有点慢,我们可以对模型进行量化以提升推理速度。 - -{{llama.cpp}}主要采用了分块量化({{Block-wise Quantization}})和{{K-Quantization}}算法来实现模型压缩与加速,其核心策略包括以下关键技术: - - # *分块量化(Block-wise Quantization)* -该方法将权重矩阵划分为固定大小的子块(如{{32}}或{{64}}元素为一组),每个子块独立进行量化。通过为每个子块分配独立的缩放因子({{Scale}})和零点({{Zero Point}}),有效减少量化误差。例如,{{Q4_K_M}}表示每个权重用{{4}}比特存储,且子块内采用动态范围调整。 -# *K-Quantization(混合精度量化)* -在子块内部进一步划分更小的单元(称为“超块”),根据数值分布动态选择量化参数。例如,{{Q4_K_M}}将超块拆分为多个子单元,每个子单元使用不同位数的缩放因子(如{{6bit}}的缩放因子和{{4bit}}的量化值),通过混合精度平衡精度与压缩率。 -# *重要性矩阵(Imatrix)优化* -通过分析模型推理过程中各层激活值的重要性,动态调整量化策略。高重要性区域保留更高精度(如{{FP16}}),低重要性区域采用激进量化(如{{Q2_K}}),从而在整体模型性能损失可控的前提下实现高效压缩。 -# *量化类型分级策略* -提供{{Q2_K}}至{{Q8_K}}等多种量化级别,其中字母后缀(如{{_M}}、{{_S}})表示优化级别: -# *Q4_K_M*:中等优化级别,平衡推理速度与精度(常用推荐)。 -# *Q5_K_S*:轻量化级别,侧重减少内存占用 - -典型场景下,{{Q4_K_M}}相比{{FP16}}模型可减少{{70%}}内存占用,推理速度提升{{2-3}}倍,同时保持{{95%}}以上的原始模型精度。实际部署时需根据硬件资源(如{{GPU}}显存容量)和任务需求(如生成文本长度)选择量化策略。 - -执行下面的命令可将{{FP16}}精度的模型采用{{Q4_K_M}}的量化策略进行量化: - -{code:title=none|language=|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} -./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 -{code} - -量化完成后,模型文件由{{15.2G}}减少到{{4.7G}}。 - -h2. 运行模型 - -模型量化完后,我们就可以运行模型来试试效果了。{{llama.cpp}}提供了多种运行模型的方式: - -h3. 命令行方式 - -执行下面的命令就可以在命令行与模型进行对话了: - -{code:title=none|language=|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} -./build/bin/llama-cli -m DeepSeek-R1-Distill-Qwen-7B/DeepSeek-R1-Distill-Qwen-7B-Q4_K_M.gguf -cnv -{code} - -h3. HTTP Server方式 - -由于模型是以{{Markdown}}格式输出内容,因此用命令行的方式看着不太方便。{{llama.cpp}}还提供{{HTTP Server}}的方式运行,交互性要好很多。 - -首先在终端执行命令 - -{code:title=none|language=|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} -./build/bin/llama-server -m DeepSeek-R1-Distill-Qwen-7B/DeepSeek-R1-Distill-Qwen-7B-Q4_K_M.gguf --port 8088 -{code} - -然后打开浏览器,输入地址{{http://127.0.0.1:8088}}就可以在网页上与模型进行交互了,非常方便! - -h1. Ktransformers - -安装 - -h1. LLaMA-Factory - -{quote} -可参考文章:[DeepSeek-R1-7B-Distill模型微调全过程记录,LLaMA_Factory训练自己的数据集,合并lora微调模型并量化为gguf,接入微信实现自动对话回复_微信_qq_53091149-DeepSeek技术社区|https://deepseek.csdn.net/67b84a893c9cd21f4cb9aab6.html#devmenu2] -{quote} - -h2. 安装 - -{code:title=none|language=bash|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} -# 首先 conda创建环境 -conda create -n LLaMA-Factory python=3.12 -# 激活环境 -conda activate LLaMA-Factory -# 从GitHub上拉去项目代码到当前目录下 -git clone https://github.com/hiyouga/LLaMA-Factory.git -# 进入目录 -cd LLaMA-Factory -# 安装所需依赖 -pip install -e ".[torch,metrics]" -# 启动webui -python src/webui.py -{code} - -h2. 微调 - -!https://markdownhexo.oss-cn-hangzhou.aliyuncs.com/img/image-20250320152454509.png! - -!https://markdownhexo.oss-cn-hangzhou.aliyuncs.com/img/image-20250320152533756.png! - -合并 - -!https://markdownhexo.oss-cn-hangzhou.aliyuncs.com/img/image-20250320152645802.png! - -h1. AutoAWQ量化 - -h2. 安装 - -{code:title=none|language=bash|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} -conda create -n AutoAWQ python=3.12 -conda activate AutoAWQ -pip install torch -pip install autoawq -{code} - -h2. 脚本 - -默认AutoAWQ会从Huggingface上下载数据集mit-han-lab/pile-val-backup,会因为网络问题失败 - -需事先手动下载,通过modelscope - -{code:title=none|language=bash|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} -modelscope download --dataset mit-han-lab/pile-val-backup --local_dir ~/modelscope/mit-han-lab/pile-val-backup -{code} - -以{{Qwen/Qwen3-4B}}模型为例 - -{code:title=none|language=bash|borderStyle=solid|theme=RDark|linenumbers=true|collapse=true} -from awq import AutoAWQForCausalLM -from transformers import AutoTokenizer -from datasets import load_dataset - -# 加载本地数据集 -def load_calib_data(): - data=load_dataset('/home/user/modelscope/mit-han-lab/pile-val-backup', split="validation") - return [text for text in data["text"] if text.strip() != '' and len(text.split(' ')) > 20] - -model_path = '/home/user/modelscope/Qwen/Qwen3-4B' -quant_path = '/home/user/modelscope/Qwen/Qwen3-4B-awq' -quant_config = { "zero_point": True, "q_group_size": 128, "w_bit": 4, "version": "GEMM" } - - -# Load model -# 加载模型 - - -model = AutoAWQForCausalLM.from_pretrained( - model_path, **{"low_cpu_mem_usage": True, "use_cache": False} -) -tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True) - - -# Quantize -# 量化 - -calib_data=load_calib_data() -model.quantize(tokenizer, quant_config=quant_config, calib_data=calib_data) - - -# Save quantized model -# 保存量化模型 - - -model.save_quantized(quant_path) -tokenizer.save_pretrained(quant_path) - - -print(f'Model is quantized and saved at "{quant_path}"') -{code} - -h1. 大模型Dense、MoE 与 Hybrid-MoE 架构的比较 - -在大模型架构设计中,Dense(全连接)、MoE(混合专家)和Hybrid-MoE(混合式MoE)是三种主流的参数组织方式,它们在模型容量、计算效率和应用场景上存在显著差异。以下从核心原理、技术特点、优缺点及适用场景进行系统对比: - ----- - -h2. *1. 核心原理对比* - -||*架构类型*||*核心思想*||*典型模型*|| -|*Dense*|所有参数对所有输入生效,每层神经元全连接,统一处理所有输入特征。|GPT-3、BERT、LLAMA| -|*MoE*|将模型划分为多个“专家”(子网络),每个输入仅激活部分专家,通过路由机制动态分配任务。|Switch Transformer、GShard| -|*Hybrid-MoE*|混合Dense和MoE层:部分层全连接,部分层采用MoE结构,平衡计算效率和模型容量。|DeepSeek-MoE、Google GLaM| - ----- - -h2. *2. 技术特点与性能对比* - -||*维度*||*Dense*||*MoE*||*Hybrid-MoE*|| -|*参数规模*|总参数量=激活参数量,随层数线性增长。|总参数量高(专家数×专家规模),但激活参数量低(仅激活部分专家)。|介于两者之间,MoE层数可控。| -|*计算效率*|计算成本高(FLOPs与参数量正相关),适合小规模模型。|相同参数量下,FLOPs显著降低(仅激活部分专家)。|通过调整MoE层比例,灵活平衡计算开销。| -|*训练稳定性*|收敛稳定,梯度传播路径简单。|路由机制易导致专家负载不均衡,需复杂正则化。|稳定性优于纯MoE,但仍需路由优化。| -|*扩展性*|参数规模受硬件限制,千亿级后成本陡增。|可扩展至万亿参数(如GShard-1.6T),适合超大规模模型。|通过局部MoE化实现高效扩展,适配中等规模。| -|*显存占用*|高(需存储全部参数梯度)。|显存需求更高(专家参数独立存储)。|显存介于两者之间,取决于MoE层占比。| -|*应用场景*|通用任务、资源受限场景。|超大规模预训练、多任务学习。|需平衡性能与成本的工业级应用。| - ----- - -h2. *3. 优缺点对比* - -h3. *Dense架构* - - * *优点*: -** 结构简单,训练稳定性高。 -** 参数利用率最大化,适合小规模高精度任务。 -* *缺点*: -** 计算成本随参数量指数级增长,难以扩展至超大规模。 -** 显存占用高,限制单卡可训练模型规模。 - -h3. *MoE架构* - - * *优点*: -** 计算效率高,相同FLOPs下模型容量更大。 -** 支持万亿级参数扩展,适合分布式训练。 -* *缺点*: -** 路由机制复杂,易出现专家“坍缩”(部分专家未被激活)。 -** 显存和通信开销大,需定制化负载均衡策略。 - -h3. *Hybrid-MoE架构* - - * *优点*: -** 灵活性高,可通过调整MoE层位置平衡性能与成本。 -** 保留关键层的全连接特性,提升任务特定性能。 -* *缺点*: -** 需精心设计MoE层分布,调参成本较高。 -** 仍面临部分MoE的稳定性挑战。 - ----- - -h2. *4. 典型应用场景* - -||*架构*||*适用场景*|| -|*Dense*|- 中小规模模型(<100B参数) - 对训练稳定性要求高的任务(如对话生成) - 边缘设备推理| -|*MoE*|- 超大规模预训练(>500B参数) - 多任务/多模态学习 - 云端高性能计算集群| -|*Hybrid-MoE*|- 中等规模模型(100B-500B参数) - 需兼顾通用性与效率的工业场景 - 长文本处理任务| - ----- - -h2. *5. 技术选型建议* - - * *选择Dense的条件*: -** 资源有限(单卡训练/推理)。 -** 任务单一,无需极高模型容量。 -** 追求极简架构和稳定收敛。 -* *选择MoE的条件*: -** 追求极致模型性能(如AGI探索)。 -** 拥有大规模计算集群(千卡级)。 -** 多任务/多模态需求显著。 -* *选择Hybrid-MoE的条件*: -** 需平衡模型容量与计算成本。 -** 部分任务依赖全连接层的强表征能力(如逻辑推理)。 -** 希望渐进式扩展模型规模。 - ----- - -h2. *6. 未来发展方向* - - # *Dense架构优化*: -#* 参数高效微调(LoRA、Adapter)。 -#* 动态稀疏激活(如微软的DeepSpeed-MoE)。 -# *MoE架构改进*: -#* 更智能的路由机制(如基于强化学习)。 -#* 专家共享与分层MoE设计。 -# *Hybrid-MoE创新*: -#* 自动化MoE层分布搜索(NAS技术)。 -#* 异构专家设计(不同专家结构适配不同任务)。 - ----- - -h2. *总结* - - * *Dense*:简单可靠,适合资源受限场景,但扩展性差。 -* *MoE*:计算高效,扩展性强,但工程复杂度高。 -* *Hybrid-MoE*:折中方案,平衡性能与成本,需精细调优。 - -实际选型需结合*任务需求*、*硬件资源*和*工程能力*综合评估。对于大多数企业级应用,Hybrid-MoE可能是当前的最优解,而科研前沿更倾向于探索纯MoE的极限能力。 -