华为云用户手册

  • 场景介绍 当专属资源池中的节点含有GPU/Ascend资源时,用户基于自己的业务,可能会有自定义GPU/Ascend驱动的需求,ModelArts面向此类客户提供了自助升级专属资源池GPU/Ascend驱动的能力。 驱动升级有两种升级方式:安全升级、强制升级。 安全升级:不影响正在运行的业务,开始升级后会先将节点进行隔离(不能再下发新的作业),待节点上的存量作业运行完成后再进行升级,因需要等待作业完成,故升级周期可能比较长。 强制升级:忽略资源池中正在运行的作业,直接进行驱动升级,可能会导致运行中作业失败,需谨慎选择。
  • 解决方法 ModelArts全局配置的委托权限不足,导致创建失败? 解决方法请参见ModelArts创建委托授权。 申请的资源中包含受限购买的资源规格,导致购买失败? 当前modelarts.bm.npu.arm.8snt9b3.d为受限购买,需要提前联系ModelArts运营或提工单申请开通资源规格。 图2 报错信息 E CS 、EVS配额不足,导致创建失败? 集群所需的ECS实例数、内存大小、CPU核数和EVS硬盘大小资源会超出华为云默认提供的资源配额,因此需要申请扩大配额。解决方法请参见申请扩大资源配额。 图3 报错信息(1) 图4 报错信息(2) 资源售罄或容量不足,导致创建失败? 减少资源池节点数量,或提工单给ModelArts申请更多资源。 图5 报错信息 ECS、BMS节点创建失败? 查看资源池失败报错信息: 包含错误码,如:Ecs.0000时,可查看弹性云服务器 ECS_错误码查看详细的错误信息及处理措施。 包含错误码,如:BMS.0001时,可查看裸金属服务器 BMS_错误码查看详细的错误信息及处理措施。 包含错误码,如:CCE.01400001时,可查看云容器引擎 CCE_错误码查看详细的错误信息及处理措施 其他报错请提工单联系ModelArts运维进一步定位解决。 集群纳管节点失败? 查看资源池失败报错信息: 查看资源池失败报错信息,包含错误码,如:CCE.01400001时,可查看云容器引擎 CCE_错误码查看详细的错误信息及处理措施。 其他报错请提工单联系ModelArts运维进一步定位解决。 集群容器网段不足,导致创建失败? 图6 报错信息 用户可根据实际业务场景和节点规模,自定义配置容器网段,配置方式如下: ModelArts Standard池,资源池创建阶段指定容器网段,根据实际需要设置更大的容器网段。 图7 设置容器网段 ModelArts Lite池,选择/创建具有更大容器网段的CCE集群。CCE容器网段配置参见网络规划。 账号冻结导致创建失败? 查看资源池失败报错信息,存在"frozen deposit fail",表示账号冻结导致资源创建失败。检查账号状态和资源欠费情况,账号解冻后重新购买资源。 订单取消导致资源创建失败? 查看资源池失败报错信息,存在"the operation is canceled by customer",表示资源池对应订单已取消,取消原因可能为超时未支付、用户自主取消,需重新购买。 其他错误 可通过F12查看浏览器请求信息,选择标红的pools接口,查看响应里的详细报错信息,如下图所示。通过错误提示修正输入参数后再次提交订单。 图8 报错信息 如CCE集群不可用,请检查CCE集群版本和状态。报错信息如下: { "error_code": "ModelArts.50004000", "error_msg": "Bad request. spec.clusters[0].providerId: Invalid value: \"77f6f112-a631-11eb-8dae-0255ac100b0d\": the cluster 77f6f112-a631-11eb-8dae-0255ac100b0d is not available" }
  • 使用前须知 ModelArts Lite Server存在以下使用限制: ModelArts Lite DevServer服务器操作系统升级/修改风险 ModelArts Lite DevServer裸金属服务器,如果升级/修改操作系统内核或者驱动,很可能导致驱动和内核版本不兼容,从而导致OS无法启动,或者基本功能不可用。如果需要升级/修改,请联系华为云技术支持。相关高危命令如:apt-get upgrade。 部分ModelArts Lite DevServer服务器不支持重装系统 如表1所示,弹性云服务器不支持重装操作系统,部分区域的裸金属服务器不支持重装操作系统,若您想重装操作系统,您可通过切换操作系统的方式解决。 表1 重装和切换操作系统能力介绍 功能 弹性云服务器 裸金属服务器 所在区域为华东二Region 所在区域为其他Region 重装操作系统 不支持 不支持 支持 切换操作系统 支持 支持 支持 重装或者切换操作系统后,ModelArts Lite Server服务器的EVS系统盘将不支持扩容 服务器在进行过“重装或者切换操作系统”操作后,EVS系统盘ID发生变化,和下单时订单中的EVS ID已经不一致, 因此EVS系统盘无法扩容,并显示信息:"当前订单已到期,无法进行扩容操作,请续订"。建议挂载数据盘EVS或挂载SFS盘等方式进行存储扩容。 表2 扩容能力介绍 功能 弹性云服务器 裸金属服务器 所在区域为华东二Region 所在区域为其他Region 系统盘ID无变化下扩容 支持 支持 支持 系统盘ID有变化下扩容 不支持 不支持 不支持 父主题: Server资源配置
  • 约束与限制 该功能只支持贵阳一区域,如果要在其他区域使用请联系技术支持。 ModelArts Lite资源池对应的CCE集群需要安装1.10.12及以上版本的华为云版Volcano插件。Volcano调度器的安装升级请参见Volcano调度器。仅华为云版Volcano插件支持开启路由加速特性。 训练使用的Python版本是3.7或3.9,否则无法实现ranktable路由加速。 训练作业的任务节点数要大于或等于3,否则会跳过ranktable路由加速。建议在大模型场景(512卡及以上)使用ranktable路由加速。 脚本执行目录不能是共享目录,否则ranktable路由加速会失败。 路由加速的原理是改变rank编号,所以代码中对rank的使用要统一,如果rank的使用不一致会导致训练异常。
  • 系统内核与gpu-driver配套关系 表4 系统内核与gpu-driver配套关系 镜像版本 系统内核版本 适配CCE gpu-driver版本 EulerOS 2.10 4.18.0-147.5.2.15.h1109.eulerosv2r10.x86_64 v1.(23|25|27|28).* 容器隧道网络|VPC|ENI 470.57.02 4.18.0-147.5.2.5.h805.eulerosv2r10.x86_64 v1.(23|25|27).* 容器隧道网络|VPC|ENI 470.57.02 EulerOS 2.9 4.18.0-147.5.1.6.h841.eulerosv2r9.x86_64 v1.(23|25|27|28).* 容器隧道网络|VPC 470.57.02 EulerOS 2.3 3.10.0-514.44.5.10.h193.x86_64 v1.(23|25).* 容器隧道网络|VPC 470.57.02 3.10.0-514.44.5.10.h254.x86_64 v1.(23|25).* 容器隧道网络|VPC 470.57.02
  • 弹性云服务器的对应的软件配套版本 表2 弹性云服务器 类型 卡类型 操作系统 适用范围 依赖插件 NPU ascend-snt3p-300i 操作系统:EulerOS 2.9 架构类型:x86 集群类型:CCE Standard、 CCE Turbo 集群版本:v1.23|v1.25 集群规模:50|200|1000|2000 集群网络模式:容器隧道网络|VPC|ENI 集群转发模式:iptables|ipvs huawei-npu npu-driver volcano 插件版本匹配关系请见表3。 ascend-snt3 操作系统:EulerOS 2.5 架构类型:x86 集群类型:CCE Standard 集群版本:v1.23|v1.25 集群规模:50|200|1000|2000 集群网络模式:容器隧道网络|VPC 集群转发模式:iptables|ipvs 操作系统:EulerOS 2.8 架构类型:arm 集群类型:CCE Standard 集群版本:v1.23|v1.25 集群规模:50|200|1000|2000 集群网络模式:容器隧道网络|VPC 集群转发模式:iptables|ipvs GPU gp-vnt1 操作系统:EulerOS 2.9 架构类型:x86 集群类型:CCE Standard 集群版本:v1.23|v1.25 集群规模:50|200|1000|2000 集群网络模式:容器隧道网络|VPC 集群转发模式:iptables|ipvs gpu-beta gpu-driver rdma-sriov-dev-plugin 插件版本匹配关系请见表3。 gp-ant03 操作系统:EulerOS 2.9 架构类型:x86 集群类型:CCE Standard 集群版本:v1.23|v1.25 集群规模:50|200|1000|2000 集群网络模式:容器隧道网络|VPC 集群转发模式:iptables|ipvs gp-ant1-pcie40 操作系统:EulerOS 2.9 架构类型:x86 集群类型:CCE Standard 集群版本:v1.23|v1.25 集群规模:50|200|1000|2000 集群网络模式:容器隧道网络|VPC 集群转发模式:iptables|ipvs gp-tnt004 操作系统:EulerOS 2.9 架构类型:x86 集群类型:CCE Standard 集群版本:v1.23|v1.25 集群规模:50|200|1000|2000 集群网络模式:容器隧道网络|VPC 集群转发模式:iptables|ipvs
  • 插件版本与CCE集群版本适配关系 表3 插件版本与CCE集群版本适配关系 类别 插件名称 插件版本 适配CCE集群版本 适用范围、约束 插件功能描述 ccePlugin gpu-beta 2.0.48(仅适用于北京四、贵阳一、广州一、上海一、乌兰察布一、北京二、乌兰察布汽车,其余region暂不支持。) v1.(23|25).* GPU 支持在容器中使用GPU显卡的设备管理插件。 1.2.15 v1.23.* huawei-npu 1.2.5 v1.(23|25).* NPU 支持容器里使用huawei NPU设备的管理插件。 volcano 1.11.9 v1.(23|25).* NPU 基于Kubernetes的批处理平台。 npuDriver npu-driver 7.1.0.7.220-23.0.5(推荐) 无约束 NPU 用于升级、回滚npu驱动。 helm rdma-sriov-dev-plugin 0.1.0 无约束 BMS、RDMA且非ascend-1980 用于支持容器里使用RDMA网卡。 memarts 3.23.6-r002 无约束 无约束 近计算侧分布式缓存插件,用于存储加速。 os-node-agent 6.2.0-20230925213538 无约束 无约束 OS插件,用于故障检测。 icAgent icagent default CCE默认安装当前适配版本 无约束 CCE基础组件,用于日志和监控。 gpuDriver gpu-driver gpu-driver与系统内核版本有关,请见表4。 用于升级、回滚gpu驱动,插件依赖gpu-beta版本。
  • 裸金属服务器的对应的软件配套版本 表1 裸金属服务器 类型 卡类型 RDMA网络协议 操作系统 适用范围、约束 依赖插件 NPU ascend-snt9b RoCE 操作系统:EulerOS 2.10 64bit 内核版本:4.19.90-vhulk2211.3.0.h1543.eulerosv2r10.aarch64 架构类型:aarch64 集群类型:CCE Standard 集群版本:v1.23|v1.25 集群规模:50|200|1000|2000 集群网络模式:容器隧道网络|VPC 集群转发模式:iptables|ipvs huawei-npu npu-driver volcano 插件版本匹配关系请见表3。 RoCE 操作系统:Huawei Cloud EulerOS 2.0 64bit 内核版本:5.10.0-60.18.0.50.r865_35.hce2.aarch64 架构类型:aarch64 集群类型:CCE Turbo 集群版本:v1.23|v1.25 集群规模:50|200|1000|2000 集群网络模式:ENI 集群转发模式:iptables|ipvs RoCE 操作系统:EulerOS 2.8 64bit 内核版本:4.19.36-vhulk1907.1.0.h619.eulerosv2r8.aarch64 架构类型:aarch64 集群类型:CCE Standard|Turbo 集群版本:v1.23|v1.25 集群规模:50|200|1000|2000 集群网络模式:容器隧道网络|VPC|ENI 集群转发模式:iptables|ipvs GPU gp-ant8 RoCE 操作系统:EulerOS 2.10 64bit 内核版本:4.18.0-147.5.2.15.h1109.eulerosv2r10.x86_64 架构类型:x86 集群类型:CCE Standard 集群版本:v1.23|v1.25 集群规模:50|200|1000|2000 集群网络模式:容器隧道网络|VPC 分布式训练时仅支持容器隧道网络 集群转发模式:iptables|ipvs gpu-beta gpu-driver rdma-sriov-dev-plugin 插件版本匹配关系请见表3。 gp-ant1 RoCE 操作系统:EulerOS 2.10 64bit 4.18.0-147.5.2.15.h1109.eulerosv2r10.x86_64 架构类型:x86 集群类型:CCE Standard 集群版本:v1.23|v1.25 集群规模:50|200|1000|2000 集群网络模式:容器隧道网络|VPC 分布式训练时仅支持容器隧道网络 集群转发模式:iptables|ipvs gp-vnt1 RoCE|IB 操作系统:EulerOS 2.9 64bit(仅上海一p6|p6s规格使用) 内核版本:147.5.1.6.h1099.eulerosv2r9.x86_64 架构类型:x86 集群类型:CCE Standard| 集群版本:v1.23|v1.25 集群规模:50|200|1000|2000 集群网络模式:容器隧道网络|VPC 分布式训练时仅支持容器隧道网络 集群转发模式:iptables|ipvs 操作系统:EulerOS 2.9 64bit(推荐) 内核版本:4.18.0-147.5.1.6.h841.eulerosv2r9.x86_64 架构类型:x86 RDMA:Remote Direct Memory Access(RDMA)是一种直接内存访问技术,将数据直接从一台计算机的内存传输到另一台计算机。 RoCE:RDMA over Converged Ethernet(RoCE)是一种网络协议,允许应用通过以太网实现远程内存访问。 IB:InfiniBand (IB) 是一种高性能计算机网络通信协议,专为高性能计算和数据中心互连设计。
  • 风险操作 当您在CCE、ECS或BMS服务控制台直接操作ModelArts Lite k8s Cluster资源时,可能会导致资源池部分功能异常,下表可帮助您定位异常出现的原因,风险操作包括但不限于以下内容: 表1 操作及其对应风险 类型 操作 风险 集群 升级、修改、休眠集群、删除集群等。 可能影响ModelArts侧基本功能,包括但不限于资源池管理、节点管理、扩缩容、驱动升级等。 节点 退订、移除、关机、污点管理、修改登录密码、修改网络安全组、切换/重装操作系统等。 可能影响ModelArts侧基本功能,包括但不限于节点管理、扩缩容、驱动升级等。 网络 修改/删除集群关联网段。 影响ModelArts侧基本功能,包括但不限于节点管理、扩缩容、驱动升级等。 插件 升级、卸载gpu-beta插件。 可能导致NPU驱动使用异常。 升级、卸载huawei-npu插件。 可能导致NPU驱动使用异常。 升级、卸载volcano插件。 可能导致作业调度异常。 卸载ICAgent插件。 可能导致日志、监控功能异常。 helm 升级、回退、卸载os-node-agent。 可能影响节点故障检测。 升级、回退、卸载rdma-sriov-dev-plugin。 可能影响容器内使用RDMA网卡。 父主题: Lite Cluster资源使用
  • kubectl工具配置 本文介绍如何配置kubectl工具,操作步骤如下。 进入专属资源池。 图1 专属资源池页签 单击创建的专属资源池,进入专属资源池详情页面。 图2 专属资源池详情 单击对应的CCE集群,进入CCE集群详情页面,在“集群信息”找到“连接信息”。 图3 链接信息 使用kubectl工具。 若通过内网使用kubectl工具,需要将kubectl工具安装在和集群在相同vpc下的某一台机器上。单击kubectl后的“配置”按钮。按照界面提示步骤操作即可。 图4 通过内网使用kubectl工具 通过公网使用kubectl工具,可以将kubectl安装在任一台可以访问公网的机器。 首先需要绑定公网地址,单击公网地址后的“绑定”按钮。 图5 绑定公网地址 选择公网IP,或者跳至创建,创建新的弹性公网IP。 创建公网IP完成后,返回CCE集群详情页面,在“集群信息”找到“连接信息”。单击kubectl后的“配置”按钮。 按照界面提示步骤操作即可。 图6 配置kubectl 验证。 在安装了kubectl工具的机器上执行如下命令,显示集群节点即为成功。 kubectl get node 父主题: Lite Cluster资源配置
  • 场景描述 在Ubuntu 20.04每次内核升级后,系统需要重新启动以加载新内核。如果您已经安装了自动更新功能,则系统将自动下载和安装可用的更新,这可能导致系统在不经意间被重启,若使用的软件依赖于特定版本的内核,那么当系统自动更新到新的内核版本时,可能会出现兼容性问题。在使用Ubuntu20.04时,建议手动控制内核的更新。 禁用自动更新可能会导致您的系统变得不安全,因为您需要手动安装重要的安全补丁。在禁用自动更新之前,请确保您已了解其中的风险。
  • 操作指导 检查当前内核版本。 uname -r 升级内核 apt-get install linux-headers-5.4.0-144-generic linux-image-5.4.0-144-generic grub-mkconfig -o /boot/efi/EFI/ubuntu/grub.cfg reboot 第一条命令为安装Linux内核头文件和内核镜像,其中版本为5.4.0-144-generic。 第二条命令为重新生成GRUB引导程序的配置文件,用于在启动计算机时加载操作系统, 命令将使用新安装的内核镜像更新GRUB的配置文件,以便在下次启动时加载新的内核。
  • Step 2:配置kubectl工具 进入专属资源池。 图11 专属资源池页签 点击创建的专属资源池,进入专属资源池详情页面,点击对应的CCE集群,进入CCE集群详情页面。 图12 专属资源池详情 在CCE集群详情页面中,在“集群信息”找到“连接信息”。 图13 链接信息 使用kubectl工具。 若通过内网使用kubectl工具,需要将kubectl工具安装在和集群在相同vpc下的某一台机器上。点击连接信息下kubectl后的“配置”按钮,根据界面提示使用kubectl工具。 图14 通过内网使用kubectl工具 通过公网使用kubectl工具,可以将kubectl安装在任一台可以访问公网的机器。 首先需要绑定公网地址,点击公网地址后的“绑定”按钮。 图15 绑定公网地址 选择公网IP后单击“确定”,完成公网IP绑定。如果没有可选的公网IP,单击“创建弹性IP”跳至弹性公网IP页面进行创建。 绑定完成后,点击连接信息下kubectl后的“配置”按钮,根据界面提示使用kubectl工具。 验证。 在安装了kubectl工具的机器上执行如下命令,显示集群节点即为成功。 kubectl get node
  • Step 4:docker run方式启动任务 Snt9B集群在纳管到cce集群后,都会自动安装docker,如果仅做测试验证,可以不需要通过创建deployment或者volcano job的方式,直接启动容器进行测试。训练测试用例使用NLP的bert模型,详细代码和指导可参考Bert。 拉取镜像。本测试镜像为bert_pretrain_mindspore:v1,已经把测试数据和代码打进镜像中。 docker pull swr.cn-southwest-2.myhuaweicloud.com/os-public-repo/bert_pretrain_mindspore:v1 docker tag swr.cn-southwest-2.myhuaweicloud.com/os-public-repo/bert_pretrain_mindspore:v1 bert_pretrain_mindspore:v1 启动容器。 docker run -tid --privileged=true \ -u 0 \ -v /dev/shm:/dev/shm \ --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/Ascend/driver:/usr/local/Ascend/driver \ -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ -v /etc/hccn.conf:/etc/hccn.conf \ bert_pretrain_mindspore:v1 \ bash 参数含义: --privileged=true //特权容器,允许访问连接到主机的所有设备 -u 0 //root用户 -v /dev/shm:/dev/shm //防止shm太小训练任务失败 --device=/dev/davinci0 //npu卡设备 --device=/dev/davinci1 //npu卡设备 --device=/dev/davinci2 //npu卡设备 --device=/dev/davinci3 //npu卡设备 --device=/dev/davinci4 //npu卡设备 --device=/dev/davinci5 //npu卡设备 --device=/dev/davinci6 //npu卡设备 --device=/dev/davinci7 //npu卡设备 --device=/dev/davinci_manager //davinci相关的设备管理的设备 --device=/dev/devmm_svm //管理设备 --device=/dev/hisi_hdc //管理设备 -v /usr/local/Ascend/driver:/usr/local/Ascend/driver //npu卡驱动挂载 -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi //npu-smi工具挂载 -v /etc/hccn.conf:/etc/hccn.conf //hccn.conf配置挂载 进入容器,并查看卡信息。 docker exec -it xxxxxxx bash //进入容器,xxxxxxx替换为容器id npu-smi info //查看卡信息 图18 查看卡信息 执行下述命令启动训练任务。 cd /home/ma-user/modelarts/user-job-dir/code/bert/ export MS_ENABLE_GE=1 export MS_GE_TRAIN=1 bash scripts/run_standalone_pretrain_ascend.sh 0 1 /home/ma-user/modelarts/user-job-dir/data/cn-news-128-1f-mind/ 图19 训练进程 查看卡占用情况,如图所示,此时0号卡被占用,说明进程正常启动。 npu-smi info //查看卡信息 图20 查看卡信息 训练任务大概会运行两小时左右,训练完成后自动停止。若想停止训练任务,可执行下述命令关闭进程,查询进程后显示已无运行中python进程。 pkill -9 python ps -ef 图21 关闭训练进程
  • Step 1:登录节点 (推荐)方式1:通过绑定公网ip的方式 客户可以为需要登录的节点绑定公网ip,然后可以通过Xshell、MobaXterm等bash工具登录节点。 使用华为云账号登录CCE管理控制台。 在CCE集群详情页面,单击“节点管理”页签,在“节点”页签中单击需要登录的节点名称,跳转至弹性云服务器页面。 图1 节点管理 绑定弹性公网IP。 若已有未绑定的弹性公网IP,直接选择即可。如果没有可用的弹性公网IP,需要先购买弹性公网IP。 图2 弹性公网IP 单击“购买弹性公网IP”,进入购买页。 图3 绑定弹性公网IP 图4 购买弹性公网IP 图5 未绑定的弹性公网IP 完成购买后,返回弹性云服务器页面,刷新列表。 图6 刷新列表 选择刚才创建的弹性公网IP,单击“确定”。 图7 绑定弹性公网IP 绑定完成后,通过MobaXterm、Xshell登录。以MobaXterm为例,填入弹性公网IP,登录节点。 图8 登录节点 方式2:通过华为云自带的远程登录功能 使用华为云账号登录CCE管理控制台。 在CCE集群详情页面,单击“节点管理”页签,在“节点”页签中单击需要登录的节点名称,跳转至弹性云服务器页面。 图9 节点管理 单击“远程登录”,在弹出的窗口中,单击“CloudShell登录”。 图10 远程登录 在CloudShell中设置密码等参数后,单击“连接”即可登录节点,CloudShell介绍可参见远程登录Linux弹性云服务器(CloudShell方式)。
  • 故障说明和处理建议 图1 Lite池故障处理流程 对于ModelArts Lite资源池,每个节点会以DaemonSet方式部署node-agent组件,该组件会检测节点状态,并将检测结果写到K8S NodeCondtition中。同时,节点故障指标默认会上报到 AOM ,您可在AOM配置告警通知。 当发生节点异常时,在故障初步分析阶段,您可先按表1识别是否为亚健康并自助进行处理,若不是,则为故障,请联系客户经理发起维修流程(若无客户经理可提交工单)。
  • 操作步骤 拉取镜像。本测试镜像为bert_pretrain_mindspore:v1,已经把测试数据和代码打进镜像中。 docker pull swr.cn-southwest-2.myhuaweicloud.com/os-public-repo/bert_pretrain_mindspore:v1 docker tag swr.cn-southwest-2.myhuaweicloud.com/os-public-repo/bert_pretrain_mindspore:v1 bert_pretrain_mindspore:v1 在主机上新建config.yaml文件。 config.yaml文件用于配置pod,本示例中使用sleep命令启动pod,便于进入pod调试。您也可以修改command为对应的任务启动命令(如“python inference.py”),任务会在启动容器后执行。 config.yaml内容如下: apiVersion: apps/v1 kind: Deployment metadata: name: yourapp labels: app: infers spec: replicas: 1 selector: matchLabels: app: infers template: metadata: labels: app: infers spec: schedulerName: volcano nodeSelector: accelerator/huawei-npu: ascend-1980 containers: - image: bert_pretrain_mindspore:v1 # Inference image name imagePullPolicy: IfNotPresent name: mindspore command: - "sleep" - "1000000000000000000" resources: requests: huawei.com/ascend-1980: "1" # 需求卡数,key保持不变。Number of required NPUs. The maximum value is 16. You can add lines below to configure resources such as memory and CPU. limits: huawei.com/ascend-1980: "1" # 限制卡数,key保持不变。The value must be consistent with that in requests. volumeMounts: - name: ascend-driver #驱动挂载,保持不动 mountPath: /usr/local/Ascend/driver - name: ascend-add-ons #驱动挂载,保持不动 mountPath: /usr/local/Ascend/add-ons - name: hccn #驱动hccn配置,保持不动 mountPath: /etc/hccn.conf - name: npu-smi #npu-smi mountPath: /usr/local/bin/npu-smi - name: localtime #The container time must be the same as the host time. mountPath: /etc/localtime volumes: - name: ascend-driver hostPath: path: /usr/local/Ascend/driver - name: ascend-add-ons hostPath: path: /usr/local/Ascend/add-ons - name: hccn hostPath: path: /etc/hccn.conf - name: npu-smi hostPath: path: /usr/local/bin/npu-smi - name: localtime hostPath: path: /etc/localtime 根据config.yaml创建pod。 kubectl apply -f config.yaml 检查pod启动情况,执行下述命令。如果显示“1/1 running”状态代表启动成功。 kubectl get pod -A 进入容器,{pod_name}替换为您的pod名字(get pod中显示的名字),{namespace}替换为您的命名空间(默认为default)。 kubectl exec -it {pod_name} bash -n {namespace} 激活conda模式。 su - ma-user //切换用户身份 conda activate MindSpore //激活 MindSpore环境 创建测试代码test.py。 from flask import Flask, request import json app = Flask(__name__) @app.route('/greet', methods=['POST']) def say_hello_func(): print("----------- in hello func ----------") data = json.loads(request.get_data(as_text=True)) print(data) username = data['name'] rsp_msg = 'Hello, {}!'.format(username) return json.dumps({"response":rsp_msg}, indent=4) @app.route('/goodbye', methods=['GET']) def say_goodbye_func(): print("----------- in goodbye func ----------") return '\nGoodbye!\n' @app.route('/', methods=['POST']) def default_func(): print("----------- in default func ----------") data = json.loads(request.get_data(as_text=True)) return '\n called default func !\n {} \n'.format(str(data)) # host must be "0.0.0.0", port must be 8080 if __name__ == '__main__': app.run(host="0.0.0.0", port=8080) 执行代码,执行后如下图所示,会部署一个在线服务,该容器即为服务端。 python test.py 图1 部署在线服务 在XShell中新开一个终端,参考步骤5~7进入容器,该容器为客户端。执行以下命令验证 自定义镜像 的三个API接口功能。当显示如图所示时,即可调用服务成功。 curl -X POST -H "Content-Type: application/json" --data '{"name":"Tom"}' 127.0.0.1:8080/ curl -X POST -H "Content-Type: application/json" --data '{"name":"Tom"}' 127.0.0.1:8080/greet curl -X GET 127.0.0.1:8080/goodbye 图2 访问在线服务 limit/request配置cpu和内存大小,已知单节点Snt9B机器为:8张Snt9B卡+192u1536g,请合理规划,避免cpu和内存限制过小引起任务无法正常运行。
  • 操作步骤 拉取镜像。本测试镜像为bert_pretrain_mindspore:v1,已经把测试数据和代码打进镜像中。 docker pull swr.cn-southwest-2.myhuaweicloud.com/os-public-repo/bert_pretrain_mindspore:v1 docker tag swr.cn-southwest-2.myhuaweicloud.com/os-public-repo/bert_pretrain_mindspore:v1 bert_pretrain_mindspore:v1 在主机上新建config.yaml文件。 config.yaml文件用于配置pod,本示例中使用sleep命令启动pod,便于进入pod调试。您也可以修改command为对应的任务启动命令(如“python train.py”),任务会在启动容器后执行。 config.yaml内容如下: apiVersion: v1 kind: ConfigMap metadata: name: configmap1980-yourvcjobname # 前缀使用“configmap1980-”不变,后接vcjob的名字 namespace: default # 命名空间自选,需要和下边的vcjob处在同一命名空间 labels: ring-controller.cce: ascend-1980 # 保持不动 data: #data内容保持不动,初始化完成,会被volcano插件自动修改 jobstart_hccl.json: | { "status":"initializing" } --- apiVersion: batch.volcano.sh/v1alpha1 # The value cannot be changed. The volcano API must be used. kind: Job # Only the job type is supported at present. metadata: name: yourvcjobname # job名字,需要和configmap中名字保持联系 namespace: default # 和configmap保持一致 labels: ring-controller.cce: ascend-1980 # 保持不动 fault-scheduling: "force" spec: minAvailable: 1 # The value of minAvailable is 1 in a single-node scenario and N in an N-node distributed scenario. schedulerName: volcano # 保持不动,Use the Volcano scheduler to schedule jobs. policies: - event: PodEvicted action: RestartJob plugins: configmap1980: - --rank-table-version=v2 # 保持不动,生成v2版本ranktablefile env: [] svc: - --publish-not-ready-addresses=true maxRetry: 3 queue: default tasks: - name: "yourvcjobname-1" replicas: 1 # The value of replicas is 1 in a single-node scenario and N in an N-node scenario. The number of NPUs in the requests field is 8 in an N-node scenario. template: metadata: labels: app: mindspore ring-controller.cce: ascend-1980 # 保持不动,The value must be the same as the label in ConfigMap and cannot be changed. spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: volcano.sh/job-name operator: In values: - yourvcjobname topologyKey: kubernetes.io/hostname containers: - image: bert_pretrain_mindspore:v1 # 镜像地址,Training framework image, which can be modified. imagePullPolicy: IfNotPresent name: mindspore env: - name: name # The value must be the same as that of Jobname. valueFrom: fieldRef: fieldPath: metadata.name - name: ip # IP address of the physical node, which is used to identify the node where the pod is running valueFrom: fieldRef: fieldPath: status.hostIP - name: framework value: "MindSpore" command: - "sleep" - "1000000000000000000" resources: requests: huawei.com/ascend-1980: "1" # 需求卡数,key保持不变。Number of required NPUs. The maximum value is 16. You can add lines below to configure resources such as memory and CPU. limits: huawei.com/ascend-1980: "1" # 限制卡数,key保持不变。The value must be consistent with that in requests. volumeMounts: - name: ascend-driver #驱动挂载,保持不动 mountPath: /usr/local/Ascend/driver - name: ascend-add-ons #驱动挂载,保持不动 mountPath: /usr/local/Ascend/add-ons - name: localtime mountPath: /etc/localtime - name: hccn #驱动hccn配置,保持不动 mountPath: /etc/hccn.conf - name: npu-smi #npu-smi mountPath: /usr/local/bin/npu-smi nodeSelector: accelerator/huawei-npu: ascend-1980 volumes: - name: ascend-driver hostPath: path: /usr/local/Ascend/driver - name: ascend-add-ons hostPath: path: /usr/local/Ascend/add-ons - name: localtime hostPath: path: /etc/localtime # Configure the Docker time. - name: hccn hostPath: path: /etc/hccn.conf - name: npu-smi hostPath: path: /usr/local/bin/npu-smi restartPolicy: OnFailure 根据config.yaml创建pod。 kubectl apply -f config.yaml 检查pod启动情况,执行下述命令。如果显示“1/1 running”状态代表启动成功。 kubectl get pod -A 进入容器,{pod_name}替换为您的pod名字(get pod中显示的名字),{namespace}替换为您的命名空间(默认为default)。 kubectl exec -it {pod_name} bash -n {namespace} 查看卡信息,执行以下命令。 npu-smi info kubernetes会根据config.yaml文件中配置的卡数分配资源给pod,如下图所示由于配置了1卡因此在容器中只会显示1卡,说明配置生效。 图1 查看卡信息 修改pod的卡数。由于本案例中为分布式训练,因此所需卡数修改为8卡。 删除已创建的pod。 kubectl delete -f config.yaml 将config.yaml文件中“limit”和“request”改为8。 vi config.yaml 图2 修改卡数 重新创建pod。 kubectl apply -f config.yaml 进入容器并查看卡信息,{pod_name}替换为您的pod名字,{namespace}替换为您的命名空间(默认为default)。 kubectl exec -it {pod_name} bash -n {namespace} npu-smi info 如图所示为8卡,pod配置成功。 图3 查看卡信息 查看卡间通信配置文件,执行以下命令。 cat /user/config/jobstart_hccl.json 多卡训练时,需要依赖“rank_table_file”做卡间通信的配置文件,该文件自动生成,pod启动之后文件地址。为“/user/config/jobstart_hccl.json”,“/user/config/jobstart_hccl.json”配置文件生成需要一段时间,业务进程需要等待“/user/config/jobstart_hccl.json”中“status”字段为“completed”状态,才能生成卡间通信信息。如下图所示。 图4 卡间通信配置文件 启动训练任务。 cd /home/ma-user/modelarts/user-job-dir/code/bert/ export MS_ENABLE_GE=1 export MS_GE_TRAIN=1 python scripts/ascend_distributed_launcher/get_distribute_pretrain_cmd.py --run_script_dir ./scripts/run_distributed_pretrain_ascend.sh --hyper_parameter_config_dir ./scripts/ascend_distributed_launcher/hyper_parameter_config.ini --data_dir /home/ma-user/modelarts/user-job-dir/data/cn-news-128-1f-mind/ --hccl_config /user/config/jobstart_hccl.json --cmd_file ./distributed_cmd.sh bash scripts/run_distributed_pretrain_ascend.sh /home/ma-user/modelarts/user-job-dir/data/cn-news-128-1f-mind/ /user/config/jobstart_hccl.json 图5 启动训练任务 训练任务加载需要一定时间,在等待若干分钟后,可以执行下述命令查看卡信息。如下图可见,8张卡均被占用,说明训练任务在进行中 npu-smi info 图6 查看卡信息 若想停止训练任务,可执行下述命令关闭进程,查询进程后显示已无运行中python进程。 pkill -9 python ps -ef 图7 关闭训练进程 limit/request配置cpu和内存大小,已知单节点Snt9B机器为:8张Snt9B卡+192u1536g,请合理规划,避免cpu和内存限制过小引起任务无法正常运行。
  • Step1 在ModelArts上创建委托授权 新建委托 第一次使用ModelArts时需要创建委托授权,授权允许ModelArts代表用户去访问其他云服务。使用ModelArts Lite的资源池需要授权允许ModelArts代表用户访问云容器引擎服务CCE、裸金属服务BMS、 镜像服务 IMS和密钥管理服务DEW。 进入到ModelArts控制台的“全局配置”页面,单击“添加授权”,根据提示进行操作。 图2 添加授权 更新委托 如果之前给ModelArts创过委托授权,此处需要更新授权。 进入到ModelArts控制台的“专属资源池”页面,查看是否存在授权缺失的提示。 如果有授权缺失,根据提示,单击“此处”更新委托。根据提示选择“追加至已有授权”,单击“确定”,系统会提示权限更新成功。
  • 集群资源开通流程 开通集群资源过程中用户侧需要完成的任务流程如下图所示。 图1 用户侧任务流程 表1 用户侧任务流程 阶段 任务 说明 参考文档 预购集群资源 登录华为云控制台,在ModelArts上创建委托授权。 第一次使用ModelArts时需要创建委托授权,授权允许ModelArts代表用户去访问其他云服务。 如果之前已经创建过委托授权,需要更新委托相应的权限。 配置ModelArts访问授权 申请开通资源规格 当前部分规格为受限购买,需要提前联系客户经理申请开通资源规格,预计1~3个工作日内开通(若无客户经理可提交工单反馈)。 申请开通资源规格 申请扩大资源配额。 集群所需的ECS实例数、内存大小、CPU核数和EVS硬盘大小资源会超出华为云默认提供的资源配额,因此需要申请扩大配额。 具体的配额方案请联系客户经理获取。 配额需大于要开通的资源,且在购买开通前完成配额提升,否则会导致资源开通失败。 提升资源配额 购买集群资源 在ModelArts控制台上购买资源池。 - 购买集群资源
  • 场景描述 本文旨在指导如何在Snt9b裸金属服务器上,进行磁盘合并挂载、安装docker等环境配置。在配置前请注意如下事项: 首次装机时需要配置存储、固件、驱动、网络访问等基础内容,这部分配置尽量稳定减少变化。 裸机上的开发形式建议开发者启动独立的Docker容器作为个人开发环境。Snt9b的裸机包含8卡算力资源,一般来说多人可以共用这个裸机完成开发与调测工作。多人使用为了避免冲突,建议各自在自己的docker容器中进行独立开发,并提前规划好每个人使用的具体卡号,避免相互影响。 ModelArts提供了标准化基础容器镜像,在容器镜像中已经预置了基础MindSpore或PyTorch框架和开发调测工具链,推荐用户直接使用该镜像,用户也可以使用自己的业务镜像或昇腾AscendHub提供的镜像。如果镜像中预置的软件版本不是您期望的版本,可以自行安装替换。 开发形式推荐通过容器中暴露的SSH端口以远程开发的模式(VSCode SSH Remote、 Xshell)连接到容器中进行开发,可以在容器中挂载宿主机的个人存储目录,用于存放代码和数据。 当前指导中很多操作步骤在最新发放的Snt9b裸机环境中已经预置,无需用户再手动配置,用户在操作中如发现某个步骤已有预置配置可直接跳过该步骤。 父主题: NPU Snt9B裸金属服务器环境配置
  • 开通流程 图1 Server资源开通流程图 表1 Server资源开通流程 阶段 任务 参考 准备工作 1、申请开通资源规格。 Step1:申请开通资源规格 2、资源配额提升。 Step2:资源配额提升 3、基础权限开通。 Step3:基础权限开通 4、配置ModelArts委托授权。 Step4:配置ModelArts委托授权 5、创建虚拟私有云。 Step5:创建虚拟私有云 6、创建密钥对。(可选,若为密码登录方式则不需要) Step6:创建密钥对 购买Server资源 7、在ModelArts控制台上购买资源。 购买Server资源 父主题: Server资源开通
  • 处理方法 在Euler2.8操作系统,NetworkManagre-config-server是一个无用的软件包,无需安装 。执行以下命令卸载NetworkManagre-config-server,并重启NetworkManager服务,重新尝试SSH连接,验证网络是否恢复。 # 卸载 NetworkManagre-config-server rpm -e NetworkManager-config-server # 重启 NetworkManager 服务 systemctl restart NetworkManager
  • 原因分析 查看yum命令历史,发现执行了“yum update -y”,“yum update -y”命令是用于在Linux操作系统上更新软件包的命令。其中,选项-y表示在更新时自动确认所有提示信息,而不需要手动输入“y”确认。 请注意,使用此命令将会检查您系统中已安装的软件包并更新至最新版本。 图1 yum命令历史 查看NetworkManager配置: NetworkManager --print-config 配置内容如下: # NetworkManager configuration: /etc/NetworkManager/NetworkManager.conf (lib: 00-server.conf) [main] # plugins=ifcfg-rh,ibft # rc-manager=symlink # auth-polkit=true # dhcp=dhclient no-auto-default=* ignore-carrier=* [logging] # backend=journal # audit=false 发现“no-auto-default=*”是打开的状态,“no-auto-default=*”含义是关闭DH Client,无法使用DHCP获取IP。正常情况下裸金属服务器这个参数是被注释的状态。 当服务器有网卡配置文件, NetworkManager.service实现将VPC子网分配的私有IP写入网卡配置文件中。NetworkManager.service会优先读取网卡配置文件中的IP设置为主机IP, 此时无论DH Cient是否关闭,服务器都可以获取分配IP。 当服务器没有网卡配置文件时,DH Client开启,此时服务器会分配私有IP。如果关闭DH Client,则服务器无法获取私有IP。 图2 查看NetworkManager配置 图3 查看网络配置 命令“yum update -y”或“yum update NetworkManagre-config-server”,都会将NetworkManagre-config-server软件升级,高版本的NetworkManagre-config-server会将参数no-auto-default=*是打开的状态,又因当前镜像无网卡配置文件导致ip获取不到,从而使得SSH连接失败。
  • 操作步骤 使用以下脚本测得GPU服务器内NVLINK带宽性能。 import torch import numpy as np device = torch.device("cuda") n_gpus = 8 data_size = 1024 * 1024 * 1024 # 1 GB speed_matrix = np.zeros((n_gpus, n_gpus)) for i in range(n_gpus): for j in range(i + 1, n_gpus): print(f"Testing communication between GPU {i} and GPU {j}...") with torch.cuda.device(i): data = torch.randn(data_size, device=device) torch.cuda.synchronize() with torch.cuda.device(j): result = torch.randn(data_size, device=device) torch.cuda.synchronize() with torch.cuda.device(i): start = torch.cuda.Event(enable_timing=True) end = torch.cuda.Event(enable_timing=True) start.record() result.copy_(data) end.record() torch.cuda.synchronize() elapsed_time_ms = start.elapsed_time(end) transfer_rate = data_size / elapsed_time_ms * 1000 * 8 / 1e9 speed_matrix[i][j] = transfer_rate speed_matrix[j][i] = transfer_rate print(speed_matrix) 以Ant8 GPU裸金属服务器为例, 其理论GPU卡间带宽为:NVIDIA*NVLink*Bridge for 2GPUS: 400GB/s。使用上述测试脚本测得带宽性能进行如下分析。 正常模式-NVLINK全互通,带宽约为370GB。基本符合预期,且证明Ant GPU裸金属服务器内部GPU间确实走NVLINK模式,且完全互联。 图2 正常模式带宽性能 异常模式-NVLINK部分互通,出现带宽波动较大的情况。如下图中GPU0和GPU4之间带宽远低于理论值, 存在问题。 图3 异常模式带宽性能 出现这种现象, 可尝试重装nvidia/cuda/nvidia-fabricmanager, 重装后再测试又恢复到了正式模式,GPU0和GPU4之间带宽恢复到370GB/s。 可能原因如下,仅供参考: 驱动程序问题:可能是由于驱动程序没有正确安装或配置,导致NVLINK带宽受限。重新安装nvidia驱动、CUDA和nvidia-fabricmanager等软件后,驱动程序可能已经正确配置,从而解决了这个问题。 硬件问题:如果GPU之间的NVLINK连接存在硬件故障,那么这可能会导致带宽受限。重新安装软件后,重启系统,可能触发了某种硬件自检或修复机制,从而恢复了正常的带宽。 系统负载问题:最初测试GPU卡间带宽时,可能存在其他系统负载,如进程、服务等,这些负载会占用一部分网络带宽,从而影响NVLINK带宽的表现。重新安装软件后,这些负载可能被清除,从而使NVLINK带宽恢复正常。
  • 原因分析 经过对裸金属服务器排查,发现nvidia-drvier和cuda都已安装,并且正常运行。nvidia-fabricmanager服务可以使单节点GPU卡间互联,在多卡GPU机器上,出现这种问题可能是nvidia-fabricmanger异常导致。 执行以下命令,查看NVIDIA和CUDA的版本,以及nvidia-fabricmanager的状态。 systemctl status nvidia-fabricmanager 发现nvidia-fabricmanager的服务为failed状态,尝试重新启动nvidia-fabricmanager失败,且提示以下信息: nvidia-fabricmanager.service failed because the control process exited with error code 通过命令查看nvidia-fabricmanager的版本,发现nvidia-fabricmanager版本与当前NVIDIA驱动版本不一致。 dpkg -l | grep nvidia-fabricmanager 卸载并重新安装正确版本的nvidia-fabricmanager,验证CUDA成功。
  • 处理方法 查看nvidia-fabricmanager的版本,若nvidia-fabricmanager版本与当前NVIDIA驱动版本不一致则执行下述命令卸载nvidia-fabricmanager。 dpkg -l | grep nvidia-fabricmanager # 若有nvidia-fabricmanager软件,将其卸载 # 若无nvidia-fabricmanager软件,请跳过此命令 sudo apt-get autoremove --purge nvidia-fabricmanager-版本 安装与NVIDIA驱动版本号相等的nvidia-fabricmanager(以515.105.01举例)。 version=515.105.01 main_version=$(echo $version | awk -F '.' '{print $1}') apt-get update apt-get -y install nvidia-fabricmanager-${main_version}=${version}-* 启动nvidia-fabricmanager,确保其服务状态为RUNNING。 systemctl enable nvidia-fabricmanager systemctl start nvidia-fabricmanager systemctl status nvidia-fabricmanager 重新验证cuda状态, 输出为True。 import torch print(torch.cuda.is_available())
  • 原因分析 在CCE纳管过程中,需要通过cloudinit userdata机制拉取cce-agent,但是在服务器上查看没有拉cce-agent的动作,理论上该动作是cloudinit中的脚本在创建时自动执行的,可能是由于安装脚本没有注入userdata或者注入了但未执行。 经查看是由于userdata未执行,可能原因为服务器A制作镜像时没有清理残留目录导致,即: 镜像里面“/var/lib/cloud/instances”残留了制作镜像机器(后面称模板机)的实例ID信息,如果制作镜像不清理“/var/lib/cloud/*”就会导致用该镜像再重装模板机时,cloud-init根据残留目录(含实例ID)判断已经执行过一次,进而不会再执行user-data里面的脚本。 而使用该镜像的服务器B和C,由于实例ID信息和镜像中残留的服务器A实例ID不同,就会执行user-data,所以CCE能纳管成功。
  • 使用GPU A系列裸金属服务器有哪些注意事项? 使用华为云A系列裸金属服务器时有如下注意事项: nvidia-fabricmanager版本号必须和nvidia-driver版本号保持一致,可参考GP Ant8裸金属服务器Ubuntu 20.04安装NVIDIA 515+CUDA 11.7中的安装nvidia-fabricmanager方法。 NCCL必须和CUDA版本相匹配,可单击此处可查看配套关系和安装方法。 使用该裸金属服务器制作自定义镜像时, 必须清除残留文件,请参考清理文件。 父主题: FAQ
  • Python封装API方式切换操作系统 # -*- coding: UTF-8 -*- import requests import json import time import requests.packages.urllib3.exceptions from urllib3.exceptions import InsecureRequestWarning requests.packages.urllib3.disable_warnings(InsecureRequestWarning) class ServerOperation(object): ################################ IAM 认证API################################################# def __init__(self, account, password, region_name, username=None, project_id=None): """ :param username: if IAM user,here is small user, else big user :param account: account big big user :param password: account :param region_name: """ self.account = account self.username = username self.password = password self.region_name = region_name self.project_id = project_id self.ma_endpoint = "https://modelarts.{}.myhuaweicloud.com".format(region_name) self.service_endpoint = "https://bms.{}.myhuaweicloud.com".format(region_name) self.iam_endpoint = "https://iam.{}.myhuaweicloud.com".format(region_name) self.headers = {"Content-Type": "application/json", "X-Auth-Token": self.get_project_token_by_account(self.iam_endpoint)} def get_project_token_by_account(self, iam_endpoint): body = { "auth": { "identity": { "methods": [ "password" ], "password": { "user": { "name": self.username if self.username else self.account, "password": self.password, "domain": { "name": self.account } } } }, "scope": { "project": { "name": self.region_name } } } } headers = { "Content-Type": "application/json" } import json url = iam_endpoint + "/v3/auth/tokens" response = requests.post(url, headers=headers, data=json.dumps(body), verify=True) token = (response.headers['X-Subject-Token']) return token def change_os(self, server_id): url = "{}/v1/{}/baremetalservers/{}/changeos".format(self.service_endpoint, self.project_id, server_id) print(url) body = { "os-change": { "adminpass": "@Server", "imageid": "40d88eea-6e41-418a-ad6c-c177fe1876b8" } } response = requests.post(url, headers=self.headers, data=json.dumps(body), verify=False) print(json.dumps(response.json(), indent=1)) return response.json() if __name__ == '__main__': # 调用API前置准备,初始化认证鉴权信息 server = ServerOperation(username="xxx", account="xxx", password="xxx", project_id="xxx", region_name="cn-north-4") server.change_os(server_id="0c84bb62-35bd-4e1c-ba08-a3a686bc5097")
共100000条