制作MindSpeed-LLM训练镜像(PyTorch框架)

MindSpeed-LLM作为昇腾大模型训练框架,旨在为昇腾芯片提供端到端的大语言模型训练方案,包含分布式预训练、分布式指令微调、分布式偏好对齐以及对应的开发工具链。MindSpeed-LLM使用指南包括了仓库拉取、环境搭建与大模型训练等章节,制作MindSpeed-LLM训练框架镜像可以结合本章节和MindSpeed-LLM使用指南

断点续训可以基于基础训练镜像制作,基础训练镜像的制作可参考使用Dockerfile构建容器镜像(PyTorch)章节进行操作。

本章节结合基础训练镜像的制作步骤,展示基于Ubuntu20.04来构建训练镜像。

以下示例使用MindSpeed-LLM 1.0.0分支。

准备软件包

请按照表1所示,获取对应操作系统的软件包,并准备镜像所需的Dockerfile文件与脚本文件。

表1 准备软件包

软件包

是否必选

说明

获取方法

mindx_elastic-{version}-py3-none-linux_{arch}.whl

使用优雅容错、Pod级别重调度或者进程级别重调度功能时,必须安装该whl包。

集群调度组件断点续训whl包,arch为CPU架构,可选aarch64或x86_64。

说明:

安装Elastic Agent组件前需确保PyTorch框架已正确安装,当前支持的PyTorch版本为:2.1.0、2.3.0、2.4.0、2.5.0。

获取链接

说明:

用户通过获取链接得到的是Ascend-mindxdl-elastic_{version}_linux-{arch}.zip压缩包,需要通过解压后,获得相应的whl软件包。

mindio_ttp-{version}-py3-none-linux_{arch}.whl

MindIO TFT安装包

获取链接

apex-0.1+ascend-cp3x-cp3x-linux_{arch}.whl

MindSpeed-LLM依赖

混合精度训练是在训练时混合使用单精度(float32)与半精度(float16)数据类型,将两者结合在一起,并使用相同的超参数实现了与float32几乎相同的精度。arch为CPU架构,可选aarch64或x86_64。

x表示8、9、10或11,当前可支持Python 3.8、Python 3.9、Python 3.10和Python3.11。

请参见《Ascend Extension for PyTorch 软件安装指南》中的“安装APEX模块”章节,根据实际情况编译APEX软件包。

torch_npu-2.1.0.post{version}-cp3x-cp3x-manylinux_2_17_{arch}.manylinux2014_{arch}.whl

MindSpeed-LLM依赖

Ascend Extension for PyTorch插件是基于昇腾的深度学习适配框架,使昇腾NPU可以支持PyTorch框架,为PyTorch框架的使用者提供昇腾AI处理器的超强算力。

Pythonx表示8、9、10或11,当前可支持Python 3.8、Python 3.9、Python 3.10和Python3.11。

获取链接

说明:

如果使用MindSpeed-LLM代码仓上的PyTorch模型,需要使用Ascend Extension for PyTorch 2.1.0及以上版本。

  • x86_64架构:torch-2.1.0+cpu.cxx11.abi-cp3x-cp3x-linux_x86_64.whl
  • Arm架构:torch-2.1.0-cp3x-cp3x-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

MindSpeed-LLM依赖

官方PyTorch包。x表示8、9、10或11,当前可支持Python3.8、Python3.9、Python3.10和Python3.11。

获取链接

Kernels

CANN二进制算子包,提供了静态库,并能够节省算子编译时间,在大模型推理、训练场景,使用静态库编译应用程序,和运行包含动态shape网络或单算子API(例如aclnn类API)相关业务时安装。arch可选aarch64或x86_64。

获取链接

说明:

请获取和服务器型号匹配的软件包。

MindSpeed

MindSpeed是针对昇腾设备的大模型加速库。

git clone https://gitee.com/ascend/MindSpeed.git

cd MindSpeed

git checkout 969686ff

version.info

安装cann需要

驱动版本信息文件。

从host拷贝“/usr/local/Ascend/driver/version.info”文件。

ascend_install.info

安装cann需要

驱动安装信息文件。

从host拷贝“/etc/ascend_install.info”文件。

Dllogger代码仓

PyTorch日志工具。

git clone https://github.com/NVIDIA/dllogger.git

get-pip.py

用于安装pip模块

curl -k https://bootstrap.pypa.io/get-pip.py -o get-pip.py

Dockerfile

制作镜像需要。

-

为了防止软件包在传递过程中或存储期间被恶意篡改,下载软件包时需下载对应的数字签名文件用于完整性验证。

在软件包下载之后,请参考《OpenPGP签名验证指南》,对从Support网站下载的软件包进行PGP数字签名校验。如果校验失败,请不要使用该软件包,先联系华为技术支持工程师解决。

使用软件包安装/升级之前,也需要按上述过程先验证软件包的数字签名,确保软件包未被篡改。

运营商客户请访问:https://support.huawei.com/carrier/digitalSignatureAction

企业客户请访问:https://support.huawei.com/enterprise/zh/tool/pgp-verify-TL1000000054

本章节以单台Atlas 800T A2 训练服务器Ubuntu 20.04 Arm操作系统、配套Python 3.8为例来介绍训练镜像的制作,使用过程中需根据实际情况修改相关步骤。

操作步骤

  1. 参照表1,在宿主机上完成软件包的准备工作。
  2. 编写如下Dockerfile。

    FROM ubuntu:20.04 
    WORKDIR /root 
    COPY . . 
      
    ARG PYTORCH_WHL=torch-2.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl 
    ARG PYTORCH_NPU_WHL=torch_npu-2.1.0.post10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl 
    ARG APEX_WHL=apex-0.1+ascend-cp38-cp38-linux_aarch64.whl 
    ARG HOST_ASCEND_BASE=/usr/local/Ascend 
    ARG TOOLKIT_PATH=/usr/local/Ascend/toolkit/latest 
    ARG TOOLKIT=Ascend-cann-toolkit_8.1.RC1_linux-aarch64.run 
    ARG KERNEL=Ascend-cann-kernels-910b_8.1.RC1_linux-aarch64.run 
    ARG MINDX_ELASTIC_WHL=mindx_elastic-7.0.RC1-py3-none-linux_aarch64.whl 
    ARG MINDIO_TTP_WHL=mindio_ttp-1.0.0-py3-none-linux_aarch64.whl 
    ARG MINDSPEED=MindSpeed 
    ARG DLLOGGER=dllogger 
      
    RUN echo "nameserver 114.114.114.114" > /etc/resolv.conf 
      
    RUN echo "deb http://repo.huaweicloud.com/ubuntu-ports/ focal main restricted universe multiverse\n\ 
    deb http://repo.huaweicloud.com/ubuntu-ports/ focal-updates main restricted universe multiverse\n\ 
    deb http://repo.huaweicloud.com/ubuntu-ports/ focal-backports main restricted universe multiverse\n\ 
    deb http://ports.ubuntu.com/ubuntu-ports/ focal-security main restricted universe multiverse" > /etc/apt/sources.list 
      
    ARG DEBIAN_FRONTEND=noninteractive 
      
    # 系统包 
    RUN umask 0022 && apt update && \ 
        apt-get install -y --no-install-recommends \ 
            gcc g++ make cmake vim \ 
            zlib1g zlib1g-dev \ 
            openssl libsqlite3-dev libssl-dev \ 
            libffi-dev unzip pciutils \ 
            net-tools libblas-dev \ 
            gfortran libblas3 libopenblas-dev \ 
            python3.8 python3.8-dev \ 
            curl unzip liblapack3 liblapack-dev \ 
            libhdf5-dev libxml2 patch 
      
    # 时区 
    RUN ln -sf /usr/share/zoneinfo/UTC /etc/localtime 
      
    # 建立Python软链接 
    RUN ln -s /usr/bin/python3.8 /usr/bin/python 
    RUN ln -s /usr/bin/python3.8 /usr/bin/python3 
    RUN ln -s /usr/bin/python3.8-config /usr/bin/python-config 
    RUN ln -s /usr/bin/python3.8-config /usr/bin/python3-config 
      
    # 配置pip源 
    RUN mkdir -p ~/.pip \ 
    && echo '[global] \n\ 
    index-url=https://mirrors.huaweicloud.com/repository/pypi/simple\n\ 
    trusted-host=mirrors.huaweicloud.com' >> ~/.pip/pip.conf 
      
    # pip3.8 
    RUN cd /tmp && \ 
        apt-get download python3-distutils && \ 
        dpkg-deb -x python3-distutils_*.deb / && \ 
        rm python3-distutils_*.deb && \ 
        cd - && \ 
        python get-pip.py && \ 
        rm get-pip.py 
      
    # 安装torch、torch_npu、apex包 
    RUN umask 0022 && pip install $PYTORCH_WHL && \ 
    pip install $PYTORCH_NPU_WHL && \ 
    pip install $APEX_WHL 
        
    RUN umask 0022 && \ 
        pip install sympy==1.4 && \ 
        pip install cffi && \ 
        pip install pathlib2 && \ 
        pip install grpcio && \ 
        pip install grpcio-tools && \ 
        pip install torchvision==0.16.0 && \ 
        pip install absl-py && \ 
    pip install datasets && \ 
    pip install tokenizers==0.20.1 && \ 
    pip install pyOpenSSL 
      
    # 创建HwHiAiUser用户和属主,UIDGID请与物理机保持一致避免出现无属主文件。示例中会自动创建user和对应的group,UIDGID都为1000
    RUN useradd -d /home/HwHiAiUser -u 1000 -m -s /bin/bash HwHiAiUser 
      
    # Ascend包 
    # 构建之前把host的/usr/local/Ascend/driver/version.info拷贝一份到当前目录 
    RUN umask 0022 &&  \ 
        cp ascend_install.info /etc/ && \ 
        mkdir -p /usr/local/Ascend/driver/ && \ 
        cp version.info /usr/local/Ascend/driver/ && \ 
        chmod +x $TOOLKIT && \ 
        chmod +x $KERNEL 
      
    RUN umask 0022 && ./$TOOLKIT --install-path=/usr/local/Ascend/ --install --quiet 
    RUN echo "source /usr/local/Ascend/ascend-toolkit/set_env.sh" >> ~/.bashrc 
    RUN umask 0022 && ./$KERNEL --install --quiet 
      
    # 只为了安装toolkit包,所以需要清理,容器启动时通过Ascend Docker Runtime挂载进来 
    RUN rm -f version.info && rm -f ascend_install.info \ 
        rm -rf /usr/local/Ascend/driver/ 
      
    RUN umask 0022 && cd $MINDSPEED && \ 
        pip install -r requirements.txt && \ 
        pip install -e . && \ 
        echo "export PYTHONPATH=/root/MindSpeed:\$PYTHONPATH" >> ~/.bashrc 
      
    RUN umask 0022 && cd $DLLOGGER && \ 
        python setup.py build && \ 
        python setup.py install 
      
    # 导入环境变量 
    ENV HCCL_WHITELIST_DISABLE=1 
      
    # 创建/lib64/ld-linux-aarch64.so.1 
    RUN umask 0022 && \ 
        if [ ! -d "/lib64" ]; \ 
        then \ 
            mkdir /lib64 && ln -sf /lib/ld-linux-aarch64.so.1 /lib64/ld-linux-aarch64.so.1; \ 
        fi 
      
    # MindCluster断点续训适配脚本 
    RUN umask 0022 && \ 
        pip install $MINDX_ELASTIC_WHL && \ 
        pip install $MINDIO_TTP_WHL 
      
      
    # 可选,使用优雅容错、Pod级别重调度或进程级别重调度时必须配置以下命令
    RUN sed -i '/import logging/i import mindx_elastic.api' $(pip3 show torch | grep Location | awk -F ' ' '{print $2}')/torch/distributed/run.py
    
    # 增加安装任务调度依赖库 
    RUN pip install apscheduler 
      
    RUN rm -rf tmp && \ 
        rm -f $PYTORCH_WHL && \ 
        rm -f $PYTORCH_NPU_WHL && \ 
        rm -f $APEX_WHL && \ 
        rm -f $TOOLKIT && \ 
        rm -f $KERNEL && \ 
        rm -f $MINDX_ELASTIC_WHL && \ 
        rm -f $MINDIO_TTP_WHL && \ 
        rm -rf $DLLOGGER && \ 
        rm -rf Dockerfile 
    ## 最后打包成镜像mindspeed-dl:v1

  3. 构建镜像。执行以下命令生成镜像为了使Dockerfile更加安全,用户可以根据业务在其中定义HEALTHCHECK检查。通过在容器内部运行HEALTHCHECK [OPTIONS] CMD命令来检查容器的运行状况。注意不要遗漏命令结尾的“.”

    docker build -t mindspeed-dl:v1 .