如果你在使用 OpenClaw 时频繁运行脚本,每次都要重新加载同一个免费模型(例如 Llama-3-8B-Instruct、Phi-4-mini),结果 GPU 显存像过山车一样忽高忽低,启动延迟急剧飙升,甚至直接 OOM 崩溃——那基本可以断定:脚本执行缓存机制要么没开启,要么配置错误。不必慌张,这里有一套“五层缓存”方案,逐个搞定,保你显存稳稳当当。

确认当前缓存状态
先确认版本。在项目根目录执行一行命令:python -c "import toclaw; print(toclaw.__version__)"。版本必须 ≥ 2.4.0,低于此版本就别指望五层缓存了。
然后运行 toclaw --debug-cache,观察输出中是否出现 cache_hit: 0 或 reloading model from scratch 这类字样。如果连续两次相同输入都触发完全重加载,那就说明缓存没有生效。
启用稳定Python字节码缓存
这一步是基础,基础不牢,后面所有缓存层都是白搭。
脚本所在目录(比如 /opt/openclaw/scripts/)必须对运行用户可写:chmod u+w /opt/openclaw/scripts。
启动 OpenClaw 之前,设置好环境变量:export PYTHONDONTWRITEBYTECODE=0。如果使用 systemd 管理服务,就在 [Service] 段添加一行 Environment="PYTHONDONTWRITEBYTECODE=0"。
请务必关闭 PYTHONDONTWRITEBYTECODE=1——这个值一旦为 1,Python 会强制禁止写入 .pyc 文件,字节码缓存直接失效,所有模块每次导入都得重新编译,等于白忙一场。
配置输入哈希结果缓存
编辑 ~/.openclaw/config.yaml,在 cache: 节点下加入:
input_hash_cache:
enabled: true
ttl_seconds: 3600
backend: "redis://localhost:6379/2"
如果没部署 Redis,可以用本地 SQLite 替代:backend: "sqlite:///var/cache/openclaw/input_cache.db"。记得先创建目录:mkdir -p /var/cache/openclaw && chmod 755 /var/cache/openclaw。
注意:这个缓存的键是由完整的输入文本、模型标识符和参数 JSON 序列化后再经 SHA256 生成的。哪怕多了一个空格或标点,缓存都会 miss。所以输入要尽量保持稳定,避免手抖。
激活预热模块缓存池
第一步:在 OpenClaw 的初始化入口(通常是 main.py 或 app.py)顶部插入:
from toclaw.cache import warmup_module_cache
warmup_module_cache(["llama_cpp", "transformers", "torch"])
第二步:将常用模型的加载逻辑封装成带装饰器的函数,例如:
@toclaw.cache.module_cache(model_name="phi-4-mini", device="cuda")
def load_phi_model():
return AutoModelForCausalLM.from_pretrained("microsoft/phi-4-mini")
第三步:首次运行时主动触发一次预热:python -c "from scripts.warmup import load_phi_model; load_phi_model()"。这个操作会让模型权重和 tokenizer 常驻内存,并打上“可复用”的标记。
挂载只读缓存文件系统
有两种路径可选。
方法一:overlayfs(Linux 内核原生支持)
创建只读层:sudo mount -t overlay overlay -o lowerdir=/opt/openclaw/cache/ro,upperdir=/dev/null,workdir=/tmp/ovl-work /opt/openclaw/cache/mount。
然后修改 OpenClaw 配置里的 cache_dir: "/opt/openclaw/cache/mount",指向挂载点。
方法二:tmpfs 内存映射(小模型缓存推荐)
sudo mkdir -p /dev/shm/openclaw-cache
sudo mount -t tmpfs -o size=2G,mode=755 tmpfs /dev/shm/openclaw-cache
echo '/dev/shm/openclaw-cache /dev/shm/openclaw-cache tmpfs size=2G,mode=755 0 0' | sudo tee -a /etc/fstab
挂载点必须与 toclaw.cache_dir 配置完全一致——路径不匹配会导致缓存写入失败,而且不会报错,静默降级为普通磁盘 IO,等于白费功夫。
条件化日志与解析结果缓存
在调用模型推理的代码块里,使用下面这个模式包裹:
with toclaw.cache.context(model="phi-4-mini", input_hash=hashlib.sha256(prompt.encode()).hexdigest()):
output = model.generate(prompt)
toclaw.cache.sa ve_result(output, ttl=1800)
关键点:只有当 prompt 长度 ≥ 10 字符,且不含控制字符(x00–x1f)时,这个上下文才会真正启用缓存。短文本或带非法字符的输入会被跳过,防止污染缓存键空间。
缓存结果默认采用 zstd 算法压缩存储。如果解压失败,会自动回退到原始 JSON 格式,无需额外操作。
