LLaMA Factory零代码轻松高效微调大模型

1. 运行环境要求

1.1、硬件环境

名称建议配置
1CPUIntel I7
2显卡NVIDIA GeForce RTX 4090
3内存16G
4系统Ubuntu20.04 +

注:根据微调的模型参数大小不同,显存要求也会不一样,参考值如下:

方法精度7B14B30B70BxB
Full (bf16 or fp16)32120GB240GB600GB1200GB18xGB
Full (pure_bf16)1660GB120GB300GB600GB8xGB
Freeze/LoRA/GaLore/APOLLO/BAdam1616GB32GB64GB160GB2xGB
QLoRA810GB20GB40GB80GBxGB
QLoRA46GB12GB24GB48GBx/2GB
QLoRA24GB8GB16GB24GBx/4GB

1.2、软件环境

名称版本
1Python3.10
2CUDA12.2
3JupyterLab3.5+
2. LLaMA Factory安装

在Jupyterlab中新建或打开一个命令行终端,本小节通过这个终端执行相关命令。

2.1、创建并配置虚拟环境

创建Conda新环境,名称可自定义,这里以微调英文缩写"llamafac"为例:

$ conda create -n llamafac python=3.10 ipykernel -y

激活新建的环境:

$ conda activate llamafac

激活后,终端提示符通常会显示环境名称(llamafac),表示您已在该环境当中。

llamafac虚拟环境加入到Jupyterlab的内核中,以便后续Jupyterlab可选到该环境:

$ python -m ipykernel install --user --name=llamafac --display-name "llamafac"

2.2、通过LLaMA-Factory源码安装

克隆LLaMA-Factory仓库到本地,会在当前目录下会生成LLaMA-Factory的文件夹

$ git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
  • --depth 1:仅克隆最近一次提交版本,不包含完整历史记录,但可以节省时间和磁盘空间。

进入刚刚克隆的目录,所有后续命令将在 LLaMA-Factory 目录下执行:

$ cd LLaMA-Factory

以"可编辑模式(或开发模式)"安装项目及其依赖库。

$ pip install -e ".[torch,metrics,modelscope]"

发现出现环境冲突,使用 pip install --no-deps -e . 解决

$ pip install --no-deps -e .

注:取消可编辑模式可以用 pip uninstall <包名>,然后正常安装(pip install .)

2.3、通过Pip安装LLaMA-Factory

$ pip install llamafactory

2.4、LLaMA-Factory验证

完成安装后,可以通过使用以下命令来快速验证安装是否成功。

$  llamafactory-cli version

个别环境如果出现socksio包未安装提示,执行提示的安装命令,接着继续执行版本查看命令。

$ pip install "httpx[socks]"

如果您能成功看到类似下面的界面,就说明安装成功了。

LLaMA-Factory安装成功后,默认提供了llamafactory-cli命令行工具,该工具提供了便捷的方式执行模型训练/微调、推理和管理等操作,无需深入代码细节。其中工具包含了多个子命令如下:

输入带-h参数,列出工具包含哪些子命令。

$ llamafactory-cli -h

  • llamafactory-cli train:用于训练微调模型;
  • llamafactory-cli eval:评估模型性能(如准确率、推理速度等);
  • llamafactory-cli export:合并 LoRA 等适配器并导出成完整模型;
  • llamafactory-cli webchat:启动一个以"网页版"形式的聊天界面;
  • llamafactory-cli chat:启动一个以"命令行"形式的聊天界面;
  • llamafactory-cli api:启动一个 OpenAI 风格的 API 服务器;
  • llamafactory-cli webui:启动一个由Gradio构造的、"网页版"形式的 LlamaBoard 界面,将模型训练、评估、模型管理等全部可视化操作,适合零代码用户。

3. LLaMA Board可视化WebUI启动&设置

第二小节已提到过,LLaMA-Factory支持通过 WebUI 可视化界面零代码训练、微调大模型。该WebUI全称LLaMA Board,使用Gradio库构造,其交互体验效果好,支持模型训练全链路的一站式平台,一个好的功能离不开好的交互,Stable Diffusion的大放异彩的重要原因除了强大的内容输出效果,就是它有一个好的WebUI,这个LLaMA Board将训练大模型主要的链路和操作都在一个页面中进行了整合,所有参数都可以可视化地编辑和操作。

在完成LLaMA-Factory安装后,可以通过以下命令进入WebUI。

$ llamafactory-cli webui

注:但目前webui只支持单机单卡和单机多卡,如果是多机多卡请使用LLaMA Factory CLI。

命令会启动一个默认监听7860端口的可视化WebUI(简称LLaMA Board),可通过浏览器访问http://localhost:7860来查看。如果要监听其它端口,可以设置GRADIO_SERVER_PORT环境变量,比如更改为8860端口,同时设置USE_MODELSCOPE_HUB为1,表示模型从 ModelScope 魔搭社区下载,避免从 HuggingFace下载导致网速不畅。

CTRL + C结束上面的进程,重新运行以下命令:

$ export USE_MODELSCOPE_HUB=1 GRADIO_SERVER_PORT=8860 && llamafactory-cli webui

通过ModelScope下载的模型,默认存储路径为~/.cache/modelscope/hub,也可以通过设置MODELSCOPE_CACHE环境变量来修改。

相关的环境变量有哪些呢?打开一个新命令行终端,查看项目的根目录下的.env.local文件(这里罗列了LLAMA Factory的所有环境变量的参考)

cat .env.local
# api
API_HOST=
API_PORT=
API_KEY=
API_MODEL_NAME=
API_VERBOSE=
FASTAPI_ROOT_PATH=
MAX_CONCURRENT=
# general
DISABLE_VERSION_CHECK=
FORCE_CHECK_IMPORTS=
ALLOW_EXTRA_ARGS=
LLAMAFACTORY_VERBOSITY=
USE_MODELSCOPE_HUB=             # 是否使用ModelScope Hub下载模型,默认为0
USE_OPENMIND_HUB=
USE_RAY=
RECORD_VRAM=
OPTIM_TORCH=
NPU_JIT_COMPILE=
# torchrun
FORCE_TORCHRUN=
MASTER_ADDR=
MASTER_PORT=
NNODES=
NODE_RANK=
NPROC_PER_NODE=
# wandb
WANDB_DISABLED=
WANDB_PROJECT=
WANDB_API_KEY=
# gradio ui
GRADIO_SHARE=                   # 是否开启公网访问,默认为False
GRADIO_SERVER_NAME=
GRADIO_SERVER_PORT=             # 监听的端口,默认为7860
GRADIO_ROOT_PATH=               # 指定WebUI部署的路径
GRADIO_IPV6=
# setup
ENABLE_SHORT_CONSOLE=
# reserved (do not use)
LLAMABOARD_ENABLED=
LLAMABOARD_WORKDIR=

在新的命令行终端中输入nvidia-smi,观察此时显存占用情况:

如果想以后台进程运行,可以结合一些nohup和守护进程工具。

nohup bash -c 'export USE_MODELSCOPE_HUB=1 GRADIO_SERVER_PORT=8860 && llamafactory-cli webui' > llamaboard.log 2>&1 &

打开浏览器访问 http://localhost:8860%EF%BC%8C%E5%8D%B3%E5%8F%AF%E7%9C%8B%E5%88%B0%E5%A6%82%E4%B8%8B%E7%95%8C%E9%9D%A2%E3%80%82

初次浏览,发现界面是不是很复杂,功能很多,不用担心,我们后续会通过具体的模型微调案例,来来介绍如何使用。我们第一步就是把语言更改为友好的中文。左上角Language选择中文

接着我们简单预览一下,它包含了哪个功能,归类一下有四个功能(tab界面):

  • 训练(train):模型训练;
  • 评估与预测(Evaluate & Predict):模型训练完后,可指定 模型 及 适配器 的路径通过该界面在指定数据集上进行评估;
  • 对话(Chat):模型训练完后,可指定 模型 及 适配器 的路径,通过该界面进行可视化对话;
  • 导出(Export):如果对模型微调效果满意并需要导出模型,可指定模型、适配器、量化等参数通过该界面后导出模型。

5. 微调Qwen2-VL多模态模型构建文旅大模型

该案例基于通义千问团队开源的多模态大模型 Qwen2-VL-2B-Instruct,介绍如何使用 LLaMA Factory 训练框架完成文旅领域大模型的微调及构造。

5.1、原模型对话

在进行微调之前,我们先进行原始模型推理,先验证一下原始模型在对于文旅领域的回答效果。

在LLaMA-Board页面:

  • 模型名称:选择Qwen2-VL-2B-Instruct
  • 模型路径:会自动显示出在Hugging Face的模型标识符Qwen/Qwen2-VL-2B-Instruct

接着切换到对话(Chat)页面:

  • 推理引擎:选择hugging face的推理引擎,会使用原生transformers库;
  • 推理数据类型:选择auto,会自动根据下载的模型配置文件config.json识别出数据类型;

点击加载模型按钮,等待默认下载...

此时观察启动LLaMA Board的命令行终端,可以看到如下日志输入,代表正在下载模型(如果LLaMA Board是通过nohup启动,tail -f llamaboard.log可查看日志输出):

当显示模型已加载,则代表下载成功,如果失败,可以重复点击加载模型或检查网络。

新建一个命令行终端,输入以下命令查看已下载的模型:

$ ls ~/.cache/modelscope/hub/models/Qwen/

某种情况下,为了统一管理模型,建议通过modelscope或git手动下载,存放到指定路径,然后后续使用时使用绝对路径来控制使用哪个模型,比如刚刚的模型,通过modelscope下载。

$ modelscope download --model Qwen/Qwen2-VL-2B-Instruct --local_dir ./models/Qwen2-VL-2B-Instruct

与LLaMA-Factory同级有个assets目录,存放着一些素材样图,选择demo_pic_1.jpg上传至对话框的图像区域,接着在系统提示词区域填写“你是一个导游,请生动有趣地回答游客提出的问题”。在页面底部的对话框输入“帮我讲讲这个地方”对话内容,点击提交即可发送消息。

发送后模型会逐字生成回答,观察模型生成的内容,记录起来供后续对比(当然此时模型未学习到特定领域的知识,回答的相对比较笼统)。

为了不影响后续微微训练显存不足情况,建议将对话的模型卸载释放显存。

点击对话(Chat)窗口中的卸载模型按钮,即可卸载模型。

5.2、微调数据集准备

打开一个新的命令行终端,进入到教程根目录(LLaMA-Factory同级目录)。

本小节准备了一份基于ShareGPT格式的文旅方面的多模态图像数据集tourism-vl.zip,存放在datasets目录下:

通过unzip解压到tourism-vl目录下。

$ unzip datasets/tourism-vl.zip -d datasets/tourism-vl
3. LLaMA Board可视化WebUI启动&设置

第二小节已提到过,LLaMA-Factory支持通过 WebUI 可视化界面零代码训练、微调大模型。该WebUI全称LLaMA Board,使用Gradio库构造,其交互体验效果好,支持模型训练全链路的一站式平台,一个好的功能离不开好的交互,Stable Diffusion的大放异彩的重要原因除了强大的内容输出效果,就是它有一个好的WebUI,这个LLaMA Board将训练大模型主要的链路和操作都在一个页面中进行了整合,所有参数都可以可视化地编辑和操作。

在完成LLaMA-Factory安装后,可以通过以下命令进入WebUI。

$ llamafactory-cli webui

注:但目前webui只支持单机单卡和单机多卡,如果是多机多卡请使用LLaMA Factory CLI。

命令会启动一个默认监听7860端口的可视化WebUI(简称LLaMA Board),可通过浏览器访问http://localhost:7860来查看。如果要监听其它端口,可以设置GRADIO_SERVER_PORT环境变量,比如更改为8860端口,同时设置USE_MODELSCOPE_HUB为1,表示模型从 ModelScope 魔搭社区下载,避免从 HuggingFace下载导致网速不畅。

CTRL + C结束上面的进程,重新运行以下命令:

$ export USE_MODELSCOPE_HUB=1 GRADIO_SERVER_PORT=8860 && llamafactory-cli webui

通过ModelScope下载的模型,默认存储路径为~/.cache/modelscope/hub,也可以通过设置MODELSCOPE_CACHE环境变量来修改。

相关的环境变量有哪些呢?打开一个新命令行终端,查看项目的根目录下的.env.local文件(这里罗列了LLAMA Factory的所有环境变量的参考)

cat .env.local
# api
API_HOST=
API_PORT=
API_KEY=
API_MODEL_NAME=
API_VERBOSE=
FASTAPI_ROOT_PATH=
MAX_CONCURRENT=
# general
DISABLE_VERSION_CHECK=
FORCE_CHECK_IMPORTS=
ALLOW_EXTRA_ARGS=
LLAMAFACTORY_VERBOSITY=
USE_MODELSCOPE_HUB=             # 是否使用ModelScope Hub下载模型,默认为0
USE_OPENMIND_HUB=
USE_RAY=
RECORD_VRAM=
OPTIM_TORCH=
NPU_JIT_COMPILE=
# torchrun
FORCE_TORCHRUN=
MASTER_ADDR=
MASTER_PORT=
NNODES=
NODE_RANK=
NPROC_PER_NODE=
# wandb
WANDB_DISABLED=
WANDB_PROJECT=
WANDB_API_KEY=
# gradio ui
GRADIO_SHARE=                   # 是否开启公网访问,默认为False
GRADIO_SERVER_NAME=
GRADIO_SERVER_PORT=             # 监听的端口,默认为7860
GRADIO_ROOT_PATH=               # 指定WebUI部署的路径
GRADIO_IPV6=
# setup
ENABLE_SHORT_CONSOLE=
# reserved (do not use)
LLAMABOARD_ENABLED=
LLAMABOARD_WORKDIR=

在新的命令行终端中输入nvidia-smi,观察此时显存占用情况:

如果想以后台进程运行,可以结合一些nohup和守护进程工具。

nohup bash -c 'export USE_MODELSCOPE_HUB=1 GRADIO_SERVER_PORT=8860 && llamafactory-cli webui' > llamaboard.log 2>&1 &

打开浏览器访问 http://localhost:8860%EF%BC%8C%E5%8D%B3%E5%8F%AF%E7%9C%8B%E5%88%B0%E5%A6%82%E4%B8%8B%E7%95%8C%E9%9D%A2%E3%80%82

初次浏览,发现界面是不是很复杂,功能很多,不用担心,我们后续会通过具体的模型微调案例,来来介绍如何使用。我们第一步就是把语言更改为友好的中文。左上角Language选择中文

接着我们简单预览一下,它包含了哪个功能,归类一下有四个功能(tab界面):

  • 训练(train):模型训练;
  • 评估与预测(Evaluate & Predict):模型训练完后,可指定 模型 及 适配器 的路径通过该界面在指定数据集上进行评估;
  • 对话(Chat):模型训练完后,可指定 模型 及 适配器 的路径,通过该界面进行可视化对话;
  • 导出(Export):如果对模型微调效果满意并需要导出模型,可指定模型、适配器、量化等参数通过该界面后导出模型。

解压完在tourism-vl目录下将生成如下文件:

分别对应:

  • train.json:数据集文件,数据集中的样本为单轮对话形式,含有 261 条样本,每条样本都由一条系统提示、一条用户指令和一条模型回答组成,微调过程中模型不断学习样本中的回答风格,从而达到学习文旅知识的目的。数据样例如下所示:

  • images:数据集对应的图片文件

  • dataset_info.json:只包含文旅游数据集的描述文件

以前内容对于LLaMA-Factory来说,已是完整的一个数据集,因此我们可以直接拷贝到LlaMA-Factory目录下。为了保存LlaMA-Factory目录下的原始内置数据集,我们先将原始数据集重命名为rawdata,再移动过去。

$ mv LLaMA-Factory/data LLaMA-Factory/rawdata && mv datasets/tourism-vl LLaMA-Factory/data

5.3、模型全参数微调

确认已启动LLaMA Board,若未启动,请移步至第3小节。

按照以下内容设置表单:

  • 模型名称:Qwen2-VL-2B-Instruct;
  • 模型路径:Qwen/Qwen2-VL-2B-Instruct。之前在推理时已下载了模型。若未下载启动微调时会自动下载。也可以手动下载,然后指定一个绝对路径;
  • 微调方法:选择full,针对小模型使用全参微调方法能带来更好的效果,对显存的要求会更高(参考开头表格),可选的还有freeze, lora;
  • 对话模板:一般每种模型都有自己的对话模板,选择模型名称时会自动识别出对应的对话模板;
  • 加速方式:auto。
    • flashattn2:能够加快注意力机制的运算速度,同时减少对内存的使用,需要特定GPU硬件支持;
    • Unsloth:若使用HuggingFace + LoRA,适合快速部署,显存节省明显,但当前仅支持 Llama, Mistral, Phi-3, Gemma, Yi, DeepSeek, Qwen等大语言模型;
    • liger_kernel:需手动集成,但对复杂模型和长序列任务优化更彻底;
  • 操作页面:选择训练(Train);
  • 训练阶段:选择Supervised Fine-Tuning(sft,监督微调);可选的还有Pre-Training(pt,预训练)、Reward Modeling(奖励模型训练)、PPO(强化学习训练)、DPO(非强化学习训练);
  • 训练数据集:选择train;

可以点击「预览数据集」,点击关闭返回训练界面。

  • 学习率:1e-4。过高易导致发散,过低则收敛缓慢,数据集越多越大。
  • 训练轮数:10;
  • 计算类型:pure_bf16。强制所有计算完全在 bf16 精度下进行,不依赖 FP32 辅助;
  • 梯度累积:设为 2。有利于模型拟合;
  • 学习率调节器:cosine,可选 linear, polynomial, constant 等。

在其他参数设置区域,根据情况进行设置,如:

  • 保存间隔:1000。节省硬盘空间。
  • 启用外部记录面板:none。虽然选择none,但还是会默认使用LlamaBoard自带的Loss曲线看板。可选的有tensorboard、wandb等,wandb需要设置相关的环境变量,所以一定要选择个,建议启动使用SwanLab,可以在可视化界面设置API Key,参考SwanLab参数设置

  • SwanLab参数设置:暂时不启用。如若启用打钩,并填写项目名、SwanLab API密钥。

将输出目录修改为train_qwen2vl,训练后的模型权重将会保存在此目录中。点击「预览命令」可展示所有已配置的参数,您如果想通过代码运行微调,可以复制这段命令,在命令行运行。

点击「开始」启动模型微调。

启动微调后需要等待一段时间,可在界面观察到日志、训练进度和损失曲线,输入nvidia-smi观察显存占用情况。

如果过程中出现错误,请结合页面日志以及终端日志进行排查。比如以下OOM(显存移除)错误,就需要增加显存或更失小点的模型。

观察之前已经使用对话(Chat)页面加载模型进行了一次推理,输入nvidia-smi查看显存占用情况。

$ nvidia-smi

观察到此时有8G的显存占用,我们点击卸载模型,释放显存。

再次输入nvidia-smi,观察显存是否已降下来。

最后,一切顺利,模型微调大约需要 15 分钟,显示“训练完毕”代表微调成功。权重文件被保存在 LLaMA-Factory/saves/Qwen2-VL-2B-Instruct/full 目录下。

从结果大致可以看到,损失还是比较平稳的下滑,效果不错。

为了后续可以方便的进行再次训练,可以把这次的训练参数保存成.yaml文件,方便下次直接加载。

5.4、微调后的模型对话

选择「Chat」栏,将检查点路径改为 train_qwen2vl,点击「加载模型」即可在 Web UI 中和微调后的模型进行对话。

与原始模型推理步骤一样,选择相同的图片并上传,接着在系统提示词区域填写“你是一个导游,请生动有趣地回答游客提出的问题”。在页面底部的对话框输入“帮我讲讲这个地方”,点击提交即可发送消息。

发送后微调后的模型,从回答中可以发现模型学习到了数据集中的内容,能够恰当地模仿导游的语气介绍图中的山西博物院。

对微调前的回答对比,可以发现微调后的模型更加符合真实场景。

注:如果需要进行其它实验,由于显存的限制,建议用完卸载模型。

5.5、模型合并导出

虽然全参数微调后的新检查点/权重文件,不需要再进行合并,但为了整理成符合huggingface标准的模型仓库格式,可以进行一次导出。

使用LLaMA Board可安智网化界面可以方便的进行模型导出。

  • 模型名称:Qwen2-VL-2B-Instruct;须与微调时的基座模型名称保持一致;
  • 模型路径:Qwen/Qwen2-VL-2B-Instruct;须与微调时的模型路径保持一致;
  • 检查点路径:train_qwen2vl;即全参数微调后的新检查点/权重文件路径;

点击导出(Export)标签页。

  • 最大分块大小(GB):4,模型会被分成多个文件存储,每个文件大小不会超过指定大小;
  • 导出量化等级:none,不进行量化;
  • 导出设备:cpu,这个地方选择什么影响不大;
  • 导出目录:../models/Qwen2-VL-2B-Tourism,../代表可以导出到LLaMA-Factory的上级目录,这里为了统一管理。

最后点击「导出」按钮,开始导出模型。

经过短暂的等待,页面状态提示导出完成。

通过FinalShell等远程工具,登录机器,可以看到在models目录下重新生成了Qwen2-VL-2B-Tourism文件夹。

其中还生成了使用Ollama部署的Modelfile文件。

### LLaMA-Factory 大模型微调方法教程 #### 创建并激活虚拟环境 在开始之前,确保已经完成基础环境配置。接着需要创建一个新的Python虚拟环境来管理依赖项: ```bash python3 -m venv llama-env source llama-env/bin/activate # Linux 或 macOS # 对于 Windows 用户应使用: # .\llama-env\Scripts\activate.bat ``` #### 工具安装 为了能够顺利地进行后续操作,还需要安装一些必要的库和工具包[^2]。 #### 下载预训练模型 获取由 Hugging Face 提供的基础版本的大规模语言模型作为起点是非常重要的一步: ```python from transformers import AutoModelForCausalLM, AutoTokenizer model_path = "path/to/pretrained/model" tokenizer = AutoTokenizer.from_pretrained(model_path) model = AutoModelForCausalLM.from_pretrained(model_path, torch_dtype=torch.bfloat16) device = 'cuda' if torch.cuda.is_available() else 'cpu' model.to(device) # 将模型移动到指定设备 ``` #### 准备数据集 对于特定领域(如法律),准备高质量的数据集至关重要。这通常涉及到收集、清理以及标注大量文本样本以便用于监督学习过程。 #### 配置微调参数 定义好要调整的关键超参数,比如批次大小(batch size),轮次(epoch number),初始学习率(learning rate)等设置。这些都会影响最终效果的好坏。 #### 执行微调命令 通过`ollama create model_name -f Modelfile`这样的指令启动实际的微调工作流[^1]。这里假设已经有了一个名为`Modelfile`的文件包含了所有必需的信息描述新创建的模型实例。 #### 使用一站式服务简化流程 得益于LLaMA-Factory提供的一站式服务平台,在此期间几乎不需要手动干预其他环节的工作,因为平台会自动处理从模型微调直到部署上线之间的每一个细节[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智驭导师授AI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值