LLaMA-Factory 微调大模型

616 阅读3分钟

环境准备

!pip3 install --upgrade pip
!pip3 install bitsandbytes>=0.39.0

LLaMA-Factory

拉取 LLaMA-Factory

LLaMA-Factory

!git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
编译执行
cd LLaMA-Factory
# pip3 install -r requirements.txt --index-url https://mirrors.huaweicoud.com/repository/pypi/simple
pip3 install -e ".[torch,metrics]"

模型微调

模型下载

以Qwen2.5-7B为例,实现大模型微调

git clone https://www.modelscope.cn/Qwen/Qwen2.5-7B-Instruct.git
配置微调参数

Llama-Factory的文件夹里,打开examples\train_qlora下提供的llama3_lora_sft_awq.yaml,复制一份并重命名为qwen_lora_sft_bitsandbytes.yaml。 将第一行model_name_or_path更改为你下载模型的位置,数据集是 identity文件。修改其他行的内容如下。

### model
model_name_or_path: Qwen2.5-7B-Instruct
……
### dataset
dataset: identity
……
运行微调模型

identity.json 中的 {{name}} 字段替换为你的名字来微调一个属于自己的大模型。

# LLaMA-Factory 目录下
llamafactory-cli train examples/train_qlora/qwen_lora_sft_bitsandbytes.yaml

推理测试

文件夹Llama-Factory\examples\inference下提供的llama3_lora_sft.yaml,复制一份,并重命名为 qwen_lora_sft.yaml

model_name_or_path: Qwen2.5-7B-Instruct
adapter_name_or_path: saves/qwen-7b/lora/sft
template: qwen
finetuning_type: lora
### export
export_dir: export
export_size: 4
export_device: cuda
export_legacy_format: false 
# LLaMA-Factory 目录下
llamafactory-cli chat examples/inference/qwen_lora_sft.yaml

导出

新建Llama-Factory\export文件夹。运行下面的导出命令

llamafactory-cli export examples/inference/qwen_lora_sft.yaml

注意

避免依赖项冲突,可以在每次安装新的依赖项后,走以下步骤

pip install --no-deps -e .

Deepseek训练与微调

参考:blog.csdn.net/CCbleach/ar…

环境

以下配置是最小配置,仅仅能运行起来小模型(<=8B),测试体验使用,无法并发

  1. GPU显存 >= 24G
  2. CUDA >= 11.8,建议 12.2
  3. python==3.10
  4. CPU >= 12核
  5. 运行内存 >= 64G
  6. nvidia-smi 命令正确输出
  7. nvcc -V 命令正确输出,并且版本匹配

创建 python 3.10 环境

conda create -n py310 python=3.10
conda activate py310

设置环境变量,将 HuggingFace设置为ModelScope

export USE_OPENMIND_HUB=1 # 1=ModelScope,0=HuggingFace

下载框架

git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip install -e ".[torch,metrics]"
pip install torch==2.4.0 torchvision==0.19.0 torchaudio==2.4.0 transformers==4.43.2 vllm==0.6.1 openai==1.61.0 deepspeed==0.14.4 #可以不执行,但是防止与其他冲突

下载模型到本地(下载小模型测试比较快)

最大模型需要800G运行内存,这里使用小模型

pip install modelscope
modelscope download --model deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B  --local_dir '/ossfs/workspace/DeepSeek-R1-Distill-Qwen-1.5B'

创建启动配置文件

deepseek-base.yaml (也可以不创建,直接将参数拼接在启动命令后面)

model_name_or_path: deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B # 会自动下载也可以提前把模型下载到本地,填写本地路径
template: deepseek3 # 训练和推理时构造 prompt 的模板
infer_backend: huggingface  # 部署框架: [huggingface, vllm]

部署

方式1:api 接口方式部署(对外暴露接口)
 API_PORT=7007 CUDA_VISIBLE_DEVICES=0 llamafactory-cli api deepseek-base.yaml

方式2:web 聊天页面方式部署(需要开外网端口访问 web 页面)
API_PORT=7007 CUDA_VISIBLE_DEVICES=0 llamafactory-cli webchat deepseek-base.yaml

方式3:命令行模式启动(终端命令行聊天)
CUDA_VISIBLE_DEVICES=0 llamafactory-cli chat deepseek-base.yaml

测试

新建chat.py

import os
from openai import OpenAI
from transformers.utils.versions import require_version

require_version("openai>=1.5.0", "To fix: pip install openai>=1.5.0")

if __name__ == '__main__':
    port = 7007
    client = OpenAI(
        api_key="0",
        base_url="http://localhost:{}/v1".format(os.environ.get("API_PORT", 7007)),
    )
    messages = []
    messages.append({"role": "user", "content": "你好,什么是deepseek?"})
    result = client.chat.completions.create(messages=messages, model="test")
    print(result.choices[0].message)

python chat.py

微调(SFT)

  1. 只讲微调,不讲全量训练,全量训练需要TB级别数据集和千台服务器
  2. 将自己的数据整理为标准的数据集格式:llamafactory.readthedocs.io/zh-cn/lates…
注册数据集

追加data/dataset_info.json里的内容,注册自己的数据集

[
  {
    "instruction": "人类指令(必填)",
    "input": "人类输入(选填)",
    "output": "模型回答(必填)"
  }
]

开始微调

创建训练配置文件:llama3_lora_sft_ds3.yaml,并修改参数,参考:llamafactory.readthedocs.io/zh-cn/lates…

测试

修改推理配置文件,增加adapter_name_or_path 和finetuning_type参数

model_name_or_path: ../DeepSeek-R1-Distill-Qwen-32B
adapter_name_or_path: saves/DeepSeek-R1-Distill-Qwen-32B/lora/sft
template: deepseek3
finetuning_type: lora
infer_backend: huggingface  # 部署框架: [huggingface, vllm]

重新启动微调后的模型

llamafactory-cli chat examples/inference/deepseek-base-lora.yaml

  • 如果微调没有效果,增大文件中的:num_train_epochs参数
  • 不是机械回答,问类似的相关问题,也会根据微调数据集正确回答