云服务器内容精选

  • Step8 Jmeter压测 获取开源的Jmeter压测工具。安装包地址:jmeter安装包地址。 安装Java。 下载jdk包到宿主机上,拷贝到容器/opt/jdk目录下,使用tar -zxvf 解压,例如: #容器内执行: mkdir /opt/jdk #宿主机上执行: docker cp jdk-8u352-linux-aarch64.tar.gz bert-mindspore:/opt/jdk #容器内执行: cd /opt/jdk tar -zxvf jdk-8u352-linux-aarch64.tar.gz 然后设置环境变量(JAVA_HOME 路径名称以实际为准): export JAVA_HOME=/opt/jdk/jdk1.8.0_352 export PATH=${JAVA_HOME}/bin:${PATH} 安装Jmeter。 下载jmeter包到宿主机上,拷贝到容器/opt/jmeter,使用unzip 解压,例如: #容器内执行: mkdir /opt/jmeter #宿主机上执行: docker cp apache-jmeter-5.4.1.zip bert-mindspore:/opt/jmeter #容器内执行: cd /opt/jmeter unzip apache-jmeter-5.4.1.zip 然后设置环境变量 export PATH=/opt/jmeter/apache-jmeter-5.4.1/bin:${PATH} 启动Jmeter压测。 修改jmeter启动脚本 vim run_jmeter.sh 将其内容修改如下,${model}.jtl 为jtl文件名 jmeter -n -t jmeter.jmx -l ${model}.jtl 启动jmeter脚本 sh run_jmeter.sh 查看信息。将jtl文件保存在本地,创建一个线程组,在该线程组下面创建一个监听器的聚合报告。在聚合报告中打开相应的jtl文件查看信息。 查看的信息包括: 平均值:平均时延 99%百分位:p99时延 异常:失败率 吞吐量:qps 每打开一个jtl文件需要重新创建一个聚合报告,不能用同一个聚合报告打开多个jtl文件,会使数据杂糅,使聚合报告信息不准。 记录最终吞吐量时需将该信息中的吞吐量 x batchsize。
  • 附录:get_onnx.py脚本内容 get_onnx.py脚本用于查看onnx模型文件信息,脚步具体内容如下: from pprint import pprint import onnxruntime onnx_path = "./model.onnx" # 此处的onnx_path值需替换成实际的模型存放路径和模型文件名称 provider = "CPUExecutionProvider" onnx_session = onnxruntime.InferenceSession(onnx_path, providers=[provider]) print("----------------- 输入部分 -----------------") input_tensors = onnx_session.get_inputs() # 该 API 会返回列表 for input_tensor in input_tensors: # 因为可能有多个输入,所以为列表 input_info = { "name" : input_tensor.name, "type" : input_tensor.type, "shape": input_tensor.shape, } pprint(input_info) print("----------------- 输出部分 -----------------") output_tensors = onnx_session.get_outputs() # 该 API 会返回列表 for output_tensor in output_tensors: # 因为可能有多个输出,所以为列表 output_info = { "name" : output_tensor.name, "type" : output_tensor.type, "shape": output_tensor.shape, } pprint(output_info)
  • Step6 安装插件代码包并编辑 模型推理时需要使用适配过昇腾的模型插件包。将获取到的模型插件代码包ascendcloud-aigc-6.3.904-*.tar.gz文件上传到容器的/home/ma-user/目录下并解压。获取路径参见获取软件和镜像。 cd /home/ma-user/ tar -zxvf ascendcloud-aigc-6.3.904-*.tar.gz #解压,包名中的*表示时间戳,请按照实际替换。 cp ascendcloud-aigc-poc-redbook.tar.gz ${model_path} #${model_path}为mindir文件所在路径 cd ${model_path} tar -zxvf ascendcloud-aigc-poc-redbook.tar.gz 解压后所得文件如图3所示。 图3 ascendcloud-aigc-poc-redbook解压后文件 编辑gunicorn.conf文件。 vim gunicorn.conf 图4 编辑gunicorn.conf文件 5556与创建容器映射端口号保持一致。 workers为服务数,测试多服务时可以根据需要修改此参数的值。 编辑infer_server.py文件。 vim infer_server.py 图5 BERT编辑infer_server.py文件 DEVICE_ID:设备ID,与挂载卡保持一致。 model_path:为mindir名称。 port:与创建容器时端口保持一致。 input_data:三个为onnx模型转mindir模型时的输入,此次三个输入全部为4,96,将图上32,256全部换为4,96即可。如果该模型只有一个输入,需将input_data2与input_data3添加注释,并将res = model[(input_data1,input_data2,input_data3])]中的input_data2与input_data3删除,在input_data1中填入相应输入即可。 此次三个BERT全部为三个输入,CV模型全部为单个输入,如下图为CV模型的输入信息查看示例。 图6 get_onnx.py查看CV模型的onnx信息 对于CV模型,需将input_data2与input_data3注释,此onnx模型为固定shape,其转为onnx模型时不能修改其输入,故Inptu_data1中需修改为1,3,640,640,后面np.int32也需修改为np.float32。 编辑jmeter.jmx文件 vim jmeter.jmx 图7 编辑jmeter.jmx文件(1) ThreadGroup.num_threads:为jemter压测的线程数。 ThreadGroup.scheduler:将false修改为true,表示限制压测时间。 ThreadGroup.duration:设置压测时间,默认时间单位为s,例如需要压测10min,则添加600即可,无需带单位。 图8 编辑jmeter.jmx文件(2) port:与创建容器时端口保持一致
  • Step1 准备环境 请参考DevServer资源开通,购买DevServer资源,并确保机器已开通,密码已获取,能通过SSH登录,不同机器之间网络互通。 当容器需要提供服务给多个用户,或者多个用户共享使用该容器时,应限制容器访问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
  • Step3 启动容器镜像 启动容器镜像。启动前请先按照参数说明修改${}中的参数。 export work_dir="自定义挂载的工作目录" export container_work_dir="自定义挂载到容器内的工作目录" export container_name="自定义容器名称" export image_name="镜像名称" // 启动一个容器去运行镜像 docker run -itd \ --device=/dev/davinci0 \ --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 \ -p 5556:5556 \ -v ${work_dir}:${container_work_dir} \ --name ${container_name} \ ${image_name} bash 参数说明: -v ${work_dir}:${container_work_dir}:代表需要在容器中挂载宿主机的目录。宿主机和容器使用不同的文件系统。work_dir为宿主机中工作目录,目录下存放着训练所需代码、数据等文件。container_work_dir为要挂载到的容器中的目录。为方便两个地址可以相同。 容器不能挂载到/home/ma-user目录,此目录为ma-user用户家目录。如果容器挂载到/home/ma-user下,拉起容器时会与基础镜像冲突,导致基础镜像不可用。 driver及npu-smi需同时挂载至容器。 --name ${container_name}:容器名称,进入容器时会用到,此处可以自己定义一个容器名称。 ${image_name}:容器镜像的名称。 通过容器名称进入容器中。 docker exec -it ${container_name} bash
  • Step5 转换模型文件 将onnx模型文件转换为mindir格式模型文件。转换过程中涉及到的参数需要查看原始onnx文件,此处提供查看的脚本文件get_onnx.py,具体的脚步文件内容见附录:get_onnx.py脚本内容。 模型转换命令如下。 export model_name="model" export LD_LIBRARY_PATH=/home/ma-user/anaconda3/envs/python-3.9.10/lib/:${LD_LIBRARY_PATH} converter_lite --modelFile=./${model_name}.onnx --outputFile=./${model_name} --fmk=ONNX --saveType=MINDIR --optimize=ascend_oriented --inputShape="input_ids:4,96;attention_mask:4,96;token_type_ids:4,96" --modelFile:模型名称。 --outputFile:输出模型名称。模型名称无需添加.mindir后缀,添加后对后续测试流程存在一定影响。 --inputShape:根据onnx输出的name:shape进行修改,可以通过get_onnx.py脚本查看,如图1所示。 图1 get_onnx.py脚本查看输入参数 如需进行AOE优化,则需配置一个config.ini文件,文件内容如下。 [ascend_context] plugin_custom_ops=FlashAttention,GroupNormSilu,GeGluV2 aoe_mode="subgraph tuning, operator tuning" AOE优化命令如下,只需将以上模型转换命令添加一个--configFile=config.ini即可。 converter_lite --modelFile=./${model_name}.onnx -- outputFile=./${model_name} --fmk=ONNX --saveType=MINDIR --optimize=ascend_oriented --inputShape="input_ids:4,96;attention_mask:4,96;token_type_ids:4,96" --configFile=config.ini benchmark测试命令如下。 benchmark --device=Ascend --modelFile=${model_name}.mindir 图2 benchmark测试
  • 获取软件和镜像 表2 获取软件和镜像 分类 名称 获取路径 插件代码包 ascendcloud-aigc-6.3.904-*.tar.gz 说明: 包名中的*表示具体的时间戳,以包名的实际时间为准。 获取路径:Support-E网站。 说明: 如果没有下载权限,请联系您所在企业的华为方技术支持下载获取。 基础镜像 西南-贵阳一:swr.cn-southwest-2.myhuaweicloud.com/atelier/mindspore_2_3_ascend:mindspore_2.3.0-cann_8.0.rc1-py_3.9-hce_2.0.2312-aarch64-snt9b-20240516142953-ca51f42 从SWR拉取。
  • Step5 转换模型文件 将onnx模型文件转换为mindir格式模型文件。转换过程中涉及到的参数需要查看原始onnx文件,此处提供查看的脚本文件get_onnx.py,具体的脚步文件内容见附录:get_onnx.py脚本内容。 模型转换命令如下。 export model_name="model" export LD_LIBRARY_PATH=/home/ma-user/anaconda3/envs/python-3.9.10/lib/:${LD_LIBRARY_PATH} converter_lite --modelFile=./${model_name}.onnx --outputFile=./${model_name} --fmk=ONNX --saveType=MINDIR --optimize=ascend_oriented --inputShape="input_ids:4,96;attention_mask:4,96;token_type_ids:4,96" --modelFile:模型名称。 --outputFile:输出模型名称。模型名称无需添加.mindir后缀,添加后对后续测试流程存在一定影响。 --inputShape:根据onnx输出的name:shape进行修改,可以通过get_onnx.py脚本查看,如图1所示。 图1 get_onnx.py脚本查看输入参数 如需进行AOE优化,则需配置一个config.ini文件,文件内容如下。 [ascend_context] plugin_custom_ops=FlashAttention,GroupNormSilu,GeGluV2 aoe_mode="subgraph tuning, operator tuning" AOE优化命令如下,只需将以上模型转换命令添加一个--configFile=config.ini即可。 converter_lite --modelFile=./${model_name}.onnx -- outputFile=./${model_name} --fmk=ONNX --saveType=MINDIR --optimize=ascend_oriented --inputShape="input_ids:4,96;attention_mask:4,96;token_type_ids:4,96" --configFile=config.ini benchmark测试命令如下。 benchmark --device=Ascend --modelFile=${model_name}.mindir 图2 benchmark测试
  • 附录:get_onnx.py脚本内容 get_onnx.py脚本用于查看onnx模型文件信息,脚步具体内容如下: from pprint import pprint import onnxruntime onnx_path = "./model.onnx" # 此处的onnx_path值需替换成实际的模型存放路径和模型文件名称 provider = "CPUExecutionProvider" onnx_session = onnxruntime.InferenceSession(onnx_path, providers=[provider]) print("----------------- 输入部分 -----------------") input_tensors = onnx_session.get_inputs() # 该 API 会返回列表 for input_tensor in input_tensors: # 因为可能有多个输入,所以为列表 input_info = { "name" : input_tensor.name, "type" : input_tensor.type, "shape": input_tensor.shape, } pprint(input_info) print("----------------- 输出部分 -----------------") output_tensors = onnx_session.get_outputs() # 该 API 会返回列表 for output_tensor in output_tensors: # 因为可能有多个输出,所以为列表 output_info = { "name" : output_tensor.name, "type" : output_tensor.type, "shape": output_tensor.shape, } pprint(output_info)
  • Step6 安装插件代码包并编辑 模型推理时需要使用适配过昇腾的模型插件包。将获取到的模型插件代码包ascendcloud-aigc-6.3.904-*.tar.gz文件上传到容器的/home/ma-user/目录下并解压。获取路径参见获取软件和镜像。 cd /home/ma-user/ tar -zxvf ascendcloud-aigc-6.3.904-*.tar.gz #解压,包名中的*表示时间戳,请按照实际替换。 cp ascendcloud-aigc-poc-redbook.tar.gz ${model_path} #${model_path}为mindir文件所在路径 cd ${model_path} tar -zxvf ascendcloud-aigc-poc-redbook.tar.gz 解压后所得文件如图3所示。 图3 ascendcloud-aigc-poc-redbook解压后文件 编辑gunicorn.conf文件。 vim gunicorn.conf 图4 编辑gunicorn.conf文件 5556与创建容器映射端口号保持一致。 workers为服务数,测试多服务时可以根据需要修改此参数的值。 编辑infer_server.py文件。 vim infer_server.py 图5 BERT编辑infer_server.py文件 DEVICE_ID:设备ID,与挂载卡保持一致。 model_path:为mindir名称。 port:与创建容器时端口保持一致。 input_data:三个为onnx模型转mindir模型时的输入,此次三个输入全部为4,96,将图上32,256全部换为4,96即可。如果该模型只有一个输入,需将input_data2与input_data3添加注释,并将res = model[(input_data1,input_data2,input_data3])]中的input_data2与input_data3删除,在input_data1中填入相应输入即可。 此次三个BERT全部为三个输入,CV模型全部为单个输入,如下图为CV模型的输入信息查看示例。 图6 get_onnx.py查看CV模型的onnx信息 对于CV模型,需将input_data2与input_data3注释,此onnx模型为固定shape,其转为onnx模型时不能修改其输入,故Inptu_data1中需修改为1,3,640,640,后面np.int32也需修改为np.float32。 编辑jmeter.jmx文件 vim jmeter.jmx 图7 编辑jmeter.jmx文件(1) ThreadGroup.num_threads:为jemter压测的线程数。 ThreadGroup.scheduler:将false修改为true,表示限制压测时间。 ThreadGroup.duration:设置压测时间,默认时间单位为s,例如需要压测10min,则添加600即可,无需带单位。 图8 编辑jmeter.jmx文件(2) port:与创建容器时端口保持一致
  • Step8 Jmeter压测 获取开源的Jmeter压测工具。安装包地址:jmeter安装包地址。 安装Java。 下载jdk包到宿主机上,拷贝到容器/opt/jdk目录下,使用tar -zxvf 解压,例如: #容器内执行: mkdir /opt/jdk #宿主机上执行: docker cp jdk-8u352-linux-aarch64.tar.gz bert-mindspore:/opt/jdk #容器内执行: cd /opt/jdk tar -zxvf jdk-8u352-linux-aarch64.tar.gz 然后设置环境变量(JAVA_HOME 路径名称以实际为准): export JAVA_HOME=/opt/jdk/jdk1.8.0_352 export PATH=${JAVA_HOME}/bin:${PATH} 安装Jmeter。 下载jmeter包到宿主机上,拷贝到容器/opt/jmeter,使用unzip 解压,例如: #容器内执行: mkdir /opt/jmeter #宿主机上执行: docker cp apache-jmeter-5.4.1.zip bert-mindspore:/opt/jmeter #容器内执行: cd /opt/jmeter unzip apache-jmeter-5.4.1.zip 然后设置环境变量 export PATH=/opt/jmeter/apache-jmeter-5.4.1/bin:${PATH} 启动Jmeter压测。 修改jmeter启动脚本 vim run_jmeter.sh 将其内容修改如下,${model}.jtl 为jtl文件名 jmeter -n -t jmeter.jmx -l ${model}.jtl 启动jmeter脚本 sh run_jmeter.sh 查看信息。将jtl文件保存在本地,创建一个线程组,在该线程组下面创建一个监听器的聚合报告。在聚合报告中打开相应的jtl文件查看信息。 查看的信息包括: 平均值:平均时延 99%百分位:p99时延 异常:失败率 吞吐量:qps 每打开一个jtl文件需要重新创建一个聚合报告,不能用同一个聚合报告打开多个jtl文件,会使数据杂糅,使聚合报告信息不准。 记录最终吞吐量时需将该信息中的吞吐量 x batchsize。
  • 获取软件和镜像 表2 获取软件和镜像 分类 名称 获取路径 插件代码包 ascendcloud-aigc-6.3.904-*.tar.gz 说明: 包名中的*表示具体的时间戳,以包名的实际时间为准。 获取路径:Support-E网站。 说明: 如果没有下载权限,请联系您所在企业的华为方技术支持下载获取。 基础镜像 西南-贵阳一:swr.cn-southwest-2.myhuaweicloud.com/atelier/mindspore_2_3_ascend:mindspore_2.3.0-cann_8.0.rc1-py_3.9-hce_2.0.2312-aarch64-snt9b-20240516142953-ca51f42 从SWR拉取。
  • Step3 启动容器镜像 启动容器镜像。启动前请先按照参数说明修改${}中的参数。 export work_dir="自定义挂载的工作目录" export container_work_dir="自定义挂载到容器内的工作目录" export container_name="自定义容器名称" export image_name="镜像名称" // 启动一个容器去运行镜像 docker run -itd \ --device=/dev/davinci0 \ --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 \ -p 5556:5556 \ -v ${work_dir}:${container_work_dir} \ --name ${container_name} \ ${image_name} bash 参数说明: -v ${work_dir}:${container_work_dir}:代表需要在容器中挂载宿主机的目录。宿主机和容器使用不同的文件系统。work_dir为宿主机中工作目录,目录下存放着训练所需代码、数据等文件。container_work_dir为要挂载到的容器中的目录。为方便两个地址可以相同。 容器不能挂载到/home/ma-user目录,此目录为ma-user用户家目录。如果容器挂载到/home/ma-user下,拉起容器时会与基础镜像冲突,导致基础镜像不可用。 driver及npu-smi需同时挂载至容器。 --name ${container_name}:容器名称,进入容器时会用到,此处可以自己定义一个容器名称。 ${image_name}:容器镜像的名称。 通过容器名称进入容器中。 docker exec -it ${container_name} bash
  • Step1 准备环境 请参考DevServer资源开通,购买DevServer资源,并确保机器已开通,密码已获取,能通过SSH登录,不同机器之间网络互通。 当容器需要提供服务给多个用户,或者多个用户共享使用该容器时,应限制容器访问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
  • Step6 安装插件代码包并编辑 模型推理时需要使用适配过昇腾的模型插件包。将获取到的模型插件代码包ascendcloud-aigc-6.3.904-*.tar.gz文件上传到容器的/home/ma-user/目录下并解压。获取路径参见获取软件和镜像。 cd /home/ma-user/ tar -zxvf ascendcloud-aigc-6.3.904-*.tar.gz #解压,包名中的*表示时间戳,请按照实际替换。 cp ascendcloud-aigc-poc-redbook.tar.gz ${model_path} #${model_path}为mindir文件所在路径 cd ${model_path} tar -zxvf ascendcloud-aigc-poc-redbook.tar.gz 解压后所得文件如图3所示。 图3 ascendcloud-aigc-poc-redbook解压后文件 编辑gunicorn.conf文件。 vim gunicorn.conf 图4 编辑gunicorn.conf文件 5556与创建容器映射端口号保持一致。 workers为服务数,测试多服务时可以根据需要修改此参数的值。 编辑infer_server.py文件。 vim infer_server.py 图5 BERT编辑infer_server.py文件 DEVICE_ID:设备ID,与挂载卡保持一致。 model_path:为mindir名称。 port:与创建容器时端口保持一致。 input_data:三个为onnx模型转mindir模型时的输入,此次三个输入全部为4,96,将图上32,256全部换为4,96即可。如果该模型只有一个输入,需将input_data2与input_data3添加注释,并将res = model[(input_data1,input_data2,input_data3])]中的input_data2与input_data3删除,在input_data1中填入相应输入即可。 此次三个BERT全部为三个输入,CV模型全部为单个输入,如下图为CV模型的输入信息查看示例。 图6 get_onnx.py查看CV模型的onnx信息 对于CV模型,需将input_data2与input_data3注释,此onnx模型为固定shape,其转为onnx模型时不能修改其输入,故Inptu_data1中需修改为1,3,640,640,后面np.int32也需修改为np.float32。 编辑jmeter.jmx文件 vim jmeter.jmx 图7 编辑jmeter.jmx文件(1) ThreadGroup.num_threads:为jemter压测的线程数。 ThreadGroup.scheduler:将false修改为true,表示限制压测时间。 ThreadGroup.duration:设置压测时间,默认时间单位为s,例如需要压测10min,则添加600即可,无需带单位。 图8 编辑jmeter.jmx文件(2) port:与创建容器时端口保持一致