云服务器内容精选

  • 步骤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 训练日志
  • 准备工作 本地已安装PyCharm 2019.2或以上版本,推荐Windows版本,社区版或专业版均可,请单击PyCharm工具下载地址获取工具并在本地完成安装。 使用PyCharm ToolKit远程连接Notebook开发环境,仅限PyCharm专业版。 使用PyCharm ToolKit提交训练作业,社区版和专业版都支持。 已注册华为账号并开通华为云,且在使用ModelArts前检查账号状态,账号不能处于欠费或冻结状态。 已创建当前使用账号的访问密钥,并获得对应的AK和SK。如果未创建,请参见创建访问密钥(AK和SK)。 当前账号已完成访问授权的配置。如未完成,请参考使用委托授权。
  • 子用户启动其他用户的SSH实例 子用户可以看到所有用户的Notebook实例后,如果要通过SSH方式远程连接其他用户的Notebook实例,需要将SSH密钥对更新成自己的,否则会报错ModelArts.6786。更新密钥对具体操作请参见修改Notebook SSH远程连接配置。 具体的错误信息提示:ModelArts.6789: 在ECS密钥对管理中找不到指定的ssh密钥对xxx,请更新密钥对并重试。
  • 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
  • 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参数值
  • 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
  • 获取软件和镜像 表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上拉取
  • 断点续训练操作过程 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 可以参考查看日志和性能操作,查看断点续训练日志和性能。
  • 精度测试 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对接结果输出示例图
  • 自动精度对比 在某些场景下,比如算子溢出、误差累积等都可能会导致模型转换前后的模型存在误差,通过精度测试节的精度校验工具可以度量模型输出的精度误差的大小。当误差较大时,可以使用精度对比工具对比转换前后的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 最大绝对误差
  • 背景信息 Notebook使用涉及到计费,具体收费项如下: 处于“运行中”状态的Notebook,会消耗资源,产生费用。根据您选择的资源不同,收费标准不同,价格详情请参见产品价格详情。当您不需要使用Notebook时,建议停止Notebook,避免产生不必要的费用。 创建Notebook时,如果选择使用云硬盘EVS存储配置,云硬盘EVS会一直收费,建议及时停止并删除Notebook,避免产品不必要的费用。 在创建Notebook时,默认会开启自动停止功能,在指定时间内停止运行Notebook,避免资源浪费。 只有处于“运行中”状态的Notebook,才可以执行打开、停止操作。 一个帐户最多创建10个Notebook。
  • run.sh脚本测试ModelArts训练整体流程 自定义容器在ModelArts上训练和本地训练的区别如下图: 图1 本地与ModelArts上训练对比 ModelArts上进行训练比本地训练多了一步OBS和容器环境的数据迁移工作。 增加了和OBS交互工作的整个训练流程如下: 建议使用OBSutil作为和OBS交互的工具,如何在本机安装obsutil可以参考obsutil安装和配置。 训练数据、代码、模型下载。(本地使用硬盘挂载或者docker cp,在ModelArts上使用OBSutil) 启动脚本,用法无切换,一般就是到达执行目录,然后python xxx.py。 训练结果、日志、checkpoints上传。(本地使用硬盘挂载或者docker cp,在ModelArts上使用OBSutil) 可以用一个run脚本把整个流程包起来。run.sh脚本的内容可以参考如下示例: #!/bin/bash ##认证用的AK和SK硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全。 ##本示例以AK和SK保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。 ##安装obsutil,完成AKSK配置。建议在基础镜像里做好。 #mkdir -p /opt && cd /opt #wget https://obs-community.obs.cn-north-1.myhuaweicloud.com/obsutil/current/obsutil_linux_amd64.tar.gz #tar -xzvf obsutil_linux_amd64.tar.gz && mv obsutil_linux_amd64_*/ utils #alias obsutil='/opt/utils/obsutil' #obsutil config -i=${HUAWEICLOUD_SDK_AK} -k=${HUAWEICLOUD_SDK_SK} -e=obs.cn-north-4.myhuaweicloud.com ##训练输入复制到容器镜像本地。 #/cache目录的容量较大。 DATA_URL=`echo ${DLS_DATA_URL} | sed /s/s3/obs/` mkdir –p /cache/data /opt/utils/obsutil cp –r –f ${DATA_URL} /cache/data ##执行训练任务。 #涉及conda env切换时。 source /xxxxx/etc/profile.d/conda.sh conda activate xxxenv conda info --envs #启动训练脚本。 cd xxxx python xxx.py ##复制输出结果到OBS目录。 TRAIN_URL=`echo ${DLS_TRAIN_URL} | sed /s/s3/obs/` /opt/utils/obsutil cp –r –f /cache/out ${TRAIN_URL} 把run.sh放到/opt目录,在实际启动任务的时候,使用以下命令启动任务即可: bash –x /opt/run.sh 把run.sh放到/root目录,可以在原镜像里增加一层,这一层就只是COPY这个run脚本。在基础镜像里可以一起把obsutil安装、配置好。参考如下dockerfile: FROM $your_docker_image_tag RUN mkdir -p /opt && cd /opt && \ wget https://obs-community.obs.cn-north-1.myhuaweicloud.com/obsutil/current/obsutil_linux_amd64.tar.gz && \ tar -xzvf obsutil_linux_amd64.tar.gz && mv obsutil_linux_amd64_*/ utils && \ /opt/utils/obsutil config -i=${HUAWEICLOUD_SDK_AK} -k=${HUAWEICLOUD_SDK_SK} -e=obs.cn-north-4.myhuaweicloud.com COPY run.sh /opt/run.sh ModelArts的容器会有一个/cache目录,这个目录挂载的硬盘容量最大。建议下载数据和中间数据都存到这个目录中,防止因硬盘占满导致任务失败。 父主题: FAQ
  • 场景介绍 阅读本文前建议您先了解以下内容: Stable Diffusion的基础知识,可参考Stable Diffusion github、Stable Diffusion wikipedia、diffusers github、Stable Diffusion with diffusers。 推理业务迁移到昇腾的通用流程,可参考推理业务迁移通用指导。 由于Huggingface网站的限制,访问Stable Diffusion链接时需使用代理服务器,否则可能无法访问网站。 在Stable Diffusion迁移适配时,更多的时候是在适配Diffusers和Stable Diffusion WebUI,使其能够在昇腾的设备上运行。其中,Diffusers遵循了Huggingface的“single-file policy”的设计原则,它的三个主要模块Pipeline、Schedulers和预训练模型中,Pipeline和Schedulers都完全遵循了“single-file policy”原则。该设计原则更推荐复制粘贴代码而不是做抽象,因此所有和这个模型前向运算相关的源代码都被复制粘贴进同一个文件中,而不是调用某些抽象提取出的模块化的库,Diffusers的这种设计原则的好处是代码简单易用、对代码贡献者友好,但也有明显的缺点,因为这种反软件结构化的设计,导致对于昇腾适配来说比较复杂,因为没有统一的模块化的库可以适配,只能针对每个不同业务的Pipeline进行单独适配。本文以Stable Diffusion v1.5的图生图为例,通过可以直接执行的样例代码介绍Diffusers的昇腾迁移过程,其他的pipeline迁移可以在基于对pipeline的代码充分理解的基础上,参考本文的思路进行举一反三。Stable Diffusion WebUI的迁移不包含在本文中,具体原因详见Stable Diffusion WebUI如何适配?。 AI推理应用运行在昇腾设备上一般有两种方式: 方式1:通过Ascend PyTorch,后端执行推理,又称在线推理。 方式2:通过模型静态转换后,执行推理,又称离线推理。 通常为了获取更好的推理性能,推荐使用方式2的离线推理。下文将以Diffusers img2img onnx pipeline为示例来讲解如何进行离线推理模式下的昇腾迁移。迁移的整体流程如下图所示: 图1 迁移流程图 父主题: AIGC推理业务昇腾迁移指导