##大模型
使用的大模型是:Qwen3-8B.
理论上qwen3系列应该都是通用的
##训练集格式
json
{"messages": [{"role": "system", "content": "这里是系统提示词"}, {"role": "user", "content": "## xxx文本\n这里是用户文本\n\n请根据上述文本,判断xxx。"}, {"role": "assistant", "content": "分类任务,一定要包含reason,推理理由"}]}
##测试集格式
正确情况在制作训练集后,按照9:1比例分割就可以得到测试集。
但是qwen3大模型,LlamaFactory框架无法直接使用上述的格式进行推理。需要转换为如下格式进行推理:
json
{"instruction":"## xxx文本\n这里是用户文本\n\n请根据上述文本,判断xxx。","system":"这里是系统提示词"}
说明:
instruction对应的就是训练集格式中的user的content内容- 上个这个格式是扒
LlamaFactory源码得到的,否则无法进行有效推理。
##训练脚本
shell
#!/bin/bash
set +x
# ============================================================
# 执行命令(复制即用)
# ============================================================
# bash sft_lora_qwen3_8b_v9.sh
# ============================================================
# 模型:Qwen3-8B(dense,非 MoE)
workdir=$(cd $(dirname $0); pwd)
source $workdir/../../../scripts/config.sh
source $workdir/../../common.sh
# === 业务专属:星云任务名 ===
JOB_NAME="xxx_qwen3_8b_rebalanced_v9"
WORLD_SIZE=1
# === 模型与模板 ===
PROMPT_TEMPLATE="qwen3_nothink"
MODEL_NAME="Qwen/Qwen3-8B"
# === LoRA 产出地址 ===
SAVE_MODEL="xxx_qwen3_8b/version=rebalanced_v9"
# === 数据集 ===
# rebalanced_v7:在 V7(v5) 基础上追加 supplement_v5 困难样本(184条,8x变体)
# 总计 2822 条,困难样本比例进一步提升
# 上传命令:
# ossutil cp data_process/train/商家未营业/shop_not_open_train_rebalanced_v7.jsonl \
# oss://woos-service-zbprod-zb1-oss-1/sgy/dataset/shop_not_open/train/
INPUT="xxx_train_rebalanced_v7.jsonl"
LR=5e-6
# ============================================================
# 超参数设计依据(v9 继续追加困难样本)
# ============================================================
# 数据:2822 条(基于 V7 的 2638 条 + supplement_v5 184 条困难样本)
#
# V7 结果(最佳 checkpoint-400):
# - 大分类准确率 92.6%,完整匹配 91.7%
# - 已打烊 F1=0.950,非打烊 F1=0.870
# - 困难样本(优先级冲突 case)仍有部分未学会
#
# V8 结果(下采样策略,已失败):
# - 准确率降至 89.0%,下采样导致已打烊学习不足 + 过拟合
#
# V9 策略:
# - 回归 V7 完整数据基础,追加新一轮困难样本变体
# - 超参完全沿用 V7(LR=5e-6, QKVO, rank=16)
# - effective_batch=16:per_device_batch=4 × accum=4 × world_size=1
# - 2822 样本 + eff_batch=16 → ~176 步/epoch
# - max_steps=500 → 约 2.84 epochs
# ============================================================
args="--stage=sft \
--model_name_or_path=$MODEL_NAME \
--do_train \
--file_name=$INPUT \
--messages=messages \
--role_tag=role \
--content_tag=content \
--user_tag=user \
--assistant_tag=assistant \
--system_tag=system \
--template=$PROMPT_TEMPLATE \
--finetuning_type=lora \
--lora_rank=16 \
--lora_target=q_proj,k_proj,v_proj,o_proj \
--output_dir=local/tmp/ckpt_save_path/ \
--overwrite_cache \
--per_device_train_batch_size=4 \
--gradient_accumulation_steps=4 \
--lr_scheduler_type=cosine \
--warmup_ratio=0.1 \
--weight_decay=0.02 \
--logging_steps=10 \
--save_steps=100 \
--max_steps=500 \
--learning_rate=$LR \
--cutoff_len=8192 \
--preprocessing_num_workers=8 \
--dataloader_num_workers=4 \
--plot_loss \
--report_to=ml_tracker \
--bf16 \
--gradient_checkpointing=false"
if [ -n "${LORA_CKPT}" ]; then
args="${args} --adapter_name_or_path=${LORA_CKPT}"
fi
说明:
- 并非完整脚本,只列举了训练超参数;
- 一开始只有
--lora_target=q_proj,v_proj,后来需要学习困难样本的时候,增加了k_proj和o_proj,所以就变成了--lora_target=q_proj,k_proj,v_proj,o_proj。
##推理脚本
shell
#!/bin/bash
set +x
# ============================================================
# 执行命令(复制即用)------ 多个 checkpoint 可并行提交
# ============================================================
# VERSION=rebalanced_v9 CKPT_ID=checkpoint-100 bash inference_qwen3_8b_v9.sh
# VERSION=rebalanced_v9 CKPT_ID=checkpoint-200 bash inference_qwen3_8b_v9.sh
# VERSION=rebalanced_v9 CKPT_ID=checkpoint-300 bash inference_qwen3_8b_v9.sh
# VERSION=rebalanced_v9 CKPT_ID=checkpoint-400 bash inference_qwen3_8b_v9.sh
# VERSION=rebalanced_v9 CKPT_ID=checkpoint-500 bash inference_qwen3_8b_v9.sh
# ============================================================
# 分类推理 ------ Qwen3-8B + LoRA)
workdir=$(cd $(dirname $0); pwd)
source $workdir/../../../scripts/config.sh
source $workdir/../../common.sh
# === 要推理的版本与 checkpoint ===
VERSION="${VERSION:-rebalanced_v9}"
CKPT_ID="${CKPT_ID:-checkpoint-300}"
# 星云任务名
JOB_NAME="xxx_qwen3_8b_${VERSION}_${CKPT_ID}"
WORLD_SIZE=1
# === 模型配置 ===
# 推理必须用 qwen3(ReasoningTemplate),配合 --enable_thinking=false
# qwen3 + enable_thinking=false 会在 prompt 末尾注入空 <think></think> 块
# 从而在 token 级别阻止模型输出思考内容,确保直接输出 JSON 结果
# qwen3_nothink 是普通 Template,enable_thinking 参数对它无效
PROMPT_TEMPLATE="qwen3"
MODEL_NAME="Qwen/Qwen3-8B"
LORA_CKPT="xxx_qwen3_8b/version=${VERSION}/ckpt_id=${CKPT_ID}"
BATCH_SIZE=1
# === 数据 ===
INPUT="xxx_test_simplified_corrected_v3_flat.jsonl"
OUTPUT="xxx_result_Qwen3-8B_${CKPT_ID}.jsonl"
PROMPT_COLUMN="instruction"
SYSTEM_COLUMN="system"
INPUT_COLUMNS="instruction,system"
# === 推理引擎配置 ===
GENERATE_MODE="vllm-async"
TENSOR_PARALLEL_SIZE=1
args="--model_name_or_path=$MODEL_NAME \
--batch_size=$BATCH_SIZE \
--template=$PROMPT_TEMPLATE \
--enable_thinking=false \
--load_from=file \
--temperature=0.7 \
--top_p=0.8 \
--top_k=100 \
--seed=1 \
--cutoff_len=8192 \
--max_new_tokens=512 \
--infer_mode=$GENERATE_MODE \
--tensor_parallel_size=$TENSOR_PARALLEL_SIZE \
--max_model_len=8192 \
--gpu_memory_utilization=0.9 \
--max_seq_len_to_capture=4096 \
--inputs=$INPUT \
--outputs=$OUTPUT \
--prompt_column=$PROMPT_COLUMN \
--system_column=$SYSTEM_COLUMN \
--input_columns=$INPUT_COLUMNS"
if [ -n "${LORA_CKPT}" ]; then
args="$args --adapter_name_or_path=$LORA_CKPT"
fi
说明:
- 只列举了推理的超参数,并不是完整脚本
- 因为
LlamaFactory框架推理参数并不能指定messages,只能指定prompt_column、system_column和input_columns,这就是为什么直接分割训练集得到的测试集无法使用的原因,而是需要将messages平铺开来。