华为云用户手册

  • Step3 为用户配置ModelArts的委托访问授权 配置完IAM权限之后,需要在ModelArts页面为子用户设置ModelArts访问授权,允许ModelArts访问OBS、SWR、IEF等依赖服务。 此方式只允许主用户为子用户进行配置。因此,本示例中,管理员账号需为所有用户完成访问授权的配置。 使用主用户的账号登录ModelArts服务管理控制台。请注意选择左上角的区域,例如“华南-广州”。 在左侧导航栏单击“全局配置”,进入“全局配置”页面。 单击“添加授权”。在“授权”页面,在“授权对象类型”下面选择“所有用户”,选择“新增委托 ”,为该主用户下面的所有子用户配置委托访问授权。 普通用户:普通用户的委托权限包括了用户使用ModelArts完成AI开发的所有必要功能权限,如数据的访问、训练任务的创建和管理等。一般用户选择此项即可。 自定义:如果对用户有更精细化的权限管理需求,可使用自定义模式灵活按需配置ModelArts创建的委托权限。可以根据实际需在权限列表中勾选要配置的权限。 勾选“我已经详细阅读并同意《ModelArts服务声明》”,单击“创建”,完成委托授权配置。 父主题: 配置ModelArts基本使用权限
  • HuggingFace权重转换操作 这里以Qwen-14B为例,Qwen-7B和Qwen-72B只需按照实际情况修改环境变量参数即可。 下载Qwen-14B的预训练权重和词表文件,并上传到/home/ma-user/ws/tokenizers/Qwen-14B目录下。具体下载地址请参见表1。如果已下载,忽略此步骤。 创建权重转换后的输出目录/home/ma-user/ws/processed_for_ma_input/Qwen-14B/converted_weights/。 cd /home/ma-user/ws/ #进入/home/ma-user/ws/目录 mkdir -p processed_for_ma_input/Qwen-14B/converted_weights 进入代码目录/home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/ModelLink,在代码目录中执行util.py脚本。 #加载ascendspeed及megatron模型: export PYTHONPATH=$PYTHONPATH:/home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/AscendSpeed export PYTHONPATH=$PYTHONPATH:/home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/ModelLink #进入到ModelLink目录下: cd /home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/ModelLink # 权重格式转换 python tools/checkpoint/util.py --model-type GPT \ --loader qwen_hf \ --saver megatron \ --target-tensor-parallel-size 8 \ #与微调TP值保持一致 --target-pipeline-parallel-size 1 \ #与微调PP值保持一致 --load-dir /home/ma-user/ws/tokenizers/Qwen-14B \ --save-dir /home/ma-user/ws/processed_for_ma_input/Qwen-14B/converted_weights \ --tokenizer-model /home/ma-user/ws/tokenizers/Qwen-14B/qwen.tiktoken \ --add-qkv-bias 参数说明: --model-type:模型类型。 --loader:权重转换要加载检查点的模型名称。 --tensor-model-parallel-size:张量并行数,需要与训练脚本中的配置一样。 --pipeline-model-parallel-size:流水线并行数,需要与训练脚本中的配置一样。 --saver:检查模型保存名称。 --load-dir:加载转换模型权重路径。 --save-dir:权重转换完成之后保存路径。 --tokenizer-model:tokenizer 路径。 --add-qkv-bias:为qkv这样的键和值添加偏差。 权重转换完成后,在/home/ma-user/ws/processed_for_ma_input/Qwen-14B/converted_weights目录下查看转换后的权重文件。 图1 转换后的权重文件
  • 权限清单 权限 表1 管理AI应用所需权限 业务场景 依赖的服务 依赖策略项 支持的功能 配置建议 管理AI应用 ModelArts modelarts:model:* 创建、删除、查看、导入AI模型。 建议配置。 仅在严格授权模式开启后,需要显式配置左侧权限。 SWR SWR Admin SWR Admin为SWR最大权限,用于: 从自定义镜像导入。 从OBS导入时使用自定义引擎。 按需配置。 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导入模型。 模型转换指定OBS路径。 按需配置。 表2 部署上线所需权限 业务场景 依赖的服务 依赖策略项 支持的功能 配置建议 部署服务 ModelArts modelarts:service:* 部署、启动、查新、更新模型服务。 建议配置。 仅在严格授权模式开启后,需要显式配置左侧权限。 LTS lts:logs:list 查询和展示LTS日志。 按需配置。 批量服务 OBS obs:object:GetObject obs:object:PutObject obs:bucket:CreateBucket obs:bucket:ListBucket obs:bucket:ListAllMyBuckets 创建批量服务。 按需配置。 边缘服务 CES ces:metricData:list 查看服务的监控指标。 按需配置。 IEF IEF Administrator 管理边缘服务。 按需配置。 创建自定义策略时,建议将项目级云服务和全局级云服务拆分为两条策略,便于授权时设置最小授权范围。 委托 表3 部署上线所需委托 业务场景 依赖的服务 委托授权项 说明 配置建议 在线服务 LTS lts:groups:create lts:groups:list lts:topics:create lts:topics:delete lts:topics:list 在线服务配置LTS日志上报。 按需配置。 批量服务 OBS obs:bucket:ListBucket obs:object:GetObject obs:object:PutObject 运行批量服务。 按需配置。 边缘服务 IEF ief:deployment:list ief:deployment:create ief:deployment:update ief:deployment:delete ief:node:createNodeCert ief:iefInstance:list ief:node:list 通过IEF部署边缘服务。 按需配置。
  • 数据处理具体操作 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不加文件类型后缀。
  • Alpaca数据处理 数据预处理脚本preprocess_data.py存放在代码包的“llm_train/AscendSpeed/ModelLink/tools/”目录中,以Llama2-70B为例, 脚本具体内容如下。 #进入到ModelLink目录下,xxx-Ascend请根据实际目录替换 cd /home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/ModelLink #加载ascendspeed及megatron模型 export PYTHONPATH=$PYTHONPATH:/home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/AscendSpeed export PYTHONPATH=$PYTHONPATH:/home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/ModelLink #数据预处理 python ./tools/preprocess_data.py \ --input {work_dir}/training_data/train-00000-of-00001-a09b74b3ef9c3b56.parquet \ --tokenizer-name-or-path {work_dir}/tokenizers/Llama2-70B \ --output-prefix {work_dir}/processed_for_ma_input/Llama2-70B/data/pretrain/alpaca \ --workers 8 \ --log-interval 1000 \ --tokenizer-type PretrainedFromHF 参数说明: ${work_dir}的路径指容器工作路径:如/home/ma-user/ws/ 。 - input:原始数据集的存放路径 - output-prefix:处理后的数据集保存路径+数据集名称前缀(例如: alpaca) - tokenizer-type:tokenizer的类型,可选项有['BertWordPieceLowerCase','BertWordPieceCase','GPT2BPETokenizer','PretrainedFromHF'],一般为PretrainedFromHF。 - tokenizer-name-or-path:tokenizer的存放路径 -workers:设置数据处理使用执行卡数量 -log-interval:是一个用于设置日志输出间隔的参数,表示输出日志的频率。在训练大规模模型时,可以通过设置这个参数来控制日志的输出 数据预处理后输出的训练数据如下: alpaca_text_document.bin alpaca_text_document.idx 训练的时指定的数据路径为${path}/alpaca/llama2-70B/alpaca_text_document, 不加文件类型后缀。
  • 自定义数据 如果是用户自己准备的数据集,可以使用Ascendspeed代码仓中的转换工具将json格式数据集转换为训练中使用的.idx + .bin格式。 #示例: #1.将准备好的json格式数据集存放于/home/ma-user/ws/training_data目录下: 如data.json #2.运行转换脚本 cd /home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/ModelLink/ #加载ascendspeed及megatron模型,xxx-Ascend请根据实际目录替换 export PYTHONPATH=$PYTHONPATH:/home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/AscendSpeed export PYTHONPATH=$PYTHONPATH:/home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/ModelLink python ./tools/preprocess_data.py \ --input {work_dir}/training_data/data.json \ --tokenizer-name-or-path {work_dir}/tokenizers/Llama2-70B \ --output-prefix {work_dir}/processed_for_ma_input/Llama2-70B/data/pretrain/alpaca \ --workers 8 \ --log-interval 1000 \ --tokenizer-type PretrainedFromHF #3.执行完成后在 datasets文件夹中可以得到 data_text_document.idx 与data_text_document.bin 两个文件
  • 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
  • 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查询得到。
  • Step5 启动推理服务 配置推理服务需要的环境变量。 export ATB_LAYER_INTERNAL_TENSOR_REUSE=1 配置需要使用的NPU卡,例如:实际使用的是第1张和第2张卡,此处填写为0,1,以此类推。 export ASCEND_RT_VISIBLE_DEVICES=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
  • 操作流程 图1 操作流程图 表1 操作任务流程说明 阶段 任务 说明 准备工作 准备环境 本教程案例是基于ModelArts Lite DevServer运行的,需要购买并开通DevServer资源。 准备代码 准备AscendSpeed训练代码、分词器Tokenizer和推理代码。 准备数据 准备训练数据,可以用Alpaca数据集,也可以使用自己准备的数据集。 准备镜像 准备训练模型适用的容器镜像。 预训练 预训练 介绍如何进行预训练,包括训练数据处理、超参配置、训练任务、断点续训及性能查看。 微调训练 SFT全参微调 介绍如何进行SFT全参微调。 LoRA微调训练 介绍如何进行LoRA微调训练。 推理前的权重转换 (二选一) 训练权重合并及转换 推理前,需要将预训练或SFT全参微调产生的多个权重文件合并为一个,并转换为HuggingFace格式。 LoRA权重合并及转换 推理前,需要将LoRA微调训练产生的多个权重文件合并为一个,并转换为HuggingFace格式。 推理部署 部署推理服务 介绍如何部署并启动推理服务。 推理性能测试 介绍如何验证推理性能,包括静态和动态benchmark。 推理精度测试 介绍如何测试推理精度,并获取评测结果。
  • 准备数据类似 登录coco数据集下载官网地址:https://cocodataset.org/#download 下载coco2017数据集的Train(18GB)、Val images(1GB)、Train/Val annotations(241MB),分别解压后并放入coco文件夹中。 下载完成后,将数据上传至SFS相应目录中。由于数据集过大,推荐先通过obsutil工具将数据集传到OBS桶后,再将数据集迁移至SFS。 在本机机器上运行,通过obsutil工具将本地数据集传到OBS桶。 # 将本地数据传至OBS中 # ./obsutil cp ${数据集所在的本地文件夹路径} ${存放数据集的obs文件夹路径} -f -r # 例如 ./obsutil cp ./coco obs://your_bucket/ -f -r 登录ECS服务器,通过obsutil工具将数据集迁移至SFS,样例代码如下: # 将OBS数据传至SFS中 # ./obsutil cp ${数据集所在的obs文件夹路径} ${SFS文件夹路径} -f -r # 例如 ./obsutil cp obs://your_bucket/coco/ /mnt/sfs_turbo/ -f -r /mnt/sfs_turbo/coco文件夹内目录结构如下: coco |---annotations |---train2017 |---val2017 更多obsutil的操作,可参考obsutil简介。 将文件设置归属为ma-user: chown -R ma-user:ma-group coco
  • Alpaca数据处理 数据预处理脚本preprocess_data.py存放在代码包的“llm_train/AscendSpeed/ModelLink/tools/”目录中,脚本具体内容如下。 cd /home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/ModelLink #数据预处理 export PYTHONPATH=$PYTHONPATH:/home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/AscendSpeed export PYTHONPATH=$PYTHONPATH:/home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/ModelLink python ./tools/preprocess_data.py \ --input {work_dir}/training_data/pretrain/train-00000-of-00001-a09b74b3ef9c3b56.parquet \ --tokenizer-name-or-path {work_dir}/tokenizers/Qwen-14B \ --output-prefix {work_dir}/processed_for_ma_input/Qwen-14B/data/pretrain/alpaca \ --workers 8 \ --log-interval 1000 \ --tokenizer-type PretrainedFromHF \ --seq-length 4096 参数说明: ${work_dir}的路径指容器工作路径:如/home/ma-user/ws/ 。 - input:原始数据集的存放路径。 - output-prefix:处理后的数据集保存路径+数据集名称前缀(例如: alpaca),替换为实际模型的路径。 - tokenizer-type:tokenizer的类型,可选项有['BertWordPieceLowerCase','BertWordPieceCase','GPT2BPETokenizer','PretrainedFromHF'],一般为PretrainedFromHF。 - tokenizer-name-or-path:tokenizer的存放路径,替换为实际模型的路径。 -workers:设置数据处理使用执行卡数量。 -log-interval:是一个用于设置日志输出间隔的参数,表示输出日志的频率。在训练大规模模型时,可以通过设置这个参数来控制日志的输出。 -seq-length : 是一个用于设置序列长度的参数,表示模型处理的序列长度。在训练大规模模型时,可以通过设置这个参数来优化模型的训练速度和效果。 数据预处理后输出的训练数据如下: alpaca_text_document.bin alpaca_text_document.idx 训练的时指定的数据路径为${path}/alpaca/qwen-14b/alpaca_text_document, 不加文件类型后缀。
  • 自定义数据 如果是用户自己准备的数据集,可以使用Ascendspeed代码仓中的转换工具将json格式数据集转换为训练中使用的.idx + .bin格式。 #示例 #1.将准备好的json格式数据集存放于/home/ma-user/ws/training_data/pretrain目录下: 如data.json #2.运行转换脚本 cd /home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/ModelLink/ 加载ascendspeed及megatron模型 export PYTHONPATH=$PYTHONPATH:/home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/AscendSpeed export PYTHONPATH=$PYTHONPATH:/home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/ModelLink #运行以下命令 python ./tools/preprocess_data.py \ --input {work_dir}/training_data/pretrain/data.json \ --tokenizer-name-or-path {work_dir}/tokenizers/Qwen-14B \ --output-prefix {work_dir}/processed_for_ma_input/Qwen-14B/data/pretrain/alpaca \ --workers 8 \ --log-interval 1000 \ --tokenizer-type PretrainedFromHF \ --seq-length 4096 #3.执行完成后在 datasets文件夹中可以得到 data_text_document.idx 与data_text_document.bin 两个文件
  • 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
  • 数据预处理 使用数据预处理脚本preprocess_data.py脚本重新生成.bin和.idx格式的SFT全参微调数据。preprocess_data.py存放在xxx-Ascend/llm_train/AscendSpeed/ModelLink/tools目录中,脚本具体内容如下。xxx-Ascend请根据实际目录替换。 #加载ascendspeed及megatron模型 export PYTHONPATH=$PYTHONPATH:/home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/AscendSpeed export PYTHONPATH=$PYTHONPATH:/home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/ModelLink #进入ModelLink目录 cd /home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/ModelLink python ./tools/preprocess_data.py \ --input /home/ma-user/ws/training_data/train-00000-of-00001-a09b74b3ef9c3b56.parquet \ --tokenizer-name-or-path $TOKENIZER_PATH \ --output-prefix $DATASET_PATH\ --tokenizer-type PretrainedFromHF \ --workers 8 \ --handler-name GeneralInstructionHandler \ --log-interval 1000 \ --append-eod 参数说明: - input:SFT全参微调数据的存放路径。 - output-prefix:处理后的数据集保存路径+数据集名称前缀(例如:alpaca_ft)。 - tokenizer-type:tokenizer的类型,可选项有['BertWordPieceLowerCase', 'BertWordPieceCase','GPT2BPETokenizer', 'PretrainedFromHF'],设置为PretrainedFromHF。 - tokenizer-name-or-path:tokenizer的存放路径。 - handler-name:生成数据集的用途,这里是生成的指令数据集,用于微调。 - workers:数据处理线程数。 -append-eod:用于控制是否在每个输入序列的末尾添加一个特殊的标记。这个标记表示输入序列结束,可以帮助模型更好地理解和处理长序列。 - log-interval:输出处理日志刷新间隔。 输出结果 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
  • 下载数据 SFT全参微调涉及的数据下载地址:https://huggingface.co/datasets/tatsu-lab/alpaca/resolve/main/data/train-00000-of-00001-a09b74b3ef9c3b56.parquet 如果在准备数据章节已下载数据集,此处无需重复操作。 SFT全参微调和LoRA微调训练使用的是同一个数据集,数据处理一次即可,训练时可以共用。
  • 数据处理具体操作 SFT全参微调数据处理具体操作步骤如下。 创建处理后的数据存放目录/home/ma-user/ws/processed_for_ma_input/Llama2-70B/data/finetune/ cd /home/ma-user/ws/ #进入容器工作目录 mkdir -p processed_for_ma_input/Llama2-70B/data/finetune 进入代码目录“/home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/ModelLink/”,在代码目录中执行preprocess_data.py脚本处理数据。 此处提供一段实际的数据处理代码示例如下。 #进入到ModelLink目录下,xxx-Ascend请根据实际目录替换。 cd /home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/ModelLink/ #加载ascendspeed及megatron模型 export PYTHONPATH=$PYTHONPATH:/home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/AscendSpeed export PYTHONPATH=$PYTHONPATH:/home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/ModelLink #执行以下命令 python ./tools/preprocess_data.py \ --input /home/ma-user/ws/training_data/train-00000-of-00001-a09b74b3ef9c3b56.parquet \ --tokenizer-name-or-path /home/ma-user/ws/tokenizers/Llama2-70B \ --output-prefix /home/ma-user/ws/processed_for_ma_input/Llama2-70B/data/finetune/alpaca_ft \ --workers 8 \ --log-interval 1000 \ --tokenizer-type PretrainedFromHF \ --handler-name GeneralInstructionHandler \ --append-eod 数据处理完后,在/home/ma-user/ws/processed_for_ma_input/Llama2-70B/data/finetune/目录下生成转换后的数据文件。
  • 权重和词表文件介绍 下载完毕后的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 将权重和词表文件放置此处。
  • 获取数据及代码 表1 准备代码 代码包名称 代码说明 下载地址 AscendCloud-3rdLLM-6.3.902-xxx.zip 包含了本教程中使用到的模型训练代码、推理部署代码和推理评测代码。代码包具体说明请参见代码目录介绍。 AscendSpeed是用于模型并行计算的框架,其中包含了许多模型的输入处理方法。 获取路径:Support网站。 说明: 如果没有软件下载权限,请联系您所在企业的华为方技术支持下载获取。 权重和词表文件 包含了本教程使用到的HuggingFace原始权重文件和Tokenizer。 标记器(Tokenizer)是NLP管道的核心组件之一。它们有一个目的:将文本转换为模型可以处理的数据。模型只能处理数字,因此标记器(Tokenizer)需要将文本输入转换为数字数据。 llama-2-13b-chat-hf 这个路径下既有权重,也有Tokenizer,全部下载。具体内容参见权重和词表文件介绍。
  • 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
  • 操作流程 开始使用如下样例前,请务必按准备工作指导完成必要操作。 Step1 准备算法:在AI Gallery中订阅算法。 Step2 准备训练数据:准备训练数据。创建OBS桶和文件夹,并将训练数据上传到OBS中。 Step3 全量微调训练:对算法进行全量微调。 Step4 部署模型并推理预测:训练完成后,部署模型并进行推理预测。 Step5 清理资源:运行完成后,停止服务并删除OBS中的数据,避免不必要的资源浪费。
  • 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 本文档中使用的是开源数据集,主要用于跑通流程和体验,客户的实际业务开展需要根据数据集格式要求匹配自己的业务数据来做精细的调参。
  • 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微调训练
  • 数据处理具体操作 SFT全参微调数据处理具体操作步骤如下。 创建处理后的数据存放目录/home/ma-user/ws/processed_for_ma_input/Qwen-14B/data/finetune/ cd /home/ma-user/ws/ #进入容器工作目录 mkdir -p processed_for_ma_input/Qwen-14B/data/finetune 进入代码目录“/home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/ModelLink/”,在代码目录中执行preprocess_data.py脚本处理数据。 此处提供一段实际的数据处理代码示例如下。 #加载ascendspeed及megatron模型 export PYTHONPATH=$PYTHONPATH:/home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/AscendSpeed export PYTHONPATH=$PYTHONPATH:/home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/ModelLink #进入到ModelLink目录下 cd /home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/ModelLink/ #执行以下命令 python ./tools/preprocess_data.py \ --input /home/ma-user/ws/training_data/finetune/alpaca_gpt4_data.json \ --tokenizer-name-or-path /home/ma-user/ws/tokenizers/Qwen-14B \ --output-prefix /home/ma-user/ws/processed_for_ma_input/Qwen-14B/data/finetune/alpaca_ft \ --workers 8 \ --log-interval 1000 \ --tokenizer-type PretrainedFromHF \ --handler-name GeneralInstructionHandler \ --make-vocab-size-divisible-by 128 \ --seq-length 4096 \ 数据处理完后,在/home/ma-user/ws/processed_for_ma_input/Qwen-14B/data/finetune/目录下生成转换后的数据文件。
  • 数据预处理 使用数据预处理脚本preprocess_data.py脚本重新生成.bin和.idx格式的SFT全参微调数据。preprocess_data.py存放在llm_train/AscendSpeed/ModelLink/tools目录中,脚本具体内容如下。 #进入ModelLink目录 cd /home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/ModelLink #加载ascendspeed及megatron模型 export PYTHONPATH=$PYTHONPATH:/home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/AscendSpeed export PYTHONPATH=$PYTHONPATH:/home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/ModelLink #执行以下命令 python ./tools/preprocess_data.py \ --input /home/ma-user/ws/training_data/finetune/alpaca_gpt4_data.json \ --tokenizer-name-or-path $TOKENIZER_PATH \ --output-prefix $DATASET_PATH\ --tokenizer-type PretrainedFromHF \ --seq-length 4096 \ --workers 8 \ --handler-name GeneralInstructionHandler \ --make-vocab-size-divisible-by 128 \ --log-interval 1000 参数说明: - input:SFT微调数据的存放路径。 - output-prefix:处理后的数据集保存路径+数据集名称前缀(例如:alpaca_ft)。 - tokenizer-type:tokenizer的类型,可选项有['BertWordPieceLowerCase', 'BertWordPieceCase','GPT2BPETokenizer', 'PretrainedFromHF'],设置为PretrainedFromHF。 - tokenizer-name-or-path:tokenizer的存放路径。 - handler-name:生成数据集的用途,这里是生成的指令数据集,用于微调。 - seq-length:是一个用于计算序列长度的函数。它接收一个序列作为输入,并返回序列的长度,需和训练时参数保持一致。 - workers:数据处理线程数。 --make-vocab-size-divisible-by:填充词汇大小,使模型中padded-vocab-size的值可被该值整除。这是出于计算效率的原因而添加的。 - log-interval:输出处理日志刷新间隔。 输出结果 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
共100000条