
如果你看到这个标题多半和我前段时间的状态差不多工作环境是Windows外网连不上或者网速极不稳定但项目又指明要用Pytorch得在本地完成离线安装。网上关于Pytorch安装的教程确实多但绝大多数是抱着联网环境写的一行 pip install torch 就完事到了没网的机器上完全跑不通。我花了一整天在这台Windows开发机上折腾中间踩了不少坑最后整理出几条靠谱的离线安装路径。这篇文章就把我完整的过程和踩坑经验写出来给同样被这个问题卡住的读者当个参考尤其是准备在无法访问外网的Windows环境里部署Pytorch的同学。Pytorch离线安装这件事难点不在安装本身而在怎么把对的东西提前准备好。很多人以为离线安装就是把whl文件拷过去 pip install 一下实际上版本不匹配、依赖缺失、GPU相关DLL加载失败这些问题往往在安装完成后才集中爆发。所以我这篇不打算只给命令而是把版本判断逻辑、依赖收集方法、避坑经验和验证手段串起来按我实际操作的顺序一步步讲。1. 先搞清楚你的离线属于哪种场景方案选错了后面全是坑1.1 离线安装的本质绝大部分Python库的安装都依赖PyPI仓库Pytorch也不例外。在线安装是一条链路pip从远程仓库拉取包自动解析依赖再逐个安装。离线安装的本质就是把这条链路拆成两段第一段在能联网的机器上把包和依赖全部下载好第二段把下载结果搬到目标机器上进行本地安装。听起来不复杂但Pytorch有个特殊的地方——它的安装包体积非常大GPU版本的wheel解压后动辄三四个GB而且它依赖的底层库比如numpy、pillow、sympy、networkx、jinja2、fsspec这些加起来也有不少。更麻烦的是Pytorch官方源和普通PyPI源上的包并不完全一致GPU版本还分cu118、cu121、cu124等不同CUDA编译版本。版本选错了轻则装上不能用重则直接DLL加载失败。1.2 三类典型场景和对应的路线我把离线安装的常见场景分成三类你可以对照自己属于哪一种完全内网隔离目标机器与外网完全隔绝最多只能插U盘拷贝文件。这种场景下最稳妥的方案是联网机器下载whl 离线pip安装或者conda-pack整环境迁移。半隔离状态目标机器无法访问外网但能访问公司内网的软件源比如内部搭建的PyPI镜像或conda镜像。这种场景最简单只需要把pip或conda的源地址指到内网镜像即可本质上和在线安装没区别。批量部署多台机器需要在比赛机房、多人团队或多台测试机上安装相同版本的环境。这种场景强烈建议用conda-pack把一套完整的环境打包复制到所有机器避免一台一台重复配置。我这次遇到的是第一种场景完全内网隔离所以下面重点讲两条路线pip whl离线安装和conda-pack整环境迁移。这两条路线在第二种场景下只要稍作调整就能用。1.3 pipwhl 与 conda-pack 两种路线的取舍先说结论如果只是在一台机器上装Pytorch选pipwhl就够了轻量、直接、便于管理如果是多台机器或者想连Python环境整个复制用conda-pack更省事。这两者的核心区别在于打包粒度。pip方案只打包Python包本身目标机器上仍然需要预装Python并且要保证Python版本、操作系统架构完全匹配。conda-pack则把整个conda环境打包包括Python解释器、所有第三方库、甚至环境变量配置目标机器上连Python都不用装解压就能用。我用一张表格归纳一下对比维度pip whl 离线安装conda-pack 整环境迁移目标机器是否需要预装Python需要不需要对版本匹配的要求严格Python版本/系统位宽必须匹配宽松环境内自带解释器安装包体积相对较小仅Python包较大包含完整环境适合场景单台机器、已有Python环境多台机器批量部署、无Python环境版本可控性高可精确指定每个包中以打包时的环境为准上手难度低中如果你的目标机器上已经装好了Python且不想动它无脑选pip路线如果你要装很多台或者目标机器连Python都要重装conda-pack一次打包到处解压的效率会高得多。2. 版本组合先对齐Python、CUDA、显卡驱动一个都不能错2.1 目标机器的信息收集三行命令搞定动手下载任何东西之前先在目标机器上确认三件事Python版本、显卡型号、显卡驱动支持的CUDA版本。这三项决定了你下载哪个版本的whl。打开命令提示符或PowerShell逐个执行python --version wmic path win32_VideoController get name nvidia-smi第一条显示Python版本。Pytorch的whl文件名里带cp310、cp311之类的标识cp310对应Python 3.10cp311对应Python 3.11必须严格对应否则pip会直接拒绝安装。第二条列出显卡型号。如果输出里看不到NVIDIA显卡说明这台机器没有可用的N卡那就老老实实装CPU版本。第三条是重点。注意看输出的右上角会有一个 CUDA Version 字段。很多人在这里有个误解以为这个数字表示当前系统已经安装了CUDA其实不是——这个数字表示当前显卡驱动最高支持到哪个CUDA版本。举个例子如果nvidia-smi显示CUDA Version 12.4意思是你的驱动支持12.4及以下所有版本的CUDA运行时。为什么这个区别重要因为Pytorch的GPU版本安装包内部是带CUDA运行时runtime的不需要你另外安装完整的CUDA Toolkit。只要驱动支持的CUDA版本高于等于Pytorch要求的CUDA版本就能正常运行。2.2 驱动支持的CUDA版本和Pytorch要求的CUDA版本是什么关系Pytorch官方发布的GPU版本文件名通常带绿色标记比如 torch-2.8.0cu121-cp310-cp310-win_amd64.whl 里的 cu121 表示这个包是用CUDA 12.1编译的。它对显卡驱动的最低要求就是能够支持CUDA 12.1。关键规则驱动支持的CUDA版本 Pytorch要求的CUDA版本就能用小于则不能用。举个例子你的驱动支持CUDA 12.4那么你装cu121、cu118都能跑因为驱动是向下兼容的。但是反过来如果驱动只支持11.8你非要去搞一个cu121的包装是能装上一运行涉及GPU的操作就会报错轻则CUDA error: no kernel image is available重则进程直接崩溃。所以在你下载离线包之前必须先在目标机器上跑一次nvidia-smi记住那个CUDA Version的数字再决定下载哪个CUDA编译版本的Pytorch。2.3 一个经过验证的组合Python 3.10 Pytorch 2.8.0 CUDA 12.1我在这次离线安装中使用的组合是 Python 3.10.11 Pytorch 2.8.0 CUDA 12.1这也是目前很多实际项目中稳定跑过的组合。为什么选这个组合首先Python 3.10是一个兼容性非常好的版本大多数第三方库都有对应的wheel包不会出现找不到匹配编译版本的情况。其次Pytorch 2.8.0是较新的稳定版本支持CUDA 12.1而CUDA 12.1对驱动的要求是522.06及以上目前绝大多数NVIDIA显卡驱动都满足这个条件。从性能和支持度两个角度来说这个组合都很均衡。对应的三个核心包版本如下torch-2.8.0cu121-cp310-cp310-win_amd64.whltorchvision-0.23.0cu121-cp310-cp310-win_amd64.whltorchaudio-2.8.0cu121-cp310-cp310-win_amd64.whltorchvision和torchaudio这两个包是Pytorch生态里常用的附属库一个管图像处理一个管音频处理。如果你的项目用不到它们可以只装torch但建议顺手都装上因为很多项目的依赖方会间接需要它们到时候缺了又要重新拷贝一次很麻烦。2.4 用CPU方案兜底无独显机器的版本选择如果你的目标机器没有NVIDIA独显或者驱动版本太老无法升级那就用CPU版本。CPU版本的wheel文件没有cu121这个标识文件名类似 torch-2.8.0-cp310-cp310-win_amd64.whl体积比GPU版本小很多大概只有后者的一半左右。CPU版本不需要关心CUDA版本也不依赖显卡驱动装好后用torch.cuda.is_available()检查会返回False这是正常的你的模型会老老实实跑在CPU上。如果你的场景是简单的模型推理、小规模训练或者代码调试CPU版本完全够用。如果目标是跑大模型训练那CPU版本只是没办法中的办法建议尽早解决显卡和驱动的问题。3. 联网机器收集离线包pip download的正确姿势3.1 为什么不能用浏览器直接点下载很多人的第一反应是用浏览器打开pytorch官网或者PyPI页面把whl文件下载下来。这种思路没有错但有一个很关键的问题Pytorch有一堆运行时依赖。就算你手动把torch的whl文件下载好了装的时候pip还是会提示缺少numpy、pillow、sympy等依赖库你还是得一个个找、一个个下载。这个过程中一旦某个包的版本选错连锁反应就是安装失败。正确的做法是用pip自带的下载功能让pip帮你收集全部依赖。pip在下载时会自动解析依赖关系把所有需要的依赖包一起拉下来。你只需要一条命令它会把wheel文件和依赖项全部放进指定目录。3.2 GPU版的正确下载姿势注意官方源不是PyPI默认源联网机器上先确保安装了pip然后执行下面的命令下载GPU版Pytorch假设你选择了CUDA 12.1版本mkdir offline_packages pip download torch2.8.0 torchvision0.23.0 torchaudio2.8.0 \ --index-url https://download.pytorch.org/whl/cu121 \ -d ./offline_packages注意这里的--index-url参数这是GPU版本离线包下载最容易踩的坑。如果你不加这个参数默认从PyPI官方源下载拿到的通常是CPU版本或者不带cu121后缀的版本因为PyPI源上的torch默认是不带CUDA编译标识的。必须显式指定Pytorch官方的whl源地址才能拿到带cu121标识的GPU版本。命令执行后offline_packages目录下会多出一批文件除了torch、torchvision、torchaudio这三个主包还有它们的依赖包比如numpy、pillow、sympy、networkx、jinja2、fsspec、filelock、typing-extensionscross-platform相关的多个whl文件看到这些文件就说明依赖收集成功了。建议在下载完之后数一下文件数量如果只有三五个大概率漏了依赖正常情况下这个目录里应该有十几个文件。3.3 CPU版的下载方式国产镜像源更省事如果你的方案是CPU版下载方式更简单用国内镜像源就行。清华、阿里、腾讯的PyPI镜像都行速度远比Pytorch官方源快。以清华源为例pip download torch2.8.0 torchvision0.23.0 torchaudio2.8.0 \ -i https://pypi.tuna.tsinghua.edu.cn/simple \ -d ./offline_packages这里用-i参数指定了清华PyPI镜像下载速度通常在几MB每秒以上。无论用什么方式下载下载完成后建议把offline_packages目录检查一遍确认没有.tar.gz格式的源码包如果有说明该依赖在Windows平台没有预编译的wheel包需要换Python版本或换源重新下载用--only-binary:all:参数可以强制只下载二进制包从源头避免源码包。3.4 目标机器上的离线安装--no-index 与 --find-links 的配合把整个offline_packages目录拷贝到目标机器后执行安装命令pip install --no-index --find-links./offline_packages torch2.8.0 torchvision0.23.0 torchaudio2.8.0这段命令的参数很重要我拆开讲--no-index告诉pip不要访问任何远程索引包括PyPI默认源和内网源只从本地找包。--find-links./offline_packages指定本地包目录的位置。如果你的目录里同时有CPU和GPU版本的多个whl文件npm还支持指定文件名直接安装更精确一些pip install --no-index --find-links./offline_packages torch-2.8.0cu121-cp310-cp310-win_amd64.whl torchvision-0.23.0cu121-cp310-cp310-win_amd64.whl torchaudio-2.8.0cu121-cp310-cp310-win_amd64.whl提示整个安装过程会持续几分钟主要时间花在写入几个G的文件上看到进度条停住不动不用慌等它跑完即可。4. conda-pack整环境搬家更适合多机器部署的备选方案4.1 conda-pack适合什么样的场景如果你不是在一台机器上装而是要在一批机器上重复配置或者目标机器连Python都没有装那pip方案就有点力不从心了。从头装Python、建虚拟环境、逐台执行pip命令工作量大且容易出错。这种情况下conda-pack能让你提前把整个conda环境打包成一个压缩文件拷到任何同架构的Windows机器上解压即用连环境变量都不用配。另外还有一类场景也适合conda-pack你的项目依赖了Pytorch之外的一堆库比如onnxruntime、opencv、requests等用pip方案你得一个个把依赖列出来用conda-pack直接打包你自己已经在用的一套环境一次搞定所有依赖。4.2 在联网机器上完成打包假设你在联网机器上已经能用conda我们重新创建一个干净的环境conda create -n pytorch_offline python3.10 -y conda activate pytorch_offline pip install torch2.8.0 torchvision0.23.0 torchaudio2.8.0 --index-url https://download.pytorch.org/whl/cu121 pip install conda-pack上面三步完成后当前pytorch_offline环境里已经包含Python 3.10、GPU版Pytorch全家桶和它们的依赖。接着用conda-pack打包conda pack -n pytorch_offline -o pytorch_offline.tar.gz执行之后会在当前目录生成一个压缩包。这个压缩包的大小可能会比较感人GPU版Pytorch加依赖打包后通常有4GB以上建议用移动硬盘或高速U盘拷贝。4.3 目标机器上的解压与激活目标机器不需要先装conda或Python直接解压这个压缩包即可。假设你把它放到了D:\pytorch_offlinetar -xzf pytorch_offline.tar.gz -C D:\pytorch_offline解压完成后进入目录找到Scripts\activate.bat并执行D:\pytorch_offline\Scripts\activate.bat这时候你的命令行前面应该会出现(pytorch_offline)前缀说明已成功激活环境。直接用python命令进入交互式界面import torch验证一下就能用了。需要注意conda-pack打包的环境是位置敏感的如果打包时环境路径是C:\Users\admin\anaconda3\envs\pytorch_offline解压到D:\pytorch_offline后路径变了conda-pack已经在压缩包里放了一个conda-unpack.exe工具来修复路径。解压后第一次使用时执行conda-unpack.exe它会更新环境内的所有硬编码路径之后各种工具才能正常工作。这一步很容易被忽略但不做的话后面可能出现一些莫名其妙的路径错误。4.4 两种方案的对比和我的建议我自己的使用体验是单机离线安装首选pipwhl因为目标机器上已经有Python环境管理起来也更透明批量部署或多机器复制场景直接上conda-pack省时省力。再补一个场景如果目标机器有内网conda镜像那连打包都不用直接改.condarc文件指向内网channel然后用conda在线安装和公网体验几乎一样。这种方案适合半隔离状态的内网环境效率最高。5. GPU版本翻车重灾区驱动、DLL、运行库逐个排查5.1 torch的GPU版自带CUDA运行时是真的吗先说结论是真的。从Pytorch官方whl源下载的带cu121标识的GPU版本包内部封装了CUDA运行时runtime库包括cudart、cublas、cudnn等关键动态链接库。所以你在目标机器上不需要安装完整版的CUDA Toolkit只需要一个足够新的显卡驱动torch运行时就能从自带库中加载所需组件。这也解释了为什么有些人的机器上从没装过CUDA但torch.cuda.is_available()却返回True。Pytorch为了降低用户的安装成本把所有CUDA依赖都塞进了自己的包目录里。不过自带CUDA运行时不意味着完全不需要排查问题。实际运行中GPU版本翻车的概率远高于CPU版本下面几个问题是我实测下来最常见的。5.2 nvlddmkm事件ID 153这个错误和Pytorch有没有关系如果你在Windows事件查看器里看到无法找到来自源 nvlddmkm 的事件 ID 153 的描述先不用慌。这个事件源是NVIDIA显卡驱动事件ID 153通常表示显卡驱动遇到了异常或GPU暂时从系统中移除和Pytorch本身没有直接关系也就是说不是torch的安装问题。但它在Pytorch使用场景中会以间接方式影响你一旦GPU驱动挂起训练过程中可能会出现CUDA error: an illegal memory access was encountered或者程序无响应。排查这一类问题我建议按下面的顺序来用nvidia-smi查看驱动是否响应如果不输出内容说明驱动已经挂掉直接重启机器然后用DDUDisplay Driver Uninstaller在安全模式下彻底卸载旧驱动再安装最新稳定版驱动。检查显卡温度。长时间满载训练导致过热会触发GPU保护机制出现nvlddmkm错误。用MSI Afterburner或HWMonitor看温度曲线超过85度就要考虑清灰或者降低功耗墙。检查电源计划。Windows的平衡电源计划可能会限制PCIe总线供电改成高性能电源计划再重启试一次。这个错误不直接对应Pytorch但在我这次离线部署时折腾了最久所以专门提一下。如果你在事件查看器里看到这个ID并且Pytorch的GPU操作频繁失败优先排查驱动和硬件。5.3 DLL加载失败的常规解法Microsoft Visual C运行库G了GPU版本后最常见的一个报错是ImportError: DLL load failed while importing torch或者更详细的提示找不到torch_python.dll的依赖项。这个问题的经典原因之一是目标机器缺少Microsoft Visual C Redistributable运行库。torch的wheel包在Windows上编译时依赖了MSVC的运行时DLL比如msvcp140.dll、vcruntime140.dll。这些DLL在开发机上通常都有但很多精简版Windows或服务器系统默认没有。解决办法很直接在联网机器上下载vc_redist.x64.exe微软官方Visual C 2015-2022 Redistributable包拷到目标机器上双击安装装完重启命令行重新执行import torch。还有一种情况也容易遇到目标机器是Windows Server系统缺少某些桌面版本的运行库组件。这时在安装vc_redist后仍然报DLL缺失的话用Dependencies工具一个绿色的DLL依赖分析工具打开 torch 目录下的DLL文件查看具体缺失的DLL名称再针对性补齐。比如常见的libomp140.x86_64.dll缺失这个文件实际是OpenMP运行时在电脑上不太好找网上搜一套对应版本的拷进去就行。5.4 torch.cuda.is_available()返回False的排查次序装完GPU版后第一件事就是验证CUDA是否可用。如果返回False按照以下顺序排查先查驱动版本运行nvidia-smi确认驱动支持的最高CUDA版本是否大于等于你装的torch要求的CUDA版本。比如你的包是cu121驱动显示最高CUDA版本必须大于等于12.1。不满足就升级驱动这是最常见的返回False的原因。确认装的是GPU版执行pip show torch看安装路径和版本号。版本号里如果没有cu后缀说明你从PyPI源装成了CPU版必须重装。检查命令python -c import torch; print(torch.__version__)如果输出2.8.0而不是2.8.0cu121那就装错了。确认Python是64位torch的GPU版本只支持64位Python如果你装的是32位Python想都不要想。python -c import platform; print(platform.architecture())看输出是否为(64bit, WindowsPE)。检查环境是否混用如果你在conda环境里用pip装了torch但启动时用的是系统Python那导入的可能是另一个环境里的包。注意where python看当前优先级。6. 安装完成后的验证流程与高频报错速查6.1 一套完整的验证步骤离线安装完成不代表真正搞定环境配好后的验证往往才是问题的开始。我在每次装完后固定跑一段脚本快速确认所有功能正常import torch print(torch版本:, torch.__version__) print(CUDA是否可用:, torch.cuda.is_available()) if torch.cuda.is_available(): print(GPU型号:, torch.cuda.get_device_name(0)) print(显存大小:, torch.cuda.get_device_properties(0).total_memory / 1024**3, GB) # 跑一个简单的张量操作确认GPU计算与CPU之间的数据迁移正常 x torch.rand(3, 3).cuda() y torch.mm(x, x) print(GPU矩阵运算结果:\n, y)这段脚本如果全部正常输出说明torch的CPU计算和GPU计算都可用。如果你的项目用到torchvision或torchaudio再加一行import torchvision; print(torchvision.__version__)一起验证。另外建议用torch.utils.collect_env生成一份环境诊断报告它会把Python版本、Pytorch版本、CUDA可用性、显卡驱动、cuDNN版本这些信息一次性打印出来方便排错。执行python -m torch.utils.collect_env在离线环境下这个工具完全可用输出信息非常详细。6.2 高频报错速查表把我这次安装过程和以往帮别人排错时遇到的高频问题整理成一张速查表报错现象可能原因解决方向No matching distribution found for torchpip在指定目录里找不到匹配的whl确认Python版本和wheel文件名是否匹配确认为GPU源指定了--index-urlERROR: torch-xxx.whl is not a supported wheel on this platform系统架构或Python版本与whl不匹配确认是64位系统、64位Pythoncp310的包只能装到3.10ImportError: DLL load failed while importing torch缺少VC运行库或某个依赖DLL安装vc_redist.x64.exe用Dependencies工具查缺失DLLtorch.cuda.is_available()返回False驱动版本不够 / 装成了CPU版先跑nvidia-smi再确认torch版本号带cu121后缀训练时报错CUDA out of memory显存不够调小batch size或用torch.cuda.empty_cache()手动释放缓存运行时报CUDA error: no kernel image is available驱动版本低于torch要求的CUDA版本升级显卡驱动或换用更低CUDA版本的torchIllegal instruction异常CPU指令集过老换用CPU版本或更新CPU平台表格里没有覆盖到其他问题的话可以再用python -m torch.utils.collect_env把诊断信息贴出来按照输出里的提示一步步排查。我在实际踩过几次坑之后学到的最大教训是离线安装和中转机上的版本一定要完全一致Python版本、系统架构、CUDA版本三者任何一个对不上装在目标机器上就会像拼图缺了一块怎么都拼不上。宁可最开始多花几分钟把环境信息核对清楚也不要装到一半甚至装完后才发现问题。如果你也正被Windows下的Pytorch离线安装卡住按上面这套流程走下来基本能省下大半天的折腾时间。