为什么你的 PyTorch 这么大-再谈 PyTorch 与 CUDA

baba 发布于 2025-10-06 103 次阅读


想象以下这样一个场景:

你的导师(或者是 Boss )观看了国内AI三大顶刊的某篇报道,让你去验证某个貌似很新奇的 PyTorch 推理应用。你看着不足 10G 的硬盘空间瑟瑟发抖。你叹气到,看来有空要清理一下微信聊天记录了。殊不知,10 G 只是开始。

很幸运,由于你平时经常打游戏你的 NVIDIA Driver 版本一直保持最新,没错 NVIDIA Driver 版本是通用的,你可以同时用来打游戏或者是运行深度学习相关工作负载,游戏就是生产力!加上新版 CUDA 向后兼容行,你得以保留珍贵的硬盘空间。

torch-2.8.0%2Bcu128-cp312-cp312-manylinux_2_28_x86_64.whl (889.0 MB)
nvidia_cublas_cu12-12.8.4.1-py3-none-manylinux_2_27_x86_64.whl (594.3 MB)
nvidia_cudnn_cu12-9.10.2.21-py3-none-manylinux_2_27_x86_64.whl (706.8 MB)
nvidia_cufft_cu12-11.3.3.83-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (193.1 MB)
nvidia_cusolver_cu12-11.7.3.90-py3-none-manylinux_2_27_x86_64.whl (267.5 MB)
nvidia_cusparse_cu12-12.5.8.93-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (288.2 MB)
nvidia_cusparselt_cu12-0.7.1-py3-none-manylinux2014_x86_64.whl (287.2 MB)
nvidia_nccl_cu12-2.27.3-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (322.4 MB)
triton-3.4.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (155.6 MB)

最终你会得到 6.5G 的磁盘占用。(加上缓存还需要 6.5G + 6.5G +)要是该应用还需要编译某些算子,你还可能需要 g++ 编译器 加上一堆 CUDA 开发库(没错就是重新安装一次)。

为什么会这么大

首先我们要知道一些关键的概念。
Python 代码如何跑在 GPU 上?
Python -> PyTorch(python部分)->libtorch_cuda.so->cuda 二进制文件->NVIDIA Driver->你的显卡 这是最基本的方式,俗称 “eager mode”。
上面的 libtorch_cuda.socuda 二进制文件 是什么?
通俗来说 libtorch_cuda.so 是 PyTorch 中c++与cuda部分的代码编译之后的二进制文件。
cuda 二进制文件,指 PyTorch 的 cuda 部分依赖。
哪里大了?
libtorch_cuda.so(1.4G+) + cuda 二进制文件 (2G+)
这俩何得何能这么大?
本文的重点来了,里面存了为多代GPU分别构建的二进制文件。没错就是存了很多份,包含你用不上的型号。这是为了保证从各代GPU在安装了PyTorch 只有都能直接运行。cuda 二进制文件同理。详细可见 https://developer.nvidia.cn/cuda-gpus 。每一代都会构建,除非特别旧的显卡。这是通过 TORCH_CUDA_ARCH_LIST 环境变量在编译前设置的。

有没有优雅的解决方案???

答案是没有!!! 貌似也算不上优雅

自己构建法:

自己通过设置 "TORCH_CUDA_ARCH_LIST=自己显卡的计算能力" 构建自己的专属 pytorch 。甚至可以直接链接到 CUDA Toolkit 中已有的二进制文件。
问题是此方过于繁琐,而且需要下载 NVIDIA 的 CUDA 开发大礼包。而且构建内存需求大,构建时间长。建议在 Docker builder 中使用。最佳实践 https://github.com/vllm-project/vllm/blob/main/docker/Dockerfile

社区构建法:

简单来说就是 PyTorch 官方为每代显卡单独构建 wheel 。但这是不可能的。
我们来算算 PyTorch 官方每个晚上要构建多少 wheel 。
5个主要 Python,3个主要 cuda 版本,俩种架构,俩种系统,要是再加上 n 种架构。
60 x N+ 的构建成本是不可能接受的。

此作者没有提供个人介绍
最后更新于 2025-10-06