大模型微调(Fine-tuning)是指在已经预训练好的大型语言模型(通常称为“基座模型”)基础上,使用特定的数据集进行进一步的训练,让模型适应特定任务或领域。微调使得大模型能够更好地适应不同行业的特定需求,从而推动各行业的应用创新。微调降低了使用大模型的门槛,使得即使没有强大的计算资源和大量的数据,企业也能够利用预训练模型进行定制化开发,从而推动大模型技术在更多行业的普及。
前期准备
服务器
这里使用的是AutoDL AI算力云(非广告),选择的原因价格相对实惠,GPU种类和库存相对丰富。(AutoDL算力云 | 弹性、好用、省钱。租GPU就上AutoDL)
下面是各数据大小的大模型微调对应的硬件配置推荐
模型尺寸 | 精度 | 显存需求 (GB) | 推荐硬件配置 |
---|---|---|---|
7B | Frenze (FP16) | 20 | RTX 4090 |
LoRA (FP16) | 16 | RTX 4090 | |
QLoRA (INT8) | 10 | RTX 4080 | |
QLoRA (INT4) | 6 | RTX 3060 | |
13B | Frenze (FP16) | 40 | RTX 4090 / A100 (40GB) |
LoRA (FP16) | 32 | A100 (40GB) | |
QLoRA (INT8) | 20 | L40 (48GB) | |
QLoRA (INT4) | 12 | RTX 4090 | |
30B | Frenze (FP16) | 80 | A100 (80GB) |
LoRA (FP16) | 64 | A100 (80GB) | |
QLoRA (INT8) | 40 | L40 (48GB) | |
QLoRA (INT4) | 24 | RTX 4090 | |
70B | Frenze (FP16) | 200 | H100 (80GB) * 3 |
LoRA (FP16) | 160 | H100 (80GB) * 2 | |
QLoRA (INT8) | 80 | H100 (80GB) | |
QLoRA (INT4) | 48 | L40 (48GB) | |
130B | Frenze (FP16) | 360 | H100 (80GB) * 5 |
LoRA (FP16) | 240 | H100 (80GB) * 3 | |
QLoRA (INT8) | 140 | H100 (80GB) * 2 | |
QLoRA (INT4) | 72 | A100 (24GB) * 3 |
选择所需要的镜像(需要与使用的大模型微调框架等工具需要的版本对应),可以先按我选择的镜像版本,后期出现版本不匹配的情况可以手动升级至相应版本。
租用好所需要的GPU服务器后,可以在控制台->容器示例中对服务器进行相关操作。
重点关注两个功能
Jupyter Lab
JupyterLab 是 Jupyter Notebook 的下一代界面,它是一个更灵活、功能更强大的 Web 应用程序,用于创建 Jupyter Notebook 文档、编写代码、运行代码、可视化数据等。JupyterLab 提供了一个集成的开发环境,它支持多种编程语言,并且可以扩展以支持更多的工具和接口。
打开Jupyter Lab,点选+开启启动页,选择终端,就可以在终端控制台上进行指令调用。
AutoPanel或实例监控
可以在AutoPanel界面中查看现阶段服务器的CPU、GPU、内存等使用情况。
技术选型
本流程使用
LlamaFactory作为大模型微调工具。
[LlamaFactory](hiyouga/LLaMA-Factory: Unified Efficient Fine-Tuning of 100+ LLMs & VLMs (ACL 2024))
EasyDataset作为数据集生成处理工具。
[EasyDataset](ConardLi/easy-dataset: A powerful tool for creating fine-tuning datasets for LLM)
Ollama和HuggingFace作为大模型下载和运行工具。
[HuggingFace](Models - Hugging Face)
Ngrok作为内网穿透工具。
[Ngrok](Kubernetes Operator: Ingress controller, gateway API, & more)
MinerU作为文档解析工具。
安装流程和注意事项多查看相关工具文档及询问大模型。
LlamaFactory安装
LLaMA Factory 是一个开源的低代码大型语言模型(LLM)训练与微调框架,主要面向研究人员和开发者,旨在简化大型语言模型的微调、评估和部署过程。
[LlamaFactory](hiyouga/LLaMA-Factory: Unified Efficient Fine-Tuning of 100+ LLMs & VLMs (ACL 2024))
下面是LlamaFactory对应的环境软件版本。
必需项
项目 | 至少版本 | 推荐版本 |
---|---|---|
python | 3.9 | 3.10 |
torch | 2.0.0 | 2.6.0 |
transformers | 4.45.0 | 4.50.0 |
datasets | 2.16.0 | 3.2.0 |
accelerate | 0.34.0 | 1.2.1 |
peft | 0.14.0 | 0.15.1 |
trl | 0.8.6 | 0.9.6 |
可选项
项目 | 至少版本 | 推荐版本 |
---|---|---|
CUDA | 11.6 | 12.2 |
deepspeed | 0.10.0 | 0.16.4 |
bitsandbytes | 0.39.0 | 0.43.1 |
vllm | 0.4.3 | 0.8.2 |
flash-attn | 2.5.6 | 2.7.2 |
在Jupyter Lab终端控制台中调用下载及安装指令。
#官方提供的下载地址,有时候需要魔法才能下载。git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.gitcd LLaMA-Factorypip install -e ".[torch,metrics]"
如果出现下载相应超时或者下载速度较慢,推荐使用国内镜像。
# 使用国内 Gitee 镜像源git clone --depth 1 https://gitee.com/hiyouga/LLaMA-Factory.gitcd LLaMA-Factorypip install -e ".[torch,metrics]"
如果遇到包冲突,pip install --no-deps -e .
命令解决。
出现以下画面表示LlamaFactory已下载安装完成。
安装完成后在终端控制台上调用Llama Board可视化指令,打开可视化界面。
llamafactory-cli webui
出现以下画面表示可视化界面已部署且运行,可以通过图中给出的地址在浏览器中进行访问。
注意点:出现运行画面后,当前程序需要后台运行,当前终端控制台不进行操作,新开一个终端控制台进行后续指令操作。
这里有一个坑,因为流程是通过JupyterLab远程调用云端服务器,所以在浏览器上访问http://127.0.0.1:7860 的本地地址是无法访问的,需要Ngrok等内网穿透工具生成访问地址,通过Ngrok提供的访问地址就可以访问服务器上的LLaMA Board可视化界面。(可查看本文中Ngrok安装内容)
Ngrok安装
Ngrok 是一款开源的反向代理工具,主要用于将本地运行的网络服务(如 Web 应用、API 服务等)通过一个安全的隧道暴露到公共网络上,从而方便开发、调试和测试。
[Ngrok](Kubernetes Operator: Ingress controller, gateway API, & more)
图中红框都可以进行Ngrok账号注册(需要使用魔法),如果遇到注册受阻可以使用GitHub账号登录。注册登录完成后在Setup\&Installation
选项卡中选择Linux,下方就会出现Ngrok在Linux上的相关指令。
通过下方指令进行Ngrok的安装。
curl -sSL https://ngrok-agent.s3.amazonaws.com/ngrok.asc \ | sudo tee /etc/apt/trusted.gpg.d/ngrok.asc >/dev/null \ && echo "deb https://ngrok-agent.s3.amazonaws.com buster main" \ | sudo tee /etc/apt/sources.list.d/ngrok.list \ && sudo apt update \ && sudo apt install ngrok
出现以下画面表示Ngork安装完成。
通过红框按钮复制指令或者下方指令在Ngrok上配置用户身份令牌。
ngrok config add-authtoken $YOUR_AUTHTOKEN //$YOUR_AUTHTOKEN代指用户自己的身份令牌
配置完成后就可以通过下方指令进行反向代理,指令中的 localhost:8080
可以替换为所需访问的本地地址,例如LlamaFactory的访问地址。
ngrok http http://127.0.0.1:7860
出现以下画面表示方向代理成功,可以在本地浏览器中使用红框内的地址访问所需要访问的地址。代理成功后当前终端控制台后台运行,新开一个终端控制台进行后续指令操作。如需要退出Ngrok操作Ctrl+C
。
注意点:Ngrok免费版一次只能代理一个地址。
使用HuggingFace下载大模型
HuggingFace 是一个提供先进自然语言处理(NLP)和人工智能开源工具的平台,支持Transformer模型的开发和应用,为开发者和研究人员提供了丰富的工具、庞大的模型库和资源,极大降低了AI大模型应用开发的门槛,能够满足从研究到工业应用的各种需求。
[HuggingFace](Models - Hugging Face)(需要魔法)
点击红框的Model选择需要的大模型。下面以DeepSeek-R1-Distill-Qwen-7B为例。
下方红框为大模型ID
。
下面指令用于安装HuggingFace Hub,HuggingFace官方提供的命令行工具,用于下载大模型。
pip install huggingface_hub
下面指令用于下载模型。
#{huggingface官网上的模型ID}整个替换为模型名称#{想要下载到的目录}整个替换为模型安装位置huggingface-cli download {huggingface官网上的模型ID} --local-dir {想要下载到的目录}
例如:
huggingface-cli download deepseek-ai/DeepSeek-R1-Distill-Qwen-7B --local-dir /root/autodl-tmp/Models
如果上面指令相应超时或者下载速度慢,可以先设置为国内镜像,再执行下载模型命令,加速模型下载。
export HF_ENDPOINT="https://hf-mirror.com"source ~/.bashrc
补充:在JupyterLab的文件浏览器中
最外层的文件夹的根目录为/root
。
数据盘目录为/root/autodl-tmp
。
系统盘目录为/
。
查询文件夹地址的方法在文件浏览器选中需要查询的文件夹,右击选择复制路径,粘贴时记得前面添加/root
才是完整路径。
出现以下画面表示模型下载成功。
在文件浏览器中可以看到下载好的大模型文件。
EasyDataSet安装
Easy Dataset是一款专门用于简化大型语言模型(LLMs)微调数据集创建的专业应用程序。它提供了一个直观的界面,用于上传特定领域的文件、智能分割内容、生成问题以及生成高质量的训练数据,以用于模型微调。
[EasyDataset](ConardLi/easy-dataset: A powerful tool for creating fine-tuning datasets for LLM)
使用下面指令下载EasyDataSet,并打开easy-dataset
文件夹。
git clone https://github.com/ConardLi/easy-dataset.gitcd easy-dataset
安装EasyDataset需要使用npm
工具,npm
工具又需要node.js
,先用下面指令查询设备是否安装node.js
和npm,若安装,则确认设备安装的版本是否与EasyDataset需要的一致。
安装node.js和npm的指令需要使用sudo
命令行工具,需要使用下面的指令查询。
which sudo
出现下面的情况表是系统内未安装sudo
。
安装sudo
,出现下面情况表示sudo
安装完成。
sudo apt updatesudo apt install sudo
同时查看sudo
安装目录指令也可以使用也确认安装完成。
which sudo
需求
Node.js 18.x or higher
(实际上最小版本需要v18.17.0
)pnpm (recommended) or npm
node -vnpm -v
出现下方情况表示未安装node.js
和npm
。
为了下载安装指定版本,使用nvm包管理工具下载安装node.js
和npm
,由于nvm
需要使用curl
命令行工具,下面指令用于安装curl
。
sudo apt updatesudo apt install curl
安装完成后进行版本验证,出现版本号则为安装成功。
curl --version
安装nvm
export NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node/curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
安装完成后,重新加载你的Shell配置文件。
source ~/.bashrc
使用 nvm
安装指定版本的 Node.js
,例如安装 Node.js 18.17.0
(推荐安装版本,与EasyDataSet适配良好)
nvm install 18.17.0nvm use 18.17.0
再次查询版本号,当显示版本号时表示安装成功。
node -vnpm -v
安装好node和npm后就可以正式安装EasyDataSet,使用下面指令安装EasyDataset。
需要确保当前控制台在easy-dataset
目录下。
cd /root/easy-dataset
在文件浏览器内可以看到easy-dataset
文件夹。
此时文件夹已经打开至EasyDataSet,运行EasyDataSet一定要确保在easy-dataset
文件夹下,使用下面的指令安装相关环境依赖。
npm install
构建和运行EasyDataSet,显示下方画面表示运行成功,可以通过红框的本地地址访问EasyDataSet,访问方法和LlamaFactory相同,需要使用Ngrok反向代理。
npm run buildnpm run start
显示EasyDataset界面。
Ollama安装
Ollama 是一个开源的本地大语言模型(LLM)运行框架,旨在让用户能够轻松地在本地机器上部署、管理和与大型语言模型进行交互。
由于EasyDataset需要使用大模型能力进行数据集的建立,虽然可以调用网络发布的公共大模型,但为了数据安全,选择本地大模型最优。本地部署大模型最简单的就是Ollama,且与EasyDataset适配,毫无疑问选用Ollama。
下载安装Ollama的命令如下。
curl -fsSL https://ollama.com/install.sh | sh
但可能会出现连接超时或速度慢的问题,还是优先选择国内镜像进行下载加速。出现当前画面表示下载完成。红色报警为Ollama服务未正常启动。
export OLLAMA_MIRROR="https://ghproxy.cn/https://github.com/ollama/ollama/releases/latest/download"curl -fsSL https://ollama.com/install.sh | sed "s|https://ollama.com/download|$OLLAMA_MIRROR|g" | sh
Ollama下载完成后,需要修改大模型下载保存位置,默认下载位置在系统盘(容量不足),需要调整至数据盘,使用下面的指令创建文件夹用于存放大模型。
创建模型储存目录
sudo mkdir -p /root/autodl-tmp/ollama/models
更改目录权限
sudo chown -R ollama:ollama /root/autodl-tmp/ollama/modelssudo chmod -R 755 /root/autodl-tmp/ollama/models
修改环境配置
使用下面的指令修改配置文件中OLLAMA\_MODELS
的地址。
export OLLAMA_MODELS="/root/autodl-tmp/ollama/models"
使用下面指令刷新配置文件。
source ~/.bashrc
在刷新后的终端控制台中使用下面的指令,大模型下载路径是修改后的则修改成功。
echo $OLLAMA_MODELS
由于AutoDL的设备系统未使用systemd
服务,需要使用下面的指令启动Ollama服务,出现以下画面表示运行成功,因为Ollama需要持续运行,当前终端控制台后台运行,后续指令需要新开一个终端控制台进行操作。
ollama serve
在Ollama运行界面下,使用 Ctrl+c
可以停止当前Ollama服务。
Ollama运行后就可以在Ollama官网找到需要的大模型,并使用Ollama的指令拉取需要的大模型。(用于数据集构建的大模型优先使用非推理模型,可以减少推理所消耗的时间)
下面以Qwen2.5 32B
的大模型下载为例。
先选择需要的数据量大小的模型,右侧复制拉取大模型的指令,在终端控制台运行。
ollama run qwen2.5:32b
下载完成后,大模型会自动运行,可以在控制台中和大模型对话,检查大模型能力。输入/bye
可以退出大模型对话。
查看已下载的大模型。
ollama list
补充:
关闭占用端口进程
退出当前正在运行的程序的控制台界面,这不代表关闭了当前程序。当你再一次调用运行指令时,会提示当前程序使用的默认端口被占用,这时需要杀掉正在占用端口的程序才能再次启动该程序。
查询正在占用端口的工具ss,使用下面的指令进行安装。
sudo apt updatesudo apt install iproute2
调用版本查询指令,出现版本号则安装成功。
ss --version
使用下面的代码可以查看正在占用端口的程序的PID
号。127.0.0.1
为ip地址,11434
为端口号。
ss -tuln -p | grep 11434
图中红框内的就是占用11434
端口程序的PID
号,使用下面的指令可以杀死当前进程。在重新运行程序就正常了。
kill -9 1726
Linux相关指令
打开文件夹指令。
cd 文件夹名称
查看文件夹下文件指令。
ls
删除空文件夹。
rmdir 文件夹名称
删除非空文件夹指令。
rm -r 文件夹名称
删除文件指令。
rm 文件名称
至此硬件和软件准备工作均已完成。现后台运行的程序有LlamaFactory、EasyDataset、Nogrk和Ollama,后续将整合这些软件功能进行大模型微调工作。
大模型微调
大模型微调(Fine-tuning)是一种在预训练模型的基础上进行进一步训练的技术,目的是让模型更好地适应特定的任务或领域。
数据集准备
数据集(Large Model Dataset)是指用于训练大型语言模型(LLMs)的海量数据集合。这些数据集通常包含大量的文本数据,用于帮助模型学习语言的结构、语义、语法和上下文信息。
构建大模型数据集是一个复杂的过程,通常包括以下步骤:
- 数据收集:从多个来源收集文本数据,如网页爬取、书籍扫描、社交媒体抓取等。数据清洗:去除重复内容、低质量文本、噪声数据等。数据标注:对部分数据进行标注,以便用于监督学习。数据分片:将数据分成多个部分,以便在分布式系统中高效处理。数据存储:将数据存储在高效的数据存储系统中,如分布式文件系统(HDFS)或对象存储(S3)。
1. 文本转换格式
EasyDataset对Markdown
格式的文件兼容性最好,所以需要将用来准备数据集的文件转换为Markdown
格式。这里使用MinerU网页版进行处理。
教程中准备了一份 民用机场专用设备管理规定.pdf 作为数据集文件,上传至MinerU。
转换为MarkDown
格式后,下载至本地。
2. 创建EasyDataset项目
在EasyDataset可视化界面上创建一个新项目。
在项目的模型配置模块中,选择第一个配置本地大模型。为了减少稍后选择模型时的干扰,将其他不需要的模型删除。
在任务配置模块中,对文本分割长度进行设置(也就是文本分段)及根据文本的信息密度设置生成问题的最大长度(也就是问题答案所需要的长度)
在提示词配置模块中,可以对生成问题提示词和生成答案提示词进行设置(可选)。可以设定大模型的角色、问答风格等。
设置以上配置后,不急于进行数据集生成,先进行大模型的功能测试。在模型测试模块中,进行简单测试,可以得到大模型回复,则表示大模型配置成功。
进入文献处理模块,选择用于处理文件的大模型,上传Markdown
文件,点击上传并处理文件,文本块分割好后,全选文本块,点击批量生成问题,对选择的文本块进行问题生成。
选择领域分析模块,可以对文件生成的领域树进行修改。领域树的子树就是文本内容分类后生成的标签,修改自动生成的不正确的标签,新增需要的标签。这些标签在问题管理中用于对生成的问题进行数据标注。
问题生成后,选择问题管理模块,可以看到生成的所有问题。对不正确的问题进行修改或删除。对所有问题修改完成后,全选问题,点击批量构造数据集。
数据集构造完成后,选择数据集管理模块,全选问题后,点击导出数据集。此时可以对导出格式进行配置,数据集一般使用Json
文件格式和Alpaca
数据集风格。可以根据需要添加系统提示词。最后导出数据集。
这样一个基础的数据集就制作完成了。但是为了让大模型得到更好的训练效果,需要对数据集进行不断的修改和优化,数据集有好坏程度决定了大模型的最终能力。
微调
因为本流程使用免费版ngrok进行反向代理,一次只能代理一个地址。所以需要停用EasyDataset的代理,调整为LlamaFactory代理,端口号调整为7860
。
数据集导入
在JupyterLab的文件浏览器中找到LlamaFactory文件夹,打开子文件夹data
,将导出的数据集文件拖拽进去。
导入完成后,还需要在配置文件dataset_info.json
中将刚导入的数据集进行配置。右击选择打开方式,使用编辑器打开。
复制下方代码,将名称替换为导入的数据集的名称,文件名替换为导入数据集的完整文件名(需要加上文件扩展名),粘贴至大括号内。
"名称": { "file_name": "文件名.json" },
Ctrl+S
保存后,关闭编辑器。此时打开dataset_info.json
,可以看到导入的数据集,已经配置完成。
LlamaFactory界面
下面介绍常用的几个模块
主界面
Train 训练
各类配置设置完成后,点击开始按钮进行模型训练。中途停止点击中断按钮。
Evaluate & Predict 评估
评估数据集不能和训练数据集内容一样。评估数据集用于评估模型的性能,通常不参与模型的训练,用于测试模型在未见过的数据上的表现。
假设你正在开发一个图像分类模型,目标是识别猫和狗的图片。
训练数据集:
- 包含大量猫和狗的图片,每张图片都有标签(猫或狗)。图片来自不同的角度、光照条件和背景。数据量可能达到数万张图片。
评估数据集:
- 包含一些未在训练数据集中出现过的猫和狗的图片。图片的来源和条件与训练数据集相似,但包含一些新的场景。数据量可能在数千张图片。
Chat 聊天
模型配置后测评
在主界面中配置好模型和模型路径后 ,应先到聊天模块进行对话测试。点击加载模型,如果模型加载失败,说明模型名称和下载的模型不一致或者模型路径错误。
模型训练后测评
在模型训练完成后,也需要到聊天界面进行训练后的模型测试。在主界面中选择最后一次训练的检查点路径,点击加载模型,然后就可以进行模型对话测试了。
Export 导出
在主界面中选择最后一次训练的检查点路径,在导出目录中配置填写导出路径,路径中的文件夹不能不存在,需要提前创建好。最后点击开始导出进行模型导出。
新模型的部署与运行
要在 Ollama 中运行格式为 Safetensors 的模型,需要先将 Safetensors 模型转换为 Ollama 支持的 gguf
格式,然后通过 Ollama 的命令行工具导入和运行。
转换格式需要llama.cpp
,使用下面指令安装
git clone https://github.com/ggml-org/llama.cpp.gitcd llama.cpppip install -r requirements.txt
若下载速度慢或链接超时,则推荐使用国内镜像
git clone https://gitee.com/limoncc/llama.cpp.gitcd llama.cpppip install -r requirements.txt
使用下面的指令SafeTensors 到 GGUF
其中,/root/autodl-tmp/Models/Merge/DeepSeek-R1-Distill-Qwen-7B
是 SafeTensors 模型的路径,/root/autodl-tmp/Models/output/model.gguf
是输出的文件路径。指令需要在~/llama.cpp
目录下执行
python convert_hf_to_gguf.py /root/autodl-tmp/Models/Merge/DeepSeek-R1-Distill-Qwen-7B --outfile /root/autodl-tmp/Models/output/model.gguf --outtype f16
运行成功后,在/root/autodl-tmp/Models/output/model.gguf
目录下则会生成Ollama可运行的gguf
格式的大模型文件。
在gguf
格式大模型文件的同级目录下,创建Modelfile文件
Modelfile
是 Ollama 使用的一种配置文件,用于定义如何将模型导入到 Ollama 环境中。它类似于 Docker 的 Dockerfile
,通过一系列指令来指定模型的来源、适配器、参数以及其他相关配置。
在Modelfile
文件中将下面代码复制保存进去,表示从该目录读取大模型文件。
FROM /root/autodl-tmp/Models/output/model.gguf
在 Modelfile
文件所在的目录下运行以下命令,将模型导入Ollama。my-model
为自定义的大模型名称。
ollama create my-model -f Modelfile
最后运行以下指令,使用Ollama运行启动微调后的大模型。
ollama run my-model
Windows同理,需要记得修改Modelfile
中的gguf
大模型的路径
向Ollama导入大模型指令需要Modelfile
文件的全路径名。
Ollama运行大模型时,需要先查询加载的模型全程
ollama create my-model -f E:\largeModel\createLargeModelFormdDeepseek-R1-7B.Modelfile
ollama lsit
ollama run my_model:latest
总结
以上为云服务器上微调大模型的全部流程,因为数据集和训练方法的问题,最终得到的大模型没有达到预期的效果。实现行业大模型,还是需要足够优秀的数据集和模型训练方法。