华为云用户手册

  • Step1 检查环境 SSH登录机器后,检查NPU设备检查。运行如下命令,返回NPU设备信息。 npu-smi info 如出现错误,可能是机器上的NPU设备没有正常安装,或者NPU镜像被其他容器挂载。请先正常安装NPU设备和驱动,或释放被挂载的NPU。 检查docker是否安装。 docker -v #检查docker是否安装 如尚未安装,运行以下命令安装docker。 yum install -y docker-engine.aarch64 docker-engine-selinux.noarch docker-runc.aarch64 配置IP转发,用于容器内的网络访问。执行以下命令查看net.ipv4.ip_forward配置项的值,如果为1,可跳过此步骤。 sysctl -p | grep net.ipv4.ip_forward 如果net.ipv4.ip_forward配置项的值不为1,执行以下命令配置IP转发。 sed -i 's/net\.ipv4\.ip_forward=0/net\.ipv4\.ip_forward=1/g' /etc/sysctl.conf sysctl -p | grep net.ipv4.ip_forward
  • 操作流程 开始使用如下样例前,请务必按准备工作指导完成必要操作。 Step1 准备算法:在AI Gallery中订阅算法。 Step2 准备训练数据:准备训练数据。创建OBS桶和文件夹,并将训练数据上传到OBS中。 Step3 全量微调训练:对算法进行全量微调。 Step4 部署模型并推理预测:训练完成后,部署模型并进行推理预测。 Step5 清理资源:运行完成后,停止服务并删除OBS中的数据,避免不必要的资源浪费。
  • Step2 准备训练数据 以Llama-7B为例,全量微调训练使用的是开源的wiki2048数据集。下载数据集之后,需要将开源数据集转化为MindSpore可以读取的数据格式,然后上传到OBS桶中,用于后续的算法训练。 下载WikiText2数据集到用户本地电脑,并转化数据集格式为MindSpore可以读取的数据格式(xxx.mindrecord.db和xxx.mindrecord),具体操作请参见文档。 请参考以下要求创建OBS桶中的文件夹,并上传数据到OBS桶中,用于后续的算法微调训练。 OBS文件夹目录要求如下: {OBS桶} # OBS对象桶,用户可以自定义名称,例如:llm-mindspore-ma -{OBS文件夹} # OBS文件夹,用于存放训练输入数据,用户可以自定义名称,例如:wiki2048 - wiki2048.mindrecord.db # 训练数据集 - wiki2048.mindrecord # 训练数据集 -{OBS文件夹} #训练输出路径,用于存放训练生成的模型文件等,用户可以自定义名称,例如:output -{OBS文件夹} #作业日志路径,用于存放训练日志,用户可以自定义名称,例如:log 本文档中使用的是开源数据集,主要用于跑通流程和体验,客户的实际业务开展需要根据数据集格式要求匹配自己的业务数据来做精细的调参。
  • benchmark方法介绍 性能benchmark包括两部分。 静态性能测试:评估在固定输入、固定输出和固定并发下,模型的吞吐与首token延迟。该方式实现简单,能比较清楚的看出模型的性能和输入输出长度、以及并发的关系。 动态性能测试:评估在请求并发在一定范围内波动,且输入输出长度也在一定范围内变化时,模型的延迟和吞吐。该场景能模拟实际业务下动态的发送不同长度请求,能评估推理框架在实际业务中能支持的并发数。 性能benchmark验证使用到的脚本存放在代码包AscendCloud-3rdLLM-x.x.x.zip的llm_evaluation目录下。 代码目录如下: benchmark_tools ├── benchmark_parallel.py # 评测静态性能脚本 ├── benchmark_serving.py # 评测动态性能脚本 ├── generate_dataset.py # 生成自定义数据集的脚本 ├── benchmark_utils.py # 工具函数集 ├── benchmark.py # 执行静态,动态性能评测脚本 父主题: 推理性能测试
  • Step3 启动容器镜像 启动容器镜像前请先按照参数说明修改${}中的参数。可以根据实际需要增加修改参数。启动容器命令如下。 container_work_dir="/home/ma-user/ws" # 容器内挂载的目录 work_dir="/home/ma-user/ws" # 宿主机挂载目录,存放了代码、数据、权重 container_name="ascendspeed" # 启动的容器名称 image_name="${container_name} " # 启动的镜像ID docker run -itd \ --device=/dev/davinci0 \ --device=/dev/davinci1 \ --device=/dev/davinci2 \ --device=/dev/davinci3 \ --device=/dev/davinci4 \ --device=/dev/davinci5 \ --device=/dev/davinci6 \ --device=/dev/davinci7 \ --device=/dev/davinci_manager \ --device=/dev/devmm_svm \ --device=/dev/hisi_hdc \ -v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \ -v /usr/local/dcmi:/usr/local/dcmi \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ --cpus 192 \ --memory 1000g \ --shm-size 200g \ --net=host \ -v ${work_dir}:${container_work_dir} \ --name ${container_name} \ $image_name \ /bin/bash 参数说明: --name ${container_name} 容器名称,进入容器时会用到,此处可以自己定义一个容器名称,例如ascendspeed。 -v ${work_dir}:${container_work_dir} 代表需要在容器中挂载宿主机的目录。宿主机和容器使用不同的文件系统。work_dir为宿主机中工作目录,目录下存放着训练所需代码、数据等文件。container_work_dir为要挂载到的容器中的目录。为方便两个地址可以相同。 容器不能挂载/home/ma-user目录,此目录为ma-user用户家目录。 driver及npu-smi需同时挂载至容器。 ${image_name} 为docker镜像的ID,在宿主机上可通过docker images查询得到。 通过容器名称进入容器中。 docker exec -it ${container_name} bash 启动容器时默认用户为ma-user用户。如果需要切换到root用户可以执行以下命令: sudo su source /home/ma-user/.bashrc 如果继续使用ma-user,在使用其他属组如root用户上传的数据和文件时,可能会存在权限不足的问题,因此需要执行如下命令统一文件属主。 sudo chown -R ma-user:ma-group ${container_work_dir} # ${container_work_dir}:/home/ma-user/ws 容器内挂载的目录 例如: sudo chown -R ma-user:ma-group /home/ma-user/ws 安装依赖包。 #进入scripts目录,xxx为包版本,请按照实际情况替换 cd /home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/scripts #执行安装命令 pip install -r requirements.txt
  • 数据处理具体操作 SFT全参微调数据处理具体操作步骤如下。 将获取到的SFT全参微调数据集上传到/home/ma-user/ws/datasets/目录中。 创建处理后的数据存放目录/home/ma-user/ws/datasets/alpaca-ft/llama2-13B/。 cd /home/ma-user/ws/datasets #进入/home/ma-user/ws/datasets目录 mkdir -p alpaca-ft/llama2-13B #创建alpaca-ft/llama2-13B目录 进入代码目录“/home/ma-user/ws/AscendCloud-3rdLLM-6.3.902/llm_train/AscendSpeed/ModelLink/”,在代码目录中执行preprocess_data.py脚本处理数据。 此处提供一段实际的数据处理代码示例如下。 export PYTHONPATH=$PYTHONPATH:/home/ma-user/ws/AscendCloud-3rdLLM-6.3.902/llm_train/AscendSpeed/ModelLink/ python tools/preprocess_data.py \ --input /home/ma-user/ws/datasets/data/alpaca_data.json \ --output-prefix /home/ma-user/ws/datasets/alpaca-ft/llama2-13b/alpaca-ft \ --tokenizer-type PretrainedFromHF \ --tokenizer-name-or-path /home/ma-user/ws/tokenizers/llama2-13b-hf \ --tokenizer-not-use-fast \ --handler-name GeneralInstructionHandler 数据处理完后,在/home/ma-user/ws/datasets/alpaca-ft/llama2-13B/目录下生成转换后的数据文件。
  • 数据预处理 使用数据预处理脚本preprocess_data.py脚本重新生成.bin和.idx格式的SFT全参微调数据。preprocess_data.py存放在AscendCloud-3rdLLM-6.3.902/llm_train/AscendSpeed/ModelLink/tools目录中,脚本具体内容如下。 #进入ModelLink目录: cd /home/ma-user/ws/AscendCloud-3rdLLM-6.3.902/llm_train/AscendSpeed/ModelLink python tools/preprocess_data.py --input alpaca_data.json\ --output-prefix $DATA_PATH \ --tokenizer-type PretrainedFromHF \ --tokenizer-name-or-path $TOKENIZER_PATH \ --tokenizer-not-use-fast \ --handler-name GeneralInstructionHandler 参数说明: - input:SFT全参微调数据的存放路径。 - output-prefix:处理后的数据集保存路径+数据集名称前缀(例如:alpaca-ft)。 - tokenizer-type:tokenizer的类型,可选项有['BertWordPieceLowerCase', 'BertWordPieceCase','GPT2BPETokenizer', 'PretrainedFromHF'],设置为PretrainedFromHF。 - tokenizer-name-or-path:tokenizer的存放路径。 - handler-name:生成数据集的用途,这里是生成的指令数据集,用于微调。 输出结果 alpaca-ft_packed_attention_mask_document.bin alpaca-ft_packed_attention_mask_document.idx alpaca-ft_packed_input_ids_document.bin alpaca-ft_packed_input_ids_document.idx alpaca-ft_packed_labels_document.bin alpaca-ft_packed_labels_document.idx 训练的时候指定的路径为/path/to/alpaca-ft不加文件类型后缀。
  • Step2 将多个权重文件合并为一个文件并转换格式 此步骤的目的是将Step1 合并LoRA微调训练生成的权重文件中生成的多个权重文件进行合并,生成一个权重文件,并转换权重文件的格式为HuggingFace格式。 脚本convert_weights_to_huggingface.py包含了权重文件合并和转换操作,具体的脚本内容和参数解释如下。 该脚本的执行需要在/home/ma-user/ws/AscendCloud-3rdLLM-6.3.902/llm_train/AscendSpeed/代码目录下进行。 python 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 scripts/tools/ckpt_convert/llama/convert_weights_to_huggingface.py \ --input-model-dir /home/ma-user/ws/AscendCloud-3rdLLM-6.3.902/llm_train/AscendSpeed/ckpt/ckpt-llama2-13b-lora/iter_xxxxxxx \ --output-model-dir /home/ma-user/ws/weight/ckpt-llama2-13b-lora-hf \ --src-tensor-model-parallel-size 8 \ --src-pipeline-model-parallel-size 1 \ --type 13B \ --org-huggingface-dir /home/ma-user/ws/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
  • Step5 启动推理服务 配置推理服务需要的环境变量。 export ATB_LAYER_INTERNAL_TENSOR_REUSE=1 配置需要使用的NPU卡,例如:实际使用的是第1张和第2张卡,此处填写为0,1,以此类推。 export ASCEND_RT_VISIBLE_DEVI CES =0,1 NPU卡编号可以通过命令npu-smi info查询。 配置使用的显存,376T配置56,280T配置26。 export MAX_MEMORY_GB=56 启动推理服务,本服务使用的开源服务框架是TGI,具体命令参考https://huggingface.co/docs/text-generation-inference/main/en/basic_tutorials/launcher。该版本不支持https和身份认证机制。 可以根据官网说明修改参数。推荐参数配置如下。 表1 推理服务启动参数表 参数配置 推荐值 参数说明 --max-input-length 1024 推理时最大输入的tokens数量,默认值为1024,可以根据实际修改。该参数会影响推理性能。 --max-total-tokens 2048 推理时最大输入+最大输出的tokens数量,默认值为2048,可以根据实际修改。该参数会影响推理性能。 --max-batch-prefill-tokens 4096 在prefill阶段,最多会使用多少token,一般为--max-input-length的整数倍。该参数会影响推理性能。 --trust-remote-code 无 是否相信远程代码。 --max-waiting-tokens 1 推理进行时,新到达的请求需要等待多少增量推理后,切换成全量推理。 --max-concurrent-requests 1000 最大同时处理的请求数,超过后拒绝访问。 --waiting-served-ratio 0.2 当等待的请求数量达到增量推理的多少比例后,切换成全量推理。 TGI服务需要safetensor的权重格式,如果权重格式不是safetensor,首次启动时,需要先将权重转换成safetensor格式(自动进行)。首次启动耗时在5~10分钟。 如果权重格式包含safetensor,启动时间在1~3分钟。服务启动后,会打印如下信息。 2024-01-22T03:27:22.252926Z INFO text_generation_router: router/src/main.rs:239: Setting max batch total tokens to 970242024-01-22T03:27:22.252952Z INFO text_generation_router: router/src/main.rs:240: Connected
  • Step1 检查环境 SSH登录机器后,检查NPU设备检查。运行如下命令,返回NPU设备信息。 npu-smi info 如出现错误,可能是机器上的NPU设备没有正常安装,或者NPU镜像被其他容器挂载。请先正常安装NPU设备和驱动,或释放被挂载的NPU。 检查docker是否安装。 docker -v #检查docker是否安装 如尚未安装,运行以下命令安装docker。 yum install -y docker-engine.aarch64 docker-engine-selinux.noarch docker-runc.aarch64
  • Step3 启动容器镜像 启动容器镜像前请先按照参数说明修改${}中的参数。 docker run -itd \ -p 8085:8085 \ --device=/dev/davinci0 \ --device=/dev/davinci1 \ --device=/dev/davinci2 \ --device=/dev/davinci3 \ --device=/dev/davinci4 \ --device=/dev/davinci5 \ --device=/dev/davinci6 \ --device=/dev/davinci7 \ -v /etc/localtime:/etc/localtime \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ -v /etc/ascend_install.info:/etc/ascend_install.info \ --device=/dev/davinci_manager \ --device=/dev/devmm_svm \ --device=/dev/hisi_hdc \ -v /var/log/npu/:/usr/slog \ -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ -v /sys/fs/cgroup:/sys/fs/cgroup:ro \ -v ${dir}:${container_dir} \ --name ${container_name} \ ${image_id} \ /bin/bash 参数说明: -e ASCEND_VISIBLE_DEVICES=0-7,挂载机器上的0-7卡。 -p 8085:8085代表需要在宿主机和容器中绑定的端口。示例中,http server使用了8085端口,根据实际需要修改。 -v ${dir}:${container_dir} 代表需要在容器中挂载宿主机的目录。宿主机和容器使用不同大的文件系统,dir为宿主机中权重文件目录,container_dir为要挂载到的容器中的目录。为方便两个地址可以相同。请确保在容器中有weight_dir的权限。可以在宿主机中执行chmod 777 -R ${weight_dir}来放开权限 --name ${container_name} 容器名称,进入容器时会用到 {image_id} 为docker镜像的id,在宿主机上可通过docker images查询得到。
  • 操作流程 图1 操作流程图 表1 操作任务流程说明 阶段 任务 说明 准备工作 准备环境 本教程案例是基于ModelArts Lite DevServer运行的,需要购买并开通DevServer资源。 准备代码 准备AscendSpeed训练代码、分词器Tokenizer和推理代码。 准备数据 准备训练数据,可以用Alpaca数据集,也可以使用自己准备的数据集。 准备镜像 准备训练模型适用的容器镜像。 预训练 预训练 介绍如何进行预训练,包括训练数据处理、超参配置、训练任务、断点续训及性能查看。 微调训练 SFT全参微调 介绍如何进行SFT全参微调。 LoRA微调训练 介绍如何进行LoRA微调训练。 推理前的权重转换 (二选一) 训练权重合并及转换 推理前,需要将预训练或SFT全参微调产生的多个权重文件合并为一个,并转换为HuggingFace格式。 LoRA权重合并及转换 推理前,需要将LoRA微调训练产生的多个权重文件合并为一个,并转换为HuggingFace格式。 推理部署 部署推理服务 介绍如何部署并启动推理服务。 推理性能测试 介绍如何验证推理性能,包括静态和动态benchmark。 推理精度测试 介绍如何测试推理精度,并获取评测结果。
  • Step1 修改预训练脚本 执行命令如下,进入/home/ma-user/ws/AscendCloud-3rdLLM-6.3.902/llm_train/AscendSpeed/代码目录。 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的预训练启动脚本。 #llama2-13b 预训练启动脚本 vim scripts/llama2/pretrain-llama2-13b.sh 修改脚本中以下内容。 DATASET_PATH #预处理后的数据地址:*注意:一般为数据地址/数据前缀名 TOKENIZER_PATH #tokeneizer地址 SAVE_PATH # 中间保存结果 包含日志 SAVE_CKPT_PATH #训练ckpt保存地址 TRAIN_ITERS=2000 #训练迭代周期,根据自己实际要求修改 MBS=4 #流水线并行中一个micro batch所处理的样本量 GBS=64 #训练中所有机器一个step所处理的样本量,建议值单机64,双机128 TP=8 #张量并行 PP=1 #流水线并行,单机建议为1,双机建议值为2 修改完后,保存退出。 :wq
  • 获取数据及代码 表1 准备代码 代码包名称 代码说明 下载地址 AscendCloud-3rdLLM-6.3.902-xxx.zip 包含了本教程中使用到的模型训练代码、推理部署代码和推理评测代码。代码包具体说明请参见代码目录介绍。 AscendSpeed是用于模型并行计算的框架,其中包含了许多模型的输入处理方法。 获取路径:Support网站。 说明: 如果没有软件下载权限,请联系您所在企业的华为方技术支持下载获取。 权重和词表文件 包含了本教程使用到的HuggingFace原始权重文件和Tokenizer。 标记器(Tokenizer)是NLP管道的核心组件之一。它们有一个目的:将文本转换为模型可以处理的数据。模型只能处理数字,因此标记器(Tokenizer)需要将文本输入转换为数字数据。 llama-2-13b-chat-hf 这个路径下既有权重,也有Tokenizer,全部下载。具体内容参见权重和词表文件介绍。
  • 权重和词表文件介绍 下载完毕后的HuggingFace原始权重文件包含以下内容,此处以llama2-13B为例。 llama2-13B ├── config.json ├── generation_config.json ├── gitattributes.txt ├── LICENSE.txt ├── Notice.txt ├── pytorch_model-00001-of-00003.bin ├── pytorch_model-00002-of-00003.bin ├── pytorch_model-00003-of-00003.bin ├── pytorch_model.bin.index.json ├── README.md ├── special_tokens_map.json ├── tokenizer_config.json ├── tokenizer.json ├── tokenizer.model └── USE_POLICY.md
  • 代码目录介绍 AscendCloud-3rdLLM-6.3.902代码包结构介绍如下: 6.3.902-Ascend ├──llm_evaluation #推理评测代码包 ├──benchmark_eval #精度评测 ├──benchmark_tools #性能评测 ├──llm_train #模型训练代码包 ├──AscendSpeed #基于AscendSpeed的训练代码 ├──Megatron-LM #三方依赖:megatron ├──ModelLink #基于AscendSpeed的训练代码 ├──scripts/ #训练需要的启动脚本 本教程需要使用到的训练相关代码存放在AscendCloud-3rdLLM-6.3.902/llm_train/AscendSpeed目录下,具体文件介绍如下: ├──llm_train #模型训练代码包 ├──AscendSpeed #基于AscendSpeed的训练代码 ├──Megatron-LM #三方依赖megatron ├──ModelLink #基于AscendSpeed的训练代码,数据预处理脚本 ├──scripts/ #训练需要的启动脚本,调用ModelLink ├──tools #权重转换脚本 ├──llama2 #Llama2的训练代码 ├──llama2.sh #Llama2训练主脚本 ├──lora-llama2-13b.sh #LoRA微调训练脚本,执行前需要修改参数,执行时会调用llama2.sh脚本 ├──pretrain-llama2-13b.sh #预训练脚本,执行前需要修改参数,执行时会调用llama2.sh脚本 ├──retrain-llama2-13b.sh #断点续训练脚本,执行前需要修改参数,执行时会调用llama2.sh脚本 ├──sft-llama2-13b.sh #SFT全参微调脚本,执行前需要修改参数,执行时会调用llama2.sh脚本
  • 上传代码到工作环境 使用root用户以SSH的方式登录DevServer。 将AscendSpeed代码包AscendCloud-3rdLLM-6.3.902-xxx.zip上传到${workdir}目录下并解压缩,如:/home/ma-user/ws目录下,以下都以/home/ma-user/ws为例。 unzip AscendCloud-3rdLLM-6.3.902-xxx.zip #解压缩,XXX表示时间戳 上传tokenizers文件到工作目录中的/home/ma-user/ws/tokenizers/llama2-13b-hf目录。 具体步骤如下: 进入到${workdir}目录下,如:/home/ma-user/ws。 cd /home/ma-user/ws mkdir -p tokenizers/llama2-13b-hf 将权重和词表文件放置此处。
  • Step1 修改LoRA微调训练脚本 执行命令如下,进入/home/ma-user/ws/AscendCloud-3rdLLM-6.3.902/llm_train/AscendSpeed/代码目录。 cd /home/ma-user/ws/AscendCloud-3rdLLM-6.3.902/llm_train/AscendSpeed/ 执行如下命令修改Llama2-13b的LoRA微调训练脚本lora-llama2-13b.sh。 vim scripts/llama2/lora-llama2-13b.sh 修改脚本内容,与SFT全参微调参数保持一致,不同点为RUN_TYPE类型不同,RUN_TYPE=lora;以及输入输出路径的配置的不同。 # learning rate args LR=0.00001 MIN_LR=0.000001 TRAIN_ITERS=2000 #训练周期 LR_WARMUP_ITERS=2000 MBS=4 GBS=64 #训练中所有机器一个step所处理的样本量,建议单机64,双机128。 # data args PWD=`pwd` datasets_PATH=/home/ma-user/ws/datasets/alpaca-ft/llama2-13b/alpaca-ft #训练数据输入路径,不加文件类型后缀 TOKENIZER_PATH=/home/ma-user/ws/tokenizers/llama2-13b-hf #TOKENIZER存放路径 SAVE_PATH=$PWD/ckpt #训练过程文件保存路径,包括日志 SAVE_CKPT_PATH=${SAVE_PATH}/ckpt-llama2-13b #续训完成后的权重保存目录 MODEL_PATH=/home/ma-user/ws/weight/llama2-13b-ckpt #预训练后的模型生成路径,断点续训时必须要有此参数。 # megatron args TP=8 PP=1 SEED=1234 RUN_TYPE=lora #表示脚本运行类型是断点续训,表示训练类型是LoRA微调训练 修改完后,保存退出。 :wq
  • Step3 启动容器镜像 启动容器镜像前请先按照参数说明修改${}中的参数。可以根据实际需要增加修改参数。启动容器命令如下。 container_work_dir="/home/ma-user/ws" # 容器内挂载的目录 work_dir="/home/ma-user/ws" # 宿主机挂载目录,存放了代码、数据、权重 container_name="${container_name}" # ${container_name}为启动的容器名称 image_name="${image_name}" # ${image_name}启动的镜像ID或name docker run -itd \ --device=/dev/davinci0 \ --device=/dev/davinci1 \ --device=/dev/davinci2 \ --device=/dev/davinci3 \ --device=/dev/davinci4 \ --device=/dev/davinci5 \ --device=/dev/davinci6 \ --device=/dev/davinci7 \ --device=/dev/davinci_manager \ --device=/dev/devmm_svm \ --device=/dev/hisi_hdc \ -v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \ -v /usr/local/dcmi:/usr/local/dcmi \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ --cpus 192 \ --memory 1000g \ --shm-size 32g \ --net=host \ -v ${work_dir}:${container_work_dir} \ --name ${container_name} \ $image_name \ /bin/bash 参数说明: --name ${container_name} 容器名称,进入容器时会用到,此处可以自己定义一个容器名称,例如ascendspeed。 -v ${work_dir}:${container_work_dir} 代表需要在容器中挂载宿主机的目录。宿主机和容器使用不同的文件系统。work_dir为宿主机中工作目录,目录下存放着训练所需代码、数据等文件。container_work_dir为要挂载到的容器中的目录。为方便两个地址可以相同。 容器不能挂载/home/ma-user目录,此目录为ma-user用户家目录。 driver及npu-smi需同时挂载至容器。 ${image_name} 为docker镜像的ID,在宿主机上可通过docker images查询得到。 通过容器名称进入容器中。 docker exec -it ${container_name} bash 启动容器时默认用户为ma-user用户。如果需要切换到root用户可以执行以下命令: sudo su source /home/ma-user/.bashrc 如果继续使用ma-user,在使用其他属组如root用户上传的数据和文件时,可能会存在权限不足的问题,因此需要执行如下命令统一文件属主。 sudo chown -R ma-user:ma-group ${container_work_dir} # ${container_work_dir}:/home/ma-user/ws 容器内挂载的目录 例如: sudo chown -R ma-user:ma-group /home/ma-user/ws 安装依赖包。 #进入scriptsscripts目录,xxx为包版本,请按照实际情况替换 cd /home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/scripts #执行安装命令 pip install -r requirements.txt
  • Step2 准备训练数据 ChatGLM-6B-finetune训练使用的是ADGEN数据集,可以从Tsinghua Cloud下载。下载数据集之后,请参考以下要求创建OBS桶中的文件夹,并上传数据到OBS桶中,用于后续的算法微调训练。 OBS文件夹目录要求如下: {chatglm-mindspore-ma} # OBS对象桶,用户可以自定义名称,例如:chatglm-mindspore-ma -{data} # OBS文件夹,用于存放训练输入数据,用户可以自定义名称,例如:data -{AdvertiseGen} # OBS文件夹,用于存放训练输入数据,用户可以自定义名称,例如:AdvertiseGen - train.json # 训练数据集 - dev.json # 评估数据集 -{OBS文件夹} #训练输出路径,用于存放训练生成的模型文件等,用户可以自定义名称,例如:output -{OBS文件夹} #作业日志路径,用于存放训练日志,用户可以自定义名称,例如:log 本文档中使用的是开源数据集,主要用于跑通流程和体验,客户的实际业务开展需要根据数据集格式要求匹配自己的业务数据来做精细的调参。
  • 操作流程 开始使用如下样例前,请务必按准备工作指导完成必要操作。 Step1 准备算法:在AI Gallery中订阅算法。 Step2 准备训练数据:准备训练数据。创建OBS桶和文件夹,并将训练数据上传到OBS中。 Step3 全量微调训练:对算法进行全量微调。 Step4 部署模型并推理预测:训练完成后,部署模型并进行推理预测。 Step5 清理资源:运行完成后,停止服务并删除OBS中的数据,避免不必要的资源浪费。
  • LoRA微调超参配置 本章节介绍LoRA微调训练前的超参配置,可以根据实际需要修改。 LoRA微调训练脚本lora-llama2-13b.sh,存放在AscendCloud-3rdLLM-6.3.902/llm_train/AscendSpeed/scripts/llama2/目录下。训练前,可以根据实际需要修改超参配置。 微调任务配置,操作同预训练配置类似,不同点为RUN_TYPE类型不同,以及输入输出路径的配置的不同。 表1 超参配置 参数 值 参数说明 DATA_PATH /home/ma-user/ws/datasets/alpaca-ft/llama2-13b/alpaca-ft 必填。训练时指定的输入数据路径。一般为数据地址/处理后的数据前缀名,不加文件类型后缀。 TOKENIZER_PATH /home/ma-user/ws/tokenizers/llama2-13b-hf 必填。tokenizer保存地址。 SAVE_PATH $PWD/ckpt 中间保存结果,包含训练日志。 SAVE_CKPT_PATH ${SAVE_PATH}/ckpt-llama2-13b-lora 必填。训练ckpt保存地址。 MODEL_PATH /home/ma-user/ws/weight/llama2-13b-ckpt 必填。加载的权重文件路径。取值二选一: (推荐)上一步LoRA微调权重转换章节中将HuggingFace格式转化为AscendSpeed格式的权重文件。 预训练完成后保存的权重文件,即预训练超参配置中的SAVE_CKPT_PATH值。如果使用此权重文件,需要将权重文件的名称改为release,将latest_checkpointed_iteration.txt的内容文件内容改为release,具体参考1和5.3-2。 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微调训练
  • 预训练超参配置 本章节介绍预训练前的超参配置,可以根据实际需要修改。 预训练脚本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。 父主题: 预训练
  • 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收敛情况
  • 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 转换后的权重文件
  • 评测结果 默认情况下,评测结果会按照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
  • 权重合并和转换介绍 模型训练完成后,训练的产物包括模型的权重、优化器状态、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微调训练
共100000条