LLaMA-Factory训练DeepSeek大模型+本地部署
前言
前面我们介绍了基于硅基流动训练私有大模型《10分钟教你微调自己的私有大模型》,该平台有三个不好的点就是可选的模型有限,训练时间需要排队等待耗时长,另外还要 给钱。今天我们换一个平台,使用:魔搭平台 + llamaFactory训练私有模型。平台会赠送服务器时长这样我们就可以不用花钱就可以训练自己的大模型了(学习使用)
魔搭-启动服务器
官网:https://www.modelscope.cn/ ,ModelScope社区与阿里云合作,Notebook功能由阿里云提供算力支持,进去之后需要做一下阿里云授权。这里准备了2个服务器,一个CPU型的,一个GPU型的,关键是它为开发者量身打造的云端深度学习开发环境,内置JupyterLab、WebIDE及Terminal,无需任何运维配置即可编写、调试及运行Python代码
点击启动后 - 查看Notebook就会进入到服务器控制台页面 - 通过terminal就可以和机器对话了 - 上方可以增加对话窗口。如下:
安装LLAMA-Factory
官网:https://llamafactory.readthedocs.io/zh-cn/latest/index.html , LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调。
在安装 LLaMA-Factory 之前,请确保您安装了下列依赖: 运行以下指令以安装 LLaMA-Factory 及其依赖:
git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip install --upgrade pip
pip install -e ".[torch,metrics]"
如果出现环境冲突,请尝试使用 pip install --no-deps -e . 解决 ,
如果提升升级pip请根据提示自行: pip install --upgrade pip升级pip 后重新安装 。 如果clone下载不下来可以手动下载后,上传到服务器中解压使用。
安装DeepSeek模型
接下来我们安装deepseek大模型,因为要从Huggingface下载(需要梯子),为了加速下载我们需要配置Huggingface的国内镜像https://hf-mirror.com,以及模型安装目录,通过huggingface-cli下载模型,模型可以在HuggingFace官网去查找:https://huggingface.co/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B , 执行下面命令:模型会下载到 /mnt/workspace/huggingface 目录
export HF_ENDPOINT=https://hf-mirror.com
export HF_HOME=/mnt/workspace/huggingface
echo $HF_HOME
huggingface-cli download --resume-download deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B
安装后进入/mnt/workspace/huggingface目录查看模型路径和名字,我的模型路径是:/mnt/workspace/huggingface/hub/models--deepseek-ai--DeepSeek-R1-Distill-Qwen-1.5B/snapshots/ad9f0ae0864d7fbcd1cd905e3c6c5b069cc8b562
启动UI界面
LLaMA-Factory 支持通过 WebUI 零代码微调大语言模型。 在完成 安装 后,您可以通过以下指令进入 WebUI:
export USE_MODELSCOPE_HUB=1 && llamafactory-cli webui
启动的端口是7860,但是只能内网访问
这里我们使用Natapp做一下内网穿透,访问:https://natapp.cn/ 找到客户端下载 - 找到linux版本-复制地址
然后回到服务器 - 新开一个终端 - 执行 wget https://download.natapp.cn/assets/downloads/clients/2_4_0/natapp_linux_amd64/natapp
下载到当前目录,然后登录到natapp中,购买一个免费的隧道-端口需要配置为7860
配置好之后复制一下token,然后在服务器终端执行:./natapp -authtoken=9ab6b9040axxxxxx
使用你的Token即可,启动效果:
该域名是可以外网访问的,访问效果如下:
注意:模型路径一定要指向我们刚才下载的模型的路径哦。加载模型 :找到下方的 chat - 点击加载模型 - 模型加载成功之后可以和模型对话,如下:
执行模型微调
instruction 列对应的内容为人类指令, input 列对应的内容为人类输入, output 列对应的内容为模型回答。下面是一个例子
"alpaca_zh_demo.json"
{
"instruction": "计算这些物品的总费用。 ",
"input": "输入:汽车 - $3000,衣服 - $100,书 - $20。",
"output": "汽车、衣服和书的总费用为 $3000 + $100 + $20 = $3120。"
},
LLAma准备了一些测试的微调数据,存放在LLaMA安装目录的/data/目录中,我们可以下载一个数据下来参考一下格式:
dataset_info.json 包含了所有经过预处理的 本地数据集 以及 在线数据集。如果要自定义数据集,需要在 dataset_info.json 文件中添加对数据集及其内容的定义
回到UI界面-点击 train微调 - 选择数据集 ,在企业中真是微调肯定要选择自己的数据,右侧可以预览数据集,您需要配置以下关键参数以进行模型微调:
- 语言:选择模型支持的语言,例如zh。
- 模型名称:选择要微调的模型,例如deepseek
- 微调方法:选择微调技术,如lora。
- 数据集:选择用于训练的数据集。
- 学习率:设置模型训练的学习率。
- 计算类型:根据GPU类型选择计算精度,如bf16或fp16。
- 梯度累计:设置梯度累计的批次数。
- LoRA+学习率比例:设置LoRA+的相对学习率。
- LoRA作用模块:选择LoRA层挂载的模型部分。
微调的方式:有三种,默认情况下为lora,因为使用lora轻量化微调方法能极大程度地节约显存。
- full:全参微调,将整个模型都进行微调,对显存要求巨大。
- freeze:冻结微调,将模型的大部分参数冻结,只对部分参数进行微调,可以降低对显存的要求。
- lora:将模型的部分参数冻结,只对部分参数进行微调,但只在特定的层上进行微调,极大节约显存。
学习率 :是最重要的超参数之一,它决定了在每次参数更新时参数改变的幅度。一个太大的学习率可能会导致模型训练不稳定,而太小的学习率会导致训练过程缓慢。微调时,通常使用比预训练阶段更小的学习率,因为我们希望模型参数的改变更加细微,以免破坏已学到的有用信息。
-
1e-1(0.1):相对较大的学习率,用于初期快速探索。
-
1e-2(0.01):中等大小的学习率,常用于许多标准模型的初始学习率。
-
1e-3(0.001):较小的学习率,适用于接近优化目标时的细致调整。
-
1e-4(0.0001):更小的学习率,用于当模型接近收敛时的微调。
-
5e-5(0.00005):非常小的学习率,常见于预训练模型的微调阶段,例如在自然语言处理中微调BERT模型。
截断长度:句子越长,显存占用越多,如果显存不够可以考虑降低到512甚至256。可以根据微调目标需要的长度进行设置。微调后,模型处理长度大于Cutoff Length的句子的能力会下降。
计算精度 :大模型的计算精度是指在训练和推理过程中,模型参数和计算操作所使用的数值表示方式的精确程度,较低的精度可以提高计算速度、减少内存占用,但可能会影响模型的准确性。因此在实际应用中,需要根据具体需求和硬件条件来选择合适的精度。
训练轮数:也称为epochs,是模型训练过程中的一个重要参数。它表示模型在训练集上训练的完整次数。例如,如果我们有一个训练集,并且我们的模型需要学习这个训练集的所有数据,那么一个epoch就是指模型对这个训练集进行一次完整的遍历
梯度累积(Gradient Accumulation):的基本思想是将一次性的整批参数更新的梯度计算变为以一小步一小步的方式进行。具体而言该方法以小批次的方式进行模型前向传播和反向传播,过程中迭代计算多个小批次梯度并累加,当累积到足够多的梯度时,执行模型的优化步骤更新参数。这也是一种典型的时间换空间的做法,即我们可以实现在有限的GPU内存上更新大量参数,不过额外添加的小批次前向传播和后向传播会使得训练速度变慢一些。例如,若目标批量大小是1,024,但设备每次只能处理256个样本,那么可以通过累积四个步骤中每个步骤的256个样本的梯度,来模拟出一个包含1,024个样本的批量更新。
LoRA(Low-Rank Approximation)是一种用于大模型微调的方法,它通过降低模型参数矩阵的秩来减少模型的计算和存储成本。在微调大模型时,往往需要大量的计算资源和存储空间,而LoRA可以通过降低模型参数矩阵的秩来大幅度减少这些需求。
具体来说,LoRA使用矩阵分解方法,将模型参数矩阵分解为两个较低秩的矩阵的乘积。这样做的好处是可以用较低秩的矩阵近似代替原始的参数矩阵,从而降低了模型的复杂度和存储需求。
LoRA秩可以根据模型的需求进行设置。一般来说,秩越低,模型的复杂度越低,但性能可能会受到一定的影响。所以在微调大模型时,需要根据具体情况来选择合适的秩大小,以平衡模型的性能和资源的使用。
建议根据硬件条件进行选择,一般可选16或32,模型微调效果较佳。
LoRA的缩放系数:是用来表示模型中每个层的相对重要性的参数。在LoRA中,每个层都有一个缩放系数,用于调整该层对总体损失函数的贡献。较高的缩放系数表示该层的权重更大,较低的缩放系数表示该层的权重较小。
缩放系数的选取可以根据问题的特点和需求进行调整。通常情况下,较低层的缩放系数可以设置为较小的值,以保留更多的原始特征信息;而较高层的缩放系数可以设置为较大的值,以强调更高级别的抽象特征。
LoRA+学习率比例点击 LoRA 参数设置,设置LoRA+学习率比例为16,LoRA+被证明是比LoRA学习效果更好的算法。
LoRA作用模块在LoRA作用模块中填写 all,即将LoRA层挂载到模型的所有线性层上,提高拟合效果。
设置好参数后滑动到下面,点击开始,LLAMA就会帮我们开始微调-微调完成后,您可以在界面上观察到训练进度和损失曲线,直到训练完成,控制台可以看到训练的过程
在Web UI中设置好参数后,您可以开始模型微调过程。微调完成后,您可以在界面上观察到训练进度和损失曲线,直到训练完成,控制台可以看到训练的过程 , 也可以在预览命令中拷贝微调命令,在终端去执行:
–stage pt:指定训练阶段为预训练
–do_train:指定是训练任务
–model_name_or_path:本地模型的文件路径或 Hugging Face 的模型标识符
–dataset:指定数据集
–finetuning_type lora:指定微调方法为lora
–lora_target q_proj,v_proj:Lora作用模块为q_proj,v_proj 此参数后续详解
–output_dir: 保存训练结果的路径
–overwrite_cache: 覆盖缓存的训练集和评估集
–per_device_train_batch_size 2: 每个gpu的批处理大小,训练参数
–gradient_accumulation_steps 2:梯度累计的步数,训练参数
–lr_scheduler_type cosine:学习率调度器,训练参数
–logging_steps 10:每两次日志输出间的更新步数,训练参数
–save_steps 1000:每两次断点保存间的更新步数,训练参数
–learning_rate 5e-5:学习率,adamW优化器的默认值为5e-5,训练参数
–num_train_epochs 3.0:需要执行的训练轮数,训练参数
–plot_loss:是否保存训练损失曲线
–fp16:使用fp16混合精度训练,此参数后续详解
启动微调后需要等待大约几十分钟,待模型下载完毕后,可在界面观察到训练进度和损失曲线。当显示训练完毕时,代表模型微调成功。
模型评估
模型训练完成之后-选择模型评估 - 选择用来评估的数据集(评估就是验证一下微调的效果好不好) -
模型评估大约需要5分钟,评估完成后会在界面上显示验证集的分数。
其中,ROUGE分数衡量了模型输出答案(predict)和验证集中的标准答案(label)的相似度,ROUGE分数越高代表模型学习得越好。你可以拷贝这个结果去问一问大模型你的模型评估结果是好是坏
现在我们选择一个检查点:选择刚才微调的模型,点击chat - 加载模型 和它对话,测试一下微调的效果
在Web UI的Chat页签下,加载微调后的模型进行对话测试。您可以输入文本与模型进行交互,并观察模型的回答是否符合预期。
导出模型
训练完成后,我们可以导出模型,从而发布到HF上或者用来本地部署。
找到导出目录就可以看到我们自己训练的模型了
- config.json:模型的配置文件,包含架构和超参数信息。
- ModelFile : 模型文件
- generation_config.json:用于文本生成任务的配置文件。
- model.safetensors:模型权重文件
- tokenizer_config.json:分词器的配置文件。
- tokenizer.json:包含分词器的完整信息,用于将文本转换为标记。
Ollama 部署模型
Ollama 是一个开源的大型语言模型服务工具,旨在帮助用户快速在本地运行大模型。通过简单的安装指令,用户可以通过一条命令轻松启动和运行开源的大型语言模型。 它提供了一个简洁易用的命令行界面和服务器,专为构建大型语言模型应用而设计。用户可以轻松下载、运行和管理各种开源 LLM。安装Ollama
curl -fsSL https://ollama.com/install.sh | sh
安装过程会比较慢,实在安装不上就参考官网手动安装:https://github.com/ollama/ollama/blob/main/docs/linux.md
安装好后在 Ollama 中创建模型 , 基于我们自己训练的模型进行创建
ollama create my-deepseek -f /mnt/workspace/LLaMA-Factory-main/my-deepseek/Modelfile
启动自己训练的大模型
ollama run my-deepseek
总结
本文讲解了如何使用LLaMA Factory微调大模型,包括环境搭建、数据准备、参数配置、训练和效果评估等,最终成功微调模型并使用Ollama部署,其中有很多坑还是需要同学自己去踩的,如果文章对你有帮助就给个好评吧。