You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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字段:
    runs-on: ubuntu-latest-xl
    
    注意:这个需要你的GitHub账号有付费计划,免费用户没法用。
  • 缓存依赖减少安装内存消耗:你的依赖安装要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:

  1. 第一个Job只做数据采集,把结果上传到GitHub Artifacts;
  2. 第二个Job下载采集到的数据,再进行PyCaret模型训练。
    这样每个Job的内存占用会分开,避免单进程同时扛两个高内存任务。

内容的提问来源于stack exchange,提问作者Bored002

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 06:52:41