华为云用户手册

  • 静态benchmark验证操作 切换到benchmark虚拟环境测试,命令如下。静态benchmark验证是在benchmark虚拟环境中操作。 conda activate benchmark 运行静态benchmark验证脚本benchmark_parallel.py,具体操作命令如下,可以根据参数说明修改参数。 cd benchmark_tools python benchmark_parallel.py --backend tgi --host 127.0.0.1 --port 8085 --tokenizer /path/to/tokenizer --epochs 5 \ --parallel-num 1 4 8 16 32 --prompt-tokens 1024 2048 --output-tokens 128 256 --benchmark-csv benchmark_parallel.csv 参数说明 --backend:服务类型,支持tgi、vllm、mindspore等。本文档使用的推理接口是tgi。 --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测试结果
  • 场景介绍 对于ModelArts专属资源池的用户,不允许使用公共资源池创建训练作业、创建Notebook实例或者部署推理服务时,可以通过权限控制限制用户使用公共资源池。 涉及配置的自定义权限策略项如下; modelarts:notebook:create:此策略项表示创建Notebook实例。 modelarts:trainJob:create:此策略项表示创建训练作业。 modelarts:service:create:此策略项表示创建推理服务。
  • Alpaca数据处理 数据预处理脚本preprocess_data.py存放在代码包的“llm_train\AscendSpeed\ModelLink\”目录中,脚本具体内容如下。 cd /home/ma-user/ws/AscendCloud-3rdLLM-6.3.902/llm_train/AscendSpeed/ModelLink python tools/preprocess_data.py \ --input ${path}/train-00000-of-00001-a09b74b3ef9c3b56.parquet \ --output-prefix ${path}/alpaca/llama2-13B/alpaca \ --tokenizer-type PretrainedFromHF \ --tokenizer-name-or-path ${path}/tokenizers/llama2-13b-hf \ --tokenizer-not-use-fast \ --json-keys text 参数说明: - input:数据集的存放路径,本案例中${path}的路径为/home/ma-user/ws/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, 不加文件类型后缀。
  • 自定义数据 如果是用户自己准备的数据集,可以使用Ascendspeed代码仓中的转换工具将json格式数据集转换为训练中使用的.idx + .bin格式。 #示例: #1.将准备好的json格式数据集存放于/home/ma-user/ws/datasets/data目录下: data.json #2.运行转换脚本 cd /home/ma-user/ws/llm_train/AscendSpeed/ModelLink/ python tools/preprocess_data.py --input data.json \ #需要转换的数据集路径 --output-prefix datasets/data \ #转换后存放的数据集路径 --tokenizer-type PretrainedFromHF \ --tokenizer-name-or-path llama2-13b-hf \ --tokenizer-not-use-fast \ --json-keys text #3.执行完成后在 datasets文件夹中可以得到 data_text_document.idx 与data_text_document.bin 两个文件
  • 断点续训练操作过程 llama2-13b的断点续训脚本retrain-llama2-13b.sh,存放在“AscendCloud-3rdLLM-6.3.902/llm_train/AscendSpeed/scripts/llama2”目录下。 执行命令如下,进入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的断点续训练脚本。 vim scripts/llama2/retrain-llama2-13b.sh 断点续训练参数配置如下: # data args PWD=`pwd` datasets_PATH=/home/ma-user/ws/datasets/alpaca/llama2-13B/alpaca_text_document #训练数据输入路径,不加文件类型后缀 TOKENIZER_PATH=/home/ma-user/ws/tokenizers #TOKENIZER存放路径 SAVE_PATH=$PWD/ckpt #训练过程文件保存路径,包括日志 SAVE_CKPT_PATH=${SAVE_PATH}/ckpt-llama2-13b #训练ckpt保存地址 MODEL_PATH=${SAVE_PATH}/ckpt-llama2-13b #预训练后的模型生成路径,断点续训时必须要有此参数。 # megatron args TP=8 PP=1 SEED=1234 RUN_TYPE=retrain #表示脚本运行类型是断点续训 . .scripts/llama2/llama2.sh 修改完后,保存退出。 :wq 在AscendSpeed代码目录下执行断点续训练脚本。 bash scripts/llama2/retrain-llama2-13b.sh 图1 保存的ckpt 可以参考查看日志和性能操作,查看断点续训练日志和性能。
  • 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 安装pip源。 #进入scriptsscripts目录 cd /home/ma-user/ws/xxxend/llm_train/AscendSpeed/scripts #执行安装命令 pip install -r requirements.txt
  • 镜像地址 本教程中用到的训练和推理的基础镜像地址和配套版本关系如下表所示,请提前了解。 表1 基础容器镜像地址: 镜像用途 镜像地址 训练&推理基础镜像 西南-贵阳一:swr.cn-southwest-2.myhuaweicloud.com/atelier/pytorch_2_1_ascend:pytorch_2.1.0-cann_7.0.0-py_3.9-hce_2.0.2312-aarch64-snt9b-20240312154948-219655b 表2 模型镜像版本 模型 版本 CANN 7.0.1 PyTorch 2.1.0
  • 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 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为要挂载到的容器中的目录。为方便两个地址可以相同。 ${image_name} 为docker镜像的ID,在宿主机上可通过docker images查询得到。 通过容器名称进入容器中。 docker exec -it ${container_name} bash #配置镜像源,例如配置清华源 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pybind11==2.11.1 #安装三方依赖库 pip install -e git+https://gitee.com/ascend/DeepSpeed.git@v0.9.2#egg=deepspeed_npu #安装其他依赖库 #进入scripts目录并安装 requirements.txt文件的依赖库。 cd /home/ma-user/ws/6.3.902-Ascend/llm_train/AscendSpeed/scripts pip install requirements.txt 执行如下命令统一文件属组。启动容器时默认用户为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
  • Step2 获取训练镜像 建议使用官方提供的镜像部署训练服务。 镜像地址{image_url}为: 西南-贵阳一:swr.cn-southwest-2.myhuaweicloud.com/atelier/pytorch_2_1_ascend:pytorch_2.1.0-cann_7.0.0-py_3.9-hce_2.0.2312-aarch64-snt9b-20240312154948-219655b
  • 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
  • Step2 启动训练脚本 请根据表1修改超参值后,再启动训练脚本。Llama2-70B建议为8机64卡训练。 多机启动 以Llama2-70B为例,多台机器执行训练启动命令如下。进入代码目录/home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed下执行启动脚本。 #第一台节点 MASTER_ADDR=xx.xx.xx.xx NNODES=8 NODE_RANK=0 MODEL_TYPE=70B RUN_TYPE=sft DATASET_PATH=/home/ma-user/ws/processed_for_ma_input/Llama2-70B/data/finetune/alpaca_ft TOKENIZER_PATH=/home/ma-user/ws/tokenizers/Llama2-70B MODEL_PATH=/home/ma-user/ws/processed_for_ma_input/Llama2-70B/converted_weights TRAIN_ITERS=200 MBS=2 GBS=1024 TP=8 PP=8 WORK_DIR=/home/ma-user/ws sh scripts/llama2/llama2.sh # 第二台节点 MASTER_ADDR=xx.xx.xx.xx NNODES=8 NODE_RANK=1 MODEL_TYPE=70B RUN_TYPE=sft DATASET_PATH=/home/ma-user/ws/processed_for_ma_input/Llama2-70B/data/finetune/alpaca_ft TOKENIZER_PATH=/home/ma-user/ws/tokenizers/Llama2-70B MODEL_PATH=/home/ma-user/ws/processed_for_ma_input/Llama2-70B/converted_weights TRAIN_ITERS=200 MBS=2 GBS=1024 TP=8 PP=8 WORK_DIR=/home/ma-user/ws sh scripts/llama2/llama2.sh ... ... # 第八台节点 MASTER_ADDR=xx.xx.xx.xx NNODES=8 NODE_RANK=7 MODEL_TYPE=70B RUN_TYPE=sft DATASET_PATH=/home/ma-user/ws/processed_for_ma_input/Llama2-70B/data/finetune/alpaca_ft TOKENIZER_PATH=/home/ma-user/ws/tokenizers/Llama2-70B MODEL_PATH=/home/ma-user/ws/processed_for_ma_input/Llama2-70B/converted_weights TRAIN_ITERS=200 MBS=2 GBS=1024 TP=8 PP=8 WORK_DIR=/home/ma-user/ws sh scripts/llama2/llama2.sh 以上命令多台机器执行时,只有${NODE_RANK}的节点ID值不同,其他参数都保持一致。 其中MASTER_ADDR、 NODE_RANK、 NODE_RANK、MODEL_TYPE 、RUN_TYPE、DATASET_PATH、TOKENIZER_PATH、MODEL_PATH为必填。TRAIN_ITERS、MBS、GBS、TP、PP、WORK_DIR为非必填,有默认值。 单机启动 对于Llama2-7B和Llama2-13B,操作过程与Llama2-70B相同,只需修改对应参数即可,可以选用单机启动,以Llama2-13B为例。 进入代码目录/home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed下执行启动脚本,先修改以下命令中的参数,再复制执行。 #非必填参数,有默认值 MBS=4 \ GBS=64 \ TP=8 \ PP=1 \ TRAIN_ITERS=200 \ WORK_DIR=/home/ma-user/ws \ #必填参数 MODEL_TYPE=13B \ RUN_TYPE=sft \ DATASET_PATH=/home/ma-user/ws/processed_for_ma_input/Llama2-13B/data/finetune/alpaca_ft \ TOKENIZER_PATH=/home/ma-user/ws/tokenizers/Llama2-13B \ MODEL_PATH=/home/ma-user/ws/processed_for_ma_input/Llama2-70B/converted_weights \ sh scripts/llama2/llama2.sh 训练完成后,请参考查看日志和性能章节查看SFT微调的日志和性能。
  • Step1 修改训练超参配置 SFT全参微调脚本llama2.sh,存放在xxx-Ascend/llm_train/AscendSpeed/scripts/llama2目录下。训练前,可以根据实际需要修改超参配置。 微调任务配置,操作同预训练配置类似,不同点为RUN_TYPE类型不同,以及输入输出路径的配置的不同。SFT微调的计算量与预训练基本一致,故配置可以与预训练相同。 表1 SFT全参微调超参配置 参数 值 参数说明 DATASET_PATH /home/ma-user/ws/processed_for_ma_input/Llama2-70B/data/finetune/alpaca_ft 必填。训练时指定的输入数据路径。一般为数据地址/处理后的数据前缀名,不加文件类型后缀。 请根据实际规划修改。 TOKENIZER_PATH /home/ma-user/ws/tokenizers/Llama2-70B 必填。加载tokenizer时,tokenizer存放地址。请根据实际规划修改。 MODEL_PATH /home/ma-user/ws/processed_for_ma_input/Llama2-70B/converted_weights 必填。加载的权重文件路径。SFT全参微调权重转换章节中将HuggingFace格式转化为Megatron格式的权重文件。 MODEL_TYPE 70B 必填。模型加载类型,根据实际填写7B、13B或70B。 TRAIN_ITERS 200 非必填。训练迭代周期。根据实际需要修改。 MBS 2 非必填。表示流水线并行中一个micro batch所处理的样本量。在流水线并行中,为了减少气泡时间,会将一个step的数据切分成多个micro batch。 该值与TP和PP以及模型大小相关,可根据实际情况进行调整。默认值为2。取值建议如下: Llama2-7B:4 Llama2-13B:4 Llama2-70B:2 GBS 1024 非必填。表示训练中所有机器一个step所处理的样本量。影响每一次训练迭代的时长。取值默认值: Llama2-7B:64 Llama2-13B:64 Llama2-70B:1024 TP 8 非必填。表示张量并行。默认值为8,取值建议: Llama2-7B:8 Llama2-13B:8 Llama2-70B:8 PP 8 非必填。表示流水线并行。取值建议: Llama2-7B:1,一般此值与运行节点数相等。 Llama2-13B:1,一般此值与运行节点个数相等。 Llama2-70B:大于等于4,建议值为8,一般选用几台机器训练则值为几。 RUN_TYPE sft 必填。表示训练类型,sft表示SFT微调训练。 MASTER_ADDR xx.xx.xx.xx 多机必填,单机忽略。指定主节点IP地址,多台机器中需要指定一个节点IP为主节点IP。 一般指定第一个节点IP为主节点IP。 NNODES 8 多机必填,单机忽略。节点总数,单机写1,双机写2,8机写8。 NODE_RANK 0 多机必填,单机忽略。节点序号,当前节点ID,一般从0开始,单机默认是0。以8机训练为例,节点ID依次为(0 1 2 3 4 5 6 7);一般ID为0的节点设置为主节点IP。 WORK_DIR /home/ma-user/ws 非必填。容器的工作目录。训练的权重文件保存在此路径下。默认值为:/home/ma-user/ws。
  • 操作流程 开始使用如下样例前,请务必按准备工作指导完成必要操作。 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 # 执行静态,动态性能评测脚本 父主题: 推理性能测试
  • 操作步骤 连接 容器镜像服务 。 登录容器 镜像服务 控制台。 单击右上角“创建组织”,输入组织名称完成组织创建。请自定义组织名称,本示例使用“deep-learning”,下面的命令中涉及到组织名称“deep-learning”也请替换为自定义的值。 选择左侧导航栏的“总览”,单击页面右上角的“登录指令”,在弹出的页面中单击复制登录指令。 此处生成的登录指令有效期为24小时,如果需要长期有效的登录指令,请参见获取长期有效登录指令。获取了长期有效的登录指令后,在有效期内的临时登录指令仍然可以使用。 登录指令末尾的 域名 为镜像仓库地址,请记录该地址,后面会使用到。 在安装容器引擎的机器中执行上一步复制的登录指令。 登录成功会显示“Login Succeeded”。 在安装容器引擎的机器上执行如下命令,为镜像打标签。 docker tag [镜像名称1:版本名称1] [镜像仓库地址]/[组织名称]/[镜像名称2:版本名称2] [镜像名称1:版本名称1]:${image_name}:${image_version}请替换为您所要上传的实际镜像的名称和版本名称。 [镜像仓库地址]:可在SWR控制台上查询,即1.c中登录指令末尾的域名。 [组织名称]:/${organization_name}请替换为您创建的组织。 [镜像名称2:版本名称2]:${image_name}:${image_version}请替换为您期待的镜像名称和镜像版本。 示例: docker tag ${image_name}:${image_version} swr.cn-north-4.myhuaweicloud.com/${organization_name}/${image_name}:${image_version} 上传镜像至镜像仓库。 docker push [镜像仓库地址]/[组织名称]/[镜像名称2:版本名称2] 示例: docker push swr.cn-north-4.myhuaweicloud.com/${organization_name}/${image_name}:${image_version} 上传镜像完成后,返回容器镜像服务控制台,在“我的镜像”页面,执行刷新操作后可查看到对应的镜像信息。
  • 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
  • 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 转换后的权重文件
  • 数据处理具体操作 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
  • 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
  • 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
  • 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
  • 代码目录介绍 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,全部下载。具体内容参见权重和词表文件介绍。
共100000条