diff --git a/docs/zh_cn/index.rst b/docs/zh_cn/index.rst index 92afbbd80..b87f162e4 100644 --- a/docs/zh_cn/index.rst +++ b/docs/zh_cn/index.rst @@ -84,3 +84,14 @@ :caption: 模型 models/supported.md + +.. toctree:: + :maxdepth: 2 + :caption: InternEvo 迁移 + + internevo_migration/internevo_migration.rst + internevo_migration/ftdp_dataset/README.md + internevo_migration/ftdp_dataset/Case1.rst + internevo_migration/ftdp_dataset/Case2.rst + internevo_migration/ftdp_dataset/Case3.rst + internevo_migration/ftdp_dataset/Case4.rst diff --git a/docs/zh_cn/internevo_migration/ftdp_dataset/Case1.rst b/docs/zh_cn/internevo_migration/ftdp_dataset/Case1.rst new file mode 100644 index 000000000..28e14ee8b --- /dev/null +++ b/docs/zh_cn/internevo_migration/ftdp_dataset/Case1.rst @@ -0,0 +1,250 @@ +.. _case1: + +使用 Processed 数据集训练 InternLM2 +=================================== + +使用尚未 token 化的 ftdp 数据训练 InternLM2 模型的场景。 + +Step 1, 离线处理数据集 +---------------------- + +ftdp 把 sft +任务的数据处理划分为三个类型,原始数据(origin)、预处理数据(processed)和 +token 过的数据(tokenized)。我们需要将预处理过的、具有统一格式的 ftdp +数据 token +化得到直接可以用于训练的格式。其中,预处理数据需要满足以下目录结构: + +.. code:: + + |-- processed-dir + |-- data1 + | |-- processed + | |-- sft_chat + | |-- data1.jsonl + |-- data2 + | |-- processed + | |-- sft_chat + | |-- data2.jsonl + +使用以下命令可离线 token 化 ftdp 格式的预处理数据(processed)数据集: + +.. code:: + + python xtuner/tools/tokenize_ftdp_datasets.py \ + --processed-dir /path/to/preprocessed/data \ + --tokenized-dir /path/to/tokenized/data \ + --tokenizer-path pretrained_model_name_or_path + +上述命令中: + +1. ``--processed-dir`` 需要指定预处理后的,具有 ftdp + 标准格式的数据路径; + +2. ``--tokenized-dir`` 需要指定为 token 化后的数据存储路径; + +3. ``--tokenizer-path pretrained_model_name_or_path`` 中的 + ``pretrained_model_name_or_path`` 同 ``from_pretrained`` 接口中的 + ``pretrained_model_name_or_path``\ 。 + +上述命令执行成功后,会在 ``/path/to/tokenized/data/chatml_llamav13_32k`` +路径下保存两个子文件夹——``train`` 和 ``valid``\ 。 + +Step 2, 导出模板 config 文件 +---------------------------- + +XTuner 中目前提供了训练 InternLM2 的模板 config,使用命令: + +.. code:: + + xtuner copy-cfg internlm2_7b_w_tokenized_dataset . + +可将训练 InternLM2 的模板 config 导出至当前目录下。 + +Step 3, 修改模板 config 文件 +---------------------------- + +修改模板 config 文件中的训练数据路径为真实数据路径,其中 +``/path/to/tokenized/data`` 与 Step 1 中的 ``/path/to/tokenized/data`` +为同一个路径: + +.. code:: diff + + ... + + ####################################################################### + # PART 1 Settings # + ####################################################################### + # Model + pretrained_model_name_or_path = 'internlm/internlm2-7b' + use_varlen_attn = True + + # Data + - dataset_folder = '/path/to/sft/data/folder' + + dataset_folder = '/path/to/tokenized/data/chatml_llamav13_32k/train' + prompt_template = PROMPT_TEMPLATE.internlm2_chat + max_length = 32768 + pack_to_max_length = True + ... + +在使用 DeepSpeed 训练模型时,如需在保存 checkpoint +时只保存模型权重,而不保存优化器状态,可参考以下步骤: + +1. 确保 mmengine 版本大于等于 0.10.3 + +.. code:: + + pip install 'mmengine>=0.10.3' + +2. 修改 Config 文件,CheckpointHook 增加 save_optimizer=False + +.. code:: diff + + default_hooks = dict( + # record the time of every iteration. + timer=dict(type=IterTimerHook), + # print log every 100 iterations. + logger=dict(type=LoggerHook, interval=1), + # enable the parameter scheduler. + param_scheduler=dict(type=ParamSchedulerHook), + # save checkpoint per epoch. + checkpoint=dict( + type=CheckpointHook, + + save_optimizer=False, + by_epoch=False, + interval=save_steps, + max_keep_ckpts=save_total_limit), + # set sampler seed in distributed evrionment. + sampler_seed=dict(type=DistSamplerSeedHook), + ) + +.. note:: + + 需要注意,经过以上设置后,训练过程不可 resume 。 + +.. _step-4-获取数据顺序-可选): + +Step 4, 获取数据顺序 (可选) +----------------------------- + +训练数据的提供顺序可能会对模型的最终训练成果产生影响。鉴于不同集群中通过 +``os.walk`` +方法所得到的结果可能存在差异,为了确保训练结果的稳定性和可控性,建议首先确立所有训练数据文件的相对次序,并在后续的训练阶段中,使用这一相对次序来替代 +``os.walk`` 方法。 + +运行下面的代码可获取数据顺序,并存为 txt 文件: + +.. code:: + + python xtuner/tools/get_data_order.py \ + --data-folder /path/to/tokenized/data \ + --save-folder /folder/to/save/data/order \ + --file-type ${file_type} + +其中,\ ``--file-type ${file_type}`` 表示需要统计所有以 ``${file_type}`` +为文件名后缀的文件的顺序。 + +例如,需要获取 ``/path/to/tokenized/data`` 路径下所有以 ``.bin`` +结尾的文件的顺序,并保存在当前路径下,那么上述命令需要改为: + +.. code:: + + python xtuner/tools/get_data_order.py \ + --data-folder /path/to/tokenized/data \ + --save-folder . \ + --file-type .bin + +同时,需要进一步修改 Step 2 中的 Config 文件,并设置数据顺序文件路径: + +.. code:: diff + + ... + ####################################################################### + # PART 3 Dataset & Dataloader # + ####################################################################### + train_dataset = dict( + type=build_packed_dataset, + dataset_cfg=dict( + type=load_intern_repo_tokenized_dataset, + - data_order_path=None, + + data_order_path='/folder/to/save/data/order/'+'data_order.txt', + folder=dataset_folder, + min_length=0, + file_type='.bin' + ), + packed_length=max_length, + seed=1024) + +Step 5, 启动训练 +---------------- + +在 slurm 集群调度系统中可以通过以下命令启动训练: + +.. code:: + + srun ${SRUN_ARGS} xtuner train internlm2_7b_w_tokenized_dataset_copy.py --launcher slurm --deepspeed deepspeed_zero1 + +若出现 OOM 现象,可尝试使用 zero2 或 zero3。以下命令可以使用 zero 3 +显存优化策略进行训练: + +.. code:: + + srun ${SRUN_ARGS} xtuner train internlm2_7b_w_tokenized_dataset_copy.py --launcher slurm --deepspeed deepspeed_zero3 + +在阿里云 DLC 中可通过以下命令启动训练: + +.. code:: diff + + export NCCL_IB_TC=136 + export NCCL_IB_SL=5 + export NCCL_IB_GID_INDEX=3 + export NCCL_SOCKET_IFNAME=bond0 + export NCCL_DEBUG=INFO + export NCCL_IB_HCA=mlx5 + export NCCL_IB_TIMEOUT=22 + export NCCL_IB_QPS_PER_CONNECTION=8 + export NCCL_NET_PLUGIN=none + + export NCCL_BUFFSIZE=2097152 + export PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:512 + - export EXP_NAME=debug + + export EXP_NAME=your_exp_name + export PYTHONPATH='.':$PYTHONPATH + source ~/.bashrc + + cd /path/to/xtuner + + conda activate conda_env_name + + export NPROC_PER_NODE=${KUBERNETES_CONTAINER_RESOURCE_GPU} + export PORT=${MASTER_PORT} + export NNODES=${WORLD_SIZE} + export NODE_RANK=${RANK} + export ADDR=${MASTER_ADDR} + + echo ${KUBERNETES_CONTAINER_RESOURCE_GPU} + echo ${WORLD_SIZE} + echo ${MASTER_PORT} + echo ${MASTER_ADDR} + echo ${RANK} + xtuner train internlm2_7b_w_tokenized_dataset_copy.py \ + --deepspeed deepspeed_zero1 \ + --work-dir work_dirs/${EXP_NAME} + +Step 6, 转模型 +-------------- + +deepspeed 转 hf: + +.. code:: + + python xtuner/tools/model_converters/pth_to_hf.py internlm2_7b_w_tokenized_dataset_copy.py /src/model/path /hf/dst/model/path + +hf 转 Turbomind: + +.. code:: + + lmdeploy convert internlm2-chat-7b /hf/dst/model/path --dst-path /turbomind/dst/model/path + +Step 7,Turbomind 评测 +---------------------- + +请参考 `OpenCompass LMDeploy +评测文档 `__\ 。 diff --git a/docs/zh_cn/internevo_migration/ftdp_dataset/Case2.rst b/docs/zh_cn/internevo_migration/ftdp_dataset/Case2.rst new file mode 100644 index 000000000..59a663d3e --- /dev/null +++ b/docs/zh_cn/internevo_migration/ftdp_dataset/Case2.rst @@ -0,0 +1,269 @@ +.. _case2: + +使用 Processed 数据集训练非 InternLM2 模型 +========================================== + +使用尚未 token 化的 ftdp 数据训练其他模型(以 Mistral 为例),且需要用 +Internlm2 对话模板覆盖原有对话模板以便让模型掌握 agent 、tool 能力。 + +Step 1, 离线处理数据集 +---------------------- + +ftdp 把 sft +任务的数据处理划分为三个类型,原始数据(origin)、预处理数据(processed)和 +token 过的数据(tokenized)。我们需要将预处理过的、具有统一格式的 ftdp +数据 token +化得到直接可以用于训练的格式。其中,预处理数据需要满足以下目录结构: + +.. code:: + + |-- processed-dir + |-- data1 + | |-- processed + | |-- sft_chat + | |-- data1.jsonl + |-- data2 + | |-- processed + | |-- sft_chat + | |-- data2.jsonl + +使用以下命令可离线 token 化 ftdp 格式的预处理数据(processed)数据集: + +.. code:: + + python xtuner/tools/tokenize_ftdp_datasets.py \ + --processed-dir /path/to/preprocessed/data \ + --tokenized-dir /path/to/tokenized/data \ + --tokenizer-path pretrained_model_name_or_path \ + --tokenizer-w-special-tokens-save-dir /path/to/save/new/tokenizer + +上述命令中: + +1. ``--processed-dir`` 需要指定预处理后的,具有 ftdp + 标准格式的数据路径(同 Case 1); + +2. ``--tokenized-dir`` 需要指定为 token 化后的数据存储路径(同 Case + 1); + +3. ``--tokenizer-path pretrained_model_name_or_path`` 中的 + ``pretrained_model_name_or_path`` 同 ``from_pretrained`` 接口中的 + ``pretrained_model_name_or_path``\ (同 Case 1); + +4. 由于除 Internlm2 外的其他模型(如 mistral 等)没有 internlm2-chat + 模型的智能体、工具调用等功能的对话模板,因此对于非 internlm2 + 模型,需要将 internlm2-chat + 对话模板中的一些特殊字符(如:<\|im_start\|>、<\|plugin\|>等)加入到新模型的 + tokenizer 的 special tokens 中,需要通过 + ``--tokenizer-w-special-tokens-save-dir`` 指定新 tokenizer + 的存储路径。\ **同时,后续训练过程需要使用新保存的 tokenizer 而非原始 + tokenizer。** + +Step 2, 导出模板 config 文件 +---------------------------- + +XTuner 中目前提供了训练 Mistral 的模板 config,使用命令: + +.. code:: + + xtuner copy-cfg mistral_7b_w_tokenized_dataset . + +可将训练 Mistral 的模板 config 导出至当前目录下。 + +Step 3, 修改模板 config 文件 +---------------------------- + +修改模板 config 文件中的训练数据路径为真实数据路径,其中 +``/path/to/tokenized/data`` 与 Step 1 中的 ``/path/to/tokenized/data`` +为同一个路径。同时,需要修改 tokenizer 路径为 Step 1 保存的路径 +``/path/to/save/new/tokenizer``\ 。 + +.. code:: diff + + ... + + ####################################################################### + # PART 1 Settings # + ####################################################################### + # Model + pretrained_model_name_or_path = 'mistralai/Mistral-7B-v0.1' + # 已经使用 Internlm2 的对话模板覆盖了 Mistral 的原有模板,new tokenizer 中已经 + # 添加了 Internlm2 对话模板中的特殊字符。 + # 请参考 docs/zh_cn/user_guides/finetune_custom_dataset.md + - tokenizer_path = '/new/tokenizer/path' + + tokenizer_path = '/path/to/save/new/tokenizer' + use_varlen_attn = True + + # Data + - dataset_folder = '/path/to/sft/data/folder' + + dataset_folder = '/path/to/tokenized/data/chatml_llamav13_32k/train' + # 已经使用 Internlm2 的对话模板覆盖了 Mistral 的原有模板 + prompt_template = PROMPT_TEMPLATE.internlm2_chat + max_length = 32768 + pack_to_max_length = True + ... + +在使用 DeepSpeed 训练模型时,如需在保存 checkpoint +时只保存模型权重,而不保存优化器状态,可参考以下步骤: + +1. 确保 mmengine 版本大于等于 0.10.3 + +.. code:: + + pip install 'mmengine>=0.10.3' + +2. 修改 Config 文件,CheckpointHook 增加 save_optimizer=False + +.. code:: diff + + default_hooks = dict( + # record the time of every iteration. + timer=dict(type=IterTimerHook), + # print log every 100 iterations. + logger=dict(type=LoggerHook, interval=1), + # enable the parameter scheduler. + param_scheduler=dict(type=ParamSchedulerHook), + # save checkpoint per epoch. + checkpoint=dict( + type=CheckpointHook, + + save_optimizer=False, + by_epoch=False, + interval=save_steps, + max_keep_ckpts=save_total_limit), + # set sampler seed in distributed evrionment. + sampler_seed=dict(type=DistSamplerSeedHook), + ) + +.. note:: + + 需要注意,经过以上设置后,训练过程不可 resume 。 + +.. _step-4-获取数据顺序-可选): + +Step 4, 获取数据顺序 (可选) +----------------------------- + +训练数据的提供顺序可能会对模型的最终训练成果产生影响。鉴于不同集群中通过 +``os.walk`` +方法所得到的结果可能存在差异,为了确保训练结果的稳定性和可控性,建议首先确立所有训练数据文件的相对次序,并在后续的训练阶段中,使用这一相对次序来替代 +``os.walk`` 方法。 + +运行下面的代码可获取数据顺序,并存为 txt 文件: + +.. code:: + + python xtuner/tools/get_data_order.py \ + --data-folder /path/to/tokenized/data \ + --save-folder /folder/to/save/data/order \ + --file-type ${file_type} + +其中,\ ``--file-type ${file_type}`` 表示需要统计所有以 ``${file_type}`` +为文件名后缀的文件的顺序。 + +例如,需要获取 ``/path/to/tokenized/data`` 路径下所有以 ``.bin`` +结尾的文件的顺序,并保存在当前路径下,那么上述命令需要改为: + +.. code:: + + python xtuner/tools/get_data_order.py \ + --data-folder /path/to/tokenized/data \ + --save-folder . \ + --file-type .bin + +同时,需要进一步修改 Step 2 中的 Config 文件,并设置数据顺序文件路径: + +.. code:: diff + + ... + ####################################################################### + # PART 3 Dataset & Dataloader # + ####################################################################### + train_dataset = dict( + type=build_packed_dataset, + dataset_cfg=dict( + type=load_intern_repo_tokenized_dataset, + - data_order_path=None, + + data_order_path='/folder/to/save/data/order/'+'data_order.txt', + folder=dataset_folder, + min_length=0, + file_type='.bin' + ), + packed_length=max_length, + seed=1024) + +Step 5, 启动训练 +---------------- + +注:训练前期(几十个 iters)loss 偏高是正常现象,因为模型需要时间学习 +Internlm2 的对话模板。 + +在 slurm 集群调度系统中可以通过以下命令启动训练: + +.. code:: + + srun ${SRUN_ARGS} xtuner train mistral_7b_w_tokenized_dataset_copy.py --launcher slurm --deepspeed deepspeed_zero1 + +若出现 OOM 现象,可尝试使用 zero2 或 zero3。以下命令可以使用 zero 3 +显存优化策略进行训练: + +.. code:: + + srun ${SRUN_ARGS} xtuner train internlm2_7b_w_tokenized_dataset_copy.py --launcher slurm --deepspeed deepspeed_zero3 + +在阿里云 DLC 中可通过以下命令启动训练: + +.. code:: diff + + export NCCL_IB_TC=136 + export NCCL_IB_SL=5 + export NCCL_IB_GID_INDEX=3 + export NCCL_SOCKET_IFNAME=bond0 + export NCCL_DEBUG=INFO + export NCCL_IB_HCA=mlx5 + export NCCL_IB_TIMEOUT=22 + export NCCL_IB_QPS_PER_CONNECTION=8 + export NCCL_NET_PLUGIN=none + + export NCCL_BUFFSIZE=2097152 + export PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:512 + - export EXP_NAME=debug + + export EXP_NAME=your_exp_name + export PYTHONPATH='.':$PYTHONPATH + source ~/.bashrc + + cd /path/to/xtuner + + conda activate conda_env_name + + export NPROC_PER_NODE=${KUBERNETES_CONTAINER_RESOURCE_GPU} + export PORT=${MASTER_PORT} + export NNODES=${WORLD_SIZE} + export NODE_RANK=${RANK} + export ADDR=${MASTER_ADDR} + + echo ${KUBERNETES_CONTAINER_RESOURCE_GPU} + echo ${WORLD_SIZE} + echo ${MASTER_PORT} + echo ${MASTER_ADDR} + echo ${RANK} + xtuner train mistral_7b_w_tokenized_dataset_copy.py \ + --deepspeed deepspeed_zero1 \ + --work-dir work_dirs/${EXP_NAME} + +Step 6, 转模型 +-------------- + +deepspeed 转 hf: + +.. code:: + + python xtuner/tools/model_converters/pth_to_hf.py mistral_7b_w_tokenized_dataset_copy.py /src/model/path /hf/dst/model/path + +hf 转 Turbomind: + +.. code:: + + lmdeploy convert internlm2-chat-7b /hf/dst/model/path --dst-path /turbomind/dst/model/path + +Step 7,Turbomind 评测 +---------------------- + +请参考 `OpenCompass LMDeploy +评测文档 `__\ 。 diff --git a/docs/zh_cn/internevo_migration/ftdp_dataset/Case3.rst b/docs/zh_cn/internevo_migration/ftdp_dataset/Case3.rst new file mode 100644 index 000000000..a4f3da8b1 --- /dev/null +++ b/docs/zh_cn/internevo_migration/ftdp_dataset/Case3.rst @@ -0,0 +1,165 @@ +.. _case3: + +使用 Processed 普通对话数据集训任意模型 +======================================= + +使用尚未 token 化的 ftdp +数据进行训练,保持待训练模型的对话模板不变,且不需要进行离线处理的场景。 + +Step 1, 导出模板 config 文件 +---------------------------- + +XTuner 中目前提供了训练 Internlm2 的模板 config,使用命令: + +.. code:: + + xtuner copy-cfg internlm2_7b_w_untokenized_dataset . + +可将训练 Internlm2 的模板 config 导出至当前目录下。 + +Step 2, 修改模板 config 文件 +---------------------------- + +修改模板 config 文件中的训练数据路径为真实数据路径,路径中的所有以 +``.json`` 为后缀的数据将会作为训练数据: + +.. code:: diff + + ... + + ####################################################################### + # PART 1 Settings # + ####################################################################### + # Model + pretrained_model_name_or_path = 'internlm/internlm2-7b' + use_varlen_attn = True + + # Data + - dataset_folder = '/mnt/petrelfs/share_data/caoweihan/v1_sample_with_legal_cate' + + dataset_folder = '/path/to/untokenized/data' + prompt_template = PROMPT_TEMPLATE.internlm2_chat + max_length = 32768 + pack_to_max_length = True + ... + +.. _step-3-获取数据顺序-可选): + +Step 3, 获取数据顺序 (可选) +----------------------------- + +训练数据的提供顺序可能会对模型的最终训练成果产生影响。鉴于不同集群中通过 +``os.walk`` +方法所得到的结果可能存在差异,为了确保训练结果的稳定性和可控性,建议首先确立所有训练数据文件的相对次序,并在后续的训练阶段中,使用这一相对次序来替代 +``os.walk`` 方法。 + +运行下面的代码可获取数据顺序,并存为 txt 文件: + +.. code:: + + python xtuner/tools/get_data_order.py \ + --data-folder /path/to/untokenized/data \ + --save-folder /folder/to/save/data/order \ + --file-type ${file_type} + +其中,\ ``--file-type ${file_type}`` 表示需要统计所有以 ``${file_type}`` +为文件名后缀的文件的顺序。 + +例如,需要获取 ``/path/to/untokenized/data`` 路径下所有以 ``.json`` +结尾的文件的顺序,并保存在当前路径下,那么上述命令需要改为: + +.. code:: + + python xtuner/tools/get_data_order.py \ + --data-folder /path/to/untokenized/data \ + --save-folder . \ + --file-type .json + +同时,需要进一步修改 Step 2 中的 Config 文件,并设置数据顺序文件路径: + +.. code:: diff + + ... + ####################################################################### + # PART 3 Dataset & Dataloader # + ####################################################################### + train_dataset = dict( + type=build_packed_dataset, + dataset_cfg=dict( + type=load_intern_repo_tokenized_dataset, + - data_order_path=None, + + data_order_path='/folder/to/save/data/order/'+'data_order.txt', + folder=dataset_folder, + min_length=0, + - file_type='.bin' # 指定 data_order_path 后,file_type 参数就不需要设置了 + ), + packed_length=max_length, + seed=1024) + +Step 4, 启动训练 +---------------- + +在 slurm 集群调度系统中可以通过以下命令启动训练: + +.. code:: + + srun ${SRUN_ARGS} xtuner train internlm2_7b_w_untokenized_dataset_copy.py --launcher slurm --deepspeed deepspeed_zero1 + +若出现 OOM 现象,可尝试使用 zero2 或 zero3。以下命令可以使用 zero 3 +显存优化策略进行训练: + +.. code:: + + srun ${SRUN_ARGS} xtuner train internlm2_7b_w_tokenized_dataset_copy.py --launcher slurm --deepspeed deepspeed_zero3 + +在阿里云 DLC 中可通过以下命令启动训练: + +.. code:: diff + + export NCCL_IB_TC=136 + export NCCL_IB_SL=5 + export NCCL_IB_GID_INDEX=3 + export NCCL_SOCKET_IFNAME=bond0 + export NCCL_DEBUG=INFO + export NCCL_IB_HCA=mlx5 + export NCCL_IB_TIMEOUT=22 + export NCCL_IB_QPS_PER_CONNECTION=8 + export NCCL_NET_PLUGIN=none + + export NCCL_BUFFSIZE=2097152 + export PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:512 + - export EXP_NAME=debug + + export EXP_NAME=your_exp_name + export PYTHONPATH='.':$PYTHONPATH + source ~/.bashrc + + cd /path/to/xtuner + + conda activate conda_env_name + + export NPROC_PER_NODE=${KUBERNETES_CONTAINER_RESOURCE_GPU} + export PORT=${MASTER_PORT} + export NNODES=${WORLD_SIZE} + export NODE_RANK=${RANK} + export ADDR=${MASTER_ADDR} + + echo ${KUBERNETES_CONTAINER_RESOURCE_GPU} + echo ${WORLD_SIZE} + echo ${MASTER_PORT} + echo ${MASTER_ADDR} + echo ${RANK} + xtuner train internlm2_7b_w_untokenized_dataset_copy.py \ + --deepspeed deepspeed_zero1 \ + --work-dir work_dirs/${EXP_NAME} + +Step 5, 转模型 +-------------- + +deepspeed 转 hf: + +.. code:: + + python xtuner/tools/model_converters/pth_to_hf.py internlm2_7b_w_untokenized_dataset_copy.py /src/model/path /hf/dst/model/path + +hf 转 Turbomind: + +.. code:: + + lmdeploy convert internlm2-chat-7b /hf/dst/model/path --dst-path /turbomind/dst/model/path diff --git a/docs/zh_cn/internevo_migration/ftdp_dataset/Case4.rst b/docs/zh_cn/internevo_migration/ftdp_dataset/Case4.rst new file mode 100644 index 000000000..ea5bc5cb1 --- /dev/null +++ b/docs/zh_cn/internevo_migration/ftdp_dataset/Case4.rst @@ -0,0 +1,204 @@ +.. _case4: + +使用 Tokenized 数据集训练 InternLM2 +=================================== + +使用已经 token 化的 ftdp 数据训练 Internlm2 模型。 + +Step 1, 导出模板 config 文件 +---------------------------- + +XTuner 中目前提供了训练 Internlm2 的模板 config,使用命令: + +.. code:: + + xtuner copy-cfg internlm2_7b_w_tokenized_dataset . + +可将训练 Internlm2 的模板 config 导出至当前目录下。 + +Step 2, 修改模板 config 文件 +---------------------------- + +修改模板 config 文件中的训练数据路径为真实数据路径: + +.. code:: diff + + ... + + ####################################################################### + # PART 1 Settings # + ####################################################################### + # Model + pretrained_model_name_or_path = 'internlm/internlm2-7b' + use_varlen_attn = True + + # Data + - dataset_folder = '/path/to/sft/data/folder' + + dataset_folder = '/path/to/tokenized/data/chatml_llamav13_32k/train' + prompt_template = PROMPT_TEMPLATE.internlm2_chat + max_length = 32768 + pack_to_max_length = True + ... + +在使用 DeepSpeed 训练模型时,如需在保存 checkpoint +时只保存模型权重,而不保存优化器状态,可参考以下步骤: + +1. 确保 mmengine 版本大于等于 0.10.3 + +.. code:: + + pip install 'mmengine>=0.10.3' + +2. 修改 Config 文件,CheckpointHook 增加 save_optimizer=False + +.. code:: diff + + default_hooks = dict( + # record the time of every iteration. + timer=dict(type=IterTimerHook), + # print log every 100 iterations. + logger=dict(type=LoggerHook, interval=1), + # enable the parameter scheduler. + param_scheduler=dict(type=ParamSchedulerHook), + # save checkpoint per epoch. + checkpoint=dict( + type=CheckpointHook, + + save_optimizer=False, + by_epoch=False, + interval=save_steps, + max_keep_ckpts=save_total_limit), + # set sampler seed in distributed evrionment. + sampler_seed=dict(type=DistSamplerSeedHook), + ) + +.. note:: + + 需要注意,经过以上设置后,训练过程不可 resume 。 + +.. _case4-step3: + +Step 3, 获取数据顺序 (可选) +----------------------------- + +训练数据的提供顺序可能会对模型的最终训练成果产生影响。鉴于不同集群中通过 +``os.walk`` +方法所得到的结果可能存在差异,为了确保训练结果的稳定性和可控性,建议首先确立所有训练数据文件的相对次序,并在后续的训练阶段中,使用这一相对次序来替代 +``os.walk`` 方法。 + +运行下面的代码可获取数据顺序,并存为 txt 文件: + +.. code:: + + python xtuner/tools/get_data_order.py \ + --data-folder /path/to/tokenized/data \ + --save-folder /folder/to/save/data/order \ + --file-type ${file_type} + +其中,\ ``--file-type ${file_type}`` 表示需要统计所有以 ``${file_type}`` +为文件名后缀的文件的顺序。 + +例如,需要获取 ``/path/to/tokenized/data`` 路径下所有以 ``.bin`` +结尾的文件的顺序,并保存在当前路径下,那么上述命令需要改为: + +.. code:: + + python xtuner/tools/get_data_order.py \ + --data-folder /path/to/tokenized/data \ + --save-folder . \ + --file-type .bin + +同时,需要进一步修改 Step 2 中的 Config 文件,并设置数据顺序文件路径: + +.. code:: diff + + ... + ####################################################################### + # PART 3 Dataset & Dataloader # + ####################################################################### + train_dataset = dict( + type=build_packed_dataset, + dataset_cfg=dict( + type=load_intern_repo_tokenized_dataset, + - data_order_path=None, + + data_order_path='/folder/to/save/data/order/'+'data_order.txt', + folder=dataset_folder, + min_length=0, + file_type='.bin' + ), + packed_length=max_length, + seed=1024) + +Step 4, 启动训练 +---------------- + +在 slurm 集群调度系统中可以通过以下命令启动训练: + +.. code:: + + srun ${SRUN_ARGS} xtuner train internlm2_7b_w_tokenized_dataset_copy.py --launcher slurm --deepspeed deepspeed_zero1 + +若出现 OOM 现象,可尝试使用 zero2 或 zero3。以下命令可以使用 zero 3 +显存优化策略进行训练: + +.. code:: + + srun ${SRUN_ARGS} xtuner train internlm2_7b_w_tokenized_dataset_copy.py --launcher slurm --deepspeed deepspeed_zero3 + +在阿里云 DLC 中可通过以下命令启动训练: + +.. code:: diff + + export NCCL_IB_TC=136 + export NCCL_IB_SL=5 + export NCCL_IB_GID_INDEX=3 + export NCCL_SOCKET_IFNAME=bond0 + export NCCL_DEBUG=INFO + export NCCL_IB_HCA=mlx5 + export NCCL_IB_TIMEOUT=22 + export NCCL_IB_QPS_PER_CONNECTION=8 + export NCCL_NET_PLUGIN=none + + export NCCL_BUFFSIZE=2097152 + export PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:512 + - export EXP_NAME=debug + + export EXP_NAME=your_exp_name + export PYTHONPATH='.':$PYTHONPATH + source ~/.bashrc + + cd /path/to/xtuner + + conda activate conda_env_name + + export NPROC_PER_NODE=${KUBERNETES_CONTAINER_RESOURCE_GPU} + export PORT=${MASTER_PORT} + export NNODES=${WORLD_SIZE} + export NODE_RANK=${RANK} + export ADDR=${MASTER_ADDR} + + echo ${KUBERNETES_CONTAINER_RESOURCE_GPU} + echo ${WORLD_SIZE} + echo ${MASTER_PORT} + echo ${MASTER_ADDR} + echo ${RANK} + xtuner train internlm2_7b_w_tokenized_dataset_copy.py \ + --deepspeed deepspeed_zero1 \ + --work-dir work_dirs/${EXP_NAME} + +Step 5, 转模型 +-------------- + +deepspeed 转 hf: + +.. code:: + + python xtuner/tools/model_converters/pth_to_hf.py internlm2_7b_w_tokenized_dataset_copy.py /src/model/path /hf/dst/model/path + +hf 转 Turbomind: + +.. code:: + + lmdeploy convert internlm2-chat-7b /hf/dst/model/path --dst-path /turbomind/dst/model/path + +Step 6,Turbomind 评测 +---------------------- + +请参考 `OpenCompass LMDeploy +评测文档 `__\ 。 diff --git a/docs/zh_cn/internevo_migration/ftdp_dataset/README.md b/docs/zh_cn/internevo_migration/ftdp_dataset/README.md new file mode 100644 index 000000000..6299fa7df --- /dev/null +++ b/docs/zh_cn/internevo_migration/ftdp_dataset/README.md @@ -0,0 +1,24 @@ +ftdp 是一个闭源的处理数据工具,开源社区用户可以忽略此文档。 + +本节介绍了常见的 4 种使用 ftdp 数据集训练的使用场景: + +- [Case 1: 使用 Processed 数据集训练 InternLM2](Case1.rst) +- [Case 2: 使用 Processed 数据集训练非 InternLM2 模型](Case2.rst) +- [Case 3: 使用 Processed 普通对话数据集训任意模型](Case3.rst) +- [Case 4: 使用 Tokenized 数据集训练 InternLM2](Case4.rst) + +请先参考下方流程图,选择自己的使用场景。其中,开源版 internlm2-chat 模型所使用的训练数据集对应流程图中的 Case 4。 + +```mermaid +graph TD; + A{ftdp 数据} + A -->|是| B{数据 tokenized} + B -->|否| C{使用 Internlm2 对话模板} + C -->|是| D{训练 Internlm2 } + D -->|是| E[Case 1] + D -->|否| F[Case 2] + C -->|否| G{离线处理数据集} + G -->|是| H[尚不支持] + G -->|否| I[Case 3] + B -->|是| J[Case 4] +``` diff --git a/docs/zh_cn/internevo_migration/internevo_migration.rst b/docs/zh_cn/internevo_migration/internevo_migration.rst new file mode 100644 index 000000000..b394ff14a --- /dev/null +++ b/docs/zh_cn/internevo_migration/internevo_migration.rst @@ -0,0 +1,323 @@ +InternEvo 迁移 +============== + +总览 +----------- + +XTuner 可以复现 InternEvo (train_internlm) 仓库训练得到的开源模型 +internlm/internlm2-chat-7b 的训练精度。 + +下面是 XTuner 和 InternEvo (train_internlm) +在相同数据集上训练相同基座模型的训练结果对比: + +.. list-table:: + :widths: 50 25 25 + :header-rows: 1 + + * - 能力类别 + - xtuner + - internevo + * - 全数据集平均(无智能体) + - 56.44 + - 55.26 + * - 全维度平均(无智能体) + - 49.58 + - 48.96 + * - 语言 Language + - 64.77 + - 62.41 + * - 知识 Knowledge + - 52.24 + - 52.52 + * - 推理 Reasoning + - 65.5 + - 63.91 + * - 数学 Mathematics + - 30.95 + - 30.26 + * - 代码 Coding + - 38.91 + - 41.06 + * - 长文本 LongEval + - 45.09 + - 43.62 + * - 智能体 Agent + - 44.85 + - 43.97 + * - 数学题智能体 + - 37 + - 37.19 + * - CIBench + - 79.07 + - 69.78 + * - PluginEval + - 65.57 + - 65.62 + +64 \* A100 的训练时间对比如下: + +=========== ========== +xtuner internevo +=========== ========== +15 h 55 min 16h 09 min +=========== ========== + +注:使用 XTuner 提供的序列并行算法可以进一步提升训练速度,使用方式请参考 +\ :ref:`序列并行文档 ` \ 。 + +在从 InternEvo (train_internlm) 向 XTuner +迁移的过程中,我们需要关注模型、数据以及训练策略这三个方面的适配问题。后续内容将详细阐述如何进行适配。 + +适配 +--------- + +模型 +~~~~ + +InternEvo 在训练时读取和保存的模型权重满足以下目录结构(以 tp2pp2 +为例): + +.. code:: + + |-- root + |-- model_config.pt + |-- model_tp0_pp0.pt + |-- model_tp0_pp1.pt + |-- model_tp1_pp0.pt + |-- model_tp1_pp1.pt + +其中,\ ``model_config.pt`` 保存模型权重的一些 meta 信息,其余 4 个 +checkpoint 则分别保存 4 组 GPUs 上的模型权重。因此,InternEvo +训练过程中要求读取预训练权重的 tp、pp 策略与训练使用的 tp、pp +策略一致才能正常读取预训练权重进行训练。 + +XTuner 支持基于 Huggingface Hub 上的模型进行训练,如下修改 config +内容即可将基座模型从 internlm2-7b 切换为 internlm2-20b: + +.. code:: diff + + ####################################################################### + # PART 1 Settings # + ####################################################################### + # Model + - pretrained_model_name_or_path = 'internlm/internlm2-7b' + + pretrained_model_name_or_path = 'internlm/internlm2-20b' + +数据 +~~~~ + +InternEvo +在训练过程中通常会把多条数据拼接为一个特定的最大长度,随后输入模型训练。其配置往往满足以下形式: + +.. code:: python + + data = dict( + seq_len=SEQ_LEN, + pack_sample_into_one=False, + min_length=MIN_LENGTH, + train_folder=TRAIN_FOLDER, + dataset_weights=DATASET_WEIGHTS, + ...) + +其中,数据配比 (``dataset_weights=DATASET_WEIGHTS``) 功能 XTuner +尚未支持。\ ``TRAIN_FOLDER`` 中的训练数据需要满足 ftdp tokenized +数据集格式: + +.. code:: + + |-- TRAIN_FOLDER + |-- cn + | |-- dataset1 + | | |-- data1.bin + | | |-- data1.bin.meta + | |-- dataset2 + | | |-- data2.bin + | | |-- data2.bin.meta + +在 XTuner 中实现在线数据集拼接策略需要参考 +``xtuner/configs/internlm/internlm2_7b/internlm2_7b_w_internevo_dataset.py`` +文件中的配置: + +.. code:: diff + + ####################################################################### + # PART 1 Settings # + ####################################################################### + # Data + - dataset_folder = '/path/to/sft/data/folder' + + dataset_folder = TRAIN_FOLDER + - max_length = 32768 + + max_length = SEQ_LEN + + ####################################################################### + # PART 3 Dataset & Dataloader # + ####################################################################### + train_dataset = dict( + type=build_packed_dataset, + dataset_cfg=dict( + type=load_intern_repo_tokenized_dataset, + data_order_path=None, + folder=dataset_folder, + - min_length=0, + + min_length=MIN_LENGTH, + file_type='.bin'), + packed_length=max_length, + seed=1024) + +.. note:: + + 需要注意,由于训练数据喂给模型的先后顺序可能对训练结果造成影响,因此建议不要轻易修改上述配置中的 ``seed`` 选项。同时,可参考 \ :ref:`获取数据顺序 ` \ 进一步固定数据顺序。 + +训练策略 +~~~~~~~~ + +变长注意力 (Variable Length Flash Attention) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +InternEvo 通过设置 +`数据配置 `__ +中的 ``pack_sample_into_one`` 参数为 False +来使用“变长注意力机制”(见下图右侧)。 + +.. code:: python + + data = dict( + pack_sample_into_one=False, + ...) + +.. raw:: html + +
+ +

+
+ +在 XTuner 中使用这一功能需要设置 config 中的 ``use_varlen_attn`` 配置为 +True,即可保证训练行为与 InternEvo 一致: + +.. code:: diff + + ... + ####################################################################### + # PART 1 Settings # + ####################################################################### + # Model + pretrained_model_name_or_path = 'internlm/internlm2-7b' + - use_varlen_attn = False + + use_varlen_attn = True + ... + +.. + + | [!IMPORTANT] + | 需要注意,当设置 ``use_varlen_attn = True`` 后,请确保 + ``batch_size`` 被设置为 1,且 ``pack_to_max_length`` 被设置为 + True。 + +.. _batchsize-与-accumulativecounts: + +batch_size 与 accumulative_counts +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +在 InternEvo 的配置中,与 batch_size 和 accumulative_counts +相关的配置有如下几个: + +.. code:: python + + data = dict( + # micro_num means the number of micro_batch contained in one gradient update + micro_num=MICRO_NUM, + # MICRO_BATCH_SIZE * SEQ_LEN = PACKED_LENGTH + micro_bsz=MICRO_BATCH_SIZE, + total_steps=TOTAL_STEP, + # 梯度累计,默认等于MICRO_NUM(BS) + gradient_accumulation=GRADIENT_ACCUMULATION, + ...) + +其中: + +1. ``micro_num`` 与 ``gradient_accumulation`` + 通常具有相同含义,其数值默认相等。 + +2. ``total_steps`` 在 XTuner 中可以不手动指定,可通过 ``max_epochs`` + 指定。 + +3. XTuner 目前只支持 ``micro_bsz = 1`` 。 + +为对齐以上配置,可参考 XTuner 中 +``xtuner/configs/internlm/internlm2_7b/internlm2_7b_w_internevo_dataset.py`` +文件中的配置,并进行如下修改: + +.. code:: diff + + ####################################################################### + # PART 1 Settings # + ####################################################################### + # Scheduler & Optimizer + - accumulative_counts = 1 + + accumulative_counts = MICRO_NUM # or GRADIENT_ACCUMULATION + - max_epochs = 1 + + max_epochs = MAX_EPOCHS + +并行训练 +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +ZeRO 系列显存优化 +''''''''''''''''' + +XTuner 支持使用 ZeRO 系列显存优化降低训练过程中的显存消耗: + +.. code:: bash + + # 单卡 + xtuner train ${CONFIG_NAME_OR_PATH} --deepspeed deepspeed_zero2 + # 多卡 + (DIST) NPROC_PER_NODE=${GPU_NUM} xtuner train ${CONFIG_NAME_OR_PATH} --deepspeed deepspeed_zero2 + (SLURM) srun ${SRUN_ARGS} xtuner train ${CONFIG_NAME_OR_PATH} --launcher slurm --deepspeed deepspeed_zero2 + +- ``--deepspeed`` 表示使用 + `DeepSpeed `__ 🚀 + 来优化训练过程。XTuner 内置了多种策略,包括 ZeRO-1、ZeRO-2、ZeRO-3 。 + +序列并行 +'''''''' + +InternEvo 中支持了 Data Parallel、Tensor Parallel、Pipeline Parallel 和 +Sequence Parallel 四种并行策略。XTuner 目前支持了 Data Parallel 和 +Sequence Parallel 两种并行策略,可满足基本全部的训练需求(搭配 zero3 +显存优化策略可支持 70B 模型 256K 上下文训练)。 + +假定 InternEvo 训练过程中:tp_world_size = TP, pp_world_size = PP, +sequence_parallel = True。则训练的 global_batch_size 满足以下计算公式: + +.. code:: + + # 多除的一个 TP 是因为启用了 sequence parallel + global_batch_size = num_gpus * batch_size_per_device * gradient_accumulate / TP / PP / TP + +需要注意的是,internlm2-chat 的训练过程中通常启用了 +\ :ref:`“变长注意力” ` \ 策略,此时 ``单卡 batch size 等于 2,拼接数据集至最大长度 2k`` 的配置与 +``单卡 batch size 等于 1,拼接数据集至最大长度 4k`` +的配置训练行为是近似的,因此 XTuner 目前只支持了 +``batch_size_per_device = 1`` 的情况。因此,若想使用 XTuner 训练时保证 +global_batch_size 与 InternEvo 一致,需要在配置文件中综合调整 +``gradient_accumulate`` 和 ``sequence_parallel_size`` 两项的数值: + +.. code:: diff + + + from xtuner.parallel.sequence import SequenceParallelSampler + + + sequence_parallel_size = SP + - accumulative_counts = 1 # 1bs * 1acc * 64gpu = 64 batchsize + + accumulative_counts = TP * PP * TP / SP + + ####################################################################### + # PART 3 Dataset & Dataloader # + ####################################################################### + train_dataloader = dict( + - sampler=dict(type=DefaultSampler, shuffle=True), + + sampler=dict(type=SequenceParallelSampler, shuffle=True), + ...) + +XTuner 序列并行的详细用法请参考 +\ :ref:`序列并行文档 ` \ 。 diff --git a/xtuner/configs/internlm/internlm2_7b/internlm2_7b_w_tokenized_dataset.py b/xtuner/configs/internlm/internlm2_7b/internlm2_7b_w_internevo_dataset.py similarity index 100% rename from xtuner/configs/internlm/internlm2_7b/internlm2_7b_w_tokenized_dataset.py rename to xtuner/configs/internlm/internlm2_7b/internlm2_7b_w_internevo_dataset.py