华为云用户手册

  • 服务发布到ELB,ELB的后端为何会被自动删除? 问题描述: 服务发布到ELB,工作负载已正常,但服务的pod端口未及时发布出来,ELB里的后端会被自动删除。 问题解答: 创建ELB时候,如果ELB监控检查失败,后端服务器组会删除,而且后续服务正常以后也不会添加。如果是更新已有的SVC时则不会删除。 添加删除节点的时候,由于集群状态的改变,可能会引起集群内的Node访问方式的改变,为保证服务正常运行,所以ELB会进行一次刷新操作,这个过程类似于更新ELB。 修复建议: 优化应用,加快应用的启动速度。 父主题: 网络指导
  • 排查项三:检查工作负载的亲和性配置 当亲和性配置出现如下互斥情况时,也会导致实例调度失败: 例如: workload1、workload2设置了工作负载间的反亲和,如workload1部署在Node1,workload2部署在Node2。 workload3部署上线时,既希望与workload2亲和,又希望可以部署在不同节点如Node1上,这就造成了工作负载亲和与节点亲和间的互斥,导致最终工作负载部署失败。 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. node selector 表示节点亲和不满足。 pod affinity rules 表示Pod亲和不满足。 pod affinity/anti-affinity 表示Pod亲和/反亲和不满足。 解决方案: 在设置“工作负载间的亲和性”和“工作负载和节点的亲和性”时,需确保不要出现互斥情况,否则工作负载会部署失败。 若工作负载配置了节点亲和性,需确保亲和的节点标签中supportContainer设置为true,否则会导致pod无法调动到节点上,查看事件提示如下错误信息: No nodes are available that match all of the following predicates: MatchNode Selector, NodeNotSupportsContainer 节点标签为false时将会调度失败。
  • 排查项四:挂载的存储卷与节点是否处于同一可用区 0/2 nodes are available: 2 node(s) had volume node affinity conflict. 存储卷与节点之间存在亲和性冲突,导致无法调度。 这是因为云硬盘不能跨可用区挂载到节点。例如云硬盘存储卷在可用区1,节点在可用区2,则会导致无法调度。 CCE中创建云硬盘存储卷,默认带有亲和性设置,如下所示: kind: PersistentVolume apiVersion: v1 metadata: name: pvc-c29bfac7-efa3-40e6-b8d6-229d8a5372ac spec: ... nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: failure-domain.beta.kubernetes.io/zone operator: In values: - cn-east-3a 解决方案: 重新创建存储卷,可用区选择与节点同一分区,或重新创建工作负载,存储卷选择自动分配。
  • 排查项七:检查everest插件是否工作正常 0/1 nodes are available: 1 everest driver not found at node。集群everest插件的everest-csi-driver 在节点上未正常启动。 检查kube-system命名空间下名为everest-csi-driver的守护进程,查看对应Pod是否正常启动,若未正常启动,删除该Pod,守护进程会重新拉起该Pod。
  • 排查项六:检查临时卷使用量 0/7 nodes are available: 7 Insufficient ephemeral-storage. 节点临时存储不足。 检查Pod是否限制了临时卷的大小,如下所示,当应用程序需要使用的量超过节点已有容量时会导致无法调度,修改临时卷限制或扩容节点磁盘可解决此问题。 apiVersion: v1 kind: Pod metadata: name: frontend spec: containers: - name: app image: images.my-company.example/app:v4 resources: requests: ephemeral-storage: "2Gi" limits: ephemeral-storage: "4Gi" volumeMounts: - name: ephemeral mountPath: "/tmp" volumes: - name: ephemeral emptyDir: {}
  • 检查项九:检查节点上调度的Pod是否过多 0/1 nodes are available: 1 Too many pods.表示节点上调度的Pod过多,超出可调度的最大实例数。 创建节点时,在“高级配置”中可选择设置“最大实例数”参数,设置节点上可以正常运行的容器 Pod 的数目上限。该数值的默认值随节点规格浮动,您也可以手动设置。 图1 最大实例数 您可以在“节点管理”页面,查看节点的“容器组(已分配/总额度)”参数列,检查节点已调度的容器是否达到上限。若已达到上限,可通过添加节点或修改最大实例数的方式解决。 您可通过以下方式修改“最大实例数”参数: 默认节点池中的节点:通过重置节点时修改“最大实例数”。 自定义节点池中的节点:可修改节点池配置参数中的max-pods参数。详情请参见节点池配置管理。 图2 查看容器数
  • 排查思路 根据具体事件信息确定具体问题原因,如表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
共100000条