华为云用户手册

  • 排查思路 根据具体事件信息确定具体问题原因,如表1所示。 表1 实例调度失败 事件信息 问题原因与解决方案 no nodes available to schedule pods. 集群中没有可用的节点。 排查项一:集群内是否无可用节点 0/2 nodes are available: 2 Insufficient cpu. 0/2 nodes are available: 2 Insufficient memory. 节点资源(CPU、内存)不足。 排查项二:节点资源(CPU、内存等)是否充足 0/2 nodes are available: 1 node(s) didn't match node selector, 1 node(s) didn't match pod affinity rules, 1 node(s) didn't match pod affinity/anti-affinity. 节点与Pod亲和性配置互斥,没有满足Pod要求的节点。 排查项三:检查工作负载的亲和性配置 0/2 nodes are available: 2 node(s) had volume node affinity conflict. Pod挂载云硬盘存储卷与节点不在同一个可用区。 排查项四:挂载的存储卷与节点是否处于同一可用区 0/1 nodes are available: 1 node(s) had taints that the pod didn't tolerate. 节点存在污点Tanits,而Pod不能容忍这些污点,所以不可调度。 排查项五:检查Pod污点容忍情况 0/7 nodes are available: 7 Insufficient ephemeral-storage. 节点临时存储不足。 排查项六:检查临时卷使用量 0/1 nodes are available: 1 everest driver not found at node 节点上everest-csi-driver不在running状态。 排查项七:检查everest插件是否工作正常 Failed to create pod sandbox: ... Create more free space in thin pool or use dm.min_free_space option to change behavior 节点thinpool空间不足。 排查项八:检查节点thinpool空间是否充足 0/1 nodes are available: 1 Too many pods. 该节点调度的Pod超出上限。 检查项九:检查节点上调度的Pod是否过多
  • 排查项五:检查Pod污点容忍情况 0/1 nodes are available: 1 node(s) had taints that the pod didn't tolerate. 是因为节点打上了污点,不允许Pod调度到节点上。 查看节点的上污点的情况。如下则说明节点上存在污点。 $ kubectl describe node 192.168.0.37 Name: 192.168.0.37 ... Taints: key1=value1:NoSchedule ... 在某些情况下,系统会自动给节点添加一个污点。当前内置的污点包括: node.kubernetes.io/not-ready:节点未准备好。 node.kubernetes.io/unreachable:节点控制器访问不到节点。 node.kubernetes.io/memory-pressure:节点存在内存压力。 node.kubernetes.io/disk-pressure:节点存在磁盘压力,此情况下您可通过节点磁盘空间不足的方案进行解决。 node.kubernetes.io/pid-pressure:节点的 PID 压力,此情况下您可通过修改节点进程 ID数量上限kernel.pid_max进行解决。 node.kubernetes.io/network-unavailable:节点网络不可用。 node.kubernetes.io/unschedulable:节点不可调度。 node.cloudprovider.kubernetes.io/uninitialized:如果kubelet启动时指定了一个“外部”云平台驱动, 它将给当前节点添加一个污点将其标志为不可用。在cloud-controller-manager初始化这个节点后,kubelet将删除这个污点。 解决方案: 要想把Pod调度到这个节点上,有两种方法: 若该污点为用户自行添加,可考虑删除节点上的污点。若该污点为系统自动添加,解决相应问题后污点会自动删除。 Pod的定义中容忍这个污点,如下所示。详细内容请参见污点和容忍。 apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - name: nginx image: nginx:alpine tolerations: - key: "key1" operator: "Equal" value: "value1" effect: "NoSchedule"
  • 排查项八:检查节点thinpool空间是否充足 节点在创建时会绑定一个供kubelet及容器引擎使用的专用数据盘,详情请参见数据盘空间分配说明。若数据盘空间不足,将导致实例无法正常创建。 方案一:清理镜像 您可以执行以下步骤清理未使用的镜像: 使用containerd容器引擎的节点: 查看节点上的本地镜像。 crictl images -v 确认镜像无需使用,并通过镜像ID删除无需使用的镜像。 crictl rmi {镜像ID} 使用docker容器引擎的节点: 查看节点上的本地镜像。 docker images 确认镜像无需使用,并通过镜像ID删除无需使用的镜像。 docker rmi {镜像ID} 请勿删除cce-pause等系统镜像,否则可能导致无法正常创建容器。 方案二:扩容磁盘 扩容磁盘的操作步骤如下: 在EVS界面扩容数据盘。 登录CCE控制台,进入集群,在左侧选择“节点管理”,单击节点后的“同步云服务器”。 登录目标节点。 使用lsblk命令查看节点块设备信息。 这里存在两种情况,根据容器存储Rootfs而不同。 Overlayfs,没有单独划分thinpool,在dockersys空间下统一存储镜像相关数据。 # lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT vda 8:0 0 50G 0 disk └─vda1 8:1 0 50G 0 part / vdb 8:16 0 200G 0 disk ├─vgpaas-dockersys 253:0 0 90G 0 lvm /var/lib/docker # 容器引擎使用的空间 └─vgpaas-kubernetes 253:1 0 10G 0 lvm /mnt/paas/kubernetes/kubelet # kubernetes使用的空间 在节点上执行如下命令, 将新增的磁盘容量加到dockersys盘上。 pvresize /dev/vdb lvextend -l+100%FREE -n vgpaas/dockersys resize2fs /dev/vgpaas/dockersys Devicemapper,单独划分了thinpool存储镜像相关数据。 # lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT vda 8:0 0 50G 0 disk └─vda1 8:1 0 50G 0 part / vdb 8:16 0 200G 0 disk ├─vgpaas-dockersys 253:0 0 18G 0 lvm /var/lib/docker ├─vgpaas-thinpool_tmeta 253:1 0 3G 0 lvm │ └─vgpaas-thinpool 253:3 0 67G 0 lvm # thinpool空间 │ ... ├─vgpaas-thinpool_tdata 253:2 0 67G 0 lvm │ └─vgpaas-thinpool 253:3 0 67G 0 lvm │ ... └─vgpaas-kubernetes 253:4 0 10G 0 lvm /mnt/paas/kubernetes/kubelet 在节点上执行如下命令, 将新增的磁盘容量加到thinpool盘上。 pvresize /dev/vdb lvextend -l+100%FREE -n vgpaas/thinpool 在节点上执行如下命令, 将新增的磁盘容量加到dockersys盘上。 pvresize /dev/vdb lvextend -l+100%FREE -n vgpaas/dockersys resize2fs /dev/vgpaas/dockersys
  • 排查项二:节点资源(CPU、内存等)是否充足 0/2 nodes are available: 2 Insufficient cpu. CPU不足。 0/2 nodes are available: 2 Insufficient memory. 内存不足。 当“实例资源的申请量”超过了“实例所在节点的可分配资源总量”时,节点无法满足实例所需资源要求导致调度失败。 如果节点可分配资源小于Pod的申请量,则节点无法满足实例所需资源要求导致调度失败。 解决方案: 资源不足的情况主要解决办法是扩容,建议在集群中增加节点数量。
  • 约束与限制 集群版本需1.15及以上。 v1.19及以上版本集群支持纳管鲲鹏节点。 纳管节点支持E CS (弹性云服务器)节点、BMS(裸金属服务器)节点、DeH(专属主机)节点,暂不支持HECS(云耀云服务器)节点。 集群开启IPv6后,只支持纳管所在的子网开启了IPv6功能的节点;集群未开启IPv6,只支持纳管所在的子网未开启IPv6功能的节点。 原虚拟机节点创建时若已设置密码或密钥,纳管时您需要重新设置密码或密钥,原有的密码或密钥将会失效。 CCE Turbo 集群要求节点支持Sub-ENI或可以绑定至少16张ENI网卡,具体规格请参见创建节点时控制台上可以选择的节点规格。 纳管BMS节点时,暂不支持使用Ubuntu系统。 纳管节点时已分区的数据盘会被忽略,您需要保证节点至少有一个未分区且符合规格的数据盘。
  • 前提条件 支持纳管符合如下条件的云服务器: 待纳管节点必须状态为“运行中”,未被其他集群所使用,且不携带 CCE 专属节点标签CCE-Dynamic-Provisioning-Node。 待纳管节点需与集群在同一虚拟私有云内(若集群版本低于1.13.10,纳管节点还需要与CCE集群在同一子网内)。 待纳管节点需挂载数据盘,可使用本地盘(磁盘增强型实例)或至少挂载一块20GiB及以上的数据盘,且不存在10GiB以下的数据盘。关于节点挂载数据盘的操作说明,请参考新增磁盘。 待纳管节点规格要求:CPU必须2核及以上,内存必须4GiB及以上,网卡有且仅能有一个。 如果使用了企业项目,则待纳管节点需要和集群在同一企业项目下,不然在纳管时会识别不到资源,导致无法纳管。从v1.21.15-r0、v1.23.14-r0、v1.25.9-r0、v1.27.6-r0、v1.28.4-r0集群版本开始,待纳管节点无需和集群在同一企业项目下,纳管后节点的企业项目保持不变。 批量纳管仅支持添加相同规格、相同可用区、相同数据盘配置的云服务器。
  • 常见问题 纳管节点失败,提示已分区磁盘会被忽略,报错内容如下: Install config-prepare failed: exit status 1, output: [ Mon Jul 17 14:26:10 CST 2023 ] start install config-prepare\nNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT\nsda 8:0 0 40G 0 disk \n└─sda1 8:1 0 40G 0 part /\nsdb 8:16 0 100G 0 disk \n└─sdb1 8:17 0 100G 0 part disk /dev/sda has been partition, will skip this device\nRaw disk /dev/sdb has been partition, will skip this device\nwarning: selector can not match any evs volume 请为节点添加一块未分区的数据盘,且数据盘规格为20GiB及以上,即可解决上述问题。纳管完成后,将使用未分区的数据盘作为容器引擎及kubelet组件的存储空间,已分区的数据盘会被忽略不作任何操作,请根据需求自行处理。
  • 排查项二:检查CoreDNS实例是否已到达性能瓶颈 CoreDNS所能提供的 域名 解析QPS与CPU消耗成正相关,如遇QPS较高的场景,需要根据QPS的量级调整CoreDNS实例规格。集群超过100节点时,推荐使用NodeLocal DNSCache提升DNS性能,详情请参见使用NodeLocal DNSCache提升DNS性能。 登录CCE控制台,进入集群。 在左侧导航栏中选择“插件中心”,确认CoreDNS插件状态为“运行中”。 单击CoreDNS插件名称,查看插件实例列表。 单击CoreDNS实例的“监控”按钮,查看实例CPU、内存使用率。 如实例已达性能瓶颈,则需调整CoreDNS插件规格。 在“已安装插件”下,单击CoreDNS插件的“编辑”按钮,进入插件详情页。 在“规格配置”下配置CoreDNS参数规格。您可以根据业务需求选择CoreDNS所能提供的域名解析QPS。 您也可以选择自定义QPS,通过选择不同的实例数、CPU配额和内存配额,来定制集群的CoreDNS参数规格。 单击“确定”,完成配置下发。
  • 创建CCE节点时可以不添加数据盘吗? 不可以,数据盘是必须要的。 新建节点会给节点绑定一个供kubelet及容器引擎使用的专用数据盘,详情请参见数据盘空间分配说明。CCE数据盘默认使用LVM(Logical Volume Manager)进行磁盘管理,开启后您可以通过空间分配调整数据盘中不同资源的空间占比,具体请参见LVM简介。 若数据盘卸载或损坏,会导致容器引擎服务异常,最终导致节点不可用。 父主题: 存储管理
  • 用户中心首页介绍 在用户中心首页,您可以查看组织的全部应用及最近使用应用、查看登录登出日志或退出登录等操作。 图1 用户中心首页 用户中心首页主要包含以下部分: 最近使用:展示您近期使用的应用,可单击应用直接免登录访问应用。 全部应用:展示组织的所有应用,可单击应用直接免登录访问应用。 登录登出日志:展示您的登录登出日志详情,包括时间、操作者、操作类型和IP地址。 帐号的下拉菜单:支持退出登录。 父主题: 普通用户指南
  • 操作步骤 进入购买注册配置中心页面。 左侧导航栏选择“注册配置中心”。 在注册配置中心页面,单击“购买注册配置中心”。 参考下表设置参数,参数前面带*号的是必须设置的参数。 参数 说明 *计费模式 选择计费方式,目前支持: 包年/包月 按需计费 *企业项目 选择Nacos所在的项目,可在下拉框中搜索和选择需要的企业项目。 *引擎名称 输入Nacos引擎的名称。 *注册配置中心类型 选择“Nacos”。 说明: Nacos引擎默认多可用区部署,部署在三节点上的,可提供可用区级别容灾能力。 *选择实例数 选择需要购买的容量规格。 版本 只能创建最新版本。 *网络 选择已创建的虚拟私有云及子网,可在下拉框中搜索和选择合适的虚拟私有云和子网。 虚拟私有云可以为您的引擎构建隔离的、用户自主配置和管理的虚拟网络环境。 标签 用于标识云资源,当您拥有相同类型的许多云资源时,可以使用标签按各种维度(例如用途、所有者或环境)对云资源进行分类。 您可以单击“ 添加标签”,在“添加标签”弹框输入标签键和标签值,添加标签,标签的命名规则请参见管理标签。在“添加标签”弹框,可单击“ 新增标签”同时添加多个标签,也可单击标签后的,删除该标签。 *购买时长 计费模式选择“包年/包月”时需要设置。可设置是否开通自动续费。 单击“立即购买”,进入引擎信息确认界面。 单击“提交”引擎开始创建,当“运行状态”为“可用”时,引擎创建完成。
  • 操作场景 ELB可以针对客户访问的业务为访问者提供个性化的管理策略,制定策略之前需要获取来访者的真实IP。TOA内核模块主要用来获取ELB转化过的访问者真实IP地址(仅支持IPv4),该插件安装在ELB后端服务器。 本文档仅适用于四层(TCP协议)服务,当客户需要在操作系统中编译TOA内核模块时,可参考本文档进行配置。 Linux内核版本为2.6.32和Linux内核版本为3.0以上的操作系统,在配置TOA内核模块的操作步骤上有所区别,具体操作请参照相应的操作步骤进行配置。
  • 在标签管理页面单个删除 登录管理控制台。 在右上角的用户名下选择“标签管理”,进入标签管理服务页面。 图1 标签管理 在“资源标签”页面,设置弹性云服务器资源搜索条件,单击“搜索”。 页面下方展示的搜索结果包含“编辑”与“只读”两种状态,单击“编辑”,切换资源标签列表为可编辑状态。 若需要删除的标签的“键”没有展示在列表中,单击,在下拉列表中勾选需要删除的标签的“键”。勾选需要展示的标签键建议不超过10个。 单击待删除标签的弹性云服务器资源所在行的,资源标签删除完成。 (可选)单击搜索结果区域右侧的按钮。 资源标签列表刷新为最新状态,并更新列表刷新时间。
  • 在标签管理页面批量删除 在批量删除标签时,请谨慎操作。执行删除操作后,其所标识的所有弹性云服务器资源对应的该标签均会被删除,且不可恢复。 登录管理控制台。 在右上角的用户名下选择“标签管理”,进入标签管理服务页面。 在“资源标签”页面,设置弹性云服务器资源搜索条件,单击“搜索”。 勾选待删除标签的弹性云服务器资源。 单击列表上方的“管理标签”,进入管理标签页面。 单击待删除标签所在行的“删除”。单击“确认”,资源标签删除完成。 (可选)单击搜索结果区域右侧的按钮。 资源标签列表刷新为最新状态,并更新列表刷新时间。
  • 安全组 安全组是一个逻辑上的分组,为具有相同安全保护需求并相互信任的云服务器提供访问策略。安全组创建后,用户可以在安全组中定义各种访问规则,当云服务器加入该安全组后,即受到这些访问规则的保护。 您也可以根据需要创建自定义的安全组,或使用默认安全组,系统会为每个用户默认创建一个默认安全组,默认安全组的规则是在出方向上的数据报文全部放行,入方向访问受限,安全组内的云服务器无需添加规则即可互相访问。默认安全组您可以直接使用,详情请参见默认安全组和规则。 云上一分钟,了解什么是安全组。 安全组需在网络互通的情况下生效。若实例属于不同VPC,但同属于一个安全组,则此安全组不生效,您可以使用对等连接等产品建立VPC连接互通。VPC连接请参见VPC连接。
  • 安全组的使用限制 为了确保良好的网络性能体验,建议一个实例最多关联5个安全组。 建议一个安全组关联的实例数量不应超过6000个,否则会引起安全组性能下降。 在一个安全组中,对于入方向规则来说,源地址是安全组的规则数量+源地址是IP地址组的规则数量+端口是不连续端口号的规则数量 ≤ 128条,否则超过数量的安全组规则将不生效。出方向的限制和入方向一致。 源地址是安全组时,包括本安全组和其他安全组。 不连续端口号取值示例为22,25,27。 如果您添加安全组规则时,使用IP地址组或者不连续端口,那么该安全组规则对不同规格云服务器的生效情况存在差异,为了避免您的安全组规则不生效,请您查看表1了解详情。 表1 安全组规则限制 安全组规则 云服务器类型 添加安全组规则时,“源地址”和“目的地址”可选择“IP地址组” 不支持的X86云服务器规格如下: 通用计算型(S1型、C1型、C2型 ) 内存优化型(M1型) 高性能计算型(H1型) 磁盘增强型( D1型) GPU加速型(G1型、G2型) 超大内存型(E1型、E2型、ET2型) 添加安全组规则时,“协议端口”可配置为不连续端口号 不支持的X86云服务器规格如下: 通用计算型(S1型、C1型、C2型 ) 内存优化型(M1型) 高性能计算型(H1型) 磁盘增强型( D1型) GPU加速型(G1型、G2型) 超大内存型(E1型、E2型、ET2型) 所有鲲鹏云服务器规格不支持配置不连续端口。 如果您在鲲鹏云服务器中添加安全组规则时,使用了不连续端口号,那么除了该条规则不会生效,该规则后的其他规则也不会生效。比如: 您先配置了安全组规则A(不连续端口号22,24),再配置了下一条安全组规则B(独立端口号9096),则安全组规则A和B均不会生效。 X86云服务器规格详情,请参见规格清单(X86)。 鲲鹏云服务器规格详情,请参见规格清单(鲲鹏)。 当您的组网中存在以下情况时,来自ELB和VPCEP的流量不受网络ACL和安全组规则的限制。 ELB实例的监听器开启“获取客户端IP”功能时,不受限制。 比如规则已明确拒绝来自ELB实例的流量进入后端云服务器,此时该规则无法拦截来自ELB的流量,流量依然会抵达后端云服务器。 VPCEP实例类型为“专业型”时,不受限制。
  • 在标签管理页面添加标签 此方法适用于为多个资源统一添加拥有同样标签键的标签。 登录管理控制台。 在右上角的用户名下选择“标签管理”,进入标签管理服务页面。 图3 标签管理 在“资源标签”页面,勾选资源所在的区域,“资源类型”请选择“ECS-ECS”,单击“搜索”。 系统列出所选区域下的所有云服务器资源。 在“搜索结果”区域,单击“创建标签键”,输入键(例如:项目),单击“确定”。 创建完成后,该标签键会添加至资源标签列表。如果列表中没有显示该标签,单击,在下拉列表中勾选创建的标签键。 默认该标签键的值为“无标签”,您还需要为每一个资源对应的标签值赋值,完成标签与资源的关联,继续下一步。 图4 资源列表 单击“编辑”,切换资源标签列表为可编辑状态。 在云服务器资源所在行,单击,输入标签“值”(例如:A)。 为标签键赋值后,“标签数量”将加1。按照同样方法依次为其他云服务器添加标签值。 图5 输入标签值
  • 编辑资产详情 数据集发布成功后,发布者可以进入数据集的详情查看资产信息。 基本设置 单击数据集名称,在数据集详情页,单击“设置”页签。在右侧单击“编辑”,在编辑框中输入资产的描述内容,“数据集名称”与“数据集描述”。 编辑完成之后单击“确定”。 关联资产 数据集可以关联Notebook和算法。当数据集关联了Notebook或算法时,Notebook或算法页面也显示关联了数据集。 在关联资产搜索框中输入待关联资产的ID,单击“关联”。 在弹出的“资产信息”页面,单击“确认”即可关联资产。 对已经关联的资产,单击“取消关联”即可取消资产的关联。 权限设置 在“可见范围”处可以更改您发布的数据集资产的可见性,可更改为“公开”或“私密”。 “公开”:资产设置为“公开”后,该资产所有用户均可查看使用。 “私密”: “仅自己可见”:设置为“仅自己可见”后,该资产只可自己使用。 “指定成员可见”:在搜索框中,输入成员的账号名/账号ID/用户昵称后,单击“搜索”。在用户列表中选择对应的用户信息后,单击“确认”。完成后,单击“保存”即可。 删除数据集 如果您需要删除发布的数据集,则单击“删除数据集”,在弹窗中单击“确认”,即可完成数据集的删除。
  • 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测试
  • 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。
  • 附录: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)
  • 获取软件和镜像 表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
  • CentOS 7安装libfuse CentOS 7默认安装的是libfuse.so.2.9.2。 首先您需要按照前提条件下载、编译及生成libfuse.so.2.9.7,然后按照以下步骤进行安装替换。 执行以下命令,查找旧版本libfuse.so.2.9.2库链接。 find / -name libfuse.so* 执行以下命令,将libfuse.so.2.9.7拷贝至旧版本库libfuse.so.2.9.2所在位置。 cp /usr/local/lib/libfuse.so.2.9.7 /usr/lib64/ 执行以下命令, 删除旧版本libfuse.so库的所有链接。 rm -f /usr/lib64/libfuse.so rm -f /usr/lib64/libfuse.so.2 执行以下命令,建立与被删除旧版本链接类似的libfuse.so.2.9.7库链接。 ln -s /usr/lib64/libfuse.so.2.9.7 /usr/lib64/libfuse.so ln -s /usr/lib64/libfuse.so.2.9.7 /usr/lib64/libfuse.so.2
  • SUSE 12安装libfuse SUSE 12默认安装的是libfuse.so.2.9.3。 首先您需要按照前提条件下载、编译及生成libfuse.so.2.9.7,然后按照以下步骤进行安装替换。 执行以下命令,查找旧版本libfuse.so.2.9.3库链接。 find / -name libfuse.so* 执行以下命令,将libfuse.so.2.9.7拷贝至旧版本库libfuse.so.2.9.3所在位置。 cp /usr/local/lib/libfuse.so.2.9.7 /usr/lib64/ 执行以下命令, 删除旧版本libfuse.so库的所有链接。 rm -f /usr/lib64/libfuse.so.2 rm -f /lib64/libfuse.so.2.9.3 执行以下命令,建立与被删除旧版本链接类似的libfuse.so.2.9.7库链接。 ln -s /usr/lib64/libfuse.so.2.9.7 /usr/lib64/libfuse.so.2 ln -s /usr/lib64/libfuse.so.2.9.7 /lib64/libfuse.so.2.9.7
  • Ubuntu 16安装libfuse Ubuntu 16默认安装的是libfuse.so.2.9.4。 首先您需要按照前提条件下载、编译及生成libfuse.so.2.9.7,然后按照以下步骤进行安装替换。 执行以下命令,查找旧版本libfuse.so.2.9.4库链接。 find / -name libfuse.so* 执行以下命令,将libfuse.so.2.9.7拷贝至旧版本库libfuse.so.2.9.4所在位置。 cp /usr/local/lib/libfuse.so.2.9.7 /lib/x86_64-linux-gnu/ 执行以下命令,删除旧版本libfuse.so库的所有链接。 rm -f /lib/x86_64-linux-gnu/libfuse.so.2 执行以下命令,建立与被删除旧版本链接类似的libfuse.so.2.9.7库链接。 ln -s /lib/x86_64-linux-gnu/libfuse.so.2.9.7 /lib/x86_64-linux-gnu/libfuse.so.2
  • 创建AI应用的 自定义镜像 规范 针对您本地开发的模型,在制作AI应用的自定义镜像时,需满足ModelArts定义的规范。 自定义镜像中不能包含恶意代码。 自定义镜像大小不超过50GB。 对于同步请求模式的AI应用,如果预测请求时延超过60s,会造成请求失败,甚至会有服务业务中断的风险,预测请求时延超过60s时,建议制作异步请求模式的镜像。 镜像对外接口 设置镜像的对外服务接口,推理接口需与config.json文件中apis定义的url一致,当镜像启动时可以直接访问。下面是mnist镜像的访问示例,该镜像内含mnist数据集训练的模型,可以识别手写数字。其中listen_ip为容器IP,您可以通过启动自定义镜像,在容器中获取容器IP。 请求示例 curl -X POST \ http://{listen_ip}:8080/ \ -F images=@seven.jpg 图1 listen_ip获取示例 返回示例 {"mnist_result": 7} (可选)健康检查接口 如果在滚动升级时要求不中断业务,那么必须在config.json文件中配置健康检查的接口,供ModelArts调用,在config.json文件中配置。当业务可提供正常服务时,健康检查接口返回健康状态,否则返回异常状态。 如果要实现无损滚动升级,必须配置健康检查接口。 自定义镜像如果需要在“在线服务”模块使用OBS外部存储挂载功能,需要新建一个OBS挂载专属目录如“/obs-mount/”,避免选择存量目录覆盖已有文件。OBS挂载仅开放对挂载目录文件新增、查看、修改功能不支持删除挂载目录文件对象,若需要删除文件请到OBS并行文件系统中手动删除。 健康检查接口示例如下。 URI GET /health 请求示例curl -X GET \ http://{listen_ip}:8080/health 响应示例 {"health": "true"} 状态码 表1 状态码 状态码 编码 状态码说明 200 OK 请求成功 日志文件输出 为保证日志内容可以正常显示,日志信息需要打印到标准输出。 镜像启动入口 如果需要部署批量服务,镜像的启动入口文件需要为“/home/run.sh”,采用CMD设置默认启动路径,例如Dockerfile如下: CMD ["sh", "/home/run.sh"] 镜像依赖组件 如果需要部署批量服务,镜像内需要安装python、jre/jdk、zip等组件包。 (可选)保持Http长链接,无损滚动升级 如果需要支持滚动升级的过程中不中断业务,那么需要将服务的Http的“keep-alive”参数设置为200s。以gunicorn服务框架为例,gunicorn缺省情形下不支持keep-alive,需要同时安装gevent并配置启动参数“--keep-alive 200 -k gevent”。不同服务框架参数设置有区别,请以实际情况为准。 (可选)处理SIGTERM信号,容器优雅退出 如果需要支持滚动升级的过程中不中断业务,那么需要在容器中捕获SIGTERM信号,并且在收到SIGTERM信号之后等待60秒再优雅退出容器。提前优雅退出容器可能会导致在滚动升级的过程中业务概率中断。要保证容器优雅退出,从收到SIGTERM信号开始,业务需要将收到的请求全部处理完毕再结束,这个处理时长最多不超过90秒。例如run.sh如下所示: #!/bin/bash gunicorn_pid="" handle_sigterm() { echo "Received SIGTERM, send SIGTERM to $gunicorn_pid" if [ $gunicorn_pid != "" ]; then sleep 60 kill -15 $gunicorn_pid # 传递 SIGTERM 给gunicorn进程 wait $gunicorn_pid # 等待gunicorn进程完全终止 fi } trap handle_sigterm TERM 父主题: 使用自定义镜像创建AI应用(推理部署)
  • 可视化训练作业介绍 ModelArts支持在开发环境中开启TensorBoard和MindInsight可视化工具。在开发环境中通过小数据集训练调试算法,主要目的是验证算法收敛性、检查是否有训练过程中的问题,方便用户调测。 ModelArts可视化作业支持创建TensorBoard类型和MindInsight两种类型。 TensorBoard和MindInsight能够有效地展示训练作业在运行过程中的变化趋势以及训练中使用到的数据信息。 TensorBoard TensorBoard是一个可视化工具,能够有效地展示TensorFlow在运行过程中的计算图、各种指标随着时间的变化趋势以及训练中使用到的数据信息。TensorBoard相关概念请参考TensorBoard官网。 TensorBoard可视化训练作业,当前仅支持基于TensorFlow2.1、Pytorch1.4/1.8版本镜像,CPU/GPU规格的资源类型。请根据实际局点支持的镜像和资源规格选择使用。 MindInsight MindInsight能可视化展现出训练过程中的标量、图像、计算图以及模型超参等信息,同时提供训练看板、模型溯源、数据溯源、性能调试等功能,帮助您在更高效地训练调试模型。MindInsight当前支持基于MindSpore引擎的训练作业。MindInsight相关概念请参考MindSpore官网。 MindInsight可视化训练作业,当前支持的镜像如下,请根据实际局点支持的镜像和资源规格选择使用。 mindspore1.2.0版本,CPU/GPU规格的资源类型。 mindspore1.5.x以上版本,Ascend规格的资源类型。 您可以使用模型训练时产生的Summary文件在开发环境Notebook中创建可视化作业。 在开发环境中创建MindInsight可视化作业,请参见MindInsight可视化作业。 在开发环境中创建TensorBoard可视化作业,请参见TensorBoard可视化作业。 父主题: 可视化训练作业
共100000条