LLaMA-Factory 保存 checkpoint 时崩溃解决办法 OOM 内存溢出(不是显存)

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
  • Swap0B(完全未启用)

建议先执行创建 Swap 的命令,然后用 free -hswapon --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 设为 500MB1GB,减少单次保存压力
🟢 低 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 保存小分片
    • 使用 deepspeedoffload 减少内存占用

情况三:权限不足(非 root)

bash 复制代码
# 确认是否有 sudo 权限
sudo -l | grep swapon

如果没有输出,说明当前用户没有 swapon 权限,需要 root 用户操作。


你现在该怎么做?

  1. 先执行上面的诊断命令,确认环境类型
  2. 如果是在 Docker 内:去宿主机创建 Swap,容器会自动使用
  3. 如果是受限 VPS :Swap 这条路走不通,重点用 max_shard_size 和减少内存占用的方法

你可以把诊断命令的输出贴出来,我帮你进一步判断。

相关推荐
YaBingSec1 小时前
玄机网络安全靶场:GeoServer XXE 任意文件读取(CVE-2025-58360)
java·运维·网络·安全·web安全·tomcat·ssh
小程故事多_801 小时前
DeepSeek-V4技术报告全解读 从架构到Infra的全栈重构之路
人工智能·重构·架构·智能体
数智工坊1 小时前
【VarifocalNet(VFNet)论文阅读】:IoU-aware稠密目标检测,把定位质量塞进分类得分
论文阅读·人工智能·深度学习·目标检测·计算机视觉·分类·cnn
一休哥助手1 小时前
2026年4月28日人工智能早间新闻
人工智能
学习论之费曼学习法1 小时前
AI 入门 30 天挑战 - Day 20 费曼学习法版 - 语音识别基础
人工智能·学习·语音识别
REDcker1 小时前
Webpack Rollup Vite三者构建对比详解 开发体验与选型考量
运维·webpack·devops
lulu12165440781 小时前
国内怎么用GPT5.5?基于weelinking零门槛合规接入GPT5.5全系列生产级能力
java·人工智能·python·gpt·ai编程
北极熊kw1 小时前
FreeBSD 安装 Xrdp 后,远程桌面时只显示白色终端 Xterm
linux·运维·服务器·rdp·freebsd·xterm
steven_yzx1 小时前
Fusion 分类和特点
人工智能·分类·数据挖掘