👉 项目官网:https://www.python-office.com/ 👈

👉 本开源项目的交流群 👈

github star gitee star atomgit star

AI编程 AI交流群

大家好,这里是程序员晚枫,正在all in AI编程实战,全网同名。


开场 30 秒
“一个 import torch 直接让可执行文件膨胀到 1 GB?”
本讲 20 分钟,教你用 4 把手术刀:排除、裁剪、替换、延迟加载,把常见 DS 栈瘦身 70 % 以上,并给出一套可复制粘贴的 .spec 模板。


7.1 体积元凶排行榜(先认清敌人)

裸体积主要肥肉可裁剪 %
PyTorch (GPU)1.2 GBCUDA 库、MKL、debug symbols70 %
TensorFlow500 MBXLA、protobuf、avx512 指令60 %
Pandas100 MB测试集、compat、json table40 %
scikit-learn30 MBtests、doc、未用算法30 %
Numpy20 MBtests、f2py、docs20 %

7.2 手术刀 1:exclude-module(2 min)

.spec 片段

1
2
3
4
5
6
7
8
a = Analysis(
...
excludes=[
'matplotlib', 'seaborn', # 如果只是 CLI
'sklearn.tests', 'pandas.tests', # 测试文件
'torch.cuda', 'torch.distributions', # 用不到的子包
],
)

经验:用 --collect-submodules torch 打印子包,按需剔除。


7.3 手术刀 2:替换轻量轮子(3 min)

场景原包轻量替代体积差
纯 CPU 推理torchtorch-cpu (pip install torch==2.1.0+cpu)-800 MB
矩阵计算numpy+mklnumpy+openblas-15 MB
数据读写pandaspolars / pyarrow-50 %
序列化joblibpickle5 / orjson-5 MB

requirements-build.txt 示例

1
2
3
4
--extra-index-url https://download.pytorch.org/whl/cpu
torch==2.1.0+cpu
numpy==1.25.2
polars==0.19

7.4 手术刀 3:按需动态加载(延迟加载)

思路:把可选算法包放在子进程或插件目录,主程序启动后再 importlib.import_module
.spec 仅打包主链路,插件目录用 --add-data 带过去,启动时按需 pip install --no-deps --target plugins/


7.5 手术刀 4:strip & UPX 组合(2 min)

.spec 片段

1
2
3
4
5
6
7
8
9
exe = EXE(
...
strip=True, # 去掉符号表(Linux/macOS)
upx=True,
upx_exclude=[
'libtorch.so', # 压缩后偶发 SIGILL
'libiomp5.so',
],
)

实测 Linux 可再减 20 %。


7.6 实战:PyTorch CPU + Pandas CLI 打包全过程(8 min)

  1. 环境

    1
    2
    python -m venv venv && source venv/bin/activate
    pip install -r requirements-build.txt
  2. 主程序(极简推理脚本)

    1
    2
    3
    4
    5
    6
    # predict.py
    import torch, pandas as pd, sys, pathlib
    model = torch.jit.load('model.pt')
    df = pd.read_csv(sys.argv[1])
    pred = model(torch.tensor(df.values)).numpy()
    pd.DataFrame(pred).to_csv('out.csv', index=False)
  3. 检查子模块(防止误杀)

    1
    python -c "import torch, pkgutil; print([m for m in pkgutil.iter_modules(torch.__path__)])"
  4. .spec 模板

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    # -*- mode: python -*-
    import pathlib
    SRC = pathlib.Path('.').resolve()

    a = Analysis(
    ['predict.py'],
    pathex=[SRC],
    binaries=[],
    datas=[('model.pt', '.')],
    hiddenimports=['torch.jit'],
    excludes=[
    'torch.cuda',
    'torch.distributions',
    'torch.testing',
    'pandas.tests',
    ],
    )

    pyz = PYZ(a.pure, a.zipped_data)

    exe = EXE(
    pyz, a.scripts, a.binaries, a.zipfiles, a.datas,
    name='PredictCLI',
    debug=False,
    console=True,
    strip=True,
    upx=True,
    upx_exclude=['libtorch.so'],
    )
  5. 打包

    1
    pyinstaller predict.spec

    结果:

  • 原 PyTorch GPU 1.2 GB → 最终单文件 145 MB
  • 运行验证
    1
    ./dist/PredictCLI sample.csv   # 输出 out.csv

7.7 进阶:TorchScript + 删减算子(可选)

如果只用 10 个算子,可

1
2
import torch.utils.bundled_inputs
torch.utils.bundled_inputs.bundle_inputs(...)

编译时裁剪未用算子,可再减 30 %。此步骤需 C++ 环境,留作彩蛋。


7.8 常见错误速查

错误原因解决
Illegal instruction (core dumped)CPU 指令集不匹配torch-cpu--cpu-baseline=avx2
libgomp.so.1: cannot open shared object file缺失 OpenMPLinux 打包时 --add-binary "/usr/lib/x86_64-linux-gnu/libgomp.so.1:."
Windows 报 numpy.core._exceptions._ArrayMemoryError32 位 Python强制 64 位解释器

小结 & 作业(30 秒)

• 4 把刀:exclude、替换、延迟、strip+UPX
• 提供可复制的 .spec 模板,实测 145 MB 完成 PyTorch 推理
• 作业:把你的训练脚本按本讲思路瘦身,下节课《第八讲:CI/CD 跨平台打包》一键推送到 GitHub Release。


大家在学习课程中有任何问题,欢迎+微信和我交流👉我的联系方式:微信、读者群、1对1、福利

扫一扫,领红包

美团红包

程序员晚枫专注AI编程培训,小白看完他和图灵社区合作的教程《30讲 · AI编程训练营》就能上手做AI项目。

🎓 AI 编程实战课程

想系统学习 AI 编程?程序员晚枫的 AI 编程实战课 帮你从零上手!