大模型微调实操--llama-factory
llama-factory环境安装
前置准备
英伟达显卡驱动更新地址
下载 NVIDIA 官方驱动 | NVIDIA
cuda下载安装地址
CUDA Toolkit 12.2 Downloads | NVIDIA Developer
pytorch下载安装地址
Previous PyTorch Versions | PyTorch
llama-factory项目和文档地址 https://github.com/hiyouga/LLaMA-Factory
安装 - LLaMA Factory
python环境下载地址 Download Python | Python.org miniconda下载地址
Miniconda - Anaconda
git下载地址
Git - Downloads
硬件环境校验
显卡驱动和CUDA的安装 下载 NVIDIA 官方驱动 | NVIDIA CUDA Toolkit 12.2 Downloads | NVIDIA Developer使用以下命令做最简单的校验
打开 cmd 输入,若出现类似内容则安装成功
软件环境准备
拉取LLaMA-Factory代码
没有git先安装一个git:Git - Downloads也可以直接下载代码解压缩
运行以下指令以安装 LLaMA-Factory 及其依赖:
创建虚拟环境
最好是先建一个虚环境来安装
比如用conda建立虚环境,不过要先安装conda或者miniconda python环境下载地址:Download Python | Python.org miniconda下载地址:Miniconda - Anaconda
备注:
如果 venv创建的虚环境,比如在LLaMA-Factory目录创建一个python310的子目录
量化环境
如果您想在 Windows 上启用量化 LoRA(QLoRA),请根据您的 CUDA 版本选择适当的 bitsandbytes]
发行版本
QLoRA最好安装cuda11.8以上的版本如12.1,特别是使用AWQ等量化算法的基础模型时,cuda11.8可能出现一些pytorch的错误
如果大模型使用awq量化需要安装autoawq模块
安装后使用以下命令做简单的正确性校验
如果识别不到可用的GPU,则说明环境准备还有问题,需要先进行处理,才能往后进
那多大的模型用什么训练方式需要多大的GPU呢,可参考 https://github.com/hiyouga/LLaMA-Factory? tab=readme-ov-file#hardware-requirement
启动 LLaMA-Factory
同时对本库的基础安装做一下校验,输入以下命令获取训练相关的参数指导, 否则说明库还没有安装成功
llamafactory-cli命令在使用的python虚拟换的scripts目录下,正常激活虚拟目录如下命令就可以使用
注意:目前webui版本只支持单机单卡和单机多卡,如果是多机多卡请使用命令行版本
如果要开启 gradio的share功能,或者修改端口号
如图所示,上述的多个不同的大功能模块都通过不同的tab进行了整合,提供了一站式的操作体验。
手动下载模型
以Meta-Llama-3-8B-Instruct为例,通过huggingface 下载(可能需要先提交申请通过),当然我们一般就不去下载meta官方的原始模型
modelscope 下载(适合中国大陆网络环境)
代码下载模型
用modelscope库下载
使用transformer来编写推理代码
微调数据集
偏好数据
sft微调一般用alpaca格式,dpo优化的偏好数据一般用sharegpt 格式
DPO优化偏好数据集
下面是DPO优化偏好数据集示例:
https://huggingface.co/datasets/hiyouga/DPO-En-Zh-20k/viewer/zh?row=5
HelpSteer2
英伟达开源的HelpSteer2 https://huggingface.co/datasets/nvidia/HelpSteer2
论文:https://arxiv.org/pdf/2406.08673
数据集注册
龙哥这儿拿甄嬛传里的语料当做自定义数据集举例
我们先下载 huanhuan.json数据集,是alpaca格式数据
可以在这儿下载:魔搭社区
微调过程参数解析微调命令
也可以将参数安装格式保存为ymal文件,然后如下使用,具体格式可以参考根目录下的examples文件夹下的例子
如果是windows下,在cmd窗口中,把命令中\和换行删掉,当成一行命名即可
上面命令可以用来基于qwen2-7b训练huanhuan_chat的lora
中断继续训练
中断之后继续训练,可以使用下面命令,训练步数也会从保存的checkpoint处开始,比如checkpoint保存点是400步,但是在450步中断,会从400步开始继续
当然使用命令训练,没有用webui看loss那么直观,需要加一个命令
在训练结束后,loss图会保存在 --output_dir 指定的目录中
如果可以通过添加命令,从检查点开始继续训练,但训练集会从头开始训练,适合用新数据集继续训练
也可以在webui中指定 检查定路径,把路径复制进去
模型评估
大模型主流评测 benchmark
虽然大部分同学的主流需求是定制一个下游的垂直模型,但是在部分场景下,也可能有同学会使用本项目来做更高要求的模型训练,用于大模型刷榜单等,比如用于评测mmlu等任务。当然这类评测同样可以用于评估大模型二次微调之后,对于原来的通用知识的泛化能力是否有所下降。(因为一个好的微调,尽量是在具备垂直领域知识的同时,也保留了原始的通用能力)
在完成模型训练后,您可以通过 llamafactory-cli eval
来评估模型效果。
配置示例文件具体如下:
本脚本改编自 https://github.com/hiyouga/LLaMA-Factory/blob/main/examples/train_lora/llama3_l ora_eval.yaml
如果是chat版本的模型
windows下,评测命令实例:
大语言模型评估集
两个开源自动化评测项目:
https://github.com/open-compass/opencompass https://github.com/EleutherAI/lm-evaluation-harness/tree/main
批量推理
环境准备
使用自动化的bleu和 rouge等常用的文本生成指标来做评估。指标计算会使用如下3个库,请先做一下 pip安装
参数解释
下面是一个 批量推理的命令例子
推理示例命令预览
windows下,龙哥的测试命令:
模型部署
LoRA模型合并导出
也可以参考文档:
LoRA 合并 - LLaMA Factory
还有一些参数可以参考:
导出GGUF
开源项目llama.cpp提供的有模型格式转换工具
项目地址:https://github.com/ggerganov/llama.cpp #####
安装gguf库
如果直接 pip 安装 gguf,不是最新版本,和最新的转换脚本会不兼容,可以直接从源码安装llama.cpp
如有必要按照模型训练环境准备章节 建立一个llama.cpp需要的python虚拟环境
格式转换
返回 llama.cpp 项目根目录,会有一个官方提供的 convert-hf-to-gguf.py 脚本,用于完成huggingface格式到gguf格式的转换
ollama安装
我们以ollama为例,下载地址:Ollama
ollama是go语言开发的开源项目,github地址:https://github.com/ollama/ollama ollama文档参考:https://github.com/ollama/ollama/tree/main/docs
ollama支持的是gguf文件格式,如果是其他文件格式需要转换成gguf文件格式
linux安装
一般线上gpu算力服务器,驱动都会已经安装好
虽然 AMD 已将驱动程序上游贡献给官方 Linux 内核源代码,但该版本较旧,可能不支持所有
ROCm 功能。我们建议您从 Linux® Drivers for AMD Radeon™ and Radeon PRO™ Graphics 安装最新驱动程序,以获得对您 Radeon GPU 的最佳支持。
#运行以下一行命令来安装 Ollama
curl -fsSL https://ollama.com/install.sh | sh
#或者手动下面命令安装
sudo curl -L https://ollama.com/download/ollama-linux-amd64 -o /usr/bin/ollama sudo chmod +x /usr/bin/ollama
#将 Ollama 添加为启动服务(推荐)
#为 Ollama 创建一个用户
sudo useradd -r -s /bin/false -m -d /usr/share/ollama ollama
#在 /etc/systemd/system/ollama.service 中创建一个服务文件,内如如下,截止启动服务 前
[Unit]
Description=Ollama Service After=network-online.target
[Service] ExecStart=/usr/bin/ollama serve User=ollama
Group=ollama Restart=always RestartSec=3
[Install] WantedBy=default.target
#然后启动服务
sudo systemctl daemon-reload sudo systemctl enable ollama
#启动 Ollama
sudo systemctl start ollama
#移除 ollama 服务
sudo systemctl stop ollama sudo systemctl disable ollama
sudo rm /etc/systemd/system/ollama.service
windows安装
不再需要 WSL!
Ollama 现在已作为 Windows 原生应用程序运行,包括对 NVIDIA 和 AMD Radeon GPU 的支持下载地址:Download Ollama on macOS,选择windows系统直接安装启动
ollama默认会安装在C:\Users\文件夹下,一般会有下面三个位置
系统要求
Windows 10 或更新版本,家庭版或专业版
如果您有 NVIDIA 显卡,需要 NVIDIA 452.39 或更新版本的驱动程序:https://www.nvidia.cn/Downloa d/index.aspx?lang=cn
如果您有 Radeon 显卡,需要 AMD Radeon 驱动程序 Drivers and Support for Processors and Graphics
启动
安装 Ollama Windows 预览版后,Ollama 将在后台运行, ollama 命令行可在 cmd 、 powershell 或您喜爱的终端应用中使用
后台使用命令,管理ollama
环境变量
下面两个环境变量,可以设置模型目录和ollama api服务的url
ollama命令介绍
官方支持模型
ollama支持的模型列表:library
对于ollama支持的模型可以用下面命令来部署
自定义模型
ollama支持的是gguf文件格式,如果是其他文件格式需要转换成gguf文件格式
要新建一个 Modelfile文件,文件内容如下,该文件假设路径是 d:/ollama/longgemf
需要说明的是,因为LLaMA3的实现本身相对规范,所以Modelfile 的编写相对很简洁,反之对于其他一些模型,可能还需要在里面自主完成template prompt格式的注册,否则问答时会出现答非所问的情况
注册模型
注册了一个叫huanhuan的模型,用下面命令:
命令聊天示例
龙哥实验例子:
open-webui 本地模型部署ui项目
如果需要本地电脑部署一个大模型带ui界面的项目,方便管理模型,可以管理文档资料,方便和gpt一样聊天,可以安装一个open-webui项目
open-webui是一个开源的本地模型推理的webui项目,后端和ollama兼容项目下载地址:https://github.com/open-webui/open-webui
API调用服务
llama-factory的api服务
训练好后,可能部分同学会想将模型的能力形成一个可访问的服务,通过API 来调用,接入到langchian或者其他下游业务中,项目也自带了这部分能力。
API 实现的标准是参考了OpenAI的相关接口协议,基于uvicorn服务框架进行开发, 使用如下的方式启动
如果要加速推理可以是用vllm推理后端,不过vllm只支持linux系统,不支持windows系统
vllm开源项目地址:https://github.com/vllm-project/vllm
项目也支持了基于vllm 的推理后端,但是这里由于一些限制,需要提前将LoRA 模型进行merge,使用
merge后的完整版模型目录或者训练前的模型原始目录都可。
服务启动后,即可按照openai 的API 进行远程访问,主要的区别就是替换 其中的base_url,指向所部署的机器url和端口号即可。
ollama的api服务
ollama api
启动ollama服务后,就可以通过api调用来进行推理,api url可以通过环境变量 OLLAMA_BASE_URL 来指定,包括端口号,默认就是
比如支持 流式生成或者非流式生成,通过post请求生成聊天内容
详细api文档可以参考
https://github.com/ollama/ollama/blob/main/docs/api.md
openai兼容api
支持openai兼容的api接口,而且国内的大部门闭源模型也支持openai兼容的api,这样不用重复开发多套接口,直接在原有模型支持的基础上,换模型和api url地址,就可以支持ollama模型推理
https://github.com/ollama/ollama/blob/main/docs/openai.md
python例子代码
from openai import OpenAI
client = OpenAI( base_url='http://localhost:11434/v1/',
# required but ignored api_key='ollama',
)
#用llama3聊天
chat_completion = client.chat.completions.create( messages=[
{
'role': 'user',
'content': 'Say this is a test',
}
],
model='llama3',
)
#用llava多模态,输入一张图片做总结
response = client.chat.completions.create( model="llava",
messages=[
{
"role": "user", "content": [
{"type": "text", "text": "What's in this image?"},
{
"type": "image_url",
"image_url":