👉 项目官网:https://www.python-office.com/ 👈
👉 本开源项目的交流群 👈
大家好,这里是程序员晚枫,全网同名。
开场 30 秒
“一个 import torch
直接让可执行文件膨胀到 1 GB?”
本讲 20 分钟,教你用 4 把手术刀:排除、裁剪、替换、延迟加载,把常见 DS 栈瘦身 70 % 以上,并给出一套可复制粘贴的 .spec
模板。
7.1 体积元凶排行榜(先认清敌人)
包 | 裸体积 | 主要肥肉 | 可裁剪 % |
---|---|---|---|
PyTorch (GPU) | 1.2 GB | CUDA 库、MKL、debug symbols | 70 % |
TensorFlow | 500 MB | XLA、protobuf、avx512 指令 | 60 % |
Pandas | 100 MB | 测试集、compat、json table | 40 % |
scikit-learn | 30 MB | tests、doc、未用算法 | 30 % |
Numpy | 20 MB | tests、f2py、docs | 20 % |
7.2 手术刀 1:exclude-module(2 min)
.spec 片段
1 | a = Analysis( |
经验:用 --collect-submodules torch
打印子包,按需剔除。
7.3 手术刀 2:替换轻量轮子(3 min)
场景 | 原包 | 轻量替代 | 体积差 |
---|---|---|---|
纯 CPU 推理 | torch | torch-cpu (pip install torch==2.1.0+cpu) | -800 MB |
矩阵计算 | numpy+mkl | numpy+openblas | -15 MB |
数据读写 | pandas | polars / pyarrow | -50 % |
序列化 | joblib | pickle5 / orjson | -5 MB |
requirements-build.txt
示例
1 | --extra-index-url https://download.pytorch.org/whl/cpu |
7.4 手术刀 3:按需动态加载(延迟加载)
思路:把可选算法包放在子进程或插件目录,主程序启动后再 importlib.import_module
。
.spec 仅打包主链路,插件目录用 --add-data
带过去,启动时按需 pip install --no-deps --target plugins/
。
7.5 手术刀 4:strip & UPX 组合(2 min)
.spec 片段
1 | exe = EXE( |
实测 Linux 可再减 20 %。
7.6 实战:PyTorch CPU + Pandas CLI 打包全过程(8 min)
环境
1
2python -m venv venv && source venv/bin/activate
pip install -r requirements-build.txt主程序(极简推理脚本)
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)检查子模块(防止误杀)
1
python -c "import torch, pkgutil; print([m for m in pkgutil.iter_modules(torch.__path__)])"
.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'],
)打包
1
pyinstaller predict.spec
结果:
- 原 PyTorch GPU 1.2 GB → 最终单文件 145 MB
- 运行验证
1
./dist/PredictCLI sample.csv # 输出 out.csv
7.7 进阶:TorchScript + 删减算子(可选)
如果只用 10 个算子,可
1 | import torch.utils.bundled_inputs |
编译时裁剪未用算子,可再减 30 %。此步骤需 C++ 环境,留作彩蛋。
7.8 常见错误速查
错误 | 原因 | 解决 |
---|---|---|
Illegal instruction (core dumped) |
CPU 指令集不匹配 | 用 torch-cpu 或 --cpu-baseline=avx2 |
libgomp.so.1: cannot open shared object file |
缺失 OpenMP | Linux 打包时 --add-binary "/usr/lib/x86_64-linux-gnu/libgomp.so.1:." |
Windows 报 numpy.core._exceptions._ArrayMemoryError |
32 位 Python | 强制 64 位解释器 |
小结 & 作业(30 秒)
• 4 把刀:exclude、替换、延迟、strip+UPX
• 提供可复制的 .spec
模板,实测 145 MB 完成 PyTorch 推理
• 作业:把你的训练脚本按本讲思路瘦身,下节课《第八讲:CI/CD 跨平台打包》一键推送到 GitHub Release。
大家在学习课程中有任何问题,欢迎+微信和我交流👉我的联系方式:微信、读者群、1对1、福利