云服务器内容精选

  • 准备工作 本地已安装PyCharm 2019.2或以上版本,推荐Windows版本,社区版或专业版均可,请单击PyCharm工具下载地址获取工具并在本地完成安装。 使用PyCharm ToolKit远程连接Notebook开发环境,仅限PyCharm专业版。 使用PyCharm ToolKit提交训练作业,社区版和专业版都支持。 已 注册华为账号 并开通华为云,且在使用ModelArts前检查账号状态,账号不能处于欠费或冻结状态。 已创建当前使用账号的访问密钥,并获得对应的AK和SK。如果未创建,请参见创建访问密钥(AK和SK)。 当前账号已完成访问授权的配置。如未完成,请参考使用委托授权。
  • 步骤2:使用PyCharm进行本地开发调试 下载代码至本地 本案例中,以图像分类模型resnet50模型为例,路径为“./models/official/cv/resnet/” # 在本地电脑Terminal下载代码至本地 git clone https://gitee.com/mindspore/models.git -b v1.5.0 图3 下载代码至本地 配置本地PC开发环境 修改“models/official/cv/resnet/requirements.txt”文件,改为: numpy==1.17.5 scipy==1.5.4 easydict==1.9 执行pip命令安装: # 在PyCharm的Terminal安装mindspore pip install mindspore==1.7.0 --trusted-host https://repo.huaweicloud.com -i https://repo.huaweicloud.com/repository/pypi/simple # 在PyCharm的Terminal安装resnet依赖 pip install -r .\official\cv\resnet\requirements.txt --trusted-host https://repo.huaweicloud.com -i https://repo.huaweicloud.com/repository/pypi/simple 图4 安装resnet依赖 准备数据集 本样例使用的数据集为类别数为五类的花卉识别数据集,下载数据集并解压数据到工程目录。新建dataset文件夹,将解压后数据集保存在dataset文件夹下。 图5 准备数据集 配置PyCharm解释器和入参 单击右上角“Current File”,选择“Edit Configuration”,打开“Run/Debug Configuration”对话框。在对话框中单击“+”,选择“Python”。 图6 前往PyCharm解释器 “Script path”选择train.py文件,“Parameters”命令如下所示,并选择Python解释器,然后单击“OK”: --net_name=resnet50 --dataset=imagenet2012 --data_path=../../../dataset/flower_photos/ --class_num=5 --config_path=./config/resnet50_imagenet2012_config.yaml --epoch_size=1 --device_target="CPU" 图7 配置PyCharm解释器 根据README说明文档,配置Parameter参数device_target="CPU"表示CPU环境运行,device_target="Ascend"表示在Ascend环境运行。 本地代码开发调测 一般本地CPU算力较低并且内存较小,可能出现内存溢出的报错,因此可以把“models/official/cv/resnet/config/resnet50_imagenet2012_config.yaml”的“batch_size”由“256”改为“32”,使得训练作业可以快速运行。 图8 修改batch_size AI开发过程中的数据集开发及模型开发是和硬件规格无关的,而且这一部分的开发耗时是最长的,因此可以先在本地PC的CPU环境进行数据集和模型开发调试。 本例中,因为样例代码已经支持在CPU上进行训练,因此用户能够在CPU上完成整个训练流程。如果代码只支持在GPU或者Ascend上训练,那么可能会报错,需要使用Notebook进行云端调试。 设置断点后单击“调试”,可实现代码逐步调试,查看中间变量值。 图9 “调试”按钮 图10 通过设置断点实现代码调试 可单击“运行”按钮,通过日志观察是否能正常训练。 图11 “运行”按钮 图12 训练日志
  • 动态benchmark 本章节介绍如何进行动态benchmark验证。 获取数据集。动态benchmark需要使用数据集进行测试,可以使用公开数据集,例如Alpaca、ShareGPT。也可以根据业务实际情况,使用generate_datasets.py脚本生成和业务数据分布接近的数据集。 方法一:使用公开数据集 ShareGPT下载地址: https://huggingface.co/datasets/anon8231489123/ShareGPT_Vicuna_unfiltered/resolve/main/ShareGPT_V3_unfiltered_cleaned_split.json Alpaca下载地址: https://github.com/tatsu-lab/stanford_alpaca/blob/main/alpaca_data.json 方法二:使用generate_dataset.py脚本生成数据集方法: generate_dataset.py脚本通过指定输入输出长度的均值和标准差,生成一定数量的正态分布的数据。具体操作命令如下,可以根据参数说明修改参数。 cd benchmark_tools python generate_dataset.py --dataset custom_datasets.json --tokenizer /path/to/tokenizer \ --min-input 100 --max-input 3600 --avg-input 1800 --std-input 500 \ --min-output 40 --max-output 256 --avg-output 160 --std-output 30 --num-requests 1000 generate_dataset.py脚本执行参数说明如下: --dataset:数据集保存路径,如custom_datasets.json。 --tokenizer:tokenizer路径,可以是HuggingFace的权重路径。 --min-input:输入tokens最小长度,可以根据实际需求设置。 --max-input:输入tokens最大长度,可以根据实际需求设置。 --avg-input:输入tokens长度平均值,可以根据实际需求设置。 --std-input:输入tokens长度方差,可以根据实际需求设置。 --min-output:最小输出tokens长度,可以根据实际需求设置。 --max-output:最大输出tokens长度,可以根据实际需求设置。 --avg-output:输出tokens长度平均值,可以根据实际需求设置。 --std-output:输出tokens长度标准差,可以根据实际需求设置。 --num-requests:输出数据集的数量,可以根据实际需求设置。 执行脚本benchmark_serving.py测试动态benchmark。具体操作命令如下,可以根据参数说明修改参数。 cd benchmark_tools python benchmark_serving.py --backend vllm --host ${docker_ip} --port 8080 --dataset custom_datasets.json --dataset-type custom \ --tokenizer /path/to/tokenizer --request-rate 0.01 1 2 4 8 10 20 --num-prompts 10 1000 1000 1000 1000 1000 1000 \ --max-tokens 4096 --max-prompt-tokens 3768 --benchmark-csv benchmark_serving.csv --backend:服务类型,如"tgi",vllm","mindspore"。 --host ${docker_ip}:服务部署的IP地址,${docker_ip}替换为宿主机实际的IP地址。 --port:推理服务端口。 --dataset:数据集路径。 --dataset-type:支持三种 "alpaca","sharegpt","custom"。custom为自定义数据集。 --tokenizer:tokenizer路径,可以是huggingface的权重路径。 --request-rate:请求频率,支持多个,如 0.1 1 2。实际测试时,会根据request-rate为均值的指数分布来发送请求以模拟真实业务场景。 --num-prompts:某个频率下请求数,支持多个,如 10 100 100,数量需和--request-rate的数量对应。 --max-tokens:输入+输出限制的最大长度,模型启动参数--max-input-length值需要大于该值。 --max-prompt-tokens:输入限制的最大长度,推理时最大输入tokens数量,模型启动参数--max-total-tokens值需要大于该值,tokenizer建议带tokenizer.json的FastTokenizer。 --benchmark-csv:结果保存路径,如benchmark_serving.csv。 脚本运行完后,测试结果保存在benchmark_serving.csv中,示例如下图所示。 图2 动态benchmark测试结果(示意图)
  • 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 # 执行静态,动态性能评测脚本、 ├── requirements.txt # 第三方依赖
  • 静态benchmark验证 本章节介绍如何进行静态benchmark验证。 已经上传benchmark验证脚本到推理容器中。 运行静态benchmark验证脚本benchmark_parallel.py,具体操作命令如下,可以根据参数说明修改参数。 cd benchmark_tools python benchmark_parallel.py --backend vllm --host ${docker_ip} --port 8080 --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、openai等。本文档使用的推理接口是vllm。 --host ${docker_ip}:服务部署的IP地址,${docker_ip}替换为宿主机实际的IP地址。 --port:推理服务端口8080。 --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测试结果(示意图)
  • 子用户启动其他用户的SSH实例 子用户可以看到所有用户的Notebook实例后,如果要通过SSH方式远程连接其他用户的Notebook实例,需要将SSH密钥对更新成自己的,否则会报错ModelArts.6786。更新密钥对具体操作请参见修改Notebook SSH远程连接配置。 具体的错误信息提示:ModelArts.6789: 在E CS 密钥对管理中找不到指定的ssh密钥对xxx,请更新密钥对并重试。
  • 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设备和驱动,或释放被挂载的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}为: 西南-贵阳一:swr.cn-southwest-2.myhuaweicloud.com/atelier/pytorch_2_1_ascend:pytorch_2.1.0-cann_7.0.1.1-py_3.9-euler_2.10.7-aarch64-snt9b-20240411153110-ca68771 docker pull {image_url} 启动容器镜像。启动前请先按照参数说明修改${}中的参数。可以根据实际需要增加修改参数。 export work_dir="自定义挂载的工作目录" export container_work_dir="自定义挂载到容器内的工作目录" export container_name="自定义容器名称" export image_name="swr.cn-southwest-2.myhuaweicloud.com/atelier/pytorch_2_1_ascend:pytorch_2.1.0-cann_7.0.1.1-py_3.9-euler_2.10.7-aarch64-snt9b-20240411153110-ca68771" // 启动一个容器去运行镜像 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 /etc/ascend_install.info:/etc/ascend_install.info \ -v /sys/fs/cgroup:/sys/fs/cgroup:ro \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ --shm-size 32g \ --net=bridge \ -v ${work_dir}:${container_work_dir} \ --name ${container_name} \ ${image_name} bash 参数说明: work_dir:工作目录,目录下存放着训练所需代码、数据等文件。 container_work_dir:容器工作目录,一般同work_dir。 container_name:自定义容器名。 image_name:容器镜像的名称。 进入容器。需要将${container_name}替换为实际的容器名称。 docker exec -it ${container_name} bash
  • Step3 获取SD1.5插件代码包并安装依赖 下载SD1.5插件代码包ascendcloud-aigc-6.3.T041-*.tar.gz文件,上传到容器的/home/ma-user/目录下,解压并安装相关依赖。获取路径参见获取软件和镜像。 mkdir -p /home/ma-user/stable_diffusers_1.5 #创建stable_diffusers_1.5目录 cd /home/ma-user/stable_diffusers_1.5 #进入stable_diffusers_1.5目录 tar -zxvf ascendcloud-aigc-6.3.*-*.tar.gz tar -zxvf ascendcloud-aigc-poc-stable_diffusers_1.5.tar.gz rm -rf ascendcloud-aigc-* pip install -r requirements.txt #安装依赖 启动前配置。有两种方式修改配置文件: 方式一:可以参考解压出来的default_config.yaml或者deepspeed_default_config.yaml文件,再通过在启动脚本命令中增加--config_file=xxx.yaml参数来指定其为配置文件。 方式二:通过命令accelerate config进行配置,如下图所示。 图1 通过命令accelerate config进行配置 (可选)文件替换。 因增加nfa和使用npu_geglu算子,将diffusers源码包中的attention.py和attention_processor.py替换成代码包中对应的文件。 图2 文件替换 可以使用find命令来查找diffusers源码包位置。 find / -name attention.py find / -name attention_processor.py 图3 查找diffusers源码包位置 找到具体位置后可以cp替换,替换前可对diffusers原始文件做备份,如果没有备份则可以通过删除diffusers包重新安装获取原始文件。 执行bash stable_diffusers_train.sh。 bash stable_diffusers_train.sh
  • 获取软件和镜像 表2 获取软件和镜像 分类 名称 获取路径 插件代码包 ascendcloud-aigc-6.3.T041-*.tar.gz 文件名中的*表示具体的时间戳,以包名的实际时间为准。 Support网站 如果没有软件下载权限,请联系您所在企业的华为方技术支持下载获取。 基础镜像包 swr.cn-southwest-2.myhuaweicloud.com/atelier/pytorch_2_1_ascend:pytorch_2.1.0-cann_7.0.1.1-py_3.9-euler_2.10.7-aarch64-snt9b-20240411153110-ca68771 SWR上拉取
  • Step4 下载模型和数据集 数据集下载地址:https://huggingface.co/datasets/lambdalabs/pokemon-blip-captions。 启动脚本前两个声明为本次训练的模型和数据集,第一次执行程序时若本地没有模型和数据集,会自动下载。但由于lambdalabs/pokemon-blip-captions数据集下载现在需要登录HuggingFace账号,请先下载到本地,再挂载到对应目录。 export MODEL_NAME="runwayml/stable-diffusion-v1-5" export DATASET_NAME="lambdalabs/pokemon-blip-captions"
  • Step5 启动训练服务 train_text_to_image_0304.py是训练的核心代码,通过stable_diffusers_train.sh来启动。 sh stable_diffusers_train.sh 如果启动前配置采用的是•可以参考解压出来的default_config...方式指定配置文件,就是在此stable_diffusers_train.sh脚本中增加--config_file=xxx.yaml参数。 刚开始会报一些Warning,可忽略。正常启动如下图所示,出现Steps: 1%字样。 图4 启动服务 如果启动过程中报SSL相关错误,如下图所示。 图5 启动过程中报SSL相关错误 修改相应路径下的/home/ma-user/anaconda3/envs/PyTorch-2.1.0/lib/python3.9/site-packages/requests/sessions.py文件,将self.verify的值由True改成False,如下图所示。 图6 修改self.verify参数值
  • 断点续训练操作过程 baichuan2-13b的断点续训脚本baichuan2.sh,存放在“6.3.904-Ascend/llm_train/AscendSpeed/scripts/baichuan2”目录下。 执行命令如下,进入AscendSpeed代码目录。 cd /home/ma-user/ws/6.3.904-Ascend/llm_train/AscendSpeed/ 在AscendSpeed代码目录下执行断点续训练脚本。 单机启动 MODEL_TYPE=13B RUN_TYPE=retrain DATA_PATH= /home/ma-user/ws/processed_for_ma_input/BaiChuan2-13B/data/retrain/alpaca_text_document TOKENIZER_MODEL=/home/ma-user/ws/tokenizers/BaiChuan2-13B/tokenizer.model CKPT_LOAD_DIR=/home/ma-user/ws/saved_dir_for_ma_output/BaiChuan2-13B/pretrain TRAIN_ITERS=300 MBS=1 GBS=16 TP=8 PP=1 sh scripts/baichuan2/baichuan2.sh 多机启动 以baichuan2-13b为例,多台机器执行训练启动命令如下。多机启动需要在每个节点上执行,已双机为例。 #第一台节点 MASTER_ADDR=xx.xx.xx.xx NNODES=2 NODE_RANK=0 MODEL_TYPE=13B RUN_TYPE=retrain DATA_PATH=/home/ma-user/ws/processed_for_ma_input/BaiChuan2-13B/data/pretrain/alpaca_text_document TOKENIZER_MODEL=/home/ma-user/code/model/Baichuan2-13B-Chat/tokenizer.model CKPT_LOAD_DIR=/home/ma-user/ws/saved_dir_for_ma_output/BaiChuan2-13B/pretrain TRAIN_ITERS=300 MBS=2 GBS=32 TP=8 PP=2 sh scripts/baichuan2/baichuan2.sh ... ... # 第二台节点 MASTER_ADDR=xx.xx.xx.xx NNODES=2 NODE_RANK=1 MODEL_TYPE=13B RUN_TYPE=retrain DATA_PATH=/home/ma-user/ws/processed_for_ma_input/BaiChuan2-13B/data/pretrain/alpaca_text_document TOKENIZER_MODEL=/home/ma-user/ws/tokenizers/BaiChuan2-13B/tokenizer.model CKPT_LOAD_DIR=/home/ma-user/ws/saved_dir_for_ma_output/BaiChuan2-13B/pretrain TRAIN_ITERS=300 MBS=2 GBS=32 TP=8 PP=2 sh scripts/baichuan2/baichuan2.sh 以上命令多台机器执行时,只有${NODE_RANK}:节点ID值不同,其他参数都保持一致。 其中MASTER_ADDR、NODE_RANK、MODEL_TYPE 、RUN_TYPE、DATA_PATH、TOKENIZER_MODEL、CKPT_LOAD_DIR为必填;TRAIN_ITERS、MBS、GBS、TP、PP、WORK_DIR为非必填,有默认值。 图1 保存的ckpt 可以参考查看日志和性能操作,查看断点续训练日志和性能。
  • 自动精度对比 在某些场景下,比如算子溢出、误差累积等都可能会导致模型转换前后的模型存在误差,通过精度测试节的精度校验工具可以度量模型输出的精度误差的大小。当误差较大时,可以使用精度对比工具对比转换前后的ONNX模型和OM模型。其中OM模型在使用converter_lite工具进行模型转换时会同步生成。 # shell cd /usr/local/Ascend/ascend-toolkit/latest/tools/msquickcmp mkdir -p ~/work/output python main.py -m ~/work/resnet50.onnx -om ~/work/resnet50.om -o ~/work/output --input-shape "input.1:1,3,224,224" 精度对比命令执行成功后,将会在指定的输出目录中生成result_{timestamp}.csv文件。 图2 精度对比生成文件 打开CSV文件后可以通过CosineSimilarity列和MaxAbsoluteError列排查第一个数值发生突变的行,这种情况一般表明:该突变行对应的Ascend算子和ONNX算子的执行结果存在较大差异,从而将排查重点锁定在对应的算子中。 图3 执行结果 如下图所示,最大绝对误差在295行发生了突变,且突变值约为65504,说明softmax算子输出的结果发生了溢出(FP16的最大值为65504),需要重点分析softmax算子为什么会执行出错,也可以联系华为工程师进行分析。 图4 最大绝对误差
  • 精度测试 benchmark工具用于精度验证,主要工作原理是:固定模型的输入,通过benchmark工具进行推理,并将推理得到的输出与标杆数据进行相似度度量(余弦相似度和平均相对误差),得到模型转换后的精度偏差信息。使用benchmark进行精度比对的基本流程如下: 将模型输入保存二进制文件。 # 数据读取,预处理 image = img_preprocess(image_path) image = np.array(image, dtype=np.float32) image = np.frombuffer(image.tobytes(), np.float32) # 保存网络输入为二进制文件 image.tofile("input_data.bin") 将基准模型的输出保存到文本文件。 本例中输出节点名称为output_node_name,输出节点的shape为“(1, 1000)”,因此一共有两维,对应的输出文件为“output_node_name 2 1 1000”,再加上输出的值即可。 # 基于原始pth模型前向推理 output = model_inference(input_data) # 保存网络输出节点名称、维度、shape及输出到本地文件 with open("output_data.txt", "w") as f: f.write("output_node_name 2 1 1000\n") f.write(" ".join([str(i) for i in output])) 使用benchmark工具进行精度对比。 #shell benchmark --modelFile=model.mindir --inputShapes=1,3,224,224 --inDataFile=input_data.bin --device=Ascend --benchmarkDataFile=output_data.txt --accuracyThreshold=5 --cosineDistanceThreshold=0.99 其中,--accuracyThreshold=5表示平均绝对误差的容忍度最大为5%,--cosineDistanceThreshold =0.99表示余弦相似度至少为99%,--inputShapes可将模型放入到netron官网中查看。 图1 benchmark对接结果输出示例图