ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

ARM64麒麟V10离线安装PyTorch完整指南

ARM64麒麟V10离线安装PyTorch完整指南 先说结论这项工作做起来没有想象中那么难但准备工作一定要做足。我前后在几个现场部署过ARM64环境下的PyTorch从最早的飞腾FT-2000到后来的鲲鹏920系统基本都是银河麒麟V10的服务器版。整体的感受是只要把官方源、镜像源、依赖包这三件事理清楚离线安装其实一条命令就能完成真正耗时间的反而是前期的依赖梳理和版本匹配。这篇文章就把我在实际项目中用过的完整流程、踩过的坑和资源获取渠道都写出来希望帮你少走几趟弯路。1. 为什么ARM64麒麟V10下装PyTorch这么特殊先说背景让刚接触这个场景的朋友先有一个概念。银河麒麟V10是目前国产化替代中使用非常广泛的一款服务器操作系统它基于Linux内核深度定制兼容国内外主流芯片特别是在ARM架构的国产CPU上跑得很稳。ARM64指的就是ARMv8 64位指令集架构对应的CPU有飞腾、鲲鹏、麒麟这里指芯片等在信创项目里几乎人手一台。PyTorch本身作为深度学习框架在x86_64架构下的安装非常成熟不管是pip还是conda都是开箱即用。但换到ARM64环境情况就变了PyTorch官方对ARM64的支持起步较晚。早期版本必须从源码编译又慢又容易出问题后来官方从1.8左右开始提供aarch64的wheel包但也只覆盖Linux平台。2.x之后虽然支持更完善了但很多企业内网服务器依然停留在离线环境连基础的pip源都访问不了。麒麟V10自带的Python环境比较保守。V10系统里预装的Python通常停留在3.7或3.8而PyTorch新版本往往要求Python 3.8以上甚至一些新特性需要3.10以上。如果不做处理可能会出现PyTorch装上了但一import就报错的情况。离线环境掐断了依赖链。PyTorch的依赖项非常多除了基础的numpy之外还有typing-extensions、filelock、jinja2、networkx、sympy等一堆第三方库。在联网环境下pip会自动帮你处理但离线环境下少一个都不行。这三个原因叠加在一起就成了你在网上搜这个问题时看到大量帖子抱怨失败的根本原因。但反过来讲只要把这三个问题分别解决了整个安装过程其实非常快。2. 安装前的环境确认与准备工作2.1 确认系统架构和系统版本装任何东西之前第一件事永远是确认你的机器到底是什么架构。ARM64服务器上使用uname -m命令如果输出结果是aarch64说明你的内核架构是ARM64如果输出x86_64请直接走常规的pip安装流程完全没必要看这篇文章。麒麟V10的系统版本可以通过cat /etc/os-release来查看同时建议看一眼SP版本比如SP1、SP2、SP3。不同SP版本底层库的版本会有差异比如glibc的版本而PyTorch的wheel包对glibc版本有硬性要求。我曾经在一台V10 SP1的机器上遇到过装了新版PyTorch报GLIBCXX_3.4.29 not found的错误就是因为系统自带的libstdc.so.6版本太老。提示如果你的机器是V10桌面版而非服务器版安装原理和命令一样但需要注意桌面版可能自带更多GUI相关的依赖库与PyTorch有冲突的概率略高建议优先使用干净的Python虚拟环境。2.2 检查Python版本麒麟V10系统自带的Python版本各不一样有的带3.7有的带3.8还有可能同时存在Python 2.7旧版。为了确保PyTorch的兼容性我强烈建议你安装一个新的Python版本并且通过虚拟环境与系统隔离。具体Python版本怎么选我的建议是直接用Python 3.8或3.10。3.8是老项目最稳妥的版本很多信创项目里的其他组件比如TensorRT、ONNX Runtime都对3.8有专门的适配3.10则是PyTorch当前支持最完善、性能较好的版本。至于3.9和3.11能用但没必要去赌兼容性。如果系统里没有合适的Python而你又无法通过apt/yum在线安装就需要先离线把Python源码包传上去编译安装。这个也不复杂Python源码包从官网下注意选择源码.tar.xz格式编译安装的命令一般是./configure --prefix/usr/local/python310 --enable-optimizations make -j$(nproc) make install编译过程大概10到20分钟具体取决于CPU核心数。装完之后建议把/usr/local/python310/bin加入PATH并顺手给python3和pip3建立软链后续操作会方便很多。2.3 确认是否需要GPU支持这是最容易忽略的一个问题。很多人在x86服务器上习惯了pip install torch torchvision直接默认装CUDA版本但到了ARM64环境情况完全不同。如果你使用的是飞腾或鲲鹏CPU的服务器基本不会配置NVIDIA GPU所以PyTorch要装的是CPU版本。CPU版本在ARM64下安装反而更顺利因为不涉及CUDA、cuDNN等一堆重度依赖。但如果你的服务器是海光或者曙光等同时支持GPU的异构平台需要注意国产GPU比如寒武纪、昇腾都有自己专用的AI框架适配层并不能直接用标准的PyTorch。这种情况你需要先确认厂商是否提供了PyTorch的适配wheel包如果没有那也只能先从CPU版本跑通流程后续再做异构加速。3. 资源下载渠道与离线包准备策略3.1 从哪里找到ARM64平台的PyTorch安装包这是整个离线安装的第一道坎也是最重要的一步。很多人卡在这里到处乱找包找到的要么是x86版本要么是旧版的aarch64包白费工夫。我这里根据实际项目经验把靠谱的渠道整理如下渠道一PyTorch官方IndexPyTorch官方在download.pytorch.org/whl下按平台和加速类型做了目录区分。ARM64 CPU版本对应的是download.pytorch.org/whl/cpu目录下的torch-xxx-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl这类文件。注意文件名里有aarch64字样说明这是ARM64平台的wheel包。但这个官方地址在国内访问速度有时候不理想甚至在内网环境下完全无法访问所以还需要其他备选渠道。渠道二国内镜像站华为云、清华、阿里等国内镜像站都做了PyTorch wheel包的同步ARM64版本也有覆盖。华为云的开源镜像站直接有pytorch-wheels目录路径为mirrors.huaweicloud.com/pytorch-wheels/。在这里你会发现不同子目录包括cpu、cu118、cu121等。对于ARM64离线安装进入cpu目录选对应Python版本如cp38、cp310找到aarch64的包下载即可。阿里云的PyPI镜像也值得一试但需要注意PyPI官方源里PyTorch主包的索引在部分时期并不同步最新版本如果你是做老项目重建这个问题不大如果追求新版本更推荐华为源或官方源。渠道三中转机下载如果你的离线服务器连不到外网但办公网或跳板机能联网那最简单的做法是找一台同架构ARM64 Linux的临时机器在上面联网下载好所有依赖再打包拷贝到内网。中转机的系统不一定要是麒麟只要是ARM64 Linux平台即可因为wheel包是平台相关的。中转机下载命令如下pip download torch2.0.1 torchvision0.15.2 --platform manylinux_2_17_aarch64 --python-version 38 --only-binary:all: -d /data/packages这段命令会下载PyTorch和torchvision的aarch64 wheel包但注意它不会自动下载依赖包。要一次性把依赖也拉下来得先准备一个requirements.txt然后把所有需要的第三方库都列出来再用pip download一次性处理。这个我在后面专门讲。3.2 版本选择的经验和建议版本选择上我吃过的亏比较多这里直接给结论。如果你用的是Python 3.8建议选PyTorch 1.13.1或2.0.1如果用的Python 3.10建议选2.1.0或2.2.0以上版本。两个原则不要盲目追求最新版。最新版的PyTorch可能对系统库要求更高比如需要更新的glibc或libstdc而麒麟V10自带的这些库版本升级起来非常麻烦还需要处理系统级依赖得不偿失。尽可能选同一大版本内的最新patch。比如要找2.0.x就选2.0.1而不是2.0.0因为patch版本往往修复了一些编译期的兼容性问题。个人最推荐的是torch 1.13.1这个版本在ARM64环境下的稳定性和兼容性表现都很好网上资料也多遇到问题容易搜到解决方案。如果你是深度学习的新项目从2.0.1起步也不错算子支持和性能都有提升。3.3 梳理完整依赖包列表PyTorch的依赖链是离线安装的隐藏难点。只有主包装完之后一import就报错然后缺什么补什么补了又引出下一个缺失非常折磨人。我的经验是装之前就一次性把依赖全拉齐。以torch 1.13.1 torchvision 0.14.1在Python 3.8下的依赖关系为例需要提前准备的核心依赖如下依赖库版本建议说明numpy1.20, 1.29torch.multiprocessing和Tensor数值计算的底层依赖typing-extensions4.3类型系统扩展torch运行时必定用到filelock3.8文件锁torch hub下载模型时会用到jinja2最新即可导出与编译模块的模板渲染依赖networkx最新即可部分图相关的算子会用到sympy最新即可torch.fx和形状推导相关能力需要它pillow5.3torchvision处理图像时依赖requests最新即可torchvision下载模型权重时依赖setuptools常规版本即可Python打包基础库six最新即可torchvision旧版兼容层依赖在实际准备时最稳妥的做法是在中转机上先创建一个空的虚拟环境然后连着网安装一次PyTorch再用pip freeze requirements.txt把依赖导出。把这个requirements.txt作为离线安装的目标清单就可以保证不遗漏。4. 离线安装的完整实操过程4.1 将安装包传输到目标服务器建议在服务器上建一个统一目录存放所有离线包比如/opt/offline_packages/。用U盘、scp、ftp还是内部传输工具都可以关键是目录结构清晰。我的习惯是分两个子目录wheels存放所有wheel包source存放可能的源码包比如某个依赖在ARM64下没有预编译版本时需要现场编译。传输完成后先做一遍完整性校验。如果包是从中转机下载的确认每个文件都有且非零长度。如果是从U盘拷贝的最好比对一下文件大小或MD5U盘拷贝在大文件场景下偶尔会出现损坏这种事我碰到过两次每次排查都要浪费不少时间。4.2 创建虚拟环境并激活即使系统自带的Python环境看起来干净也不要直接往里装。麒麟V10系统的Python环境往往被系统组件占用比如yum、gnome等都可能依赖它。一旦你往里面装了某些版本的numpy可能导致系统自带的工具报错到时候排障成本极高。创建一个独立的虚拟环境是最稳妥的选择python3 -m venv /opt/pytorch_env source /opt/pytorch_env/bin/activate如果你的Python里没有ensurepip模块venv创建时可能提示找不到pip先执行python3 -m ensurepip --upgrade或者在编译Python时把ensurepip模块一起编译进去。麒麟V10的系统Python一般自带这些组件如果是自己编译的Python需要注意这个细节。4.3 安装主体wheel包激活虚拟环境后进入wheel包所在目录先安装依赖cd /opt/offline_packages/wheels pip install --no-index --find-links. numpy typing-extensions filelock jinja2 networkx sympy pillow requests这里--no-index的意思是完全不访问PyPI源所有包只从本地目录找--find-links.指定查找目录为当前目录。如果你把依赖包都放在一个目录下这个命令会自动匹配版本。依赖装好之后再安装主体pip install --no-index --find-links. torch-1.13.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl pip install --no-index --find-links. torchvision-0.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl也可以一条命令把两个包一起装pip install --no-index --find-links. torch torchvisionpip会自动在当前目录找到对应版本的wheel包。不加--no-index时pip可能因为默认源访问不了而卡很久超时这是离线安装最常见的失败原因命令报错或者长时间无响应时先确认有没有加--no-index。4.4 用conda-pack方式做整体移植备选方案如果你在信创环境里已经装好了Anaconda或Miniconda而且能用联网的ARM64机器那么conda-pack是另一个更高阶的离线部署方案特别适合需要移植一整个深度学习环境的场景。原理其实很简单在一台同架构的联网机器上装好Anaconda、创建好PyTorch虚拟环境、装好所有依赖然后用conda-pack把这个环境打包成一个tar.gz文件拷贝到目标机器解压修改一下前缀路径就能用。这样连虚拟环境本身都一起打包了省掉了现场一步步pip安装的时间。具体操作如下# 在联网机器上 conda create -n pytorch_env python3.8 conda activate pytorch_env pip install torch1.13.1 torchvision0.14.1 # 安装打包工具 conda install -c conda-forge conda-pack # 打包 conda pack -n pytorch_env -o pytorch_env.tar.gz在目标机器上mkdir -p /opt/pytorch_env tar -xzf pytorch_env.tar.gz -C /opt/pytorch_env source /opt/pytorch_env/bin/activate conda-unpack注意conda-unpack这一步不能少它是conda-pack环境激活后的初始化修复主要处理路径替换和缓存清理。这个方案的好处是依赖不会遗漏坏处是包体积大动辄2GB以上传输不方便而且如果联网机器和目标机器的Python补丁版本不一致可能还需要微调。我对这个方案的使用建议是如果只是装一个PyTorch用wheel方案更快如果还需要迁移tensorflow、opencv等各种库conda-pack方案更省心。5. 安装后的验证与常见坑5.1 功能验证命令装完之后别急着跑业务代码先用一组简单的命令验证安装效果python -c import torch; print(torch.__version__) python -c import torchvision; print(torchvision.__version__) python -c import torch; x torch.randn(3, 3); y x x.T; print(y.shape)第一条确认torch能正常导入且版本正确第二条确认torchvision与torch版本匹配第三条做一个简单的矩阵乘法确认基本算子没有问题。如果这三条都能通过说明安装本身就成功了。再进一步可以做一个完整的模型推理测试比如跑一下ResNet18的forward过程import torch import torchvision.models as models model models.resnet18(weightsNone) model.eval() dummy_input torch.randn(1, 3, 224, 224) with torch.no_grad(): output model(dummy_input) print(output.shape)如果输出[1, 1000]说明整个前向推理链路都是通顺的。这一步不耗时但对后续业务系统接入来说等于提前做了一次冒烟测试很有价值。5.2 常见问题与排查速查表我把ARM64麒麟V10下装PyTorch时最容易遇到的几个问题整理成了速查表方便你现场对照排查现象可能原因解决方案pip找不到wheel包平台标签不匹配检查文件名是否含aarch64和对应的cp37/cp38/cp39pip卡住不动没有加--no-index参数pip在尝试访问外网加上--no-index --find-links.import torch报GLIBCXX_3.4.29 not found系统libstdc.so.6版本太老从gcc相关rpm包提取新libstdc或升级兼容库import torch报Illegal instruction (core dumped)CPU指令集不兼容极少见确认wheel包的manylinux版本更换为armv8兼容版本torchvision与torch版本不匹配两个包版本对应关系错误按官方配对表选版本如torch 1.13.1对应torchvision 0.14.1运行推理时线程数过高导致卡顿OpenBLAS或MKL线程池配置不当设置环境变量OMP_NUM_THREADS、MKL_NUM_THREADS装完发现没有GPU可用使用了CPU版wheel确认安装的是否是cu版本的wheelARM64下通常只装CPU版5.3 关于GLIBC和libstdc的坑这个问题值得单独拿出来说。麒麟V10系统较老的版本SP1之前自带的libstdc.so.6版本较低而新版PyTorch2.x之后编译时用到的GCC版本更高导致运行时会报错找不到C符号。排查方法很简单strings /usr/lib64/libstdc.so.6 | grep GLIBCXX如果输出里没有GLIBCXX_3.4.29说明系统库太老。解决方式有两种第一种是从gcc-toolset或兼容系统的rpm包中提取新版的libstdc.so.6放入虚拟环境lib目录并设置LD_LIBRARY_PATH第二种是换一个对系统库要求低的PyTorch旧版本比如1.13.1。两种方式里我更推荐先尝试换版本因为直接动系统库影响面太大后续其他国产化组件可能还有依赖。5.4 ARM64环境性能验证最后如果你装完之后发现推理速度比预期慢很多先不要急着怀疑PyTorch的ARM64支持不行先检查两件事是否开启了CPU的向量指令优化。PyTorch的ARM64版本底层使用Arm Compute Library和Neon指令集优化你在跑大规模矩阵运算时应先确认torch.backends.mkldnn.is_available()返回是True如果一直是False说明CPU没有使用加速指令需要检查是不是wheel版本的问题。线程数设置是否合理。在飞腾等ARM服务器上核心数动辄64核甚至128核PyTorch默认会使用所有核但某些场景下线程过多反而导致性能下降。设置OMP_NUM_THREADS16或MKL_NUM_THREADS16往往会有意想不到的提速效果。6. 附离线安装资源准备清单写到最后把整个离线安装的资源准备流程归纳成一份清单你可以直接参考这份清单去准备环境确认架构uname -m确认是aarch64cat /etc/os-release确认麒麟版本。确认Python跑python3 --version推荐3.8或3.10如版本不合适先离线编译Python。准备离线包从官方源或华为镜像源下载对应Python版本的torch、torchvision wheel包以及numpy、typing-extensions、filelock、jinja2、networkx、sympy、pillow、requests等依赖包。创建虚拟环境python3 -m venv /opt/pytorch_env并激活。执行离线安装进入wheel包目录pip install --no-index --find-links. torch torchvision。冒烟验证import并跑一次矩阵乘法和一次简单的模型推理。固化依赖清单在虚拟环境内执行pip freeze requirements.txt后续项目交付或运维重建时可直接复现。整个流程看起来步骤多但真正操作熟练之后十五分钟内就能完成安装剩下的时间主要是调优和验证。我在实际项目里碰到的最多的反而是找到的包不对和漏了依赖这两件事如果你在准备阶段就把它们解决了正式安装只会有惊无险。最后再分享一点个人体会这类信创环境下的离线安装本质上考验的不是你会不会敲pip命令而是对依赖关系、平台架构和系统底座的把控能力。顺利的话一次就能装通不顺利的话可能就是某个版本号差一个小版本符号的问题。所以拿到一个环境别着急动手先花十分钟把系统信息、Python版本、CPU架构摸清楚再决定用哪个版本、走哪条安装路径这一步做好了后面就是流水线作业了。
返回列表