本文共 6950 字,大约阅读时间需要 23 分钟。
阿里云(弹性高性能计算)在最近的发布中支持多队列调度以及管理,另外发布针对多队列调度自动伸缩的策略支持。
本文主要介绍以下内容云上计算资源规格可能是和本地的计算节点规格不一样,这就导致单个集群里需要支持多种规格的计算资源,HPC集群一般会用不同队列(job queue)或者节点组(node group)来管理不同规格的节点,然后分发作业到不同的队列以达到区分云上作业和本地作业;
E-HPC通过发布以下功能支持多队列部署:
自动伸缩服务支持多队列弹性策略的配置,针对每个队列可以配置如下信息:
E-HPC支持创建部署多种HPC调度集群,不同HPC调度器类型对队列的支持情形是不同的,这里做一些简要的介绍
PBSPro有两种队列类型,
PBSPro默认会创建execution队列workq,该队列默认被创建和启用, 扩容节点时如果没有指定queue,队列workq里的作业可以分发到该节点计算。
以下是pbspro队列相关的命令qmgr -c "create queue high queue_type = execution"qmgr -c "set queue high started = true"qmgr -c "set queue high enabled = true"# 设置节点的队列信息为high,将只能运行队列high里的作业qmgr -c "set node node001 queue = high"
目前E-HPC对PBSPro集群队列的管理,都是针对execution队列
Slurm里对应队列的概念是partitions,partitions可以认为是节点组,将节点分成多个set;partitions也可以被认为是作业队列,可以对该partition下运行的作业设置限制,例如作业运行时间限制,用户权限限制等等。
Slurm默认的partition是comp,所有计算节点都属于该partition以下是Slurm关于partition的相关配置# 创建新的partition,并且指定该partition节点, 但是该配置不是持久化的,重启slurmctld服务就会覆盖该配置scontrol create PartitionName=heavy nodes=compute0# 通过修改配置文件的方式# 打开文件/opt/slurm/17.02.4/etc/slurm.conf, 可以看到文末的partition配置PartitionName=comp Nodes=ALL Default=YES MaxTime=INFINITE State=UP可以添加新的partition,例如PartitionName=light Nodes=compute0,compute1 Default=YES MaxTime=INFINITE State=UP# 重启slurmctldsystem restart slurmctld
LSF或者CUBE的默认队列是normal, 所有的节点默认加入该队列,可以配置节点或者节点组加入某个队列,队列配置信息如下
# 打开队列配置文件lsb.queues (CUBE的配置路径是/opt/cubeman/etc, LSF类似)# 增加如下队列配置Begin QueueQUEUE_NAME = highPRIORITY = 30NICE = 20#QJOB_LIMIT = 60 # job limit of the queue#UJOB_LIMIT = 5 # job limit per user#PJOB_LIMIT = 2 # job limit per processor#RUN_WINDOW = 5:19:00-1:8:30 20:00-8:30#r1m = 0.7/2.0 # loadSched/loadStop#r15m = 1.0/2.5#pg = 4.0/8#ut = 0.2#io = 50/240#CPULIMIT = 180/apple # 3 hours of host apple#FILELIMIT = 20000#MEMLIMIT = 5000 # jobs bigger than this (5M) will be niced#DATALIMIT = 20000 # jobs data segment limit#STACKLIMIT = 2048#CORELIMIT = 20000#PROCLIMIT = 5 # job processor limit#USERS = all # users who can submit jobs to this queueHOSTS = high # hostgroup high#PRE_EXEC = /usr/local/lsf/misc/testq_pre >> /tmp/pre.out#POST_EXEC = /usr/local/lsf/misc/testq_post |grep -v "Hey"#REQUEUE_EXIT_VALUES = 55 34 78DESCRIPTION = For normal low priority jobs, running only if hosts are \lightly loaded.End Queue# 打开hostgroup配置文件lsb.hosts,最后增加节点组配置(CUBE的配置路径是/opt/cubeman/etc, LSF类似)Begin HostGroupGROUP_NAME GROUP_MEMBER # Key wordshigh (compute0 compute1) # Define a host groupEnd HostGroup# 重启服务service cubeman restart
SGE默认队列是all.q,默认节点组是@allhosts,所有节点都默认在该节点组
以下是SGE关于队列的相关配置# 添加节点组qconf -ahgrp @highgroup_name @highhostlist compute0 compute1# 添加队列qconf -aq high指定节点组hostlist @high
由于部分客户和合作伙伴是通过OpenAPI和E-HPC对接,这里介绍一下API如何调用, 以python为示例代码,其他语言的示例代码可以通过来查看其他语言的示例代码
#!/usr/bin/env python#coding=utf-8from aliyunsdkcore.client import AcsClientfrom aliyunsdkcore.request import CommonRequestclient = AcsClient('', ' ','cn-hangzhou')request = CommonRequest()request.set_accept_format('json')request.set_domain('ehpc.cn-hangzhou.aliyuncs.com')request.set_method('GET')request.set_version('2018-04-12')request.set_action_name('CreateCluster')# 设置队列,创建的计算节点会被指定为该队列,该队列会被自动创建request.add_query_param('JobQueue', 'high')# 设置CreateCluster其他参数......response = client.do_action_with_exception(request)
#!/usr/bin/env python#coding=utf-8from aliyunsdkcore.client import AcsClientfrom aliyunsdkcore.request import CommonRequestclient = AcsClient('', ' ','cn-hangzhou')request = CommonRequest()request.set_accept_format('json')request.set_domain('ehpc.cn-hangzhou.aliyuncs.com')request.set_method('GET')request.set_version('2018-04-12')request.set_action_name('AddNodes')# 设置队列,新扩容的计算节点会被指定为该队列,该队列如果不存在会被自动创建request.add_query_param('JobQueue', 'high')# 设置AddNodes其他参数......response = client.do_action_with_exception(request)
新增API用于查询集群队列列表
#!/usr/bin/env python#coding=utf-8from aliyunsdkcore.client import AcsClientfrom aliyunsdkcore.request import CommonRequestclient = AcsClient('', ' ','cn-hangzhou')request = CommonRequest()request.set_accept_format('json')request.set_domain('ehpc.cn-hangzhou.aliyuncs.com')request.set_method('GET')request.set_version('2018-04-12')request.set_action_name('ListQueues')request.add_query_param('RegionId', 'cn-hangzhou')request.add_query_param('ClusterId', ' ')response = client.do_action_with_exception(request)
#!/usr/bin/env python#coding=utf-8from aliyunsdkcore.client import AcsClientfrom aliyunsdkcore.request import CommonRequestclient = AcsClient('', ' ','cn-hangzhou')request = CommonRequest()request.set_accept_format('json')request.set_domain('ehpc.cn-hangzhou.aliyuncs.com')request.set_method('GET')request.set_version('2018-04-12')request.set_action_name('SubmitJob')# 指定作业提交到该队列中request.add_query_param('JobQueue', 'high')# 设置SubmitJob其他参数......response = client.do_action_with_exception(request)
#!/usr/bin/env python#coding=utf-8from aliyunsdkcore.client import AcsClientfrom aliyunsdkcore.request import CommonRequestclient = AcsClient('', ' ','cn-hangzhou')request = CommonRequest()request.set_accept_format('json')request.set_domain('ehpc.cn-hangzhou.aliyuncs.com')request.set_method('GET')request.set_version('2018-04-12')request.set_action_name('SetAutoScaleConfig')# 对于队列high,设定扩容实例规格为GPU实例ecs.gn6v-c8g1.8xlargee,按量付费request.add_query_param('Queues.1.QueueName', 'high')request.add_query_param('Queues.1.InstanceType', 'ecs.gn6v-c8g1.8xlarge')request.add_query_param('Queues.1.SpotStrategy', 'NoSpot')request.add_query_param('Queues.1.SpotPriceLimit', '0')# 对于队列low,设定扩容实例规格为ecs.g5.large,扩容抢占式实例,最高出价为0.1request.add_query_param('Queues.2.QueueName', 'low')request.add_query_param('Queues.2.InstanceType', 'ecs.g5.large')request.add_query_param('Queues.2.SpotStrategy', 'SpotWithPriceLimit')request.add_query_param('Queues.2.SpotPriceLimit', '0.1')# 设置SetAutoScaleConfig其他参数......response = client.do_action_with_exception(request)
LSF/CUBE由于需要license,在创建好集群之后,需要用户手动配置license认证,然后手动配置队列和节点组信息,配置方法在上述章节已经提及,然后后续扩容节点或者自动伸缩就可以做到自动化多队列管理
转载地址:http://tmtpo.baihongyu.com/