PAI-PPU最佳实践
1. 背景
本文提供在PAI上使用阿里云自研算力PPU的最佳实践、常见工具、常见问题说明。在参考本文档前,假定读者已经对PAI+英伟达GPU相关使用方法有基本了解,包括PAI工作空间、PAI DSW、PAI DLC、PAI EAS、PAI资源组使用等,本文不再描述PAI产品本身的使用,而是聚焦在PAI PPU算力使用上的最佳实践。如果对于PAI的基本使用仍有疑问,可参考阿里云官网帮助文档、或者联系对接的商务、PAI PDSA同学。
注意:本文可能会引用到其他文档,届时如果找不到对应文档,也可联系对接的PAI PDSA同学。
2. PPU镜像的使用
镜像的来源分三种:
阿里云PAI-PPU官方镜像:PAI-PPU官方镜像会不定期更新版本,可参考以下在线文档查看最新的官方镜像说明:PAI-PPU-V1.4.X 官方镜像 Release Note。
自定义镜像:由用户基于base镜像在DSW中保存的镜像。
阿里云PAI提供的定制版专属镜像:按特定客户需求阿里云为用户定制的镜像,一般以URL形式直接提供。
3. PPU pip源的使用
3.1 如何配置PPU pip源
使用阿里云PAI-PPU官方镜像:
阿里云PAI-PPU官方镜像已经内置了PPU pip源并做了必要的鉴权配置,可以直接使用pip install安装。
pip install <软件包名称>使用自定义镜像:
自定义镜像需要配置默认pip源,并注入必要的鉴权信息:
export PIP_INDEX_URL="https://<pip_user>:<pip_password>@art-pub.eng.t-head.cn/artifactory/api/pypi/ptgai-pypi_ppu_<os_name>_<cuda_version>_index/simple/" export PIP_EXTRA_INDEX_URL="http://mirrors.cloud.aliyuncs.com/pypi/simple/" echo -e "machine art-pub.eng.t-head.cn\nlogin <pip_user>\npassword <pip_password>" >> ~/.netrc其中以下字段需要手动修改:
pip_user:PPU pip源用户名,请联系PAI PDSA获取。
pip_password:PPU pip源密码,请联系PAI PDSA获取。
os_name:当前镜像的操作系统类型,例如:ubuntu、alios。
cuda_version:当前镜像内置PPU SDK的CUDA兼容版本,例如:cu123、cu126等。
3.2 如何判断一个包是否需要使用PPU特定版本
若包的安装需要涉及CUDA编译,则需使用PPU-PIP包清单。常用判断逻辑如下:
快速判断:最常见的需要PPU特定版本的软件包如下:
torch、torchvision、tensorflow、vllm、sglang、flash-attn、transformer-engine、triton、mmcv、spconv、open3d。
判断依据一:对应软件包的开源Readme包含关于当前开源库的简介,指出了当前库的功能,这可以作为最基本的判断条件。
判断依据二:Github中的Languages中是否包含Cuda,如果Cuda含量很高,基本上可以判定为是一个Cuda相关的开源库;如果Cuda含量仅2%,需要结合其他判定条件进行判断。

判断依据三:解压开源库对应的whl包,遍历全部文件是否包含.cu后缀。

wget https://files.pythonhosted.org/packages/b8/92/fa66b0684c0eace3a480498e70ad40a0f3784890a25b480ae05fb8d7a458/lmdeploy-0.7.1-cp310-cp310-manylinux2014_x86_64.whl unzip lmdeploy-0.7.1-cp310-cp310-manylinux2014_x86_64.whl find ./ -name "*.cu"判断依据四:解压开源库对应的whl包,遍历全部.so文件,判断文件名是否包含如"cuda"、"nv_fatbin"等关键信息。
find ./ -name "*.so*" | xargs readelf -a | grep 'nv_fatbin' find ./ -name "*.so*" | xargs readelf -a | grep 'cuda'
3.3 PPU源里包含哪些包
PPU pip源中包含的软件包会随PPU SDK的更新而更新,可访问以下文档随时查看最新的软件包列表:PPU-PIP包清单。
其中软件包分为“优化版本”与“社区版本”两类:
优化版本:针对PPU做过性能优化的开源库安装包
社区版本:未做代码修改,在PPU SDK上编译的开源软件包
如果没有特殊要求,请优先选择“优化版本”以最大程度发挥PPU芯片的性能。
3.4 如果确定需要使用PPU特定包,但是PPU源里不存在应该怎么处理?
PAI-PPU兼容了CUDA和Triton的编程接口,对于不在PAI-PPU pip源中的软件包,大部分可通过参考软件自身的文档,采用Install from source方式安装。以SGLang为例,其官网提供的Install from source方式:https://docs.sglang.ai/start/install.html#method-2-from-source
# Use the last release branch
git clone -b v0.4.4.post1 https://github.com/sgl-project/sglang.git
cd sglang
pip install --upgrade pip
pip install -e "python[all]" --find-links https://flashinfer.ai/whl/cu124/torch2.5/flashinfer-python使用ppu-training:1.4.3-pytorch2.5.1-ppu-py310-cu126-ubuntu22.04官方镜像,可正确编译并使用:

此方式仅作为备选,请优先通过PAI-PPU pip源安装所需的软件包。如有特殊的软件包适配需求,请联系PAI PDSA。
3.5 当使用PPU pip源,但是对应的依赖不在PPU源里,报依赖包不存在情况应该怎么处理?
PAI-PPU pip源自身具备upstream功能,会自动从公开的pip源中获取不具备的依赖包。如仍出现依赖包无法正常安装的情况,可采取如下手段处理:
通过pip config list命令检查pip源是否正确配置

参考3.3 PPU源里包含哪些包,确认所需的依赖包确实不在pip源中。
参考3.4 如果确定需要使用PPU特定包,但是PPU源里不存在应该怎么处理?,手动安装所需的依赖包。
如上述手段仍不能解决问题,请联系PAI PDSA。
3.6 如何在PAI中配置PPU Conda环境
阿里云PAI平台不提供Anaconda或Miniconda的安装方式,请自行在PAI-PPU环境中安装Conda软件。
由于PAI-PPU仅支持Python 3.10或3.8环境,因此请确保在conda create命令中加入python=3.10或python=3.8参数。
以准备一个Python 3.10 + PyTorch 2.4.0的环境为例:
conda create -n torch240 python=3.10
conda activate torch240
pip install torch==2.4.0+ppu1.4.2.oe
pip install flash-attn==2.5.6+ppu1.4.2.oe
pip install xformers==0.0.29.post1+ppu1.4.2.oe
pip install -r requirement.txt # vllm env below
pip install vllm==0.6.6.post1+ppu1.4.2.oe4. 针对一个存量N卡镜像,如何制作一个对应的PPU镜像
第一步:选择基础官方镜像
在官方镜像中,按照以下原则选择一个符合需求的基础镜像:
优先保证操作系统、CUDA兼容版本与所需的版本一致。
当已有CUDA版本无法满足需求时,请联系PAI PDSA获取专属镜像。
选择Python版本。如所需的版本为Python 3.10,则可参考PAI-PPU-V1.4.X 官方镜像 Release Note 直接获取适用的基础镜像。
如所需Python 3.8,则建议使用Conda或其他Python包管理软件安装Python环境。
PPU软件包暂无法支持Python 3.10和Python 3.8以外的Python版本。
第二步:定制PPU镜像
使用选定的官方镜像启动DSW实例。
在DSW实例中使用Conda或其他Python包管理软件安装所需的Python环境。
在DSW实例环境中,安装需要用到的包。
# 1. 安装torch等PPU特殊版本 pip install xxx # 2. 移除第3节提到的需要特殊安装的包,并安装剩余版本(社区版即可) pip install -r requirements.txt # 3. 如错误覆盖了一些特殊版本的包,需2次安装PPU特殊版本在DSW中进行保存镜像,以便后续使用

5. PPU常用工具的使用
5.1 如何查看PPU的运行环境
可通过以下命令查看PAI-PPU的运行环境:
PPU SDK版本:
cat /usr/local/PPU_SDK/release.yamlCUDA兼容版本:
nvcc --version容器操作系统版本:
cat /etc/os-releasePython版本:
python --versionPyTorch版本:
python -c "import torch; print(torch.__version__)"
5.2 PPU-SMI工具
PPU-SMI(PPU System Management Interface)是一个基于HGML(HanGuang Management Library)的命令行工具,用于辅助用户管理和查看PPU设备。通过ppu-smi命令行工具,用户可以:
修改设备配置 / 特性开关。
查询指定设备运行参数和特性使能状态。
收集运行数据 / 特定事件,导出至表格供后续分析。
分析各个应用程序的设备资源使用情况。
查询多个PPU设备的拓扑信息。
ppu-smi工具的详细使用方法,可参见ppu-smi查看基本信息汇总。
5.3 Asight System快速入门
Asight Systems是一款用于PPU程序的性能分析套件,支持跟踪CPU和GPU的各种事件,并显示其时间线,可以对程序进行系统级分析,找到性能瓶颈。Asight Systems分为两个工具:
asys命令行工具:用于采集目标程序的事件,并生成报告,运行在Linux平台。asys支持多种类型事件的采集,如HGGC,HGTX,OSRT及其调用栈信息等,并支持灵活的采集开始和结束方式。
Asight Systems GUI:用于展示报告,支持Windows和Mac平台。Asight Systems GUI提供多种视图展示报告,如TimelineView,EventsView,FunctionTable等,可以流畅显示海量数据,且操作简单,易于使用。
Asight Systems工具套件的使用流程为:
用asys命令行工具跟踪目标程序,生成报告。
用Asight Systems GUI打开报告,进行分析。
详细使用说明,请参见程序性能分析套件Asight Systems。
5.4 Asight Compute快速入门
Asight Compute是一款用于PPU应用程序的Kernel分析器,支持收集Kernel运行期间的Metrics并展示,可以对Kernel的性能进行优化。Asight Compute分为两个工具:
acu命令行工具:用于采集Kernel的Metrics,并生成报告。运行在Linux平台。
Asight Compute GUI工具:用于展示报告。支持Windows和Mac平台。Asight Compute GUI提供多种视图展示Metrics,如Roofline Chart,Bar Chart,Memory Table等,并且支持Baseline比对功能,操作简单,易于使用。
Asight Compute工具的使用流程为:
用acu命令行工具跟踪目标程序,生成报告。
用Asight Compute GUI打开报告,进行分析。
详细使用说明,请参见Kernel分析器Asight Compute。
6. PPU高阶使用
6.1 自研RDMA网络最佳实践
由于PAI-PPU环境使用了自研RDMA网络(非Nvidia Infiniband网络),并使用了特殊的多卡互联方式(ICN Link),因此RDMA与集合通信库的配置方式略有特殊。
请参考以下在线文档配置正确的环境变量:自研集合通信库(ACCL-P)使用最佳实践。
6.2 PPU编程指南
真武810E算力在软件栈上完全兼容CUDA软件栈,用户可以直接使用CUDA语言编写程序,在PAI-DSW平台上使用编译后,在DLC、EAS等模块中使用真武810E运行。
真武810E算力上的编程模型、CUDA Sample最佳实践、CuBLAS最佳实践、Cutlass最佳实践以及NVCC、CUDA Sample兼容说明可参考以下在线文档:
6.3 兼容性分析
PAI-PPU环境高度兼容了CUDA编程接口、Triton编程接口、nvcc编译器以及常用的PyTorch算子。
详细的兼容性分析信息可参见以下在线文档:兼容性。
7. 其他常见问题
类型 | 问题 | 解法 | 备注 |
环境适配 | 我使用conda创建了虚拟环境后,如何安装特定版本的torch? | 使用ptg源安装,例如:pip install torch==2.4.0+ppu1.4.2.oe | 1)确保安装时,采用了ptg源的包。 2)如果版本不存在,可以查看报错信息找存在的包的小版本进行安装。 |
在conda中安装了特定版本的torch后报错"GLIBCXX_3.4.30 not found"。 | 使用conda环境时,基础镜像使用ubuntu22.04高版本,兼容性更好。 | 基座镜像用新的,兼容旧的可能性更高。 | |
我需要一个py38的环境,要求cuda 12.1,官方镜像列表中没有怎么办? | 联系PAI PDSA进行获取;或者采取向上适配原则,尝试用更新的环境进行适配,使用更新版本特性可避免旧版本的一些潜在bug。 | ||
我的环境无法适配成功,要么A软件无法适配,要么B软件无法适配,如何解决? | debug顺序: 1)找一个N卡环境,可以适配成功的镜像,作为样本去适配各个环境版本,避免非GPU卡导致的兼容适配问题; 2)适配难度: 硬件依赖>操作系统>python版本 > 不可修改代码,依赖版本的软件 > cuda版本 > torch版本 > 其他依赖包。 如果基座镜像无法完全匹配,先按照上述方式进行最接近镜像查找,在无法完全匹配的配置上取就近高版进行实验适配。 | 难以适配的问题举例: 1)在新硬件上编译不支持新硬件的老版算子。 2)在高版本python(3.10)装低版本numpy(例如1.20.0)->改使用低版本镜像。 3)在低版本系统里装高版本GLIBC ->改使用高版本镜像。 | |
PPU编译 | 我需要安装一个特定版本的mmcv,应该如何编译? | 以MMCV为例,如下进行操作: 编译成功的whl文件可以留存后用。 | |
我需要安装的包编译失败了,如何解决? | 1)检查报错内容,看报错是否是此软件包在普通GPU卡上亦有此问题,并寻求对应解法。 2)如果报错内容为pg1环境独有,尝试如下操作:使用官方ptg镜像出发进行编译尝试,以避免其他环境更改导致的问题。 | ||
我有一些torch开头的包,比如torch_lighting,torchvision,torchaudio,torch-scatter,都要编译安装吗? | torchvision和torchaudio一般在ptg原始镜像中自带且跟随torch版本做了对齐,建议直接测试当前版本是否满足要求;如果不满足,再从ptg源进行安装(PPU-V1.4.2 PIP包清单 中查找版本号); torch_lightning可直接pip install。 torch-scatter可直接pip install,但是会有一个较长的编译过程。 | 可以尝试这样: pip install torch-scatter --no-binary 来确保重新编译;但注意--no-binary 选项可能在特定情况下编译依赖文件缺失,此时需要直接git clone源码参考源码仓库说明进行编译 | |
我们的代码当中有自定义算子,需要做编译,是否支持? | 支持,参考n卡下编译过程,直接编译安装即可。 | ||
模型训练 | 我使用了mmdet3d进行训练,模型训练结果不符合预期,差异很大 | 需要明确mmcv,mmdet3d等的版本,确保版本符合模型要求(此类包不同版本之间可能有巨大差异)。 | |
我的模型在DSW中运行正常,但在DLC中无法运行 | 1)采取了错误的镜像,或者DSW中的特定修改未保存到镜像(例如在CPFS存储中安装setup的内容,需要在DLC中重新setup)。 2)多节点环境变量设置不准确:
3)卡数,节点数配置不准确: PPU单节点16卡,不同于N卡环境单节点8卡,注意修改。 | ||
我的模型在DLC中运行正常,但是在DSW中无法启动 | DSW可能用了较少的资源(如CPU核数)进行创建,而数据读取的worker数设置太大,可能导致dataloader加载异常。修改对应的数据加载worker数即可。 | 建议有条件的在DSW测试时,使用完整节点。 | |
我的模型训练loss NAN了 | 1)检查是够有随卡数变化的lr scaling机制,由于卡数变多,可能导致lr较大导致loss nan。 2)检查lr设置是否本身偏高,导致容易数据异常。 | ||
我的模型训练无问题,最终评估时显示nccl报错超时了 | 1)如果涉及到多节点,可能是由于代码评估只用单节点,导致其他节点闲置导致超时。建议修改训练代码剔除评测部分代码,或者延长超时时间TORCH_NCCL_HEARTBEAT_TIMEOUT_SEC=大于评估时间 2)多节点环境变量设置不对,参考如下设置: | ||
模型设置tp=2时报错,如何解决? | 由于PPU ICN的互联方式(非全互联)比较复杂,所以为了能达到最优的性能,针对模型任务的不同并行策略,需要配置不同的环境变量: TP 2: TP 4: TP 8: TP1 或 16:无需设置 |
