说明一体化计算机加速平台·异构计算主账号拥有所有功能的操作权限,子账号仅可在被授权的工作空间内操作。
创建和使用一体化计算加速平台·异构计算之前,需要先注册天翼云门户的账号。如果已拥有天翼云的账号,可登录后直接使用一体化计算加速平台·异构计算。
准备工作
创建扩展资源组
资源组是运行所需要的资源组合,资源组内可以有不同规格的节点。根据自己的需求选择创建“标准资源组”或者“扩展资源组”。本文主要介绍依赖扩展资源组进行训练。
在左侧导航栏选择“资源>资源组”,进入“扩展资源组”页面,点击“创建资源组”按钮,选择“扩展资源组”。具体创建步骤参见创建资源组。
数据上传
创建存储挂载
说明1.存储挂载和k8s共享存储的区别:
存储挂载是将HPFS/ZOS挂载到物理机上;k8s共享存储用于提交训练任务时挂载到Pod容器上。
2.大规模训练时推荐使用HPFS高性能存储。
在左侧导航栏选择“数据准备>存储挂载”进入存储挂载列表页面,点击“创建存储挂载”按钮。
根据实际情况填写相关信息,将ZOS挂载到绑定了eip的物理机节点上,然后点击创建。具体操作参见创建存储挂载。
上传数据到HPFS/ZOS
登录已挂载HPFS/ZOS、并且绑定了EIP可访问公网的物理机节点,下载并拷贝数据到HPFS/ZOS目录。具体步骤参见如何上传数据到HPFS存储并使用或如何上传数据到ZOS存储。
可使用以下示例数据,并与下文模型训练-镜像上传中的示例镜像配套使用。
#下载
wget https://huabei-2.zos.ctyun.cn/huabei2-cwai-images/ascend/hdk24.1.rc2/ModelLink-1.0.RC2.zip
#校验文件md5sum
md5sum ModelLink-1.0.RC2.zip
#ea46cd5dd7924ca8acbcc61d34a47d62 ModelLink-1.0.RC2.zip
#拷贝到hpfs存储(假设hpfs挂载路径为/mnt/cwai/hpfs)
cp ModelLink-1.0.RC2.zip /mnt/cwai/hpfs
#解压
cd /mnt/cwai/hpfs
unzip ModelLink-1.0.RC2.zip
创建k8s共享存储
说明1.存储挂载和k8s共享存储的区别:
存储挂载是将HPFS/ZOS挂载到物理机上;k8s共享存储用于提交训练任务时挂载到Pod容器上。
2.大规模训练时推荐使用HPFS高性能存储。
在左侧导航栏选择“数据准备>k8s共享存储”,点击“创建k8s共享存储”按钮。填写自定义名称,选择需要挂载的资源组,选择存储类型和开通的存储实例。具体操作参见创建k8s共享存储。
注意此处创建的k8s共享存储是和资源组绑定的,如果有多个资源组,可以共享同一个HPFS/ZOS实例,但需要分别创建k8s共享存储。
创建队列
队列是资源组内部分资源配额的集合,一个资源组可创建多个队列。在运行训练任务时,通过将任务绑定到队列进行资源的排队和使用申请。
点击左侧导航栏选择“资源>队列”,点击“创建队列”按钮,创建训练使用的队列。具体创建步骤参见创建队列。
创建工作空间
工作空间可实现项目资源隔离、多项目分开工作。工作空间的创建需要在队列创建操作之后。
- 在左侧导航栏选择“工作空间”进入工作空间列表页面,点击“创建工作空间”按钮。
- 完成“基础信息”和“关联资源”配置,点击“创建”即可完成工作空间。其中关联资源列表仅显示未关联其他工作空间的队列,若无队列资源可选择,可创建新队列或将目标队列与其他工作空间解绑后即可选择。
- 在工作空间列表可查看已创建的工作空间。具体请参见工作空间管理。
模型训练
镜像上传
一体化计算加速平台·异构计算中镜像用于提供开发所需的环境。镜像仓库中提供预置镜像和自定义镜像两种能力。预置镜像即平台预先设置的完整镜像,可以在创建自定义训练时直接使用。自定义镜像即可上传本地自有镜像,上传完成后可在创建自定义训练任务时选择并使用。
进入对应工作空间后,在左侧导航栏选择“镜像仓库>镜像列表”进入“自定义镜像”页面。在“自定义镜像”页面中点击“上传镜像”按钮进入上传镜像页面。
在“上传镜像”页面单击“查看网络配置方法”可查看自定义镜像上传方法,也可通过最佳实践了解如何上传镜像到一体化计算加速平台·异构计算的私有镜像仓库。
可使用以下示例的Llama2-7b镜像,并与上文准备工作-数据上传中的示例数据配套使用。
获取实例的llama2-7b镜像文件
#下载
wget https://huabei-2.zos.ctyun.cn/huabei2-cwai-images/ascend/hdk24.1.rc2/ascend_modellink_1.0.rc2_cann8.0.RC2-torch2.1.0-conda24.7.1-vscode4.12.0-ubuntu22.04-ssh-deactivate-arm64.zip
#校验文件md5sum
md5sum ascend_modellink_1.0.rc2_cann8.0.RC2-torch2.1.0-conda24.7.1-vscode4.12.0-ubuntu22.04-ssh-deactivate-arm64.zip
#20b766a13bc58c5414a44abd626938b3 ascend_modellink_1.0.rc2_cann8.0.RC2-torch2.1.0-conda24.7.1-vscode4.12.0-ubuntu22.04-ssh-deactivate-arm64.zip
#解压
unzip ascend_modellink_1.0.rc2_cann8.0.RC2-torch2.1.0-conda24.7.1-vscode4.12.0-ubuntu22.04-ssh-deactivate-arm64.zip
#加载
docker load -i ascend_modellink_1.0.rc2_cann8.0.RC2-torch2.1.0-conda24.7.1-vscode4.12.0-ubuntu22.04-ssh-deactivate-arm64
#docker images输出如下(校验IMAGE ID是否为220f023c7fe6):
REPOSITORY TAG IMAGE ID CREATED SIZE
ascend_modellink_1.0.rc2 cann8.0.RC2-torch2.1.0-conda24.7.1-vscode4.12.0-ubuntu22.04-ssh-deactivate-arm64 220f023c7fe6 10 days ago 16.5GB
示例镜像中conda环境py38_torch210的pip list列表见文末附录1,可以基于该镜像自行新建所需的conda环境,构建完成后上传到一体化计算加速平台·异构计算自定义镜像仓库中。
提交训练任务
创建自定义训练任务实现一键运行任务,且支持同一任务多次运行。
-
进入工作空间后在左侧导航栏选择“训练>自定义训练”进入训练任务列表页面,点击“新建训练任务”按钮。
-
在“新建训练任务”页面,配置训练任务参数信息,然后点击“保存任务”。具体参数说明可参见创建自定义训练任务。
-
“镜像来源”选择上传的自定义镜像。
-
“存储”选择“+HPFS共享存储”或“+ZOS共享存储”,挂载目录选择上述步骤创建的k8s共享存储,成功后会将目录挂载到容器内目录(默认为/data)。注:此处可选择的HPFS/ZOS共享存储名称范围是已选所属队列的资源组下的k8s共享存储。
-
(单机多卡预训练)在启动命令栏中填入启动训练任务的执行命令。llama2-7b模型单机预训练脚本pretrain_llama2_7b_ptd_single_node.sh详见文末附录2。
/bin/bash -c cd /data/ModelLink-1.0.RC2 && source activate py38_torch210 && chmod +x ./examples/llama2/pretrain_llama2_7b_ptd_single_node.sh && NNODES=1 TP=1 PP=2 GBS=256 MBS=1 TRAIN_STEPS=500 SAVE_INTERVAL=300 ./examples/llama2/pretrain_llama2_7b_ptd_single_node.sh
-
(多机多卡预训练)在启动命令栏中填入启动训练任务的执行命令。llama2-7b多机预训练脚本pretrain_llama2_7b_ptd_multi_nodes.sh详见文末附录3。
/bin/bash -c cd/data/ModelLink-1.0.RC2&&sourceactivatepy38_torch210&&chmod+x./examples/llama2/pretrain_llama2_7b_ptd_multi_nodes.sh&&NNODES=2TP=1PP=2GBS=512MBS=1TRAIN_STEPS=500SAVE_INTERVAL=300./examples/llama2/pretrain_llama2_7b_ptd_multi_nodes.sh
-
“永久保存日志”开关开启后选择ZOS共享存储名称和路径可将训练日志永久保存至ZOS共享存储。注:此处可选择的ZOS共享存储名称范围是已选所属队列的资源组下的k8s共享存储。
-
确认所配置参数,点击“保存任务”。
-
-
保存创建的训练任务后,需在训练任务列表页面点击“运行”操作。支持多次运行。
- 点击“运行”后,训练任务开始调度资源、拉取容器镜像、下载代码目录、执行启动命令等动作。首次运行时耗时较长,请耐心等待,第二次及以后运行时无需再次拉取镜像。
- b.如果队列内资源不足会进入“排队中”状态等待资源分配。
-
运行后在训练任务列表页面点击任务名称,进入训练任务详情页查看运行的详细信息。单击运行情况的ID,可跳转详情页面查看本次运行的实例列表、TimeLine、监控、日志等信息。
附录1 示例镜像conda环境py38_torch210安装列表
# conda activate py38_torch210
# pip list
Package Version Editable project location
----------------------------- ----------- -------------------------
accelerate 1.0.1
aiohappyeyeballs 2.4.3
aiohttp 3.10.10
aiosignal 1.3.1
apex 0.1+ascend
async-timeout 4.0.3
attrs 24.2.0
certifi 2024.8.30
charset-normalizer 3.4.0
datasets 3.1.0
decorator 5.1.1
dill 0.3.8
einops 0.8.0
exceptiongroup 1.2.2
filelock 3.16.1
frozenlist 1.5.0
fsspec 2024.9.0
huggingface-hub 0.26.2
idna 3.10
iniconfig 2.0.0
Jinja2 3.1.4
MarkupSafe 2.1.5
mindspeed 0.0.1 /root/MindSpeed
mpmath 1.3.0
multidict 6.1.0
multiprocess 0.70.16
networkx 3.1
ninja 1.11.1.1
numpy 1.24.4
packaging 24.1
pandas 2.0.3
peft 0.7.1
pillow 10.4.0
pip 24.2
pluggy 1.5.0
propcache 0.2.0
protobuf 5.28.3
psutil 6.1.0
pyarrow 17.0.0
pybind11 2.13.6
pytest 8.3.3
python-dateutil 2.9.0.post0
pytz 2024.2
PyYAML 6.0.2
regex 2024.11.6
requests 2.32.3
safetensors 0.4.5
scipy 1.10.1
sentencepiece 0.2.0
setuptools 75.1.0
six 1.16.0
sympy 1.13.3
tiktoken 0.7.0
tokenizers 0.15.2
tomli 2.0.2
附录2 单机训练脚本
ModelLink-1.0.RC2/examples/llama2/pretrain_llama2_7b_ptd_single_node.sh
#!/bin/bash
export CUDA_DEVICE_MAX_CONNECTIONS=1
export NPU_ASD_ENABLE=0
export HCCL_CONNECT_TIMEOUT=1200
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
export MULTI_STREAM_MEMORY_REUSE=1
source /usr/local/Ascend/ascend-toolkit/set_env.sh
#从平台页面环境变量传入
NNODES=$(echo $NNODES)
TP=$TP
PP=$PP
MBS=$MBS
GBS=$GBS
TRAIN_STEPS=$TRAIN_STEPS
SAVE_INTERVAL=$SAVE_INTERVAL
GPUS_PER_NODE=8
MASTER_ADDR=localhost
MASTER_PORT=6000
NODE_RANK=0
WORLD_SIZE=$(($GPUS_PER_NODE*$NNODES))
CKPT_SAVE_DIR="./ckpt/ckpt-llama2-7b-tp${TP}pp${PP}-${NNODES}nodes"
DATA_PATH="./dataset/llama-2-7b-hf/alpaca_text_document"
TOKENIZER_MODEL="./model_from_hf/llama-2-7b-hf/tokenizer.model"
#CKPT_LOAD_DIR="your model ckpt path"
LOG_DIR="./logs/cwai-pretrain-llama2-7b-tp${TP}pp${PP}-${NNODES}nodes-log"
mkdir -p $LOG_DIR
mkdir -p $CKPT_SAVE_DIR
DISTRIBUTED_ARGS="
--nproc_per_node $GPUS_PER_NODE \
--nnodes $NNODES \
--node_rank $NODE_RANK \
--master_addr $MASTER_ADDR \
--master_port $MASTER_PORT
"
GPT_ARGS="
--tensor-model-parallel-size ${TP} \
--pipeline-model-parallel-size ${PP} \
--sequence-parallel \
--num-layers 32 \
--hidden-size 4096 \
--ffn-hidden-size 11008 \
--num-attention-heads 32 \
--tokenizer-type Llama2Tokenizer \
--tokenizer-model ${TOKENIZER_MODEL} \
--seq-length 4096 \
--max-position-embeddings 4096 \
--micro-batch-size $MBS \
--global-batch-size $GBS \
--make-vocab-size-divisible-by 1 \
--lr 1.25e-6 \
--train-iters $TRAIN_STEPS \
--lr-decay-style cosine \
--untie-embeddings-and-output-weights \
--disable-bias-linear \
--attention-dropout 0.0 \
--init-method-std 0.01 \
--hidden-dropout 0.0 \
--position-embedding-type rope \
--normalization RMSNorm \
--use-fused-rmsnorm \
--swiglu \
--use-flash-attn \
--no-masked-softmax-fusion \
--attention-softmax-in-fp32 \
--min-lr 1.25e-7 \
--weight-decay 1e-1 \
--lr-warmup-fraction 0.01 \
--clip-grad 1.0 \
--adam-beta1 0.9 \
--initial-loss-scale 65536 \
--adam-beta2 0.95 \
--no-gradient-accumulation-fusion \
--no-load-optim \
--no-load-rng \
--use-distributed-optimizer \
--use-fused-swiglu \
--use-fused-rotary-pos-emb \
--overlap-grad-reduce \
--bf16 \
--log-throughput
"
DATA_ARGS="
--data-path $DATA_PATH \
--split 100,0,0
"
OUTPUT_ARGS="
--log-interval 1 \
--save-interval $SAVE_INTERVAL \
--eval-interval 10000 \
--eval-iters 0 \
"
# Include "--load $CKPT_LOAD_DIR" in the torchrun command when performing continual Pre-training.
torchrun $DISTRIBUTED_ARGS pretrain_gpt.py \
$GPT_ARGS \
$DATA_ARGS \
$OUTPUT_ARGS \
--distributed-backend nccl \
--save $CKPT_SAVE_DIR \
2>&1 | tee ${LOG_DIR}/pretrain_llama2_7b_tp${TP}pp${PP}_${NNODES}_nodes_${NODE_RANK}_${TRAIN_STEPS}iters.log
附录3 多机训练脚本
ModelLink-1.0.RC2/examples/llama2/pretrain_llama2_7b_ptd_multi_nodes.sh
#!/bin/bash
export CUDA_DEVICE_MAX_CONNECTIONS=1
export NPU_ASD_ENABLE=0
export HCCL_CONNECT_TIMEOUT=1200
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
export MULTI_STREAM_MEMORY_REUSE=1
source /usr/local/Ascend/ascend-toolkit/set_env.sh
#从平台页面环境变量传入
NNODES=$(echo $NNODES)
TP=$TP
PP=$PP
MBS=$MBS
GBS=$GBS
TRAIN_STEPS=$TRAIN_STEPS
SAVE_INTERVAL=$SAVE_INTERVAL
# k8s pytorchJob自动生成分布式训练相关环境变量
NODE_RANK=$(echo $RANK)
MASTER_ADDR=$(echo $MASTER_ADDR)
MASTER_PORT=$(echo $MASTER_PORT)
GPUS_PER_NODE=8
WORLD_SIZE=$(($GPUS_PER_NODE*$NNODES))
CKPT_SAVE_DIR="./ckpt/ckpt-llama2-7b-tp${TP}pp${PP}-${NNODES}nodes"
DATA_PATH="./dataset/llama-2-7b-hf/alpaca_text_document"
TOKENIZER_MODEL="./model_from_hf/llama-2-7b-hf/tokenizer.model"
#CKPT_LOAD_DIR="your model ckpt path"
LOG_DIR="./logs/cwai-pretrain-llama2-7b-tp${TP}pp${PP}-${NNODES}nodes-log"
mkdir -p $LOG_DIR
mkdir -p $CKPT_SAVE_DIR
DISTRIBUTED_ARGS="
--nproc_per_node $GPUS_PER_NODE \
--nnodes $NNODES \
--node_rank $NODE_RANK \
--master_addr $MASTER_ADDR \
--master_port $MASTER_PORT
"
GPT_ARGS="
--tensor-model-parallel-size ${TP} \
--pipeline-model-parallel-size ${PP} \
--sequence-parallel \
--num-layers 32 \
--hidden-size 4096 \
--ffn-hidden-size 11008 \
--num-attention-heads 32 \
--tokenizer-type Llama2Tokenizer \
--tokenizer-model ${TOKENIZER_MODEL} \
--seq-length 4096 \
--max-position-embeddings 4096 \
--micro-batch-size ${MBS} \
--global-batch-size ${GBS} \
--make-vocab-size-divisible-by 1 \
--lr 1.25e-6 \
--train-iters $TRAIN_STEPS \
--lr-decay-style cosine \
--untie-embeddings-and-output-weights \
--disable-bias-linear \
--attention-dropout 0.0 \
--init-method-std 0.01 \
--hidden-dropout 0.0 \
--position-embedding-type rope \
--normalization RMSNorm \
--use-fused-rmsnorm \
--swiglu \
--use-flash-attn \
--no-masked-softmax-fusion \
--attention-softmax-in-fp32 \
--min-lr 1.25e-7 \
--weight-decay 1e-1 \
--lr-warmup-fraction 0.01 \
--clip-grad 1.0 \
--adam-beta1 0.9 \
--initial-loss-scale 65536 \
--adam-beta2 0.95 \
--no-gradient-accumulation-fusion \
--no-load-optim \
--no-load-rng \
--use-distributed-optimizer \
--use-fused-swiglu \
--use-fused-rotary-pos-emb \
--overlap-grad-reduce \
--bf16 \
--log-throughput
"
DATA_ARGS="
--data-path $DATA_PATH \
--split 100,0,0
"
OUTPUT_ARGS="
--log-interval 1 \
--save-interval $SAVE_INTERVAL \
--eval-interval 10000 \
--eval-iters 0 \