LLaMA-Factory 保存 checkpoint 时崩溃解决办法 OOM 内存溢出(不是显存)。
llamafactory无法保存checkpoints 的临时办法
1 建立 Swap 有些云空间不支持
2 释放内存
llamafactory无法保存checkpoints 的一般办法
3 以后设置 max_shard_size
4 以后设置 dataloader_num_workers: 2或者0
1. 建立 Swap ------ ✅ 有效,但能"保命"不能"提速"
效果:可以防止保存时 OOM 崩溃,但速度极慢
- 保存 checkpoint 时需要将模型状态序列化到磁盘,这个过程会占用大量内存
- 当 RAM 不够时,系统会把部分数据换到 Swap,避免进程被 kill
- 代价:Swap 在硬盘上,读写速度比 RAM 慢 100~1000 倍,保存一个大模型 checkpoint 可能需要几十分钟甚至更久
- 建议:如果你只是临时跑一下、保存一个小模型,32GB Swap 可以应急;但如果模型很大,建议直接加 RAM
查看swap
查看 Swap 情况的常用命令如下:
1. 快速查看总体情况(最常用)
bash
free -h
输出示例:
total used free shared buff/cache available
Mem: 4.0Gi 483Mi 2.6Gi 17Mi 951Mi 3.5Gi
Swap: 0B 0B 0B
2. 查看 Swap 文件/分区的详细信息
bash
swapon --show
或简写:
bash
swapon -s
输出示例:
NAME TYPE SIZE USED PRIO
/swapfile file 32G 0B -2
3. 直接读取内核 Swap 信息
bash
cat /proc/swaps
输出示例:
Filename Type Size Used Priority
/swapfile file 33554428 0 -2
4. 查看内存和 Swap 使用比例(百分比)
bash
free -m | awk 'NR==2{printf "内存使用率: %.2f%%\n", $3*100/$2} NR==3{printf "Swap使用率: %.2f%%\n", $3*100/$2}'
5. 实时交互式查看(需安装)
bash
htop
然后按 F6 可以排序,Swap 信息在顶部显示。
6. 查看哪些进程在使用 Swap
bash
for file in /proc/*/status; do awk '/VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file; done | sort -k 2 -n -r | head -20
当前你的环境情况(刚才已查):
- 物理内存:4GB
- Swap :0B(完全未启用)
建议先执行创建 Swap 的命令,然后用 free -h 和 swapon --show 确认是否生效。
bash
# ============================================
# 使用硬盘交换区 (Swap)
# 如果物理内存(RAM)实在腾不出来,临时的办法是增加 Linux 的 Swap 空间。虽然慢,但能保命,防止保存时直接崩溃
# ============================================
sudo fallocate -l 32G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
2. 释放内存 ------ ⚠️ 效果有限
只能锦上添花,不能雪中送炭
echo 3 > /proc/sys/vm/drop_caches可以释放文件系统缓存,但通常只能腾出几百 MB- 关闭其他程序、清理显存(如果用 GPU)也能腾出一些空间
- 但对于 4GB RAM 跑 LLaMA-Factory 来说,杯水车薪
3. 设置 max_shard_size ------ ✅ 有效,推荐
效果:降低单次保存的内存峰值
-
默认可能是 5GB 或 10GB 一个分片,保存时会占用大量连续内存
-
设为较小的值(如
"500MB"或"1GB"),可以把一个大 checkpoint 拆成多个小文件依次保存 -
内存占用更平滑,不容易触发 OOM
-
在训练配置里添加:
yaml# 或在命令行加 --save_safetensors True --max_shard_size 500MB
4. 设置 dataloader_num_workers: 0 ------ ⚠️ 对保存 checkpoint 帮助不大
主要影响训练速度,对保存 checkpoint 时的内存问题改善有限
num_workers控制数据加载的并行进程数,设为 0 意味着在主进程里加载数据- 好处:减少多进程带来的内存开销(每个 worker 都会占用一部分 RAM)
- 坏处:数据加载变成瓶颈,GPU 可能空闲等待
- 对保存 checkpoint 的帮助:间接的,因为减少了训练期间的内存占用,留给保存操作的内存稍微多一点
实际建议(按优先级)
| 优先级 | 措施 | 说明 |
|---|---|---|
| 🔴 最高 | 加物理内存 | 4GB 跑 LLaMA-Factory 太极限了,建议至少 16GB,32GB 更稳妥 |
| 🟠 高 | 建立 Swap | 你列的命令是对的,32GB Swap 可以应急,先执行起来 |
| 🟡 中 | 设置 max_shard_size |
设为 500MB 或 1GB,减少单次保存压力 |
| 🟢 低 | dataloader_num_workers: 0 | 顺手设置,减少一点内存占用 |
| 🟢 低 | 释放缓存 | `sudo sync && echo 3 |
关于你的命令
你列的创建 Swap 的命令是正确的,在当前环境下强烈建议立即执行:
bash
sudo fallocate -l 32G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
执行后可以用 free -h 确认 Swap 已启用。
总结 :在 4GB RAM 的环境下,这些方法都是"权宜之计",Swap 能防止崩溃但会很慢,max_shard_size 是最有效的软件层面优化。如果经常训练大模型,升级硬件是根本解决办法。
这个错误说明当前环境没有权限启用 Swap ,最常见的原因是你在 Docker 容器 或某些受限的 VPS/云服务器(如 OpenVZ、LXC)中运行。
先诊断环境
请依次执行以下命令,确认你所在的环境:
bash
# 1. 检查是否在 Docker 容器内
ls -la /.dockerenv 2>/dev/null && echo "在 Docker 容器内" || echo "不在 Docker 容器内"
# 2. 检查容器类型
cat /proc/1/cgroup | head -5
# 3. 检查当前用户权限
whoami && id
# 4. 检查 swapon 的 capabilities
capsh --print 2>/dev/null | grep cap_sys_admin || echo "没有 cap_sys_admin 权限"
常见原因及解决办法
情况一:在 Docker 容器内运行 ⭐最常见
原因 :容器默认没有 CAP_SYS_ADMIN 权限,无法执行 swapon。
解决办法:
方案 A:停止容器,重新启动时加特权参数
bash
# 退出当前容器,在宿主机执行
docker run --privileged -it your_image_name
# 或
docker run --cap-add=SYS_ADMIN -it your_image_name
方案 B:在宿主机创建 Swap,容器内直接使用
在宿主机(你的物理机/云服务器)上执行:
bash
sudo fallocate -l 32G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
然后容器内会自动共享宿主机的 Swap(不需要在容器内再执行 swapon)。
情况二:在受限 VPS 上(OpenVZ / LXC)
原因:服务商限制了内核权限,用户无法自行管理 Swap。
验证:
bash
systemd-detect-virt 2>/dev/null || virt-what 2>/dev/null
解决办法:
- 联系服务商开通 Swap 权限
- 或升级套餐到 KVM 等完整虚拟化方案
- 如果服务商不允许,Swap 方案就不可行,只能考虑:
- 减小 batch size
- 使用
max_shard_size保存小分片 - 使用
deepspeed或offload减少内存占用
情况三:权限不足(非 root)
bash
# 确认是否有 sudo 权限
sudo -l | grep swapon
如果没有输出,说明当前用户没有 swapon 权限,需要 root 用户操作。
你现在该怎么做?
- 先执行上面的诊断命令,确认环境类型
- 如果是在 Docker 内:去宿主机创建 Swap,容器会自动使用
- 如果是受限 VPS :Swap 这条路走不通,重点用
max_shard_size和减少内存占用的方法
你可以把诊断命令的输出贴出来,我帮你进一步判断。