华为云用户手册

  • 权限清单 权限 表1 训练作业所需权限 业务场景 依赖的服务 依赖策略项 支持的功能 配置建议 训练管理 ModelArts modelarts:trainJob:* modelarts:trainJobLog:* modelarts:aiAlgorithm:* modelarts:image:list modelarts:network:get modelarts:workspace:get 创建训练作业和查看训练日志。 建议配置。 仅在严格授权模式开启后,需要显式配置左侧权限。 modelarts:workspace:getQuotas 查询工作空间配额。如果开通了工作空间功能,则需要配置此权限。 按需配置。 modelarts:tag:list 在训练作业中使用标签管理服务TMS。 按需配置。 IAM iam:credentials:listCredentials iam:agencies:listAgencies 使用配置的委托授权项。 按需配置。 SFS Turbo sfsturbo:shares:getShare sfsturbo:shares:getAllShares 在训练作业中使用SFS Turbo。 按需配置。 SWR swr:repository:listTags swr:repository:getRepository swr:repository:listRepositories 使用自定义镜像运行训练作业。 按需配置。 SMN smn:topic:publish smn:topic:list 通过SMN通知训练作业状态变化事件。 按需配置。 OBS obs:bucket:ListAllMybuckets obs:bucket:HeadBucket obs:bucket:ListBucket obs:bucket:GetBucketLocation obs:object:GetObject obs:object:GetObjectVersion obs:object:PutObject obs:object:DeleteObject obs:object:DeleteObjectVersion obs:object:ListMultipartUploadParts obs:object:AbortMultipartUpload obs:object:GetObjectAcl obs:object:GetObjectVersionAcl obs:bucket:PutBucketAcl obs:object:PutObjectAcl obs:object:ModifyObjectMetaData 使用OBS桶中的数据集运行训练作业。 按需配置。 委托 表2 训练作业所需委托 业务场景 依赖的服务 委托授权项 说明 配置建议 训练作业 OBS obs:bucket:ListBucket obs:object:GetObject obs:object:PutObject 训练作业启动前下载数据、模型、代码。 训练作业运行中上传日志、模型。 建议配置。
  • 预训练超参配置 本章节介绍预训练前的超参配置,可以根据实际需要修改。 预训练脚本pretrain-llama2-13b.sh,存放在AscendCloud-3rdLLM-6.3.902/llm_train/AscendSpeed/scripts/llama2目录下。训练前,可以根据实际需要修改超参配置。 表1 超参配置 参数 值 参数说明 DATA_PATH /home/ma-user/ws/datasets/alpaca/llama2-13B/alpaca_text_document 必填。训练时指定的输入数据路径。一般为数据地址/处理后的数据前缀名,不加文件类型后缀。 请根据实际规划修改。 TOKENIZER_PATH /home/ma-user/ws/tokenizers/llama2-13b-hf 必填。tokenizer保存地址。 SAVE_PATH $PWD/ckpt 中间保存结果,包含训练日志。 SAVE_CKPT_PATH ${SAVE_PATH}/ckpt-llama2-13b 必填。训练ckpt保存地址。 MODEL_TYPE 13B 模型加载类型,默认为13B。 TRAIN_ITERS 2000 训练迭代周期。根据实际需要修改。 MBS 4 流水线并行中一个micro batch所处理的样本量。在流水线并行中,为了减少气泡时间,会将一个step的数据切分成多个micro batch。 默认值4。 GBS 64 训练中所有机器一个step所处理的样本量。影响每一次训练迭代的时长,建议值单机64,双机128。 TP 8 张量并行。 PP 1 流水线并行。 lr 0.00015 学习率,非必填,默认值3.0e-4 RUN_TYPE pretrain 训练脚本类型:pretrain。 父主题: 预训练
  • 监控资源 用户可以通过资源占用情况窗口查看计算节点的资源使用情况,最多可显示最近三天的数据。在资源占用情况窗口打开时,会定期向后台获取最新的资源使用率数据并刷新。 操作一:如果训练作业使用多个计算节点,可以通过实例名称的下拉框切换节点。 操作二:单击图例“cpuUsage”、“gpuMemUsage”、“gpuUtil”、“memUsage”“npuMemUsage”、“npuUtil”、可以添加或取消对应参数的使用情况图。 操作三:鼠标悬浮在图片上的时间节点,可查看对应时间节点的占用率情况。 表1 参数说明 参数 说明 cpuUsage cpu使用率。 gpuMemUsage gpu内存使用率。 gpuUtil gpu使用情况。 memUsage 内存使用率。 npuMemUsage npu内存使用率。 npuUtil npu使用情况。 父主题: 单机单卡
  • Step1 修改预训练脚本 执行命令如下,进入AscendSpeed代码目录。 cd .. #退出当前目录 cd /home/ma-user/ws/AscendCloud-3rdLLM-6.3.902/llm_train/AscendSpeed/ #进入/home/ma-user/ws/AscendCloud-3rdLLM-6.3.902/llm_train/AscendSpeed/目录 执行如下命令修改Llama2-13b的SFT全参微调脚本sft-llama2-13b.sh。 vim scripts/llama2/sft-llama2-13b.sh 修改脚本内容,与预训练参数保持一致,不同点为RUN_TYPE类型不同,RUN_TYPE=sft;以及输入输出路径的配置的不同。 datasets_PATH #预处理后的数据地址:*注意:一般为数据地址/数据前缀名 TOKENIZER_PATH #tokeneizer地址 SAVE_PATH # 中间保存结果 包含日志 SAVE_CKPT_PATH #训练ckpt保存地址 MODEL_PATH #SFT全参微调权重加载地址 MASTER_ADDR=${1:-localhost} # 主节点的ip地址,默认为localhost,多机多卡训练时需指定主节点IP地址。 MASTER_PORT=12331 #任务运行端口号 NNODES=${2:-1} # 节点总数,默认为1 NODE_RANK=${3:-0} # 当前节点id,默认从0开始 MODEL_TYPE=13B #模型加载类型 TRAIN_ITERS=2000 #训练迭代周期 MBS=4 #流水线并行中一个micro batch所处理的样本量 GBS=64 #训练中所有机器一个step所处理的样本量,建议单机64,双机128。 TP=8 #张量并行 PP=1 #流水线并行 RUN_TYPE=sft #训练类型:pretrain、sft、loral,sft表示训练类型是SFT全参微调 修改完后,保存退出。 :wq
  • 查看性能 训练性能主要通过训练日志中的2个指标查看,吞吐量和loss收敛情况。 吞吐量:日志里存在samples per second参数。samples per second*seq_lenth/总卡数得到tokens/s/p,seq_lenth取值在训练脚本中可以查看,本示例中为4096。单机8卡吞吐量一般为1650tokens/s/p;双机16卡吞吐量一般为1625tokens/s/p。 loss收敛情况:日志里存在lm loss参数 ,lm loss参数随着训练迭代周期持续性减小,并逐渐趋于稳定平缓。也可以使用可视化工具TrainingLogParser查看loss收敛情况,如图2所示。 单节点训练:训练过程中的loss直接打印在窗口上。 多节点训练:训练过程中的loss打印在最后一个节点上。 图2 Loss收敛情况
  • 操作步骤 登录Imagenet数据集下载官网地址,下载Imagenet21k数据集:http://image-net.org/ 下载格式转换后的annotation文件:ILSVRC2021winner21k_whole_map_train.txt和ILSVRC2021winner21k_whole_map_val.txt。 下载完成后将上述3个文件数据上传至OBS桶中的imagenet21k_whole文件夹中。上传方法请参考上传数据和算法至OBS(首次使用时需要)。
  • HuggingFace权重转换操作 下载Llama2-13b的预训练权重和词表文件,并上传到/home/ma-user/ws/tokenizers/llama2-13b-hf目录下。具体下载地址请参见表1。如果已下载,忽略此步骤。 创建权重转换后的输出目录/home/ma-user/ws/weight/llama2-13b-ckpt/。 cd /home/ma-user/ws/ #进入/home/ma-user/ws/目录 mkdir -p weight/llama2-13b-ckpt 进入代码目录/home/ma-user/ws/AscendCloud-3rdLLM-6.3.902/llm_train/AscendSpeed/,在代码目录中执行convert_weights_from_huggingface.py脚本。 export PYTHONPATH=$PYTHONPATH:/home/ma-user/ws/AscendCloud-3rdLLM-6.3.902/llm_train/AscendSpeed/ModelLink cd /home/ma-user/ws/AscendCloud-3rdLLM-6.3.902/llm_train/AscendSpeed/ModelLink # 权重格式转换 python tools/ckpt_convert/llama/convert_weights_from_huggingface.py \ --input-model-dir /home/ma-user/ws/tokenizers/llama2-13b-hf \ # 输入权重文件夹 --output-model-dir /home/ma-user/ws/weight/llama2-13b-ckpt \ #转换之后的权重输出路径 --tensor-model-parallel-size 8 \ #tp需要与训练脚本中的配置一样 --pipeline-model-parallel-size 1 \ # pp需要与训练脚本中的配置一样 --type 13B \ #模型类型(13B) --merge-mlp 权重转换完成后,在/home/ma-user/ws/weight/llama2-13b-ckpt目录下查看转换后的权重文件。 图1 转换后的权重文件
  • Step1 创建用户组并加入用户 主用户账号下面可以创建多个子用户,并对子用户的权限进行分组管理。此步骤介绍如何创建用户组、子用户、并将子用户加入用户组中。 主用户登录管理控制台,单击右上角用户名,在下拉框中选择“统一身份认证”,进入IAM服务。 图1 统一身份认证 创建用户组。在左侧菜单栏中,选择“用户组”。单击右上角“创建用户组”,在“用户组名称”中填入“用户组02”,然后单击“确定”完成用户组创建。 创建完成后,返回用户组列表。通过用户组管理,将已有子用户加入到用户组中。如果没有子用户账号,可以创建子用户并加入用户组。 创建子用户账号并加入用户组。在IAM左侧菜单栏中,选择“用户”,单击右上角“创建用户”,在“创建用户”页面中,添加多个用户。 请根据界面提示,填写必选参数,然后单击“下一步”。 在“加入用户组”步骤中,选择“用户组02”,然后单击“创建用户”。 系统将逐步创建好前面设置的2个用户。 父主题: 配置ModelArts基本使用权限
  • 评测结果 默认情况下,评测结果会按照outputs/default/{timestamp}的目录结果保存到对应的测试工程。 单独的评测结果如下: outputs/default/20240124_155746 # 父目录 ├── configs │ └── 20240124_155746.py # 数据集的一些配置 ├── logs # 运行过程中的日志 │ ├── eval │ └── infer ├── predictions # 各个数据集的原始输入与推理结果 │ └── opencompass.models.vllm_api.VLLM_opencompass_baichuan_13b_npu ├── results # 各个数据集的分数 │ └── opencompass.models.vllm_api.VLLM_opencompass_baichuan_13b_npu └── summary # 评测结果总结 ├── summary_20240124_155746.csv └── summary_20240124_155746.txt
  • 推理高阶配置 词表切分 在分布式场景下,默认不使用词表切分能提升推理性能,同时也会增加单卡的显存占用。不建议开启词表并行,如确需使用词表切分,配置以下环境变量: export USE_VOCAB_PARALLEL=1 关闭命令: unset USE_VOCAB_PARALLEL 配置后重启服务生效。 Matmul_all_reduce融合算子 使用Matmul_all_reduce融合算子能提升全量推理性能;该算子要求驱动和固件版本为Ascend HDK 24.1.RC1.B011及以上,默认不开启。如需开启,配置以下环境变量: export USE_MM_ALL_REDUCE_OP=1 关闭命令: unset USE_MM_ALL_REDUCE_OP 配置后重启服务生效。 查看详细日志 查看详细耗时日志可以辅助定位性能瓶颈,但会影响推理性能。如需开启,配置以下环境变量: export DETAIL_TIME_LOG=1 export RAY_DEDUP_LOGS=0 关闭命令: unset DETAIL_TIME_LOG 配置后重启服务生效。 父主题: 推理部署(vLLM)
  • 静态benchmark验证操作 运行静态benchmark验证脚本benchmark_parallel.py,具体操作命令如下,可以根据参数说明修改参数。 cd benchmark_tools python benchmark_parallel.py --backend vllm --host 127.0.0.1 --port 8085 --tokenizer /path/to/tokenizer --epochs 10 \--parallel-num 1 2 4 8 --output-tokens 256 256 --prompt-tokens 1024 2048 --benchmark-csv benchmark_parallel.csv 参数说明 --backend:服务类型,支持tgi、vllm、mindspore等。本文档使用的推理接口是vllm。 --host:服务IP地址,如127.0.0.1。 --port:服务端口,和推理服务端口8085。 --tokenizer:tokenizer路径,HuggingFace的权重路径。 --epochs:测试轮数,默认取值为5 --parallel-num:每轮并发数,支持多个,如 1 4 8 16 32。 --prompt-tokens:输入长度,支持多个,如 128 128 2048 2048,数量需和--output-tokens的数量对应。 --output-tokens:输出长度,支持多个,如 128 2048 128 2048,数量需和--prompt-tokens的数量对应。 --benchmark-csv:结果保存路径,如benchmark_parallel.csv。 脚本运行完成后,测试结果保存在benchmark_parallel.csv中,示例如下图所示。 图1 静态benchmark测试结果
  • 权重合并和转换介绍 模型训练完成后,训练的产物包括模型的权重、优化器状态、loss等信息。这些内容可用于断点续训、模型评测或推理任务等。 在进行模型评测或推理任务前,需要将训练后生成的多个权重文件合并,并转换成Huggingface格式的权重文件。 权重文件的合并转换操作都要求在训练的环境中进行。 预训练或增量预训练产生的权重文件的合并与转换操作,请参考多卡权重合并进行操作。 LoRA微调训练产生的权重文件的合并与转换操作,请参考LoRA权重合并进行操作。 父主题: 推理前的权重合并转换
  • 增量预训练超参配置 本章节介绍增量预训练前的超参配置,可以根据实际需要修改。 增量预训练脚本sft-llama2-13b.sh,存放在AscendCloud-3rdLLM-6.3.902-xxx/6.3.902-Ascend/llm_train/AscendSpeed/scripts/llama2目录下。训练前,可以根据实际需要修改超参配置。 微调任务配置,操作同预训练配置类似,不同点为RUN_TYPE类型不同,以及输入输出路径的配置的不同。 表1 增量预训练超参配置 参数 值 参数说明 DATA_PATH ${MA_JOB_DIR}/6.3.902-Ascend/datasets/alpaca/alpaca-ft 必填。训练时指定的输入数据路径。一般为数据地址/处理后的数据前缀名, 不加文件类型后缀。 TOKENIZER_PATH ${MA_JOB_DIR}/6.3.902-Ascend/tokenizers/llama2-13b-hf 必填。tokenizer保存地址。 SAVE_PATH $PWD/ckpt 中间保存结果,包含训练日志。 SAVE_CKPT_PATH ${SAVE_PATH}/ckpt-llama2-13b-sft 必填。训练ckpt保存地址。 MODEL_PATH ${MA_JOB_DIR}/6.3.902-Ascend/weight/llama2-13b-ckpt 必填。加载的权重文件路径。取值二选一: (推荐)上一步增量预训练权重转换章节中将HuggingFace格式转化为AscendSpeed格式的权重文件。 预训练完成后保存的权重文件,即预训练超参配置中的SAVE_CKPT_PATH值。 MASTER_ADDR=${1:-localhost} localhost 主节点IP地址,默认为localhost。 多机多卡训练时需指定主节点IP地址。 MODEL_TYPE 13B 模型加载类型。 TRAIN_ITERS 2000 训练迭代周期。根据实际需要修改。 MBS 4 流水线并行中一个micro batch所处理的样本量。在流水线并行中,为了减少气泡时间,会将一个step的数据切分成多个micro batch。 非必填,默认值4。 GBS 64 训练中所有机器一个step所处理的样本量。影响每一次训练迭代的时长。建议单机64,双机128。 TP 8 张量并行。 PP 1 流水线并行。 seq_length 4096 要处理的最大序列长度,默认值2048,建议改为4096。 RUN_TYPE sft 训练脚本类型:pretrain、sft、loral。此处填写sft,表示增量预训练。 父主题: 增量预训练
  • LoRA微调超参配置 本章节介绍LoRA微调训练前的超参配置,可以根据实际需要修改。 LoRA微调训练脚本lora-llama2-13b.sh,存放在AscendCloud-3rdLLM-6.3.902-xxx/6.3.902-Ascend/llm_train/AscendSpeed/scripts/llama2/目录下。训练前,可以根据实际需要修改超参配置。 微调任务配置,操作同预训练配置类似,不同点为RUN_TYPE类型不同,以及输入输出路径的配置的不同。 表1 超参配置 参数 值 参数说明 DATA_PATH ${MA_JOB_DIR}/6.3.902-Ascend/datasets/alpaca-ft/alpaca-ft 必填。训练时指定的输入数据路径。一般为数据地址/处理后的数据前缀名,不加文件类型后缀。 TOKENIZER_PATH ${MA_JOB_DIR}/6.3.902-Ascend/tokenizers/llama2-13b-hf 必填。tokenizer保存地址。 SAVE_PATH $PWD/ckpt 中间保存结果,包含训练日志。 SAVE_CKPT_PATH ${SAVE_PATH}/ckpt-llama2-13b-lora 必填。训练ckpt保存地址。 MODEL_PATH ${MA_JOB_DIR}/6.3.902-Ascend/weight/llama2-13b-ckpt 必填。加载的权重文件路径。取值二选一: (推荐)上一步LoRA微调权重转换章节中将HuggingFace格式转化为AscendSpeed格式的权重文件。 预训练完成后保存的权重文件,即预训练超参配置中的SAVE_CKPT_PATH值。 MODEL_TYPE 13B 模型加载类型。 TRAIN_ITERS 2000 训练迭代周期。根据实际需要修改。 MBS 4 流水线并行中一个micro batch所处理的样本量。在流水线并行中,为了减少气泡时间,会将一个step的数据切分成多个micro batch。 非必填,默认值4。 GBS 64 训练中所有机器一个step所处理的样本量。影响每一次训练迭代的时长。建议值单机64,双机128。 TP 8 张量并行。 PP 1 流水线并行。 seq_length 4096 要处理的最大序列长度,默认值2048,建议改为4096。 RUN_TYPE lora 训练脚本类型:pretrain、sft、lora。此处填写lora,表示LoRA微调训练。 父主题: LoRA微调训练
  • Step1 合并LoRA微调训练生成的权重文件 此步骤的目的是将LoRA微调训练时生成的SAVE_CKPT_PATH和MODEL_PATH权重文件合并在一起,形成完整的权重文件。SAVE_CKPT_PATH和MODEL_PATH的具体值参考LoRA微调超参配置。 编辑LoRA权重合并脚本文件merge_lora_llama2_ptd_13B.sh,并修改配置。该脚本存放在“${MA_JOB_DIR}/6.3.902-Ascend/llm_train/AscendSpeed/scripts/tools/lora”目录下。 把26-31行设置TP、PP、ORIGIN_CHECKPOINT_PATH、LORA_CHECKPOINT_PATH、VOCAB_FILE、MERGED_MODEL_SAVE_PATH移动至else外,同时设置: ORIGIN_CHECKPOINT_PATH=${MA_JOB_DIR}/6.3.902-Ascend/tokenizers/llama2-13b-hf:设置为LoRA微调超参配置章节中的MODEL_PATH值。 LORA_CHECKPOINT_PATH=${MA_JOB_DIR}/6.3.902-Ascend/llm_train/AscendSpeed/ckpt/ckpt-llama2-13b-lora:设置为LoRA微调任务章节中的SAVE_CKPT_PATH值。 VOCAB_FILE=${MA_JOB_DIR}/6.3.902-Ascend/tokenizers/llama2-13b-hf:tokenizer文件路径。 MERGED_MODEL_SAVE_PATH=${MA_JOB_DIR}/6.3.902-Ascend/weight/llama2_13b_lora_merge/:输出合并后的权重路径。 TP=8:张量并行数,要与LORA微调时设置相同的参数。 PP=1:流水线并行数,要与LORA微调时设置相同的参数,单机建议值为1,双机建议为2。 设置执行命令。 sh scripts/tools/lora/merge_lora_llama2_ptd_13B.sh 并提交做作业。
  • Step2 将多个权重文件合并为一个文件并转换格式 此步骤的目的是将Step1 合并LoRA微调训练生成的权重文件中生成的多个权重文件进行合并,生成一个权重文件,并转换权重文件的格式为HuggingFace格式。 脚本convert_weights_to_huggingface.py包含了权重文件合并和转换操作,具体的脚本内容和参数解释如下。 该脚本的执行需要在${MA_JOB_DIR}/6.3.902-Ascend/llm_train/AscendSpeed/代码目录下进行。 python ${MA_JOB_DIR}/6.3.902-Ascend/llm_train/AscendSpeed/scripts/tools/ckpt_convert/llama/convert_weights_to_huggingface.py \ --input-model-dir ${ASCNEDSPEED_CKPT_PATH} \ --output-model-dir ${MERGE_CKPT_PATH} \ --src-tensor-model-parallel-size ${TENSOR-MODEL-PARALLEL-SIZE} \ --src-pipeline-model-parallel-size ${PIPELINE-MODEL-PARALLEL-SIZE} \ --type ${TYPE} \ --org-huggingface-dir ${HUGGINFGFACE_DIR} \ --merge-mlp 参数说明: ${ASCNEDSPEED_CKPT_PATH}:训练生成的AscendSpeed格式权重目录,多机多卡场景下需要把多个节点上的权重文件都放到任意一个节点的这个目录下,需要指定到含有mp_rank_xxxxxxx的目录,一般为iter_xxxxx或release。 ${MERGE_CKPT_PATH}:合并后的权重路径。 ${TENSOR-MODEL-PARALLEL-SIZE}:原始模型的TP配置大小,取值来自训练中的配置,此处需要手动输入。 ${PIPELINE-MODEL-PARALLEL-SIZE}:原始模型的PP配置大小,取值来自训练中的配置,此处需要手动输入。 ${TYPE}:原始模型参数大小,支持参数配置: 7B、13B、70B,按实际模型要求设置。 ${HUGGINFGFACE_DIR}:可选,开源HuggingFace权重目录,用于将开源权重内的配置文件,复制到转换后权重的输出目录中。 下面提供一个convert_weights_to_huggingface.py脚本的实际样例,供参考。 python ${MA_JOB_DIR}/6.3.902-Ascend/llm_train/AscendSpeed/scripts/tools/ckpt_convert/llama/convert_weights_to_huggingface.py \ --input-model-dir ${MA_JOB_DIR}/6.3.902-Ascend/llm_train/AscendSpeed/ckpt/ckpt-llama2-13b-lora/iter_xxxxxxx \ --output-model-dir ${MA_JOB_DIR}/6.3.902-Ascend/weight/ckpt-llama2-13b-lora-hf \ --src-tensor-model-parallel-size 8 \ --src-pipeline-model-parallel-size 1 \ --type 13B \ --org-huggingface-dir ${MA_JOB_DIR}/6.3.902-Ascend/tokenizers/llama2-13b-hf \ --merge-mlp 日志中出现下列提示即表示合并转换完成。 Merging tp pp weight from path: {as_dir} ...... Merging weight complete!!! Converting weight to huggingface...... Converting weight to huggingface complete!!! Saving weight to path: {hf_dir} huggingface weight saved to: {hf_dir}/pytorch_model.bin Generating model index config...... model index config saved in: {hf_dir}/pytorch_model.bin.index.json Generating weight config file from: {org_hf_dir} config file copy from "{org_hf_dir}" complete!!! 转换完成后目录中的release文件夹内至少包含一个bin文件和一个bin.index.json文件,bin文件大小应和huggingface原始权重大小相似: {hf_dir} ├── pytorch_model.bin └── pytorch_model.bin.index.json 以下config文件需要指定org_huggingface_dir参数才会生成。 ├── config.json ├── generation_config.json ├── gitattributes.txt ├── LICENSE.txt ├── README.md ├── special_tokens_map.json ├── tokenizer_config.json ├── tokenizer.json ├── tokenizer.model ├── USE_POLICY.md
  • 预训练超参配置 本章节介绍预训练前的超参配置,可以根据实际需要修改。 预训练脚本pretrain-llama2-13b.sh,存放在AscendCloud-3rdLLM-6.3.902-xxx/llm_train/AscendSpeed/scripts/llama2目录下。训练前,可以根据实际需要修改超参配置。 表1 超参配置 参数 值 参数说明 DATA_PATH ${MA_JOB_DIR}/6.3.902-Ascend/datasets/alpaca/llama2-13B/alpaca_text_document 必填。训练时指定的输入数据路径。一般为数据地址/处理后的数据前缀名,不加文件类型后缀。 请根据实际规划修改。 TOKENIZER_PATH ${MA_JOB_DIR}/6.3.902-Ascend/tokenizers/llama2-13b-hf 必填。tokenizer保存地址。 SAVE_PATH $PWD/ckpt 中间保存结果,包含训练日志。 SAVE_CKPT_PATH ${SAVE_PATH}/ckpt-llama2-13b 必填。训练ckpt保存地址。 MODEL_TYPE 13B 模型加载类型,默认为13B。 TRAIN_ITERS 2000 训练迭代周期。根据实际需要修改。 MBS 4 流水线并行中一个micro batch所处理的样本量。在流水线并行中,为了减少气泡时间,会将一个step的数据切分成多个micro batch。 默认值4。 GBS 64 训练中所有机器一个step所处理的样本量。影响每一次训练迭代的时长,建议值单机64,双机128。 TP 8 张量并行。 PP 1 流水线并行。 lr 0.00015 学习率,非必填,默认值3.0e-4 RUN_TYPE pretrain 训练脚本类型:pretrain。 父主题: 预训练
  • 创建LoRA微调训练任务 在VS Code中修改“\6.3.902-Ascend\llm_train\AscendSpeed\scripts\llama2\lora-llama2-13b.sh”脚本,修改脚本内容如下: #!/bin/bash set -ex source /usr/local/Ascend/ascend-toolkit/set_env.sh # The number of parameters is not aligned export LD_LIBRARY_PATH=/usr/local/lib:/usr/local/lib:/root/miniconda3/lib:$LD_LIBRARY_PATH # 以下环境变量和多机网络通信相关,可以在容器内使用ifconfig查看 export HCCL_CONNECT_TIMEOUT=3600 # 多机通信等待时间 export AZUREML_EXPERIMENT_ID=0 # 多机训练时,数据多机编译 export GLOO_SOCKET_IFNAME=${NCCL_SOCKET_IFNAME} # 多机之间使用gloo通信时需要指定网口名称, export TP_SOCKET_IFNAME=${NCCL_SOCKET_IFNAME} # 多机之间使用TP通信时需要指定网口名称 # 以下变量和性能优化相关 export HCCL_OP_BASE_FFTS_MODE_ENABLE=TRUE # FFTS开关 export COMBINED_ENABLE=1 # pytorch Tensor 非连续转连续 export MULTI_STREAM_MEMORY_REUSE=1 # Enable memory reuse in INF_NAN mode can reduce memory usage and achieve lossless performance # export INF_NAN_MODE_ENABLE=1 # 解决算子遇到inf和NAN问题 # model args export MODEL_TYPE=13B # learning rate args export LR=0.00001 export MIN_LR=0.000002 export TRAIN_ITERS=50 export LR_WARMUP_ITERS=2000 #训练周期 export MBS=4 export GBS=64 #训练中所有机器一个step所处理的样本量,建议单机64,双机128。 # data args PWD=`pwd` export DATASET_PATH=${MA_JOB_DIR}/6.3.902-Ascend/datasets/alpaca-ft/alpaca-ft #训练数据输入路径,不加文件类型后缀 export TOKENIZER_PATH=${MA_JOB_DIR}/6.3.902-Ascend/tokenizers/llama2-13b-hf/ #TOKENIZER存放路径 export SAVE_PATH=$PWD/ckpt #训练过程文件保存路径,包括日志 export SAVE_CKPT_PATH=${SAVE_PATH}/ckpt-llama2-13b-loral #续训完成后的权重保存目录 export MODEL_PATH=${MA_JOB_DIR}/6.3.902-Ascend/weight/llama2-13b-ckpt #预训练后的模型生成路径,断点续训时必须要有此参数。 # megatron args export TP=8 export PP=1 export SEED=1234 export RUN_TYPE=lora #表示脚本运行类型是断点续训,表示训练类型是LoRA微调训练 bash $PWD/scripts/llama2/llama2.sh 在“\6.3.902-Ascend\llm_train\AscendSpeed”路径下创建“ckpt/ckpt-llama2-13B-loral”目录,并设置为输出目录。 在“\6.3.902-Ascend\datasets\alpaca-ft”目录挂载4.2.1中的输出目录。 图1 设置输出目录 设置“tokenizers/llama2-13b-hf”目录挂载权重目录“obs://standard-llama2-13b/llama-2-13b-chat-hf/”。设置“weight/llama2-13b-ckpt”目录挂载LoRA微调权重转换的输出路径。 图2 设置输出和挂载目录 设置启动命令。 cd ${MA_JOB_DIR}/6.3.902-Ascend/llm_train/AscendSpeed/ && bash ./scripts/llama2/lora-llama2-13b.sh 单击“提交作业”完成作业创建。 图3 提交作业
  • Step1 修改预训练脚本 在VS Code中修改“\6.3.902-Ascend\llm_train\AscendSpeed\scripts\llama2\pretrain-llama2-13b.sh”脚本,修改脚本中以下内容。 #!/bin/bash set -ex source /usr/local/Ascend/ascend-toolkit/set_env.sh # The number of parameters is not aligned export LD_LIBRARY_PATH=/usr/local/lib:/usr/local/lib:/root/miniconda3/lib:$LD_LIBRARY_PATH # 以下环境变量和多机网络通信相关,可以在容器内使用ifconfig查看 export HCCL_CONNECT_TIMEOUT=3600 # 多机通信等待时间 export AZUREML_EXPERIMENT_ID=0 # 多机训练时,数据多机编译 export GLOO_SOCKET_IFNAME=${NCCL_SOCKET_IFNAME} # 多机之间使用gloo通信时需要指定网口名称 export TP_SOCKET_IFNAME=${NCCL_SOCKET_IFNAME} # 多机之间使用TP通信时需要指定网口名称 # 以下变量和性能优化相关 export HCCL_OP_BASE_FFTS_MODE_ENABLE=TRUE # FFTS开关 export COMBINED_ENABLE=1 # pytorch Tensor 非连续转连续 export MULTI_STREAM_MEMORY_REUSE=1 # Enable memory reuse in INF_NAN mode can reduce memory usage and achieve lossless performance # export INF_NAN_MODE_ENABLE=1 # 解决算子遇到inf和NAN问题 # model args export MODEL_TYPE=13B # learning rate args export LR=3.0e-4 export MIN_LR=3.0e-5 export TRAIN_ITERS=2000 #训练迭代周期,根据自己实际要求修改 export LR_WARMUP_ITERS=2000 export MBS=4 #流水线并行中一个micro batch所处理的样本量 export GBS=64 #训练中所有机器一个step所处理的样本量,建议值单机64,双机128 # data args PWD=`pwd` export DATASET_PATH=${MA_JOB_DIR}/6.3.902-Ascend/datasets/alpaca/alpaca_text_document #预处理后的数据地址:*注意:一般为数据地址/数据前缀名 export TOKENIZER_PATH=${MA_JOB_DIR}/6.3.902-Ascend/tokenizers/llama2-13b-hf #tokeneizer地址 export SAVE_PATH=$PWD/ckpt # 中间保存结果 包含日志 export SAVE_CKPT_PATH=${SAVE_PATH}/ckpt-llama2-13B-pretrain #训练ckpt保存地址 # megatron args export TP=8 #张量并行 export PP=1 #流水线并行,单机建议为1,双机建议值为2 export SEED=1234 export RUN_TYPE=pretrain bash $PWD/scripts/llama2/llama2.sh
  • 操作流程 图1 操作流程图 表1 操作任务流程说明 阶段 任务 说明 准备工作 准备资源 本教程案例是基于ModelArts Standard运行的,需要购买并开通ModelArts专属资源池和OBS桶。 准备数据 准备训练数据,可以用Alpaca数据集,也可以使用自己准备的数据集。 准备权重 准备分词器Tokenizer和推理代码。 准备代码 准备AscendSpeed训练代码。 准备镜像 准备训练和推理模型适用的容器镜像。 配置ModelArts IDE插件 本案例采用VS Code插件完成大语言模型预训练、微调以及权重的合并转化。 预训练 预训练 介绍如何进行预训练,包括训练数据处理、超参配置、训练任务、断点续训及性能查看。 微调训练 增量预训练 介绍如何进行增量预训练。 LoRA微调训练 介绍如何进行LoRA微调训练。 推理前的权重转换 (二选一) 训练权重合并及转换 推理前,需要将预训练或增量预训练产生的多个权重文件合并为一个,并转换为HuggingFace格式。 LoRA权重合并及转换 推理前,需要将LoRA微调训练产生的多个权重文件合并为一个,并转换为HuggingFace格式。 推理部署 部署推理服务 介绍如何部署并启动推理服务。 推理性能测试 介绍如何验证推理性能,包括静态和动态benchmark。 推理精度测试 介绍如何测试推理精度,并获取评测结果。
  • 预训练权重合并及转换 由于预训练或增量预训练时产出的权重文件(TP和PP文件)个数比较多,推理前需要把多个权重文件合并为一个文件,并转换为HuggingFace格式。Llama2-13B一般使用单卡推理。 基于预训练或增量预训练完成的模型,进行推理部署时,权重合并和转换操作建议参考本章节。 脚本convert_weights_to_huggingface.py包含了权重文件合并和转换操作,具体的脚本内容和参数解释如下。 该脚本的执行需要在/6.3.902-ASCEND/llm_train/AscendSpeed/代码目录下进行。 python ${MA_JOB_DIR}/6.3.902-Ascend/llm_train/AscendSpeed/scripts/tools/ckpt_convert/llama/convert_weights_to_huggingface.py \ --input-model-dir ${ASCNEDSPEED_CKPT_PATH} \ --output-model-dir ${MERGE_CKPT_PATH} \ --src-tensor-model-parallel-size ${TENSOR-MODEL-PARALLEL-SIZE} \ --src-pipeline-model-parallel-size ${PIPELINE-MODEL-PARALLEL-SIZE} \ --type ${TYPE} \ --org-huggingface-dir ${HUGGINFGFACE_DIR} \ --merge-mlp 参数说明: ${ASCNEDSPEED_CKPT_PATH}:训练生成的AscendSpeed格式权重目录,多机多卡场景下需要把多个节点上的权重文件都放到任意一个节点的这个目录下;需要指定到含有mp_rank_xxxxxxx的目录,一般为iter_xxxxx或release。 ${MERGE_CKPT_PATH}:合并后的权重路径。 ${TENSOR-MODEL-PARALLEL-SIZE}:原始模型的TP配置大小,取值来自训练中的配置,此处需要手动输入。 ${PIPELINE-MODEL-PARALLEL-SIZE}:原始模型的PP配置大小,取值来自训练中的配置,此处需要手动输入。 ${TYPE}:原始模型参数大小,支持参数配置: 7B、13B、70B,按实际模型要求设置。 ${HUGGINFGFACE_DIR}:可选,开源HuggingFace权重目录,用于将开源权重内的配置文件,复制到转换后权重的输出目录中。 下面提供一个convert_weights_to_huggingface.py脚本的实际样例,供参考。 export PYTHONPATH=$PYTHONPATH:${MA_JOB_DIR}/6.3.902-Ascend/llm_train/AscendSpeed/ModelLink/ && python ${MA_JOB_DIR}/6.3.902-Ascend/llm_train/AscendSpeed/scripts/tools/ckpt_convert/llama/convert_weights_to_huggingface.py \ --input-model-dir ${MA_JOB_DIR}/6.3.902-Ascend/llm_train/AscendSpeed/ckpt/ckpt-llama2-13b-sft/iter_xxxxxxx \ --output-model-dir ${MA_JOB_DIR}/6.3.902-Ascend/weight/ckpt-llama2-13b-sft-hf \ --src-tensor-model-parallel-size 8 \ --src-pipeline-model-parallel-size 1 \ --type 13B \ --org-huggingface-dir ${MA_JOB_DIR}/6.3.902-Ascend/tokenizers/llama2-13b-hf \ --merge-mlp 父主题: 推理前的权重合并转换
  • 查看性能 训练性能主要通过训练日志中的2个指标查看,吞吐量和loss收敛情况。 吞吐量:日志里存在samples per second参数。samples per second*seq_lenth/总卡数得到tokens/s/p,seq_lenth取值在训练脚本中可以查看,本示例中为4096。单机8卡吞吐量一般为1650tokens/s/p,双机16卡吞吐量一般为1625tokens/s/p。 loss收敛情况:日志里存在lm loss参数 ,lm loss参数随着训练迭代周期持续性减小,并逐渐趋于稳定平缓。也可以使用可视化工具TrainingLogParser查看loss收敛情况,如图3所示。 单节点训练:训练过程中的loss直接打印在窗口上。 多节点训练:训练过程中的loss打印在最后一个节点上。 图3 Loss收敛情况
  • Step1 准备数据集 精度测试需要数据集进行测试。推荐公共数据集mmlu和ceval。下载地址: 表1 精度测试数据集 数据集名称 下载地址 下载说明 mmlu https://huggingface.co/datasets/cais/mmlu 下载其中的data.tar解压到得到data文件夹,为表示区分,将data文件夹重命名为mmlu-exam。 ceval https://huggingface.co/datasets/ceval/ceval-exam 下载其中的ceval-exam.zip压缩包,解压到ceval-exam文件夹。
  • Step2 配置精度测试环境 请在推理服务部署提供的镜像中的tgi环境执行。 获取精度测试代码。精度测试代码存放在代码包AscendCloud-3rdLLM-x.x.x的/llm_evaluation目录中,代码目录结构如下: benchmark_eval ├── config │ ├── config.json # 服务的配置模板,已配置了ma-standard,tgi示例 │ ├── mmlu_subject_mapping.json # mmlu数据集学科信息 │ ├── ceval_subject_mapping.json # ceval数据集学科信息 ├── evaluators │ ├── evaluator.py # 数据集数据预处理方法集 │ ├── chatglm.py # 处理请求相应模块, 一般和chatglm的官方评测数据集ceval搭配 │ ├── llama.py # 处理请求相应模块, 一般和llama的评测数据集mmlu搭配 ├── mmlu-exam, mmlu数据集 ├── ceval-exam, ceval数据集 ├── eval_test.py # 启动脚本,建立线程池发送请求,并汇总结果 ├── service_predict.py # 发送请求的服务 执行精度测试启动脚本eval_test.py,具体操作命令如下,可以根据参数说明修改参数。 python eval_test.py \ --max_workers=1 \ --service_name=llama2-13b-chat-test \ --eval_dataset=ceval \ --service_url=http://127.0.0.1:8085/generate \ --few_shot=3 \ --is_devserver=True \ --model_name=llama2 \ --deploy_method=vllm 参数说明: max_workers:请求的最大线程数,默认为1。 service_name:服务名称,保存评测结果时创建目录,示例为:llama2-13b-chat-test。 eval_dataset:评测使用的评测集(枚举值),目前仅支持mmlu、ceval。 service_url:成功部署推理服务后的服务预测地址,示例:http://127.0.0.1:8085/generate。此处的端口号8085来自前面配置的服务端口。 few_shot:开启少量样本测试后添加示例样本的个数。默认为3,取值范围为0~5整数。 is_devserver: 是否devserver部署方式,True表示DevServer模式。False表示ModelArts Standard模式。 model_name:评测模型名称,llama2。 deploy_method:部署方法,不同的部署方式api参数输入、输出解析方式不同,目前支持tgi、ma_standard、vllm等方式。
  • Step3 查看精度测试结果 默认情况下,评测结果会按照result/{service_name}/{eval_dataset}-{timestamp} 的目录结果保存到对应的测试工程。执行多少次,则会在{service_name}下生成多少次结果。 单独的评测结果如下: {eval_dataset}-{timestamp} # 例如: mmlu-20240205093257 ├── accuracy │ ├── evaluation_accuracy.xlsx # 测试的评分结果,包含各个学科数据集的评分和总和评分。 ├── infer_info │ ├── xxx1.csv # 单个数据集的评测结果 │ ├── ...... │ ├── xxxn.csv # 单个数据集的评测结果 ├── summary_result │ ├── answer_correct.xlsx # 回答正确的结果 │ ├── answer_error.xlsx # 保存回答了问题的选项,但是回答结果错误 │ ├── answer_result_unknow.xlsx # 保存未推理出结果的问题,例如超时、系统错误 │ ├── system_error.xlsx # 保存推理结果,但是可能答非所问,无法判断是否正确,需要人工判断进行纠偏。
  • LoRA微调权重转换 LoRA微调训练前,需要先把训练权重文件转换为AscendSpeed格式。 基于预训练或增量预训练生成的权重文件已经是AscendSpeed格式,进行LoRA微调训练时,不需要再单独做权重转换,可以跳过此章节。 基于原始HuggingFace权重进行LoRA微调训练时,需要将Huggingface格式权重转换为AscendSpeed格式。 LoRA微调训练和增量预训练使用的是同一个HuggingFace权重文件,转换为AscendSpeed格式后的结果也是通用的。如果在增量预训练任务中已经完成了HuggingFace权重转换操作,此处无需重复操作,可以直接使用增量预训练中的权重转换结果。如果前面没有执行HuggingFace权重转换任务,可以参考增量预训练权重转换章节完成。 父主题: LoRA微调训练
  • 自定义数据 如果是用户自己准备的数据集,可以使用Ascendspeed代码仓中的转换工具将json格式数据集转换为训练中使用的.idx + .bin格式。 #示例: #1.将准备好的json格式数据集存放于6.3.902-Ascend/datasets/data目录下: data.json #2.修改转换脚本 python ${MA_JOB_DIR}/6.3.902-Ascend/llm_train/AscendSpeed/ModelLink/tools/preprocess_data.py \ --input ${MA_JOB_DIR}/6.3.902-Ascend/datasets/data/data.json \ #需要转换的数据集路径 --output-prefix ${MA_JOB_DIR}/6.3.902-Ascend/datasets/alpaca/llama2-13B/alpaca \ #转换后存放的数据集路径 --tokenizer-type PretrainedFromHF \ --tokenizer-name-or-path ${MA_JOB_DIR}/6.3.902-Ascend/tokenizers/llama2-13b-hf \ --tokenizer-not-use-fast \ --json-keys text #3.执行完成后在 datasets文件夹中可以得到 data_text_document.idx 与data_text_document.bin 两个文件
  • Alpaca数据处理 数据预处理脚本preprocess_data.py存放在代码包的“llm_train\AscendSpeed\ModelLink\”目录中,脚本具体说明如下。 python 6.3.902-Ascend/llm_train/AscendSpeed/ModelLink/tools/preprocess_data.py --input ${MA_JOB_DIR}/6.3.902-Ascend/datasets/data/train-00000-of-00001-a09b74b3ef9c3b56.parquet --output-prefix ${MA_JOB_DIR}/6.3.902-Ascend/datasets/alpaca/llama2-13B/alpaca --tokenizer-type PretrainedFromHF --tokenizer-name-or-path ${MA_JOB_DIR}/6.3.902-Ascend/tokenizers/llama2-13b-hf --tokenizer-not-use-fast --json-keys text 参数说明: - input:数据集的存放路径,本案例中${path}的路径为${MA_JOB_DIR}/6.3.902-Ascend/datasets 。 - output-prefix:处理后的数据集保存路径+数据集名称前缀(例如: alpaca) - tokenizer-type:tokenizer的类型,可选项有['BertWordPieceLowerCase','BertWordPieceCase','GPT2BPETokenizer','PretrainedFromHF'],一般为PretrainedFromHF。 - tokenizer-name-or-path:tokenizer的存放路径。 - json-keys: space separate listed of keys to extract from json,默认使用text,不需要修改。 数据预处理后输出的训练数据如下: alpaca_text_document.bin alpaca_text_document.idx 训练的时指定的数据路径为“${path}/alpaca/llama2-13B/alpaca_text_document”, 不加文件类型后缀。
  • 创建预训练数据处理任务 通过VS Code新建任务。 图1 新建任务 设置作业名称、描述、作业模式,选择准备镜像中训练镜像并根据需求选择资源规格和节点数。 图2 设置训练作业基本信息 在数据处理场景,通常选择:1节点,CPU规格即可。图中因无CPU资源故选择NPU规格。 设置权重、数据集的挂载文件夹。 单击权重文件存储目录“6.3.902-Ascend/tokenizers/llama2-13b-hf”右侧的挂载按钮。 图3 设置挂载文件夹 选择步骤2.3中存储权重的桶中文件夹,例如:obs://standard-llama2-13b / llama-2-13b-chat-hf,单击确定,完成挂载。 图4 选择OBS桶中文件夹 以相同步骤,完成数据集的挂载,例如将obs://standard-llama2-13b/alpaca/挂载到6.3.902-Ascend/datasets/data目录,结果如下: 图5 完成权重和数据集挂载 设置输出挂载路径。 鼠标移动至输出目录,单击右侧出现的“设为输出”完成输出路径的挂载。 图6 设置输出挂载路径 设置执行命令,并提交作业。 在命令窗口输出执行预训练数据处理,此处提供一段实际的数据处理代码示例如下。 python ${MA_JOB_DIR}/6.3.902-Ascend/llm_train/AscendSpeed/ModelLink/tools/preprocess_data.py --input ${MA_JOB_DIR}/6.3.902-Ascend/datasets/data/llama2-13B/train-00000-of-00001-a09b74b3ef9c3b56.parquet --output-prefix ${MA_JOB_DIR}/6.3.902-Ascend/datasets/alpaca --tokenizer-type PretrainedFromHF --tokenizer-name-or-path ${MA_JOB_DIR}/6.3.902-Ascend/tokenizers/llama2-13b-hf --tokenizer-not-use-fast --json-keys text 单击提交作业。 图7 提交作业 待作业执行完成后,就可以在OBS中挂载输出路径的目录下找到输出结果。 图8 作业执行完成 图9 输出文件 也可以在插件页面下载结果至本地 图10 下载结果至本地
  • 请求服务 使用命令测试推理服务是否正常启动。 curl -X POST http://127.0.0.1:8080/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "baichuan-13b-chat", "messages": [ { "role": "user", "content": "你是谁?" } ], "max_tokens": 100, "top_k": -1, "top_p": 1, "temperature": 0, "ignore_eos": false, "stream": false }' 服务的API与vLLM官网相同:https://github.com/vllm-project/vllm。此处介绍关键参数。 表1 请求服务参数说明 参数 是否必选 默认值 参数类型 描述 model 是 - Str 模型名称,参数--served-model-name的值。 messages 是 - LIst 请求输入的问题。 max_tokens 否 16 Int 每个输出序列要生成的最大tokens数量。 top_k 否 -1 Int 控制要考虑的前几个tokens的数量的整数。设置为 -1 表示考虑所有tokens。 适当降低该值可以减少采样时间。 top_p 否 1.0 Float 控制要考虑的前几个tokens的累积概率的浮点数。必须在 (0, 1] 范围内。设置为 1 表示考虑所有toekns。 temperature 否 1.0 Float 控制采样的随机性的浮点数。较低的值使模型更加确定性,较高的值使模型更加随机。0表示贪婪采样。 stop 否 None None/Str/List 用于停止生成的字符串列表。返回的输出将不包含停止字符串。 例如:["你", "好"],生成文本时遇到"你"或者"好"将停止文本生成。 stop_token_ids 否 None List 用于停止生成的token列表。返回的输出将包含停止tokens,除非停止tokens是特殊tokens。 ignore_eos 否 False Bool 是否忽略EOS tokens并继续生成EOS tokens后的tokens。False表示不忽略。 presence_penalty 否 0.0 Float 基于生成文本中新tokens是否已出现来对其进行惩罚的浮点数。大于0的值鼓励模型使用新的tokens,小于0的值鼓励模型重复使用tokens。 取值范围为[-2, 2] frequency_penalty 否 0.0 Float 基于生成文本中新tokens的频率来对其进行惩罚的浮点数。大于0的值鼓励模型使用新的tokens,小于0的值鼓励模型重复使用tokens。 取值范围为[-2, 2] skip_special_tokens 否 True Bool 是否跳过输出中的特殊tokens。默认为True,表示跳过。 stream 否 False Bool 是否开启流式推理。默认为False,表示不开启流式推理。 查看返回是否符合预期
共100000条