GitHub Action任务执行被终止问题求助:含pycaret库的Python数据采集项目异常退出
解决GitHub Actions中Python进程因内存不足被终止(Exit Code 137)的问题
看到你碰到的这个Exit Code 137报错,我太熟悉了——这根本不是超时问题,而是你的Python进程被系统的内存不足(OOM)杀手给强制干掉了!137这个码是128+9,其中9对应的是SIGKILL信号,一般都是系统在内存彻底耗尽的时候发出来的。结合你用了PyCaret这个机器学习库(本身训练模型、处理数据就很吃内存),再加上GitHub Actions标准ubuntu-latest runner默认只有约7GB内存,大概率就是内存不够用了。下面给你一步步排查和解决:
一、先实锤内存耗尽的问题
你可以在GitHub Action的 workflow 里加几个监控步骤,直观看到内存使用情况:
jobs: data-collection: runs-on: ubuntu-latest steps: # ... 你的checkout、安装依赖等步骤 - name: 查看初始内存状态 run: free -h - name: 运行脚本并实时监控内存 run: | python main.py & PID=$! # 每30秒输出一次内存使用,直到脚本结束 while kill -0 $PID 2>/dev/null; do free -h sleep 30 done - name: 检查系统OOM日志(仅在脚本失败时执行) if: failure() run: dmesg | grep -i oom
如果运行后看到内存使用率持续飙升到接近100%,或者dmesg输出里有Out of memory相关的记录,就坐实了是内存不足的问题。
二、从PyCaret代码入手减内存
这是最直接的优化方向,针对PyCaret的特性调整:
- 缩小数据集规模:如果你的数据集很大,先采样一部分用来训练模型,不用全量数据:
import pandas as pd # 取50%的样本(可根据情况调整比例) df = pd.read_csv("your_data.csv").sample(frac=0.5, random_state=42) - 限制模型训练范围:PyCaret默认会训练十几个模型并做性能对比,你可以指定只练几个轻量级的,避免内存过载:
from pycaret.classification import compare_models # 只训练逻辑回归、决策树这类内存友好的模型 best_model = compare_models(include=['lr', 'dt']) - 关闭并行计算:PyCaret很多操作默认用多线程/多进程,会大幅增加内存占用,你可以设置
n_jobs=1关闭并行:best_model = compare_models(include=['lr', 'dt'], n_jobs=1) - 手动清理内存:在代码里定期删掉无用变量,触发垃圾回收:
import gc # 完成某个大任务后,及时清理 del large_dataframe gc.collect()
三、优化GitHub Actions环境
如果代码优化后还是不够,可以从环境层面调整:
- 用大内存Runner:GitHub Actions提供了付费的大内存Runner,比如
ubuntu-latest-xl(14GB内存)或ubuntu-latest-2xl(28GB内存),只需要修改runs-on字段:
注意:这个需要你的GitHub账号有付费计划,免费用户没法用。runs-on: ubuntu-latest-xl - 缓存依赖减少安装内存消耗:你的依赖安装要15分钟,可以用
actions/cache缓存pip的依赖包,减少重复安装的内存压力:- name: 缓存pip依赖 uses: actions/cache@v3 with: path: | ~/.cache/pip key: ${{ runner.os }}-pip-${{ hashFiles('requirements.txt') }} restore-keys: | ${{ runner.os }}-pip-
四、拆分任务降低单进程压力
如果你的脚本同时做数据采集和模型训练,可以把这两部分拆成两个独立的GitHub Actions Job:
- 第一个Job只做数据采集,把结果上传到GitHub Artifacts;
- 第二个Job下载采集到的数据,再进行PyCaret模型训练。
这样每个Job的内存占用会分开,避免单进程同时扛两个高内存任务。
内容的提问来源于stack exchange,提问作者Bored002
相关产品推荐
相关产品推荐

