华为云用户手册

  • Step1 创建训练任务 创建训练作业,并自定义名称、描述等信息。选择自定义算法,启动方式自定义,以及选择上传的镜像。 代码目录选择:OBS桶路径下的 llm_train/AscendSpeed 代码目录。 图1 创建训练作业 若镜像使用使用基础镜像(二选一)中的基础镜像时,训练作业启动命令中输入: cd /home/ma-user/modelarts/user-job-dir/AscendSpeed; sh ./scripts/install.sh; sh ./scripts/obs_pipeline.sh 若镜像使用E CS 中构建新镜像(二选一)构建的新镜像时,训练作业启动命令中输入: cd /home/ma-user/modelarts/user-job-dir/AscendSpeed; sh ./scripts/obs_pipeline.sh
  • Step2 配置数据输入和输出 单击“增加训练输入”和“增加训练输出”,用于配置训练作业开始时需要输入数据的路径和训练结束后输出数据的路径。 在“输入”的输入框内设置变量:ORIGINAL_TRAIN_DATA_PATH、ORIGINAL_HF_WEIGHT。 ORIGINAL_TRAIN_DATA_PATH:训练时指定的输入数据集路径。 ORIGINAL_HF_WEIGHT:加载tokenizer与Hugging Face权重时,对应的存放地址。 在“输出”的输入框内设置变量:OUTPUT_SAVE_DIR、HF_SAVE_DIR。 OUTPUT_SAVE_DIR:训练完成后指定的输出模型路径。 HF_SAVE_DIR:训练完成的权重文件自动转换为Hugging Face格式权重输出的路径(确保添加CONVERT_MG2HF环境变量并设置为True)。 分别单击“输入”和“输出”的数据存储位置,如图所示,选择OBS桶中指定的目录。ORIGINAL_TRAIN_DATA_PATH中则直接选中数据集文件。 “输入”和“输出”中的获取方式全部选择为:环境变量。 “输出”中的预下载至本地目标选择:下载,此时输出路径中的数据则会下载至OBS中。
  • Step1 创建训练任务 创建训练作业,并自定义名称、描述等信息。选择自定义算法,启动方式自定义,以及选择上传的镜像。 代码目录选择:OBS桶路径下的 llm_train/AscendSpeed 代码目录。 图1 创建训练作业 若镜像使用使用基础镜像(二选一)中的基础镜像时,训练作业启动命令中输入: cd /home/ma-user/modelarts/user-job-dir/AscendSpeed; sh ./scripts/install.sh; sh ./scripts/obs_pipeline.sh 若镜像使用ECS中构建新镜像(二选一)构建的新镜像时,训练作业启动命令中输入: cd /home/ma-user/modelarts/user-job-dir/AscendSpeed; sh ./scripts/obs_pipeline.sh
  • 创建Notebook 创建开发环境Notebook实例,具体操作步骤请参考创建Notebook实例。 镜像选择已注册的 自定义镜像 ,资源类型选择创建好的专属资源池,规格推荐选择“Ascend: 8*ascend-snt9b”。 图1 Notebook中选择自定义镜像与规格 云硬盘EVS是Notebook开发环境内存的存储硬盘,作为持久化存储挂载在/home/ma-user/work目录下,该目录下的内容在实例停止后会被保留。可以自定义磁盘空间,若需要存储数据集、模型等大型文件,建议申请规格300GB+。存储支持在线按需扩容。 图2 自定义存储配置
  • 模型软件包结构说明 AscendCloud-6.3.907代码包中AscendCloud-LLM代码包结构介绍如下,训练脚本以分类的方式集中在scripts文件夹中: |──llm_train # 模型训练代码包 |──AscendSpeed # 基于AscendSpeed的训练代码 |──ascendcloud_patch/ # 针对昇腾云平台适配的功能补丁包 |──scripts/ # 训练需要的启动脚本 |──llama2 # llama2系列模型执行脚本的文件夹 |──llama3 # llama3系列模型执行脚本的文件夹 |──qwen # Qwen系列模型执行脚本的文件夹 |──qwen1.5 # Qwen1.5系列模型执行脚本的文件夹 |── ... |── dev_pipeline.sh # 系列模型共同调用的多功能的脚本 |── install.sh # 环境部署脚本 |——src/ # 启动命令行封装脚本,在install.sh里面自动构建 |──llm_inference # 推理代码包 |──llm_tools # 推理工具
  • 修改代码 将AscendSpeed代码包AscendCloud-LLM-xxx.zip在本地解压缩后。在上传代码前,需要对解压后的训练脚本代码进行修改。具体文件为:llm_train/AscendSpeed/scripts/obs_pipeline.sh,具体修改代码内容以及位置,如下所示。 训练作业中存在2个代码目录,一个是从OBS上传到ModelArts Standard训练容器中的代码目录OBS_CODE_DIR,一个是后续构建新镜像步骤ECS中构建新镜像(二选一)中镜像的代码目录CODE_DIR。修改代码如图1。 图1 修改区分训练作业中2个代码目录 使用环境变量SAVE_PATH重新覆盖权重文件保存路径,作为最终的权重保存路径。修改代码如图2。 图2 修改权重保存路径 多机训练场景下,需要将CODE_DIR修改为OBS_CODE_DIR目录,则可以使用scripts/tools/sync_with_obs.py工具将其它节点的权重文件同步上传到主节点。修改代码如图3。 图3 多机同步权重文件
  • 数据集下载 本教程使用Alpaca数据集,数据集的介绍及下载链接如下。 Alpaca数据集是由OpenAI的text-davinci-003引擎生成的包含52k条指令和演示的数据集。这些指令数据可以用来对语言模型进行指令调优,使语言模型更好地遵循指令。 预训练使用的Alpaca数据集下载:https://huggingface.co/datasets/tatsu-lab/alpaca/resolve/main/data/train-00000-of-00001-a09b74b3ef9c3b56.parquet,数据大小:24M左右。 SFT和LoRA微调使用的Alpaca数据集下载:https://huggingface.co/datasets/QingyiSi/Alpaca-CoT/blob/main/alpacaGPT4/alpaca_gpt4_data.json,数据大小:43.6 MB。
  • 自定义数据 用户也可以自行准备训练数据。数据要求如下: 使用标准的.json格式的数据,通过设置--json-key来指定需要参与训练的列。 请注意huggingface中的数据集具有如下this格式。可以使用–json-key标志更改数据集文本字段的名称,默认为text。在维基百科数据集中,它有四列,分别是id、url、title和text。可以指定–json-key标志来选择用于训练的列。 { 'id': '1', 'url': 'https://simple.wikipedia.org/wiki/April', 'title': 'April', 'text': 'April is the fourth month...' }
  • 创建OBS桶 ModelArts使用 对象存储服务 (Object Storage Service,简称OBS)进行数据存储以及模型的备份和快照,实现安全、高可靠和低成本的存储需求。因此,在使用ModelArts之前通常先创建一个OBS桶,然后在OBS桶中创建文件夹用于存放数据。 本文档也以将运行代码以及输入输出数据存放OBS为例,请参考创建OBS桶,例如桶名:standard-llama2-13b。并在该桶下创建文件夹目录用于后续存储代码使用,例如:training_data。
  • 操作流程 图1 操作流程图 表2 操作任务流程说明 阶段 任务 说明 准备工作 准备资源 本教程案例是基于ModelArts Standard运行的,需要购买并开通ModelArts专属资源池和OBS桶。 准备数据 准备训练数据,可以用本案使用的数据集,也可以使用自己准备的数据集。 准备权重 准备所需的权重文件。 准备代码 准备AscendSpeed训练代码。 准备镜像 准备训练模型适用的容器镜像。 准备Notebook 本案例需要创建一个Notebook,以便能够通过它访问SFS Turbo服务。随后,通过Notebook将OBS中的数据上传至SFS Turbo,并对存储在SFS Turbo中的数据执行编辑操作。 预训练 预训练 介绍如何进行预训练,包括训练数据处理、超参配置、创建训练任务及性能查看。 微调训练 SFT全参微调 介绍如何进行SFT全参微调,包括训练数据处理、超参配置、创建训练任务及性能查看。 LoRA微调训练 介绍如何进行LoRA微调训练,包括训练数据处理、超参配置、创建训练任务及性能查看。
  • 方案概览 本文档利用训练框架PyTorch_npu+华为自研Ascend Snt9B硬件,为用户提供了常见主流开源大模型在ModelArts Standard上的预训练和全量微调方案。 本方案目前仅适用于部分企业客户,完成本方案的部署,需要先联系您所在企业的华为方技术支持。 适配的CANN版本是cann_8.0.rc2,驱动版本是23.0.5。 本文档适用于仅使用OBS对象存储服务(Object Storage Service)作为存储的方案,OBS用于存储模型文件、训练数据、代码、日志等,提供了高可靠性的数据存储解决方案。
  • 支持的模型列表 本方案支持以下模型的训练,如表1所示。 表1 支持的模型列表 序号 支持模型 支持模型参数量 权重文件获取地址 1 llama2 llama2-7b https://huggingface.co/meta-llama/Llama-2-7b-chat-hf 2 llama2-13b https://huggingface.co/meta-llama/Llama-2-13b-chat-hf 3 llama2-70b https://huggingface.co/meta-llama/Llama-2-70b-hf https://huggingface.co/meta-llama/Llama-2-70b-chat-hf (推荐) 4 llama3 llama3-8b https://huggingface.co/meta-llama/Meta-Llama-3-8B-Instruct 5 llama3-70b https://huggingface.co/meta-llama/Meta-Llama-3-70B-Instruct 6 Qwen qwen-7b https://huggingface.co/Qwen/Qwen-7B-Chat 7 qwen-14b https://huggingface.co/Qwen/Qwen-14B-Chat 8 qwen-72b https://huggingface.co/Qwen/Qwen-72B-Chat 9 Qwen1.5 qwen1.5-7b https://huggingface.co/Qwen/Qwen1.5-7B-Chat 10 qwen1.5-14b https://huggingface.co/Qwen/Qwen1.5-14B-Chat 11 qwen1.5-32b https://huggingface.co/Qwen/Qwen1.5-32B-Chat 12 qwen1.5-72b https://huggingface.co/Qwen/Qwen1.5-72B-Chat 13 Yi yi-6b https://huggingface.co/01-ai/Yi-6B-Chat 14 yi-34b https://huggingface.co/01-ai/Yi-34B-Chat 15 ChatGLMv3 glm3-6b https://huggingface.co/THUDM/chatglm3-6b 16 Baichuan2 baichuan2-13b https://huggingface.co/baichuan-inc/Baichuan2-13B-Chat 17 Qwen2 qwen2-0.5b https://huggingface.co/Qwen/Qwen2-0.5B-Instruct 18 qwen2-1.5b https://huggingface.co/Qwen/Qwen2-1.5B-Instruct 19 qwen2-7b https://huggingface.co/Qwen/Qwen2-7B-Instruct 20 qwen2-72b https://huggingface.co/Qwen/Qwen2-72B-Instruct 21 GLMv4 glm4-9b https://huggingface.co/THUDM/glm-4-9b-chat
  • 环境准备 本工具支持x86和ARM的系统环境,使用前需要安装以下软件。 表2 安装软件及步骤 软件 安装步骤 mindspore-lite 安装版本:2.2.10 下载地址:https://www.mindspore.cn/lite/docs/zh-CN/r2.2/use/downloads.html 需要下载的安装包与操作系统有关,请根据需要选择合适的安装包。 如果操作系统为Linux aarch64,则下载:mindspore-lite-2.2.10-linux-aarch64.tar.gz。 如果操作系统为Linux x86_64,则下载:mindspore-lite-2.2.10-linux-x64.tar.gz。 安装方式如下: MindSpore Lite云侧推理包解压缩后,设置`LITE_HOME`环境变量为解压缩的路径,例如: export LITE_HOME=$some_path/mindspore-lite-2.2.10-linux-aarch64 设置环境变量LD_LIBRARY_PATH: export LD_LIBRARY_PATH=$LITE_HOME/runtime/lib:$LITE_HOME/runtime/third_party/dnnl:$LITE_HOME/tools/converter/lib:$LD_LIBRARY_PATH 如果需要使用convert_lite或者benchmark工具,则需要设置环境变量PATH。 export PATH=$LITE_HOME/tools/converter/converter:$LITE_HOME/tools/benchmark:$PATH cann 安装版本:CANN 7.0.0 下载地址:https://support.huawei.com/enterprise/zh/ascend-computing/cann-pid-251168373/software/258923273?idAbsPath=fixnode01%7C23710424%7C251366513%7C22892968%7C251168373 请下载toolkit和对应机器的kernels包,以Snt9B为例则下载“Ascend-cann-toolkit_7.0.0_linux-aarch64.run”和“Ascend-cann-kernels-型号_7.0.0_linux.run”。 安装命令(以Snt9B的cann安装为例): ./Ascend-cann-toolkit_7.0.0_linux-aarch64.run --full ./Ascend-cann-kernels-型号_7.0.0_linux.run --install 请安装在默认路径下:/usr/local/Ascend,暂不支持安装在自定义路径下。 tailor 安装版本:0.3.4 下载地址: https://cneast3-modelarts-sdk.obs.cn-east-3.myhuaweicloud.com/tailor-0.3.4-py3-none-any.whl SHA-256: https://cneast3-modelarts-sdk.obs.cn-east-3.myhuaweicloud.com/tailor-0.3.4-py3-none-any.whl/1713929258832/tailor-0.3.4-py3-none-any.whl.sha256 安装命令: pip install tailor-0.3.4-py3-none-any.whl
  • 使用指导 tailor支持“命令行”和“Python API”两种方式使用。 命令行方式 命令行运行样例: tailor --model_path="./resnet50-v2-7.onnx"--config_path="./config.ini"--input_shape="data:1,3,224,224"--output_path="/home/"--accuracy="fp32"--aoe=True config.ini参考内容如下: [ascend_context] input_shape=data:[-1,3,224,224] dynamic_dims=[1],[2],[3] 表3 参数说明 参数名称 功能描述 参数类型 是否必填 默认值 备注 --model_path 指定onnx模型路径。 string 是 - - --config_path 指定模型配置文件路径。 string 否 - tailor支持动态分档转换功能,需要指定配置文件路径,需要注意即便有配置文件,只要是动态模型就需要指定--input_shape参数。 --input_shape 指定模型转换的shape。 string 否 - 固定shape模型转换可以不填,动态模型转换必填。 --output_path 指定结果输出路径。 string 否 默认为当前目录下。 - --aoe 是否在转换时进行AOE优化。 bool 否 False AOE优化可以提升模型性能,但不是一定有提升,需要注意开启AOE,会导致模型转换耗时极大延长。 --accuracy 指定模型精度,只支持fp16和fp32。 string 否 fp16 - Python API 导入包并创建tailor对象。 from tailor.tailor import Tailor onnx_model_path = "./resnet50-v2-7.onnx"    # 相对路径或者绝对路径均可以 t = Tailor(onnx_model_path) 查询onnx模型的输入信息。 # 查询onnx模型的输入信息 t.get_model_input_info() 图1 查询onnx模型的输入输出信息 查询onnx模型的输出信息。 # 查询模型的输出信息 t.get_model_output_info() 图2 查询onnx模型的输出信息 固定shape模型,可以直接运行。 t.run() 指定档位信息运行。 input_shape="data:1,3,224,224" t.run(input_shape=input_shape) 动态档位执行config_path运行。需要注意,只要是动态模型,就必须要传入input_shape,因为转换模型后的benchmark和profiling都依赖单个shape操作。 input_shape="data:1,3,224,224" config_path = "./resnet/config.ini" t.run(input_shape=input_shape, config_path=config_path) 指定精度为fp32。 input_shape="data:1,3,224,224" t.run(input_shape=input_shape, accuracy='fp32') 开启AOE优化。 input_shape="data:1,3,224,224" t.run(input_shape=input_shape, aoe=True) 指定输出位置。 input_shape="data:1,3,224,224" # 不指定输出路径,则默认在当前执行目录存储结果 t.run(input_shape=input_shape, output_path="/home/xxx") 运行结果将存储在output文件夹中,如果用户指定了output_path,会指定位置保存,如果不指定则在当前代码执行目录生成文件夹保存输出。整体运行的结果都存放在output文件夹中,每转一次模型就会根据模型名称以及相关参数生成结果文件,如下图所示。 图3 output文件 在每次运行的结果文件中,分为三部分:convert、benchmark、profiling,相关的文件及存储内容如下。 表4 输出文件介绍(以模型名称为resnet50-v2-7.onnx为例) 类别 文件名称 是否一定生成 文件存储内容 convert resnet50-v2-7.mindir 是 转换后的mindir模型。 resnet50-v2-7.om 否 转换过程中的om文件,不是必定生成。 onnx_to_mindspore.sh 是 模型转换命令,可以本地直接运行。 resnet50-v2-7_convert.log 是 模型转换过程的日志。 config.ini 否 配置文件,在指定fp32精度或者AOE打开时会生成。 onnx_to_mindspore_aoe.sh 否 在打开AOE功能时会生成。 benchmark run_benchmark.sh 是 运行benchmark的脚本,可本地直接运行。 run_benchmark_accuracy.sh 是 benchmark运行精度的脚本,可本地直接运行。 performance.txt 是 benchmark性能测试结果。 accuracy.txt 是 精度测试结果。 *.bin 是 自动构造的输入随机bin文件,可能存在多个。 resnet50-v2-7_output.txt 是 上述bin文件作为输入时onnx模型运行的结果。 profiling run_profiling.sh 是 运行profiling的脚本,可本地直接运行。 profiling.config 是 运行profiling的配置文件。 profiling.json 是 运行profiling的配置文件。 PROF_xxx开头的文件夹 是 运行profiling的结果文件夹。 run_aggregate.sh 是 运行数据聚合的脚本,可直接本地运行。 run_profiling.log 是 存储运行profiling的日志信息。
  • 克隆原有的虚拟环境到SFS盘 # shell conda create --prefix /home/ma-user/work/envs/user_conda/sfs-clone-env --clone PyTorch-1.8 -y Source: /home/ma-user/anaconda3/envs/PyTorch-1.8 Destination: /home/ma-user/work/envs/user_conda/sfs-clone-env Packages: 20 Files: 39687 Preparing transaction: done Verifying transaction: done Executing transaction: done # # To activate this environment, use # # $ conda activate /home/ma-user/work/envs/user_conda/sfs-clone-env # # To deactivate an active environment, use # # $ conda deactivate 查看新创建的clone虚拟环境,如果出现新创建的虚拟环境的名称为空的情况,可以参考添加新创建到虚拟环境到conda env。 # shell conda env list # conda environments: # base /home/ma-user/anaconda3 PyTorch-1.8 /home/ma-user/anaconda3/envs/PyTorch-1.8 python-3.7.10 /home/ma-user/anaconda3/envs/python-3.7.10 sfs-clone-env /home/ma-user/work/envs/user_conda/sfs-clone-env sfs-new-env * /home/ma-user/work/envs/user_conda/sfs-new-env (可选)将新建的虚拟环境注册到JupyterLab kernel(可以在JupyterLab中直接使用虚拟环境) # shell pip install ipykernel ipython kernel install --user --name=sfs-clone-env rm -rf /home/ma-user/.local/share/jupyter/kernels/sfs-clone-env/logo-* 说明:此处“.local/share/jupyter/kernels/sfs-clone-env”为举例,请以用户实际的安装路径为准。 刷新JupyterLab页面,可以看到新的kernel。
  • 重新启动镜像激活SFS盘中的虚拟环境 方法一,直接使用完整conda env路径。 # shell conda activate /home/ma-user/work/envs/user_conda/sfs-new-env 方法二,先添加虚拟环境到conda env,然后使用名称激活。 # shell conda config --append envs_dirs /home/ma-user/work/envs/user_conda/ conda activate sfs-new-env 方法三,直接使用完成虚拟环境中的python或者pip。 # shell /home/ma-user/work/envs/user_conda/sfs-new-env/bin/pip list /home/ma-user/work/envs/user_conda/sfs-new-env/bin/python -V
  • 保存并共享虚拟环境 将要迁移的虚拟环境打包。 # shell pip install conda-pack conda pack -n sfs-clone-env -o sfs-clone-env.tar.gz --ignore-editable-packages Collecting packages... Packing environment at '/home/ma-user/work/envs/user_conda/sfs-clone-env' to 'sfs-clone-env.tar.gz' [########################################] | 100% Completed | 3min 33.9s 解压到SFS目录。 # shell mkdir /home/ma-user/work/envs/user_conda/sfs-tar-env tar -zxvf sfs-clone-env.tar.gz -C /home/ma-user/work/envs/user_conda/sfs-tar-env 查看现有的conda虚拟环境。 # shell conda env list # conda environments: # base /home/ma-user/anaconda3 PyTorch-1.8 * /home/ma-user/anaconda3/envs/PyTorch-1.8 python-3.7.10 /home/ma-user/anaconda3/envs/python-3.7.10 sfs-clone-env /home/ma-user/work/envs/user_conda/sfs-clone-env sfs-new-env /home/ma-user/work/envs/user_conda/sfs-new-env sfs-tar-env /home/ma-user/work/envs/user_conda/sfs-tar-env test-env /home/ma-user/work/envs/user_conda/test-env
  • Step2 启动镜像 获取基础镜像。建议使用官方提供的镜像。镜像地址{image_url}参见获取镜像。 docker pull {image_url} 启动容器镜像。启动前请先按照参数说明修改${}中的参数。可以根据实际需要增加修改参数。推理默认使用单机单卡。 docker run -itd --net=host \ --device=/dev/davinci0 \ --device=/dev/davinci_manager \ --device=/dev/devmm_svm \ --device=/dev/hisi_hdc \ --shm-size=32g \ -v /usr/local/dcmi:/usr/local/dcmi \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ -v /var/log/npu/:/usr/slog \ -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ -v ${work_dir}:${container_work_dir} \ --name ${container_name} \ ${image_id} \ /bin/bash 参数说明: device=/dev/davinci0:挂载NPU设备,示例中挂载了1张卡davinci0。 ${work_dir}:${container_work_dir} 代表需要在容器中挂载宿主机的目录。宿主机和容器使用不同的文件系统,work_dir为宿主机中工作目录,目录下存放着训练所需代码、数据等文件。container_dir为要挂载到的容器中的目录。为方便两个地址可以相同。 shm-size:共享内存大小。 ${container_name}:容器名称,进入容器时会用到,此处可以自己定义一个容器名称。 ${image_id}:镜像ID,通过docker images查看刚拉取的镜像ID。 容器不能挂载到/home/ma-user目录,此目录为ma-user用户家目录。如果容器挂载到/home/ma-user下,拉起容器时会与基础镜像冲突,导致基础镜像不可用。 driver及npu-smi需同时挂载至容器。 不要将多个容器绑到同一个NPU上,会导致后续的容器无法正常使用NPU功能。 进入容器。需要将${container_name}替换为实际的容器名称。启动容器默认使用ma-user用户,后续所有操作步骤都在ma-user用户下执行。 docker exec -it ${container_name} bash
  • Step1 检查环境 请参考DevServer资源开通,购买DevServer资源,并确保机器已开通,密码已获取,能通过SSH登录,不同机器之间网络互通。 购买DevServer资源时如果无可选资源规格,需要联系华为云技术支持申请开通。 当容器需要提供服务给多个用户,或者多个用户共享使用该容器时,应限制容器访问Openstack的管理地址(169.254.169.254),以防止容器获取宿主机的元数据。具体操作请参见禁止容器获取宿主机元数据。 SSH登录机器后,检查NPU卡状态。运行如下命令,返回NPU设备信息。 npu-smi info # 在每个实例节点上运行此命令可以看到NPU卡状态 npu-smi info -l | grep Total # 在每个实例节点上运行此命令可以看到总卡数 如出现错误,可能是机器上的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
  • Step6 开始训练 进入代码根目录。 cd ModelZoo-PyTorch/PyTorch/built-in/mlm/Qwen-VL 运行精度训练脚本train_full_8p.sh。运行前请先修改参数。 bash test/train_full_8p.sh --model_name=${预训练模型路径} --data_path=${训练数据集路径} --epochs=${训练epoch数量} # 8卡精度训练,混精bf16 例: bash test/train_full_8p.sh --model_name=path/Qwen-VL-Chat --data_path=path/xx.json --epochs=${训练epoch数量} 运行性能训练脚本train_performance_8p.sh。运行前请先修改参数。 # 运行性能训练脚本 bash test/train_performance_8p.sh --model_name=${预训练模型路径} --data_path=${训练数据集路径} # 8卡性能,混精bf16 训练后的产物路径说明如下。 #日志路径: ModelZoo-PyTorch/PyTorch/built-in/mlm/Qwen-VL/test/output/8p #训练输出权重路径: ModelZoo-PyTorch/PyTorch/built-in/mlm/Qwen-VL/output-qwen-vl 训练过程中,训练日志会在最后的Rank节点打印。 日志里存在lm loss参数,lm loss参数随着训练迭代周期持续性减小,并逐渐趋于稳定平缓。可以使用可视化工具TrainingLogParser查看loss收敛情况。
  • Step2 启动镜像 获取基础镜像。建议使用官方提供的镜像。镜像地址{image_url}参见获取软件和镜像。 docker pull {image_url} 启动容器镜像。启动前请先按照参数说明修改${}中的参数。可以根据实际需要增加修改参数。训练默认使用单机8卡。 docker run -itd --net=host \ --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 \ --shm-size=64g \ -v /usr/local/dcmi:/usr/local/dcmi \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ -v /var/log/npu/:/usr/slog \ -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ -v ${work_dir}:${container_work_dir} \ --name ${container_name} \ ${image_id} \ /bin/bash 参数说明: device=/dev/davinci0,..., --device=/dev/davinci7:挂载NPU设备,示例中挂载了8张卡davinci0~davinci7。 ${work_dir}:${container_work_dir} 代表需要在容器中挂载宿主机的目录。宿主机和容器使用不同的文件系统,work_dir为宿主机中工作目录,目录下存放着训练所需代码、数据等文件。container_dir为要挂载到的容器中的目录。为方便两个地址可以相同。 shm-size:共享内存大小。 ${container_name}:容器名称,进入容器时会用到,此处可以自己定义一个容器名称。 ${image_id}:镜像ID,通过docker images查看刚拉取的镜像ID。 容器不能挂载到/home/ma-user目录,此目录为ma-user用户家目录。如果容器挂载到/home/ma-user下,拉起容器时会与基础镜像冲突,导致基础镜像不可用。 driver及npu-smi需同时挂载至容器。 不要将多个容器绑到同一个NPU上,会导致后续的容器无法正常使用NPU功能。 进入容器。需要将${container_name}替换为实际的容器名称。启动容器默认使用ma-user用户。 docker exec -it ${container_name} bash
  • Step4 准备训练环境 下载权重。从HuggingFace下载Qwen-VL-Chat,或将您已下载的权重文件上传到容器工作目录${container_work_dir}中。 # 模型结构如下: Qwen-VL-Chat/ ├── config.json ├── configuration_qwen.py ├── generation_config.jsons ├── modeling_qwen.py ├── pytorch_model-00001-of-00010.bin ├── pytorch_model-00002-of-00010.bin ├── pytorch_model-00003-of-00010.bin ├── pytorch_model-00004-of-00010.bin ├── pytorch_model-00005-of-00010.bin ├── pytorch_model-00006-of-00010.bin ├── pytorch_model-00007-of-00010.bin ├── pytorch_model-00008-of-00010.bin ├── pytorch_model-00009-of-00010.bin ├── pytorch_model-00010-of-00010.bin ├── pytorch_model.bin.index.json ├── qwen_generation_utils.py ├── qwen.tiktoken ├── README.md ├── SimSun.ttf ├── tokenization_qwen.py ├── tokenizer_config.json └── visual.py 赋予容器访问权重文件的权限。上传文件到宿主机时使用的是root用户,此处需要执行如下命令统一文件属主为ma-user用户。 #统一文件属主为ma-user用户 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 在容器中解压代码包并执行Qwen-VL安装脚本。 # 解压代码包 unzip AscendCloud-AIGC-6.3.906-*.zip rm -rf AscendCloud-AIGC-6.3.906-* # 执行安装脚本 # model_path 配置为Qwen-VL的权重路径,例:/home/ma-user/Qwen-VL-Chat git config --global http.sslVerify false bash multimodal_algorithm/QwenVL/6d0ab0efd0a/qwen_vl_install.sh {model_path} # 执行完成后,代码路径为ModelZoo-PyTorch/PyTorch/built-in/mlm/Qwen-VL # 安装bc命令 sudo yum install -y bc
  • 获取软件和镜像 表2 获取软件和镜像 分类 名称 获取路径 插件代码包 AscendCloud-6.3.906-xxx.zip软件包中的AscendCloud-AIGC-6.3.906-xxx.zip 说明: 包名中的xxx表示具体的时间戳,以包名的实际时间为准。 获取路径:Support-E 说明: 如果没有下载权限,请联系您所在企业的华为方技术支持下载获取。 基础镜像 西南-贵阳一:swr.cn-southwest-2.myhuaweicloud.com/atelier/pytorch_2_1_ascend:pytorch_2.1.0-cann_8.0.rc2-py_3.9-hce_2.0.2312-aarch64-snt9b-20240528150158-b521cc0 从SWR拉取。
  • Step1 检查环境 请参考DevServer资源开通,购买DevServer资源,并确保机器已开通,密码已获取,能通过SSH登录,不同机器之间网络互通。 购买DevServer资源时如果无可选资源规格,需要联系华为云技术支持申请开通。 当容器需要提供服务给多个用户,或者多个用户共享使用该容器时,应限制容器访问Openstack的管理地址(169.254.169.254),以防止容器获取宿主机的元数据。具体操作请参见禁止容器获取宿主机元数据。 SSH登录机器后,检查NPU卡状态。运行如下命令,返回NPU设备信息。 npu-smi info # 在每个实例节点上运行此命令可以看到NPU卡状态 npu-smi info -l | grep Total # 在每个实例节点上运行此命令可以看到总卡数 如出现错误,可能是机器上的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
  • Step4 准备推理环境 获取LLaVA模型代码。 cd ${container_work_dir} unzip AscendCloud-6.3.906-xxx.zip unzip AscendCloud-AIGC-6.3.906-xxx.zip cd multimodal_algorithm/LLAVA/llava-inference/5d8f1760c08b7dfba3ae97b71cbd4c6f17d12dbd bash build.sh cd LLaVA mkdir ./playground/data/eval 下载llava-v1.5-13b模型。下载地址:liuhaotian/llava-v1.5-13b at main (huggingface.co) 图1 下载llava-v1.5-13b模型
  • Step6 开始推理 进入解压后的源码包根目录。 cd ${container_work_dir}/multimodal_algorithm/LLAVA/llava-inference/5d8f1760c08b7dfba3ae97b71cbd4c6f17d12dbd/LLaVA 修改mme_8p.sh。需要将脚本里模型的路径更改为实际存放模型的路径(--model-path 模型路径),同时检查数据集路径与实际保持一致(--question-file --image-folder --answers-file)。 vim ./scripts/v1_5/eval/mme_8p.sh 运行评估脚本。启动单卡。 ASCEND_RT_VISIBLE_DEVI CES =0 bash ./scripts/v1_5/eval/mme_8p.sh 启动8卡。可支持单机八卡推理,可以减短耗时。 ASCEND_RT_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 bash ./scripts/v1_5/eval/mme_8p.sh
  • FAQ 如果clip-vit-large-patch14-336模型不能自动下载。 请手动下载(openai/clip-vit-large-patch14-336 at main (huggingface.co)),并在llava-v1.5-13b模型下的config.json文件中修改mm_vision_tower参数中的模型路径。 图3 提示clip-vit-large-patch14-336模型不能自动下载
  • Step1 检查环境 请参考DevServer资源开通,购买DevServer资源,并确保机器已开通,密码已获取,能通过SSH登录,不同机器之间网络互通。 购买DevServer资源时如果无可选资源规格,需要联系华为云技术支持申请开通。 当容器需要提供服务给多个用户,或者多个用户共享使用该容器时,应限制容器访问Openstack的管理地址(169.254.169.254),以防止容器获取宿主机的元数据。具体操作请参见禁止容器获取宿主机元数据。 SSH登录机器后,检查NPU卡状态。运行如下命令,返回NPU设备信息。 npu-smi info # 在每个实例节点上运行此命令可以看到NPU卡状态 npu-smi info -l | grep Total # 在每个实例节点上运行此命令可以看到总卡数 如出现错误,可能是机器上的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 启动镜像 获取基础镜像。建议使用官方提供的镜像。镜像地址{image_url}参见获取软件和镜像。 docker pull {image_url} 启动容器镜像。启动前请先按照参数说明修改${}中的参数。可以根据实际需要增加修改参数。 docker run -it --net=host \ --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 \ --shm-size=32g \ -v /usr/local/dcmi:/usr/local/dcmi \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ -v /var/log/npu/:/usr/slog \ -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ -v ${work_dir}:${container_work_dir} \ --name ${container_name} \ ${image_id} \ /bin/bash 参数说明: device=/dev/davinci0,..., --device=/dev/davinci7:挂载NPU设备,示例中挂载了8张卡davinci0~davinci7。 ${work_dir}:${container_work_dir} 代表需要在容器中挂载宿主机的目录。宿主机和容器使用不同的文件系统,work_dir为宿主机中工作目录,目录下存放着训练所需代码、数据等文件。container_dir为要挂载到的容器中的目录。为方便两个地址可以相同。 shm-size:共享内存大小。 ${container_name}:容器名称,进入容器时会用到,此处可以自己定义一个容器名称。 ${image_id}:镜像ID,通过docker images查看刚拉取的镜像ID。 容器不能挂载到/home/ma-user目录,此目录为ma-user用户家目录。如果容器挂载到/home/ma-user下,拉起容器时会与基础镜像冲突,导致基础镜像不可用。 driver及npu-smi需同时挂载至容器。 不要将多个容器绑到同一个NPU上,会导致后续的容器无法正常使用NPU功能。 进入容器。需要将${container_name}替换为实际的容器名称。启动容器默认使用ma-user用户,后续所有操作步骤都在ma-user用户下执行。 docker exec -it ${container_name} bash
  • 获取软件和镜像 表2 获取软件和镜像 分类 名称 获取路径 插件代码包 AscendCloud-6.3.906-xxx.zip软件包中的AscendCloud-AIGC-6.3.906-xxx.zip 说明: 包名中的xxx表示具体的时间戳,以包名的实际时间为准。 获取路径:Support-E 说明: 如果没有下载权限,请联系您所在企业的华为方技术支持下载获取。 基础镜像 西南-贵阳一:swr.cn-southwest-2.myhuaweicloud.com/atelier/pytorch_2_1_ascend:pytorch_2.1.0-cann_8.0.rc2-py_3.9-hce_2.0.2312-aarch64-snt9b-20240606190017-b881580 从SWR拉取。
共100000条