项目部署模型微调:SFT + LoRA 实战记录(产品迭代)

Rudy 2026-1-18 10 1/18

前言

SFT:  监督学习,解决的是对不对的问题。

RLHF: 强化学习,解决的是能不能安全做对的问题。

DPO:直接优化偏好,解决的是如何又快又好的做到的问题

目前格局:80%场景用 SFT + DPO,20% 高安全场景用 RLHF

一、项目背景

需求一:

AI电商类目生成项目因文本大模型生成文本太单一,故需微调开源模型部署

二、环境准备

1.AutoDl租卡

AutoDL算力云 | 弹性、好用、省钱,GPU算力零售价格新标杆

2.vscode remote远程连接ssh

3.数据集 ModelScope :

git clone https://www.modelscope.cn/datasets/haiyang/product_description_generation.git

数据清洗:训练集/验证集/测试集 为8 : 1 :1,转为用于 LLaMAFactory 的 Alpaca 格式数据

项目部署模型微调:SFT + LoRA 实战记录(产品迭代)

采用5090

项目部署模型微调:SFT + LoRA 实战记录(产品迭代)

vscode连接远程服务器

git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
mkdir -p /root/autodl-tmp/conda/pkgs 
conda config --add pkgs_dirs /root/autodl-tmp/conda/pkgs 
mkdir -p /root/autodl-tmp/conda/envs 
conda config --add envs_dirs /root/autodl-tmp/conda/envs
conda create -n llama-factory python=3.12
conda activate llama-factory

# 报错就刷新
source ~/.bashrc

pip install -e ".[torch,metrics]"
llamafactory-cli version
llamafactory-cli webui

从 HuggingFace 上下载基座模型

mkdir Hugging-Face
export HF_ENDPOINT=https://hf-mirror.com
export HF_HOME=/root/autodl-tmp/Hugging-Face

echo $HF_ENDPOINT echo $HF_HOME
pip install -U huggingface_hub

hf download Qwen/Qwen2.5-7B-Instruct

选择模型Qwen2.5-7B-Instruct

因为:

  • instruction-tuned 模型
  • 支持 29+ 语言,包含中文
  • 支持很长上下文
  • 结构化输出(尤其 JSON) 做了增强描述。

Qwen3-8B 官方模型卡的亮点是:

  • 支持 thinking / non-thinking 两种模式切换
  • 在数学、代码、逻辑推理上更强。

但是任务是商品文案生成,训练快成本低。

三、微调过程

微调训练之前

项目部署模型微调:SFT + LoRA 实战记录(产品迭代)

加载已经清洗好的数据集:

模型名称 Qwen2.5-1.5B-Instruct

模型路径  /root/autodl-tmp/Hugging-Face/hub/models--Qwen--Qwen2.5-1.5B-Instruct/snapshots/989aa7980e4cf806f80c7fef2b1adb7bc71aa306

微调方法 lora

训练方式 Supervised Fine-Tuning

数据集 上面粘贴到LLaMA-Factory 的data下面,另外改dataset_info.json不然不会显示你添加的数据集

学习率:5e-5 :每次更新参数时迈多大步子,大了学得快,但容易训崩;小了更稳,但收敛慢

训练轮数 3.0 :整个数据集完整训练几遍,多了可能更充分,但也更容易过拟合

最大梯度范数 1.0:梯度裁剪阈值,防止梯度爆炸,太小会限制学习,太大保护作用弱

最大样本数 100000:每个数据集最多取多少条样本参与训练,用来限流,防止数据太多训太久

计算类型 bf16:用什么精度训练,bf16更省显存、速度通常更好,前提是显卡支持

截断长度 2048:单条样本最多保留多少 token,超出就截断大,保留上下文更多,但更吃显存、更慢
批处理大小 2 每张 GPU 一次前向/反向处理多少条样本 大:训练更快,但更吃显存
梯度累积 8 不马上更新参数,累计 8 次小 batch 再更新 1 次 显存不够时伪装成大 batch 的常用手段
验证集比例 0 拿多少训练数据出来做验证
学习率调节器 cosine 学习率怎么变化 就是先高后低,平滑衰减,比较常用

第一轮实验:

项目部署模型微调:SFT + LoRA 实战记录(产品迭代) 项目部署模型微调:SFT + LoRA 实战记录(产品迭代)

还在下降,存在欠拟合状态,继续加大轮数

微调完成

项目部署模型微调:SFT + LoRA 实战记录(产品迭代)

因数据质量属于公开,所以公司内部都是用真实用户集

配置导出模型

项目部署模型微调:SFT + LoRA 实战记录(产品迭代)

嗯,可以用,但考虑是个人项目(租服务器显卡成本过高),故以另外一种方式来实现业务构思,从而有条件后可泛化至实际场景。

构思:

本地显卡4060训练最小模块模型,进行Lora微调三种特色化模型,在让site站点通过不同的Lora配置不同的推理方式。

采用方案:

Windows 主机 + WSL2 Ubuntu + LLaMA-Factory

1.启动wsl

mkdir -p /mnt/e/AI_Models
mkdir -p /mnt/e/AI_Models/models
mkdir -p /mnt/e/AI_Models/data
mkdir -p /mnt/e/AI_Models/output
mkdir -p /mnt/e/AI_Models/LLaMA-Factory
nvidia-smi
sudo apt update
wsl -u root
passwd ubuntu


sudo apt install -y python3-venv
python3 -m venv ~/llm-env
source ~/llm-env/bin/activate

python3 --version
pip install --upgrade pip setuptools wheel

pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121

# 确认显卡
python -c "import torch; print(torch.cuda.is_available()); print(torch.cuda.get_device_name(0))"

11111

git clone --depth 1 https://github.com/hiyouga/LlamaFactory.git /mnt/e/AI_Models/LLaMA-Factory
cd /mnt/e/AI_Models/LLaMA-Factory

pip install -e .
pip install -r requirements.txt
pip install -r requirements/metrics.txt

多开终端

wsl
cd /mnt/e/AI_Models/
source ~/llm-env/bin/activate

pip install -U "huggingface_hub[cli]"
hf download Qwen/Qwen2.5-1.5B-Instruct --local-dir /mnt/e/AI_Models/models/Qwen2.5-1.5B-Instruct

mkdir -p /mnt/e/AI_Models/hf_cache
export HF_HOME=/mnt/e/AI_Models/hf_cache


sudo apt update
sudo apt install -y openssh-server

111

vscode 安装Remote - WSL

在wsl终端所在项目目录中 code .

通用的模型:

项目部署模型微调:SFT + LoRA 实战记录(产品迭代)

继续训练Lora微调模型,分别是tiktok、amazon、shopee

1.shopee 风格:高性价比

项目部署模型微调:SFT + LoRA 实战记录(产品迭代)

2. tiktok风格:场景使用版

项目部署模型微调:SFT + LoRA 实战记录(产品迭代)

3.amazon风格:功能清晰版

项目部署模型微调:SFT + LoRA 实战记录(产品迭代)

采用 vllm 部署微调模型接口服务

source ~/llm-env/bin/activate

pip install vllm

运行全是错误

缺少c++、内存太小。。。,不过问题不大,问ai基本解决

项目部署模型微调:SFT + LoRA 实战记录(产品迭代)

多次尝试后:启动成功

vllm serve /mnt/e/AI_Models/export/default   --host 0.0.0.0   --port 8000   --served-model-name default   --gpu-memory-utilization 0.7   --max-model-len 1024

项目部署模型微调:SFT + LoRA 实战记录(产品迭代)

但是有个问题:我有四个lora模型,后台要启动4个太耗内存了,于是采用一个基座模型+lora 适配器的模型

  • 1 个 vLLM 服务
  • 1 个 base model
  • 4 个 LoRA adapter
vllm serve /mnt/e/AI_Models/export/Qwen2.5-1.5B-Instruct \
--port 8000 \
--served-model-name qwen-base \
--enable-lora \
--lora-modules \
shopee=/mnt/e/AI_Models/LLaMA-Factory/saves/Qwen2.5-1.5B-Instruct/lora/shopee \
amazon=/mnt/e/AI_Models/LLaMA-Factory/saves/Qwen2.5-1.5B-Instruct/lora/amazon \
tiktok=/mnt/e/AI_Models/LLaMA-Factory/saves/Qwen2.5-1.5B-Instruct/lora/tiktok \
default=/mnt/e/AI_Models/LLaMA-Factory/saves/Qwen2.5-1.5B-Instruct/lora/default \
--max-loras 4 \
--api-key EMPTY \
--generation-config vllm \
--gpu-memory-utilization 0.6 \
--max-model-len 1024 \
--max-num-seqs 1

ok,成功

测试vllm的适配器服务

from openai import OpenAI

client = OpenAI(
    base_url="http://127.0.0.1:8000/v1",
    api_key="EMPTY",
)

resp_amazon = client.chat.completions.create(
    model="amazon",
    messages=[
        {
            "role": "system",
            "content": "你是跨境电商商品文案助手。请根据输入信息输出严格JSON。"
        },
        {
            "role": "user",
            "content": """<SITE=amazon><LOCALE=中文><TASK=bundle_json>
{
  "category_path": "",
  "source_title": "垃圾桶 两侧 - 功能清晰款",
  "features": ["双侧设计", "家用", "收纳方便"]
}"""
        }
    ],
    temperature=0.1
)

resp_tiktok = client.chat.completions.create(
    model="tiktok",
    messages=[
        {
            "role": "system",
            "content": "你是跨境电商商品文案助手。请根据输入信息输出严格JSON。"
        },
        {
            "role": "user",
            "content": """<SITE=tiktok><LOCALE=中文><TASK=bundle_json>
{
  "category_path": "",
  "source_title": "垃圾桶 两侧 - 功能清晰款",
  "features": ["双侧设计", "家用", "收纳方便"]
}"""
        }
    ],
    temperature=0.1
)

resp_shopee = client.chat.completions.create(
    model="shopee",
    messages=[
        {
            "role": "system",
            "content": "你是跨境电商商品文案助手。请根据输入信息输出严格JSON。"
        },
        {
            "role": "user",
            "content": """<SITE=shopee><LOCALE=中文><TASK=bundle_json>
{
  "category_path": "",
  "source_title": "垃圾桶 两侧 - 功能清晰款",
  "features": ["双侧设计", "家用", "收纳方便"]
}"""
        }
    ],
    temperature=0.1
)
respones = {
    "amazon": resp_amazon,
    "tiktok": resp_tiktok,
    "shopee": resp_shopee
}

for name, item in respones.items():
    content = item.choices[0].message.content or ""

    print("\n" + "=" * 30)
    print(f"模型: {name}")
    print("=" * 30)
    print(content)
    print("-" * 30)

项目部署模型微调:SFT + LoRA 实战记录(产品迭代)

接下来在项目上数据库加字段,把原先的第二轮最后面的生成大模型换成根据site 分配路由 lora适配模型:

项目部署模型微调:SFT + LoRA 实战记录(产品迭代)

python3 -m venv ~/.venvs/litellm
source ~/.venvs/litellm/bin/activate
pip install -U "litellm[proxy]"

启动

litellm --config /mnt/f/AI_Models/DEMO/My_Demo/1.ai_list_generate/backend/litellm_config.yaml --host 0.0.0.0 --port 4000

 

 

- THE END -
最后修改:2026年4月22日
1

共有 0 条评论