說明一體化計算機加速平臺·異構計算主賬號擁有所有功能的操作權限,子賬號僅可在被授權的工作空間內操作。
創建和使用一體化計算加速平臺·異構計算之前,需要先注冊天翼云門戶的賬號。如果已擁有天翼云的賬號,可登錄后直接使用一體化計算加速平臺·異構計算。
準備工作
創建擴展資源組
資源組是運行所需要的資源組合,資源組內可以有不同規格的節點。根據自己的需求選擇創建“標準資源組”或者“擴展資源組”。本文主要介紹依賴擴展資源組進行訓練。
在左側導航欄選擇“資源>資源組”,進入“擴展資源組”頁面,點擊“創建資源組”按鈕,選擇“擴展資源組”。具體創建步驟參見創建資源組。
數據上傳
創建存儲掛載
說明1.存儲掛載和k8s共享存儲的區別:
存儲掛載是將HPFS/ZOS掛載到物理機上;k8s共享存儲用于提交訓練任務時掛載到Pod容器上。
2.大規模訓練時推薦使用HPFS高性能存儲。
在左側導航欄選擇“數據準備>存儲掛載”進入存儲掛載列表頁面,點擊“創建存儲掛載”按鈕。
根據實際情況填寫相關信息,將ZOS掛載到綁定了eip的物理機節點上,然后點擊創建。具體操作參見創建存儲掛載。
上傳數據到HPFS/ZOS
登錄已掛載HPFS/ZOS、并且綁定了EIP可訪問公網的物理機節點,下載并拷貝數據到HPFS/ZOS目錄。具體步驟參見如何上傳數據到HPFS存儲并使用或如何上傳數據到ZOS存儲。
可使用以下示例數據,并與下文模型訓練-鏡像上傳中的示例鏡像配套使用。
#下載
wget //huabei-2.zos.daliqc.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 //huabei-2.zos.daliqc.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 \