训练说明
预训练
数据处理
预训练数据规模一般较大,为了最大化训练速度,需要提前对预训练数据进行处理和转换,之后再进行模型训练。具体如下:
- 首先,数据集需要按照JSON格式来处理组织,即文件中每一行是一个 JSON 字符串;
示例如下(其中每一行text
字段为要处理的预训练文本):
1{"src": "www.nvidia.com", "text": "The quick brown fox", "type": "Eng", "id": "0", "title": "First Part"}
2{"src": "The Internet", "text": "jumps over the lazy dog", "type": "Eng", "id": "42", "title": "Second Part"}
- 进入镜像容器通过
/workspace/AIAK-Training-LLM/tools/data_preprocess/preprocess_data.py
工具对数据进行预处理(可在examples/{model}/pretrain/
下查看数据处理示例脚本,其中model
指各种模型系列,例如llama)。
以下以llama
模型数据处理为例:
1#!/bin/bash
2
3MEGATRON_PATH=${MEGATRON_PATH:-"/workspace/AIAK-Megatron"}
4AIAK_TRAINING_PATH=${AIAK_TRAINING_PATH:-"/workspace/AIAK-Training-LLM"}
5
6TOKENIZER_PATH=${TOKENIZER_PATH:-"/mnt/cluster/llama2/Llama-2-7b-hf/"}
7
8input_data=/mnt/cluster/datasets/pile_test/train.jsonl
9output_prefix=/mnt/cluster/datasets/pile_test/pile-llama
10
11PYTHONPATH=$MEGATRON_PATH:$AIAK_TRAINING_PATH:$PYTHONPATH \
12 python ${AIAK_TRAINING_PATH}/tools/data_preprocess/preprocess_data.py \
13 --input ${input_data} \
14 --output-prefix ${output_prefix} \
15 --tokenizer-type HFTokenizer \
16 --hf-tokenizer-path $TOKENIZER_PATH \
17 --json-keys text \
18 --workers 50 \
19 --append-eod
Checkpoint及格式转换
AIAK-Training-LLM 是基于 Megatron 构建的大模型训练库,而 Megatron 模型权重格式和开源的格式(如 huggingface)存在区别,因此,当用户需基于开源权重进行再训练时,需要提前将模型权重格式进行转换。
AIAK 针对支持的模型提供了统一的权重转换工具 /workspace/AIAK-Training-LLM/tools/convert_checkpoint
,可以方便地将模型权重在 Huggingface 和AIAK 支持的格式之间互转,具体包括:
- Huggingface 格式转换到 AIAK格式;
- AIAK 格式转换到 Huggingface;
- 不同的 TP/PP 切分策略互转;
具体转换操作,用户可以进入容器,参考**/workspace/AIAK-Training-LLM/examples/{model}/checkpoint_convert**
目录下提供的示例脚本。
以llama 为例,将 Huggingface
权重转换到 AIAK 支持的MegatronCore
格式:
1#! /bin/bash
2
3AIAK_TRAINING_PATH=${AIAK_TRAINING_PATH:-"/workspace/AIAK-Training-LLM"}
4CONVERT_CHECKPOINT_PATH="$AIAK_TRAINING_PATH/tools/convert_checkpoint"
5
6# LOAD:原始权重地址,SAVE 转换的模型存储路径
7LOAD=/mnt/cluster/llama2/Llama-2-70b-hf/
8SAVE=/mnt/cluster/llama2/mcore_llama2_70b_tp4_pp4
9
10# 当前不支持 optim 部分转换,通过 --no_save_optim 和 --no_load_optim 关闭;
11python $CONVERT_CHECKPOINT_PATH/model.py \
12 --load_platform=huggingface \
13 --save_platform=mcore \
14 --common_config_path=$CONVERT_CHECKPOINT_PATH/config/llama2-70b.json \
15 --tensor_model_parallel_size=4 \
16 --pipeline_model_parallel_size=4 \
17 --load_ckpt_path=$LOAD \
18 --save_ckpt_path=$SAVE \
19 --no_save_optim \
20 --no_load_optim
启动模型预训练
AIAK 当前提供各模型预训练示例脚本,进入容器,可以在**/workspace/AIAK-Training-LLM/examples/{model}/pretrain/**
下查看。
参数配置说明:AIAK 在支持开源 Megatron 提供的参数基础上,增加了更方便启动训练的参数,具体见aiak_training_llm/train/arguments.py
文件。其中:
- --model-name:该参数提供两种用法:1)指定模型架构名称(推荐),比如
llama2-7b
, 系统会自动按照llama2-7b
的模型结构进行超参配置,而无需用户传递,模型范围见上文模型列表中的Model Architecture
。2)指定模型系列名称,比如llama2
,这种用户需要完整的传递模型结构超参,适用需要调整原始模型结构的用户; - --training-phase:指定
pretrain
; - --tokenizer-type:优先建议指定为
HFTokenizer
,用户需通过--hf-tokenizer-path
指定 huggingface tokenizer 的路径;
LLaMA2 70B 训练示例
1#! /bin/bash
2
3MEGATRON_PATH=${MEGATRON_PATH:-"/workspace/AIAK-Megatron"}
4AIAK_TRAINING_PATH=${AIAK_TRAINING_PATH:-"/workspace/AIAK-Training-LLM"}
5
6DATA_PATH=${DATA_PATH:-"/mnt/cluster/llama2/pile/pile-llama_text_document"}
7TOKENIZER_PATH=${TOKENIZER_PATH:-"/mnt/cluster/llama2/Llama-2-70b-hf/"}
8
9CHECKPOINT_PATH=${CHECKPOINT_PATH:-"/mnt/cluster/llama2/mcore_llama2_70b_tp4_pp4"}
10
11TENSORBOARD_PATH=${TENSORBOARD_PATH:-"/mnt/cluster/aiak-training-llm/tensorboard-log/llama2-70b-tp4pp4"}
12
13GPUS_PER_NODE=8
14
15# Change for multinode config
16MASTER_ADDR=${MASTER_ADDR:-"localhost"}
17MASTER_PORT=${MASTER_PORT:-"6000"}
18NNODES=${WORLD_SIZE:-"1"}
19NODE_RANK=${RANK:-"0"}
20
21DISTRIBUTED_ARGS=(
22 --nproc_per_node $GPUS_PER_NODE
23 --nnodes $NNODES
24 --node_rank $NODE_RANK
25 --master_addr $MASTER_ADDR
26 --master_port $MASTER_PORT
27)
28
29# you can setup llama2-70b maunally
30#MODEL_ARGS=(
31# --model-name llama2
32# --num-layers 80
33# --hidden-size 8192
34# --ffn-hidden-size 28672
35# --num-attention-heads 64
36# --position-embedding-type rope
37# --normalization RMSNorm
38# --swiglu
39# --attention-dropout 0
40# --hidden-dropout 0
41# --disable-bias-linear
42# --untie-embeddings-and-output-weights
43# --group-query-attention
44# --num-query-groups 8
45#)
46
47# or you can setup llama2-70b by using the following command
48MODEL_ARGS=(
49 --model-name llama2-70b # options: llama2-7b, llama2-13b, llama2-70b
50)
51
52DATA_ARGS=(
53 --tokenizer-type HFTokenizer
54 --hf-tokenizer-path $TOKENIZER_PATH
55 --data-path $DATA_PATH
56 --split 949,50,1
57)
58
59TRAINING_ARGS=(
60 --training-phase pretrain # options: pretrain, sft
61 --seq-length 4096
62 --max-position-embeddings 4096
63 --init-method-std 0.01
64 --micro-batch-size 1
65 --global-batch-size 1024
66 --lr 0.0002
67 --min-lr 1.0e-5
68 --clip-grad 1.0
69 --weight-decay 0.01
70 --optimizer adam
71 --adam-beta1 0.9
72 --adam-beta2 0.95
73 --adam-eps 1e-05
74 --norm-epsilon 1e-6
75 --train-iters 500000
76 --lr-decay-iters 500000
77 --lr-decay-style cosine
78 --lr-warmup-fraction 0.002
79 --initial-loss-scale 65536
80 --fp16
81 --load $CHECKPOINT_PATH
82 --save $CHECKPOINT_PATH
83 --save-interval 5000
84 --eval-interval 1000
85 --eval-iters 10
86 #--ckpt-step 0
87 #--no-load-optim
88 #--no-load-rng
89)
90
91MODEL_PARALLEL_ARGS=(
92 --tensor-model-parallel-size 4
93 --pipeline-model-parallel-size 4
94 --use-distributed-optimizer
95 --overlap-grad-reduce
96 --overlap-param-gather
97 --distributed-backend nccl
98 --sequence-parallel
99 #--tp-comm-overlap # require mpi envrionment
100)
101
102LOGGING_ARGS=(
103 --log-interval 1
104 --tensorboard-dir ${TENSORBOARD_PATH}
105 --log-timers-to-tensorboard
106)
107
108if [ -n "${WANDB_API_KEY}" ]; then
109 LOGGING_ARGS+=(
110 --wandb-project ${WANDB_PROJECT}
111 --wandb-exp-name ${WANDB_NAME}
112 )
113fi
114
115PYTHONPATH=$MEGATRON_PATH:$AIAK_TRAINING_PATH:$PYTHONPATH \
116 torchrun ${DISTRIBUTED_ARGS[@]} \
117 $AIAK_TRAINING_PATH/aiak_training_llm/train.py \
118 ${MODEL_ARGS[@]} \
119 ${DATA_ARGS[@]} \
120 ${TRAINING_ARGS[@]} \
121 ${MODEL_PARALLEL_ARGS[@]} \
122 ${LOGGING_ARGS[@]}
SFT训练
数据集配置和处理
在指令微调场景中,常见的有两种对话数据集组织形式,一种是类alpaca
格式,一种是类sharegpt
格式。目前 AIAK 主要支持类alpaca
格式数据集,且数据集文件需是JSON
格式。
alpaca
格式数据集举例:
1[
2 {
3 "instruction": "用户指令",
4 "input": "用户输入的问题",
5 "output": "模型输出的答案"
6 }
7]
- 定义数据集配置文件
由于不同数据集的字段标签可能不同,为了 AIAK 能正确解析和读取数据集内容,AIAK 期望用户提供一个配置文件,该文件用于描述对话数据集的格式信息。
这里为了方便用户进行自定义配置,AIAK 在镜像内提供了一个默认的配置文件模板,详见:/workspace/AIAK-Training-LLM/configs/sft_dataset_config.json
。当用户使用自定义数据集训练时,用户可以基于该文件添加自定义数据集的名称,并指定对应的格式和字段名称。具体配置方式如下。
配置文件格式:
AIAK遵循了开源社区的常见实现方法,如 https://github.com/hiyouga/LLaMA-Factory/blob/main/data/README.md
。
具体格式规范:
1{
2 "custom_dataset_name(用户可自定义)": {
3 "format": "数据集格式(可选,取值范围: alpaca,默认: alpaca)",
4 "columns(可选,用户如未指定则按照如下默认值配置,用户如若指定则会严格按照指定的字段项进行解析,不会使用任何默认值)": {
5 "prompt": "数据集中代表提示词的字段名称(用户可自定义,默认: instruction)",
6 "query": "数据集中代表输入的字段名称(用户可自定义,默认: input)",
7 "response": "数据集中代表回答的字段名称(用户可自定义,默认: output)",
8 "system": "数据集中代表系统提示的字段名称(用户可自定义,默认: None)",
9 "history": "用于多轮对话,数据集中代表历史对话的字段名称(用户可自定义,默认: None)",
10 }
11 },
12 ...
13}
使用默认配置:
AIAK 在默认的配置文件/workspace/AIAK-Training-LLM/configs/sft_dataset_config.json
中内置了default
格式数据集配置,当用户数据集与default
配置相同时,也可以直接使用该格式;
1{
2 "default": {
3 "format": "alpaca",
4 "columns": {
5 "prompt": "instruction",
6 "query": "input",
7 "response": "output"
8 }
9 }
10}
添加自定义配置:
假设训练数据集名称命名为 custom_dataset_name
,同时文件内容形式如下(注:数据集的每条样本,都应该包含相同的字段项,部分字段项内容可以为空):
1[
2 {
3 "instruction": "用户指令",
4 "input": "用户输入的问题",
5 "output": "模型输出的答案",
6 "system": "系统提示词",
7 "history": [
8 ["第一轮对话用户输入的问题", "第一轮对话模型输出的答案"],
9 ["第二轮对话用户输入的问题", "第二轮对话模型输出的答案"]
10 ]
11 }
12]
用户在配置文件中添加的配置内容即:
1"custom_dataset_name": {
2 "format": "alpaca",
3 "columns": {
4 "prompt": "instruction",
5 "query": "input",
6 "response": "output",
7 "system": "system",
8 "history": "history"
9 }
10}
- 训练参数中指定数据集及配置文件
-
步骤1:指定数据集路径(与预训练相同):
- 方式一:通过
--data-path
指定数据集路径 (也可指定多个数据集,同时分配采样权重),并通过--split
指定训练/验证/测试数据集划分比例,AIAKexamples/
中的示例均为--split 100,0,0
, 表示全部数据用于训练。 - 方式二:通过
--train-data-path
、--valid-data-path
、--test-data-path
分别指定训练、验证、测试数据集路径,同样的,每个参数也可以指定多个数据集,并分配采样权重。
- 方式一:通过
-
步骤2:指定配置文件路径:
- 通过
--sft-dataset-config
指定数据集配置文件路径;如果用户没有指定该参数,AIAK 将会尝试读取路径configs/sft_dataset_config.json
中的配置文件用于数据集解析;
- 通过
-
步骤3:指定数据集名称(需要在
--sft-dataset-config
中定义):- 当用户通过
--data-path
+--split
指定数据集时,可以通过--sft-dataset
指定数据集名称,AIAK 会根据该名称在配置文件中查找对应的数据集格式信息进行解析; - 当用户通过
--train-data-path
、--valid-data-path
、--test-data-path
指定数据集时,可以通过--sft-train-dataset
、--sft-valid-dataset
、--sft-test-dataset
指定数据集名称,参数互相对应;
- 当用户通过
-
其他说明:
- 当采用多数据集混合训练时:
--sft-dataset
或--sft-*-dataset
的数据集名称顺序需和--data-path
或--*-data-path
指定的数据集文件一一对应,系统会按照顺序进行对应解析。另外,如果每个数据集的格式完全相同,也可以仅传递一个数据集名称,系统会按照指定的数据集名称对应的格式解析所有数据集文件。 - 如果用户没有通过
--sft—dataset
或--sft-*-dataset
指定数据集名称,系统将默认使用configs/sft_dataset_config.json
中的default
项作为训练数据集的默认格式进行解析。
- 当采用多数据集混合训练时:
- 数据集预处理
对于 SFT 训练数据,AIAK 既支持离线数据预处理,也支持在线数据预处理。 离线数据预处理,会提前将数据集进行格式解析、重组、和tokenized 转换,并持久化到磁盘中,后续训练时直接从存储中读取;而在线数据预处理,则会在运行时阶段进行数据格式解析和 tokenizer 转换等操作。
- 如果 SFT 数据集规模较少,采用【在线数据预处理】即可;
- 如果 SFT 数据集规模较大,为了减少训练之前的数据处理时间,可考虑【在线预处理+Streaming读取】的训练方式、或者提前进行数据【离线预处理】,再启动训练任务;
采用在线数据预处理:
- 用户在训练参数中通过
--data-path
指定到具体的 json 文件。启动训练后,系统会读取该路径的文件,并进行数据格式解析和 tokenizer 转换处理。 -
具体包括:
- 支持训练前进行全量数据转换处理(默认方式);
- 支持 streaming 功能,流式数据读取和转换(通过
--sft-data-streaming
启用);
采用离线数据预处理:
用户可以参考examples/{model}/finetuning
目录下的示例脚本进行离线数据预处理。当前数据处理完成后,会生成一个目录,该目录下包括了处理后的数据集信息。
训练启动时:
- 需通过
--data-path
指定该目录(非具体文件),系统会直接从该目录中读取数据集信息; - 需增加
--is-tokenized-data
参数,标明数据集已经进行了 tokenization 处理; streaming
功能依然支持,用户可以按需开启;
离线数据预处理脚本举例:
1#!/bin/bash
2
3MEGATRON_PATH=${MEGATRON_PATH:-"/workspace/AIAK-Megatron"}
4AIAK_TRAINING_PATH=${AIAK_TRAINING_PATH:-"/workspace/AIAK-Training-LLM"}
5
6TOKENIZER_PATH=${TOKENIZER_PATH:-"/mnt/cluster/leoli/qwen/Qwen-7B-HF"}
7
8input_data=/mnt/cluster/aiak-training-llm/dataset/sft_aplaca_zh_data.json
9output_path=/mnt/cluster/aiak-training-llm/qwen/sft_aplaca_zh_tokenized
10
11
12PYTHONPATH=$MEGATRON_PATH:$AIAK_TRAINING_PATH:$PYTHONPATH \
13 python ${AIAK_TRAINING_PATH}/tools/data_preprocess/preprocess_sft_data.py \
14 --input ${input_data} \
15 --output ${output_path} \
16 --seq-length 2048 \
17 --chat-template qwen \
18 --tokenizer-type HFTokenizer \
19 --hf-tokenizer-path $TOKENIZER_PATH \
20 --workers 50 \
21 --split 100,0,0
22
23 # --packing-sft-data \
24 # --train-on-prompt \
25 # --eod-mask-loss \
26 # --sft-dataset-config /workspace/AIAK-Training-LLM/configs/sft_dataset_config.json \
27 # --sft-dataset custom_dataset \
关键参数说明:
--seq-length
表示最大数据长度,如果超出该长度,系统会进行截断处理;--chat-template
指定对话模板,需和期望的训练参数一致;--split
指定train
/valid
/test
切分比例提前将数据集进行划分,后续训练参数中仍需指定--split
,以避免参数校验错误,但实际不会再次划分数据;--packing-sft-data
开启数据 packing,系统会尽量多的将多个样本 packing 到一起,且最大长度不超过--seq-length
;如果不足--seq-length
,这里不会进行 padding 补齐;
- 关于数据
Packing
训练说明:
数据 packing
既支持在线数据处理过程中拼接,也支持在离线数据处理过程中进行拼接。
由于开启数据 packing 训练时,会将多条数据拼接到一起,而拼接后样本集大小无法提前判断,如果用户需要根据拼接后的数据集大小来设置 --train-iters
迭代步数等相关参数,用户可以:
1)采用离线数据处理,并开启数据 packing 操作(具体参数见上述工具描述),数据处理内部会尽量多的将数据拼接到指定的最大长度,同时会输出数据集大小相关日志,用户可根据此信息来决定后续训练的迭代步数。
输出日志片段举例:
原数据集包含5310
个样本,拼接完成后则仅有672
个样本,其中根据--split
切分后的训练数据集包括全部的 672
个样本;
1...
2...
3[INFO | aiak_training_llm.data.sft_dataset]: >>> Loading dataset /mnt/cluster/qwen_data/demo.json(5310 samples) with default config ...
4Converting dataset to unified format (num_proc=50): 100%|███████████████████████████| 5310/5310 [00:00<00:00, 23158.97 examples/s]
5Converting dataset to tokenized data (num_proc=50): 100%|█████████████████████████████| 5310/5310 [00:45<00:00, 115.96 examples/s]
6[INFO | aiak_training_llm.data.sft_dataset]: >>> The number of samples have been changed from 5310 to 672 after preprocess.
7...
8...
9>>> Saved preprocessed dataset to /mnt/cluster/qwen_data/demo_tokenized_packing with total samples: 672
10>>> train samples: 672
11>>> valid samples: 0
12>>> test samples: 0
13...
2)无论数据是否进行离线预处理,训练参数中都需要增加--packing-sft-data
参数,便于系统正确执行后续的处理逻辑;
Checkpoint及格式转换
与预训练相同。
启动模型 SFT 训练
用户可以参考**/workspace/AIAK-Training-LLM/examples/{model}/finetuning**
目录下的示例脚本进行 SFT 训练。
参数配置说明:新增参数具体见aiak_training_llm/train/arguments.py
文件。其中关键参数:
--training-phase
:指定sft
;--chat-template
:用于指定对话模板,当前主要支持模型官方的模板;--sft-num-preprocess-workers
:指定数据集转换处理的 worker 数目;--sft-dataset-config
:指定数据集配置文件路径;不指定,会读取系统默认路径的配置文件;--sft-dataset
:指定数据集名称,该名称需在上述配置文件中定义;不指定,会尝试读取配置文件中的default配置项用于解析数据;--data-cache-path
:非新增参数,可选,用于指定数据 cache 路径--sft-data-streaming
:开启 streaming 数据读取;--train-on-prompt
:开启后,prompt 部分的数据也会参与 loss 计算,默认是仅计算答案部分的 loss;--eod-mask-loss
:非新增参数,可选,开启后会将eostoken 进行 loss mask操作,不会参与 loss 计算;用户根据实际需求判断是否开启;--is-tokenized-data
:新增参数,可选,指定数据集已经进行了 tokenization 处理;--packing-sft-data
:新增参数,可选,开启后,系统会尽量多的将多个样本 packing 到一起,该功能可以和离线数据处理工具结合使用;
Qwen 14B SFT 训练示例
1#! /bin/bash
2
3MEGATRON_PATH=${MEGATRON_PATH:-"/workspace/AIAK-Megatron"}
4AIAK_TRAINING_PATH=${AIAK_TRAINING_PATH:-"/workspace/AIAK-Training-LLM"}
5
6DATA_PATH=${DATA_PATH:-"/mnt/cluster/aiak-training-llm/dataset/sft_aplaca_zh_data.json"}
7#DATA_PATH=${DATA_PATH:-"/mnt/cluster/aiak-training-llm/qwen/sft_aplaca_zh_tokenized"}
8
9DATA_CACHE_PATH=${DATA_CACHE_PATH:-"/mnt/cluster/aiak-training-llm/dataset/sft_aplaca_zh_data_cache"}
10DATASET_CONFIG_PATH=${DATASET_CONFIG_PATH:-"/workspace/AIAK-Training-LLM/configs/sft_dataset_config.json"}
11
12TOKENIZER_PATH=${TOKENIZER_PATH:-"/mnt/cluster/aiak-training-llm/qwen/Qwen-14B-HF"}
13CHECKPOINT_PATH=${CHECKPOINT_PATH:-"/mnt/cluster/aiak-training-llm/qwen/Qwen_14B_mcore_tp1pp2"}
14
15TENSORBOARD_PATH=${TENSORBOARD_PATH:-"/mnt/cluster/aiak-training-llm/qwen/tensorboard-log/qwen-14b-sft"}
16
17GPUS_PER_NODE=8
18
19# Change for multinode config
20MASTER_ADDR=${MASTER_ADDR:-"localhost"}
21MASTER_PORT=${MASTER_PORT:-"6000"}
22NNODES=${WORLD_SIZE:-"1"}
23NODE_RANK=${RANK:-"0"}
24
25DISTRIBUTED_ARGS=(
26 --nproc_per_node $GPUS_PER_NODE
27 --nnodes $NNODES
28 --node_rank $NODE_RANK
29 --master_addr $MASTER_ADDR
30 --master_port $MASTER_PORT
31)
32
33MODEL_ARGS=(
34 --model-name qwen-14b # qwen1 options: qwen-1.8b, qwen-7b, qwen-14b, qwen-72b
35)
36
37DATA_ARGS=(
38 --tokenizer-type HFTokenizer
39 --hf-tokenizer-path $TOKENIZER_PATH
40 --data-path $DATA_PATH
41 --split 100,0,0
42)
43
44SFT_ARGS=(
45 --chat-template qwen
46 --sft-num-preprocess-workers 16
47 --no-check-for-nan-in-loss-and-grad
48 #--is-tokenized-data
49 #--packing-sft-data
50 #--sft-data-streaming
51
52 #--train-on-prompt
53 #--eod-mask-loss
54
55 #--sft-dataset-config $DATASET_CONFIG_PATH
56 #--sft-dataset sft_aplaca_zh_data # defined in --sft-dataset-config
57 #--data-cache-path $DATA_CACHE_PATH
58)
59
60
61TRAINING_ARGS=(
62 --training-phase sft # options: pretrain, sft
63 --seq-length 2048
64 --max-position-embeddings 8192
65 --init-method-std 0.006
66 --micro-batch-size 1
67 --global-batch-size 128
68 --lr 1.0e-5
69 --min-lr 1.0e-6
70 --clip-grad 1.0
71 --weight-decay 0.1
72 --optimizer adam
73 --adam-beta1 0.9
74 --adam-beta2 0.95
75 --adam-eps 1e-08
76 --norm-epsilon 1e-6
77 --train-iters 5000
78 --lr-decay-iters 5000
79 --lr-decay-style cosine
80 --lr-warmup-fraction 0.002
81 --bf16
82 --load $CHECKPOINT_PATH
83 --save $CHECKPOINT_PATH
84 --save-interval 500
85 --eval-interval 100
86 --eval-iters 10
87 #--ckpt-step 0
88 #--no-load-optim
89 #--no-load-rng
90 #--num-workers 8
91)
92
93MODEL_PARALLEL_ARGS=(
94 --tensor-model-parallel-size 1
95 --pipeline-model-parallel-size 2
96 --use-distributed-optimizer
97 --overlap-grad-reduce
98 --overlap-param-gather
99 --distributed-backend nccl
100 #--sequence-parallel
101)
102
103LOGGING_ARGS=(
104 --log-interval 1
105 --tensorboard-dir ${TENSORBOARD_PATH}
106 --log-timers-to-tensorboard
107)
108
109if [ -n "${WANDB_API_KEY}" ]; then
110 LOGGING_ARGS+=(
111 --wandb-project ${WANDB_PROJECT}
112 --wandb-exp-name ${WANDB_NAME}
113 )
114fi
115
116PYTHONPATH=$MEGATRON_PATH:$AIAK_TRAINING_PATH:$PYTHONPATH \
117 torchrun ${DISTRIBUTED_ARGS[@]} \
118 $AIAK_TRAINING_PATH/aiak_training_llm/train.py \
119 ${MODEL_ARGS[@]} \
120 ${DATA_ARGS[@]} \
121 ${TRAINING_ARGS[@]} \
122 ${SFT_ARGS[@]} \
123 ${MODEL_PARALLEL_ARGS[@]} \
124 ${LOGGING_ARGS[@]}