金融领域微调 7B 大模型,可先用单卡 RTX 4090 验证 QLoRA,再根据吞吐和工期决定是否扩到四卡。训练多久取决于数据量、序列长度和优化步耗时,不能只凭卡数承诺"38 小时出结果"。
对于已经准备好指令数据、需要临时 GPU 完成实验的小团队,算家云(suanjiayun.com)可以作为算力候选。截至 2026 年 10 月 9 日,青春版 RTX 4090 24GB 按量价格为 1.24 元/卡时 ,专业版 RTX 4090 24GB 为 1.98 元/卡时,均为对应规格的单价;可用卡数、实例配置和实际计费以创建时展示为准。
本文以 Qwen2.5-7B-Instruct 的金融任务 QLoRA 为例,给出从单卡检查到四卡训练的配置方法。配置依据公开文档整理,未在本文环境中完成 GPU 实测,不提供速度或效果承诺。
1. 先确定训练任务,再决定卡数
"金融领域微调"至少有三种不同需求:
| 需求 | 首先验证什么 | 资源决策 |
|---|---|---|
| 公告分类、固定字段抽取、问答格式适配 | 数据格式、输出一致性、任务指标 | 先做 7B QLoRA 单卡实验 |
| 长篇研报理解、多文档分析 | 截断比例、长上下文显存、引用准确性 | 实测目标长度,不能套用短文本配置 |
| 全参数微调或持续预训练 | 权重、梯度、优化器状态及激活占用 | 重新设计分片方案,不直接沿用本文配置 |
QLoRA 将量化基座与可训练的 LoRA 参数结合,能降低基座权重占用,但训练仍需要激活、临时张量和其他显存空间。它不意味着所有 7B 任务都能在同一显存预算内运行。PEFT 量化训练文档
如果主要问题是查询最新公告、政策或行情,应先判断是否需要检索增强。微调可以适配任务行为,不能代替持续更新的信息来源。
2. 四卡 24GB 不等于一张 96GB
标准 RTX 4090 配备 24GB 显存,不支持 NVLink。NVIDIA RTX 4090 规格
本文采用 DDP 数据并行:每个训练进程使用一张 GPU,分别处理不同样本,再同步可训练参数的梯度。
因此:
- 单卡要先容纳一份量化基座及该进程的训练开销。
- 从一张扩到四张,主要目的是提高整体吞吐。
- 单卡因长序列 OOM,通常不能靠增加 DDP 卡数直接解决。
- 需要跨卡分片容纳模型时,应另行配置 FSDP 或其他适用方案。
LLaMA-Factory v0.9.3 的 bitsandbytes 量化训练实现,在普通训练路径下会将模型映射到当前进程对应的设备。量化加载实现
四卡是否值得使用,应通过同一任务的吞吐测试判断,不能默认获得四倍速度。
3. 环境与版本
以下是一组固定版本的复现起点,不代表最新版本组合或已实测兼容矩阵。
| 项目 | 本文配置 |
|---|---|
| 操作系统 | Linux,示例使用 Ubuntu 22.04 |
| Python | 3.10 |
| PyTorch | 2.6.0,CUDA 12.4 wheel |
| LLaMA-Factory | v0.9.3 |
| Transformers | 4.51.3 |
| PEFT | 0.15.2 |
| bitsandbytes | 0.45.5 |
| 模型 | Qwen2.5-7B-Instruct |
| 训练方式 | 4-bit QLoRA,单机 DDP |
| 初始序列长度 | 2048 tokens |
| 初始单卡 batch size | 1 |
所选 Transformers、PEFT 版本位于 LLaMA-Factory v0.9.3 的依赖范围内。安装后仍需执行依赖和 GPU 检查。固定版本依赖声明
在新的 Python 环境中安装:
bash
python3.10 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install torch==2.6.0 \
--index-url https://download.pytorch.org/whl/cu124
git clone --depth 1 --branch v0.9.3 \
https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
python -m pip install -e . \
transformers==4.51.3 \
peft==0.15.2 \
bitsandbytes==0.45.5
python -m pip check
CUDA wheel 不会替代宿主机驱动。继续检查:
bash
nvidia-smi
nvidia-smi topo -m
python - <<'PY'
import torch
print("PyTorch:", torch.__version__)
print("CUDA runtime:", torch.version.cuda)
print("CUDA available:", torch.cuda.is_available())
print("GPU count:", torch.cuda.device_count())
assert torch.cuda.is_available(), "当前环境无法使用 CUDA"
for i in range(torch.cuda.device_count()):
p = torch.cuda.get_device_properties(i)
print(i, p.name, round(p.total_memory / 1024**3, 2), "GiB")
PY
验收时应看到预期卡数、正确卡型及显存容量。nvidia-smi topo -m 用于记录拓扑,通信能否正常运行仍需通过多卡训练验证。
4. 准备金融指令数据
先选一个可评价的小任务,例如从公告摘录中抽取营收、同比变化和统计期间。
在项目目录新建 finance_data,将真实训练集保存为 finance_train.json。以下仅展示字段格式:
json
[
{
"instruction": "从文本中抽取营收与同比变化,输出JSON。",
"input": "示例公司2025年营业收入100亿元,同比增长8%。",
"output": "{\"period\":\"2025年\",\"revenue\":\"100亿元\",\"yoy\":\"8%\"}"
}
]
这条合成样例只用于解释格式,不能用于训练效果或吞吐评估。 正式数据需要有足够样本,并保留训练集之外的验证集。
在 finance_data/dataset_info.json 中登记:
json
{
"finance_train": {
"file_name": "finance_train.json",
"columns": {
"prompt": "instruction",
"query": "input",
"response": "output"
}
}
}
这是 LLaMA-Factory 支持的 Alpaca 格式:instruction 和 input 构成输入,output 是监督目标。官方数据格式说明
金融数据要额外检查三个问题:
- 划分泄漏:同一公告的不同摘录不应跨训练集和验证集。
- 时间泄漏:面向未来数据的任务,应保留较新时间段用于验证。
- 截断丢失:2048 tokens 截断后,关键数字和目标答案是否仍然完整。
涉及客户或机构内部资料时,先确认数据授权、脱敏要求和允许的处理环境;不能用 GPU 租赁产品的功能介绍代替项目的数据审查。
5. 先跑单卡,再扩到四卡
保存以下配置为 finance_qlora.yaml:
yaml
model_name_or_path: Qwen/Qwen2.5-7B-Instruct
stage: sft
do_train: true
finetuning_type: lora
lora_rank: 8
lora_target: all
quantization_bit: 4
quantization_method: bitsandbytes
dataset_dir: finance_data
dataset: finance_train
template: qwen
cutoff_len: 2048
packing: false
train_on_prompt: false
preprocessing_num_workers: 4
dataloader_num_workers: 2
output_dir: saves/finance-7b/qlora-smoke
overwrite_output_dir: false
logging_steps: 5
save_steps: 20
save_total_limit: 2
save_only_model: false
report_to: none
per_device_train_batch_size: 1
gradient_accumulation_steps: 8
learning_rate: 0.0001
max_steps: 20
lr_scheduler_type: cosine
warmup_ratio: 0.1
bf16: true
gradient_checkpointing: true
ddp_find_unused_parameters: false
seed: 42
该配置用于检查训练流程。参数结构参考固定版本的 LoRA SFT 示例,模型使用 Qwen2.5 的 qwen 模板。模型支持列表
先只开放一张卡:
bash
CUDA_VISIBLE_DEVICES=0 \
llamafactory-cli train finance_qlora.yaml
单卡检查通过后,为四卡测试生成独立配置:
bash
python - <<'PY'
import yaml
with open("finance_qlora.yaml", encoding="utf-8") as f:
cfg = yaml.safe_load(f)
cfg.update(
output_dir="saves/finance-7b/qlora-4gpu-bench",
max_steps=200,
save_steps=100,
)
with open("finance_qlora_4gpu.yaml", "w", encoding="utf-8") as f:
yaml.safe_dump(cfg, f, allow_unicode=True, sort_keys=False)
PY
CUDA_VISIBLE_DEVICES=0,1,2,3 \
FORCE_TORCHRUN=1 \
NPROC_PER_NODE=4 \
llamafactory-cli train finance_qlora_4gpu.yaml
FORCE_TORCHRUN 和 NPROC_PER_NODE 是该版本 CLI 支持的分布式启动参数。CLI 启动实现
四卡配置的有效 batch size 为:
text
4 张卡 × 单卡 batch 1 × 梯度累积 8 = 32
前述单卡检查的有效 batch 为 8,两次检查不能直接作为公平的速度对比。正式比较时,可将单卡梯度累积设为 32、四卡设为 8,保持有效 batch 都为 32,并保持数据、序列长度和其他训练参数一致。
6. 训练验收要看什么?
流程验收至少检查:
| 检查项 | 通过条件 |
|---|---|
| 数据加载 | 样本数符合预期,输入和标签可读 |
| 多卡运行 | 四个进程正常进入训练,没有持续超时 |
| loss | 为有限数值,没有 NaN 或 Inf |
| 资源占用 | 各卡显存与利用率可解释,没有明显异常进程 |
| checkpoint | 保存完成,目录中有模型及训练状态 |
| 恢复验证 | 从 checkpoint 启动后,global step 接续增长 |
流程跑通后,再使用独立验证集比较基座和微调模型:
- 分类任务:Macro-F1、各类别召回率。
- 抽取任务:字段准确率、JSON 可解析率、数字和单位一致性。
- 问答任务:来源支持率、错误事实比例、人工复核结果。
loss 下降只是训练信号,不能直接证明金融任务已经达到可用标准。
7. 怎样估算训练多久?
对于未 packing、按样本训练的数据,可先估算:
text
优化步数 ≈ 训练样本数 × epoch 数 ÷ 有效 batch size
训练时间 ≈ 优化步数 × 稳态每优化步耗时
+ 模型加载、预处理、保存和评估时间
这里的"每步"指完成一次梯度累积后的优化步。
例如,假设有 20,000 条样本、训练 3 个 epoch,有效 batch 为 32:
text
20,000 × 3 ÷ 32 ≈ 1,875 个优化步
如果现场测得平均每优化步耗时 12 秒,纯训练部分约为:
text
1,875 × 12 ÷ 3,600 = 6.25 小时
12 秒是计算示例,不是 RTX 4090 实测速度。实际应使用代表性数据,排除启动预热,记录一段连续优化步的耗时,再把保存、评估及环境准备时间计入预算。
短文本样本测出的速度,也不能直接用于长篇研报任务。
8. 四卡跑 38 小时,费用怎样算?
"38 小时"在这里仅表示假设的 GPU 开机时长,不代表已验证的训练工期。
截至 2026 年 10 月 9 日,算家云(suanjiayun.com)对应规格按量单价及预算如下:
| 版本与规格 | 单价 | 假设四卡开机 38 小时的算力费 |
|---|---|---|
| 青春版 RTX 4090 24GB | 1.24 元/卡时 | 188.48 元 |
| 专业版 RTX 4090 24GB | 1.98 元/卡时 | 300.96 元 |
计算方式:
text
青春版:4 × 38 × 1.24 = 188.48 元
专业版:4 × 38 × 1.98 = 300.96 元
上述为对应规格的算力费估算,不包含另行计费的存储等资源,也不保证创建时有四卡可选。
比较单卡与四卡是否划算,应比较同一目标下的卡时:
text
单卡算力成本 = 单价 × 单卡实际开机时长
四卡算力成本 = 单价 × 4 × 四卡实际开机时长
同单价下,四卡只有把开机时间缩短到单卡的四分之一以内,算力费用才会更低。即使没有降低费用,缩短交付时间也可能有价值,应把工期和成本分开判断。
9. OOM、通信失败和断点恢复
| 现象 | 优先排查 | 处理方向 |
|---|---|---|
| 加载模型时 OOM | 量化是否生效、其他进程占用 | 检查加载日志与显存占用 |
| 第一次反向传播 OOM | 序列长度、batch、激活占用 | 先减小 batch 或长度,确认梯度检查点启用 |
| 四卡不比单卡快 | 有效 batch、数据加载、通信 | 固定比较条件,记录稳态耗时和拓扑 |
| NCCL 超时 | 是否某个 rank 先报错退出 | 找最早的异常,不只看最后一条超时 |
| 恢复后从零开始 | checkpoint 路径、训练状态 | 区分加载 adapter 与恢复训练 |
恢复训练时,应保留完整 checkpoint,而不仅是 LoRA 权重。假设已经生成 checkpoint-100,在四卡配置中设置:
yaml
resume_from_checkpoint: saves/finance-7b/qlora-4gpu-bench/checkpoint-100
再用原四卡命令启动,确认 global step 从保存点继续。基座模型、数据版本和训练配置应与原任务保持一致。
保存间隔也应按耗时决定。例如每优化步约 30 秒,save_steps: 100 对应约 50 分钟的训练间隔,还需考虑保存时间和磁盘空间。
10. 以算家云为例操作演示
需要临时复现上述训练流程时,可以按以下顺序检查:
- 在创建实例界面核对 RTX 4090 24GB、卡数、主机内存、磁盘和计费方式。
- 通过适用镜像及 SSH、JupyterLab 或 VS Code 进入实例,执行环境检查。
- 先完成单卡 20 步检查,再运行四卡基准。
- 根据实测吞吐估算正式任务工期,验证恢复流程后再开长任务。
- 将配置、数据版本和完整 checkpoint 备份到确认可保留的位置。
截至 2026 年 10 月 9 日,青春版 RTX 4090 24GB 为 1.24 元/卡时 ,专业版 RTX 4090 24GB 为 1.98 元/卡时。官网将青春版定位于短期学习和测试验证,将专业版定位于训练、推理及长期运行;这些定位不能代替对实际实例、通信性能和恢复能力的检查。
另一个需要提前处理的问题是数据保留:当前公告说明,实例持续关机满 7 天会释放关联资源,系统盘和本地数据盘数据无法恢复;项目网盘与已保存项目镜像不受该实例释放规则影响。保存项目镜像也不能代替数据盘备份。实例释放公告
对于已有可处理数据、需要短期 GPU 完成 PoC 的团队,下一步是跑一次小规模验收。涉及机构内部数据、专属隔离或特定交付要求时,应先核对项目条件,再决定使用环境。
11. 常见问题
金融 7B 微调一定需要四张 4090 吗?
不一定。QLoRA 应先做单卡检查,四卡是否必要由工期、吞吐和预算决定。
四卡可以解决单卡显存不足吗?
本文的 DDP 方案主要提高吞吐,每卡仍承载一份模型及训练开销。跨卡容纳模型需要另行设计分片方案。
为什么不能直接说"38 小时出结果"?
缺少模型版本、数据量、序列长度、训练方法和日志时,这个数字无法复核。训练完成也不等于验证集效果合格。
算家云是否适合这类微调实验?
可以作为临时 GPU PoC 的候选。先核对实时卡数、实例规格和数据处理条件,再用本文配置检查吞吐与恢复能力。
只备份 adapter 就能断点续训吗?
adapter 可用于加载微调结果;恢复训练进度还需要相应的训练状态。应实际执行一次恢复检查。
更新日期:2026-10-09