PAI-PPU最佳实践

更新时间:
复制为 MD 格式

1. 背景

本文提供在PAI上使用阿里云自研算力PPU的最佳实践、常见工具、常见问题说明。在参考本文档前,假定读者已经对PAI+英伟达GPU相关使用方法有基本了解,包括PAI工作空间、PAI DSW、PAI DLC、PAI EAS、PAI资源组使用等,本文不再描述PAI产品本身的使用,而是聚焦在PAI PPU算力使用上的最佳实践。如果对于PAI的基本使用仍有疑问,可参考阿里云官网帮助文档、或者联系对接的商务、PAI PDSA同学。

注意:本文可能会引用到其他文档,届时如果找不到对应文档,也可联系对接的PAI PDSA同学。

2. PPU镜像的使用

镜像的来源分三种:

  1. 阿里云PAI-PPU官方镜像:PAI-PPU官方镜像会不定期更新版本,可参考以下在线文档查看最新的官方镜像说明:PAI-PPU-V1.4.X 官方镜像 Release Note

  2. 自定义镜像:由用户基于base镜像在DSW中保存的镜像。

  3. 阿里云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 SDKCUDA兼容版本,例如:cu123、cu126等。

3.2 如何判断一个包是否需要使用PPU特定版本

若包的安装需要涉及CUDA编译,则需使用PPU-PIP包清单。常用判断逻辑如下:

  1. 快速判断:最常见的需要PPU特定版本的软件包如下:

    torch、torchvision、tensorflow、vllm、sglang、flash-attn、transformer-engine、triton、mmcv、spconv、open3d。

  2. 判断依据一:对应软件包的开源Readme包含关于当前开源库的简介,指出了当前库的功能,这可以作为最基本的判断条件。

  3. 判断依据二:Github中的Languages中是否包含Cuda,如果Cuda含量很高,基本上可以判定为是一个Cuda相关的开源库;如果Cuda含量仅2%,需要结合其他判定条件进行判断。

    image.png

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

    image

    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" 
  5. 判断依据四:解压开源库对应的whl包,遍历全部.so文件,判断文件名是否包含如"cuda"、"nv_fatbin"等关键信息。

    find ./ -name "*.so*" | xargs readelf -a | grep 'nv_fatbin'
    find ./ -name "*.so*" | xargs readelf -a | grep 'cuda'

    image.png

3.3 PPU源里包含哪些包

PPU pip源中包含的软件包会随PPU SDK的更新而更新,可访问以下文档随时查看最新的软件包列表:PPU-PIP包清单

其中软件包分为“优化版本”与“社区版本”两类:

  • 优化版本:针对PPU做过性能优化的开源库安装包

  • 社区版本:未做代码修改,在PPU SDK上编译的开源软件包

如果没有特殊要求,请优先选择“优化版本”以最大程度发挥PPU芯片的性能。

3.4 如果确定需要使用PPU特定包,但是PPU源里不存在应该怎么处理?

PAI-PPU兼容了CUDATriton的编程接口,对于不在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官方镜像,可正确编译并使用:

image.png

说明

此方式仅作为备选,请优先通过PAI-PPU pip源安装所需的软件包。如有特殊的软件包适配需求,请联系PAI PDSA。

3.5 当使用PPU pip源,但是对应的依赖不在PPU源里,报依赖包不存在情况应该怎么处理?

PAI-PPU pip源自身具备upstream功能,会自动从公开的pip源中获取不具备的依赖包。如仍出现依赖包无法正常安装的情况,可采取如下手段处理:

  1. 通过pip config list命令检查pip源是否正确配置

    image.png

  2. 参考3.3 PPU源里包含哪些包,确认所需的依赖包确实不在pip源中。

  3. 参考3.4 如果确定需要使用PPU特定包,但是PPU源里不存在应该怎么处理?,手动安装所需的依赖包。

  4. 如上述手段仍不能解决问题,请联系PAI PDSA。

3.6 如何在PAI中配置PPU Conda环境

说明

阿里云PAI平台不提供AnacondaMiniconda的安装方式,请自行在PAI-PPU环境中安装Conda软件。

由于PAI-PPU仅支持Python 3.103.8环境,因此请确保在conda create命令中加入python=3.10python=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.oe

4. 针对一个存量N卡镜像,如何制作一个对应的PPU镜像

第一步:选择基础官方镜像

在官方镜像中,按照以下原则选择一个符合需求的基础镜像:

  1. 优先保证操作系统、CUDA兼容版本与所需的版本一致。

  2. 当已有CUDA版本无法满足需求时,请联系PAI PDSA获取专属镜像。

  3. 选择Python版本。如所需的版本为Python 3.10,则可参考PAI-PPU-V1.4.X 官方镜像 Release Note 直接获取适用的基础镜像。

  4. 如所需Python 3.8,则建议使用Conda或其他Python包管理软件安装Python环境。

说明

PPU软件包暂无法支持Python 3.10Python 3.8以外的Python版本。

第二步:定制PPU镜像

  1. 使用选定的官方镜像启动DSW实例。

  2. DSW实例中使用Conda或其他Python包管理软件安装所需的Python环境。

  3. DSW实例环境中,安装需要用到的包。

    # 1. 安装torchPPU特殊版本
    pip install xxx
    
    # 2. 移除第3节提到的需要特殊安装的包,并安装剩余版本(社区版即可)
    pip install -r requirements.txt
    
    # 3. 如错误覆盖了一些特殊版本的包,需2次安装PPU特殊版本
  4. DSW中进行保存镜像,以便后续使用

    image.png

5. PPU常用工具的使用

5.1 如何查看PPU的运行环境

可通过以下命令查看PAI-PPU的运行环境:

  • PPU SDK版本:cat /usr/local/PPU_SDK/release.yaml

  • CUDA兼容版本:nvcc --version

  • 容器操作系统版本:cat /etc/os-release

  • Python版本:python --version

  • PyTorch版本: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程序的性能分析套件,支持跟踪CPUGPU的各种事件,并显示其时间线,可以对程序进行系统级分析,找到性能瓶颈。Asight Systems分为两个工具:

  • asys命令行工具:用于采集目标程序的事件,并生成报告,运行在Linux平台。asys支持多种类型事件的采集,如HGGC,HGTX,OSRT及其调用栈信息等,并支持灵活的采集开始和结束方式。

  • Asight Systems GUI:用于展示报告,支持WindowsMac平台。Asight Systems GUI提供多种视图展示报告,如TimelineView,EventsView,FunctionTable等,可以流畅显示海量数据,且操作简单,易于使用。

Asight Systems工具套件的使用流程为:

  1. asys命令行工具跟踪目标程序,生成报告。

  2. Asight Systems GUI打开报告,进行分析。

详细使用说明,请参见程序性能分析套件Asight Systems

5.4 Asight Compute快速入门

Asight Compute是一款用于PPU应用程序的Kernel分析器,支持收集Kernel运行期间的Metrics并展示,可以对Kernel的性能进行优化。Asight Compute分为两个工具:

  • acu命令行工具:用于采集KernelMetrics,并生成报告。运行在Linux平台。

  • Asight Compute GUI工具:用于展示报告。支持WindowsMac平台。Asight Compute GUI提供多种视图展示Metrics,如Roofline Chart,Bar Chart,Memory Table等,并且支持Baseline比对功能,操作简单,易于使用。

Asight Compute工具的使用流程为:

  1. acu命令行工具跟踪目标程序,生成报告。

  2. 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兼容说明可参考以下在线文档:

PG1编程指南

6.3 兼容性分析

PAI-PPU环境高度兼容了CUDA编程接口、Triton编程接口、nvcc编译器以及常用的PyTorch算子。

详细的兼容性分析信息可参见以下在线文档:兼容性

7. 其他常见问题

类型

问题

解法

备注

环境适配

我使用conda创建了虚拟环境后,如何安装特定版本的torch?

使用ptg源安装,例如:pip install torch==2.4.0+ppu1.4.2.oe

参见3.6 如何在PAI中配置PPU Conda环境

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为例,如下进行操作:

git clone https://github.com/open-mmlab/mmcv.git
cd mmcv
git checkout v1.6.0
MMCV_WITH_OPS=1 python setup.py bdist_wheel
pip install dist/mmcv_full-1.6.0-cp38-cp38-linux_x86_64.whl

编译成功的whl文件可以留存后用。

我需要安装的包编译失败了,如何解决?

1)检查报错内容,看报错是否是此软件包在普通GPU卡上亦有此问题,并寻求对应解法。

2)如果报错内容为pg1环境独有,尝试如下操作:使用官方ptg镜像出发进行编译尝试,以避免其他环境更改导致的问题。

我有一些torch开头的包,比如torch_lighting,torchvision,torchaudio,torch-scatter,都要编译安装吗?

torchvisiontorchaudio一般在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)多节点环境变量设置不准确:

NNODES=${NNODES:-1}

NODE_RANK=${RANK:-0}

MASTER_PORT=${PORT:-29500}

MASTER_ADDR=${MASTER_ADDR:-"127.0.0.1"}

通用环境变量列表

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)多节点环境变量设置不对,参考如下设置:

export NCCL_SOCKET_IFNAME=eth0
export NCCL_IB_HCA=
export NCCL_DEBUG=INFO
export NCCL_IB_DISABLE=1

模型设置tp=2时报错,如何解决?

由于PPU ICN的互联方式(非全互联)比较复杂,所以为了能达到最优的性能,针对模型任务的不同并行策略,需要配置不同的环境变量:

TP 2:export CUDA_VISIBLE_DEVICES=4,7,5,6,1,2,0,3,12,15,13,14,9,10,8,11

TP 4:export CUDA_VISIBLE_DEVICES=4,5,7,6,0,1,3,2,9,8,10,11,13,12,14,15

TP 8:export CUDA_VISIBLE_DEVICES=4,5,7,6,2,3,1,0,13,12,14,15,11,10,8,9

TP1 或 16:无需设置