目录
在Google Cloud上创建LSF集群,并配置LSF Resource Connector
对于现在正在蓬勃发展的云计算技术,LSF集群也是早已给出了在云上进行集群部署的方案,对于主流的AWS、Google Cloud、微软的Azure云服务,以及Openshift,LSF都可以支持,并且还在进行越来越深度的合作。
今天我们先以Google Cloud为例,来介绍一下LSF集群在云上的部署步骤。
准备云环境
在开始之前,首先要准备好云环境的账号,确保可以正常在云环境中创建和申请资源。
也可以先阅读相应云厂商的操作指南,掌握基础的云部署操作流程。
了解LSF Resource Connector
LSF Resource Connector是LSF 10.1版本后专门用于云部署的组件,通过这个组件,LSF可以将云供应商提供的虚拟机加入LSF集群,在workload高的时候扩大集群规模,保证作业吞吐量,在空闲的时候归还云上的节点来降低集群花费,达到集群规模的弹性设置。
LSF的守护进程ebrokerd就是专门用于Resource Connector的,如果发现有异常,我们可以通过查看LSF log目录下的ebrokerd日志来检查有没有相关的错误提示。
在Google Cloud上创建LSF集群,并配置LSF Resource Connector
1、在Google Cloud上创建project
Google Cloud上的资源申请都要基于某个project,所以首先要先创建一个project。
以Google Cloud账户登录Google Cloud,进入Google Cloud Console:
https://console.cloud.google.com/
点击页面上方的project,选择或新建一个project。
创建完成后为这个project选择一个service account。从IAM & Admin选择Service Account。
为这个project创建一个新的service account,在action菜单中选择Manage permissions可以为这个service account设置权限。
为刚才创建的project选择Compute Engine default service account和Google API Service Agent,将权限设为Editor。
选择KEYS,然后从ADD KEY中选择Create new key来创建,并下载一个credential key作为之后的备用。
接下来选择JSON格式, 点击CREATE会下载一个JSON格式的文件到本地,将这个文件保存好,在之后为LSF作业在Google Cloud创建VM时会用到。
2、为LSF管理节点,在Google Cloud上创建VM实例
点击Compute Engine菜单,选择VM instances,然后选择CREATE INSTANCE。
选择New VM instance并且填写所需信息:
-
指定VM instance的Name。Labels可以帮助说明,是可选项。
-
在Region和Zone中选择国家和地区创建VM instance。不同国家地区可以使用的CPU、GPU型号不同,价格也有所差异。
-
Boot disk中可以指定VM的操作系统以及系统磁盘空间大小。
-
选择Management,security,disks,networking,sole tenancy,可以打开扩展选项,用于设置SSH安全,或者增加额外的数据存储磁盘。
在扩展页面的Security下面,可以添加SSH Keys。
可以在想要用来远程访问这个VM的机器上,利用ssh-keygen生成本地机器的ssh key,然后将这个key添加到这里,这样,从本地机器就可以直接通过ssh访问当前这个VM了。
填写完成后,点击Create进行创建,Google Cloud会在创建完成后自动将新创建的VM启动。
3、安装和配置LSF管理节点
当刚才的VM创建完成后,从VM列表中获取其外部IP(external IP address)。
将LSF安装到这个VM上,安装完成后,建议进行以下配置:
-
在LSF_TOP/conf/lsf.conf中,配置:
其中,LSF_ROOT_USER=Y用于开启root用户对LSF集群的操作权限。
LSB_RC_EXTERNAL_HOST_FLAG=googlehost用于告诉LSF Resource Connector当前的云提供商是Google Cloud。
LSB_RC_EXTERNAL_HOST_IDLE_TIME=2用于设置当运行在云端的VM节点上的作业结束后多久,LSF集群会控制Google Cloud对VM进行回收。设置为2表示某个VM节点上的所有作业结束2分钟之后,就会触发回收。这个值可以根据自己的需要进行设置,没有作业运行仍然保留VM会导致额外的不必要费用,但是如果你的应用环境会很频繁的有新的作业出现,过于快速的回收VM会造成过于频繁的创建新的VM,在VM创建和添加到LSF集群的过程中,不能运行作业,但仍会造成费用,所以过于频繁的不必要的创建过程也会导致额外的费用增加。这个需要根据自己的作业场景进行调节。
LSB_GPU_NEW_SYNTAX=extend和LSF_GPU_AUTOCONFIG=Y都是针对GPU资源的最新优化参数,如果想要在集群中使用GPU资源,建议按照这个进行配置。
-
LSF_TOP/conf/lsbatch/configdir/lsb.modules中,配置:
schmod_demand是用于开启LSF Resource Connector的模块。
-
LSF_TOP/conf/lsf.shared中配置:
-
LSF_TOP/conf/lsbatch/configdir/lsb.queues中设置一个或多个队列用于容纳将要在云端VM上运行的作业。在这些队列上,加入参数:RC_HOSTS=googlehost,例如:
-
按照如下操作启用user_data.sh:
编辑user_data.sh,按照实际情况修改以下内容:
确保user_data.sh的结尾会调用lsadmin、badmin等命令启动LSF相关服务。
-
按以下方式在LSF_TOP/conf/resource_connector/hostProviders.json中启用Google:
{
"providers":[
{
"name": "google",
"type": "googleProv",
"path": "resource_connector/google/provider.json"
}
]
}
-
按照以下参数配置LSF_TOP/conf/resource_connector/google/provider.json文件:
{
"host_type": "google_host",
"interfaces":
[{
"name": "getAvailableTemplates",
"action": "resource_connector/google/scripts/getAvailableTemplates.sh"
},
{
"name": "getReturnRequests",
"action": "resource_connector/google/scripts/getReturnRequests.sh"
},
{
"name": "requestMachines",
"action": "resource_connector/google/scripts/requestMachines.sh"
},
{
"name": "requestReturnMachines",
"action": "resource_connector/google/scripts/requestReturnMachines.sh"
},
{
"name": "getRequestStatus",
"action": "resource_connector/google/scripts/getRequestStatus.sh"
}]
}
-
将10.1/resource_connector/google/下的conf目录复制到管理节点VM的LSF_TOP/conf/resource_connector/google/下:
-
配置project和credential文件:将之前下载的JSON格式的credential文件上传到 LSF管理节点的VM上,并在googleprov_config.json 文件中定义好project名称和传上去的credential文件的路径。
{
"LogLevel": "INFO",
"GCLOUD_PROJECT_ID": "lsf-rc-test",
"GCLOUD_CREDENTIAL_FILE": "/home/admin/lsf-rc-test-af9e765bb22f.json"
}
-
在LSF管理节点上通过lsfstartup命令启动lim、res和sbatchd等服务进程。
4、创建一个新的Google Cloud VM作为LSF计算节点并且安装LSF
a.创建一个新的VM用于安装LSF计算节点,这个VM的系统磁盘将作为之后用于为LSF作业动态创建VM的来源磁盘。
b.创建VM并且使用与刚才作为管理节点的VM相同的子网(subnet)。
c.登录创建好的VM。
d.将LSF安装包和entitlement文件传输到VM上,例如以下文件:
-
lsf10.1_linux2.6-glibc2.3-x86_64.tar.Z
-
lsf10.1_lsfinstall.tar.Z
-
lsf_std_entitlement.dat
e.如果当前VM没有安装ed,先用yum安装ed:
-
yum install ed
f.解压lsfinstall压缩包,编辑其中的server.config文件并设置以下参数:
-
LSF_TOP:指定与管理节点上LSF相同的安装位置。
-
LSF_ADMINS:指定与管理节点上相同的用户作为admin。
-
LSF_TARDIR:指定当前VM中LSF安装包文件所在目录位置。
-
LSF_ENTITLEMENT_FILE:指定当前VM中entitlement文件所在的位置。
-
LSF_SERVER_HOSTS:指定LSF管理节点的名称,并且确认从当前VM可以解析这个名称。
-
LSF_LOCAL_RESOURCES:将参数的值设置为"[resource googlehost]"。
-
LSF_LIM_PORT:设置与LSF 管理节点上的LIM port相同的值。示例:
5、执行lsfinstall脚本进行安装
安装结束后,确认LSF_TOP/conf/lsf.conf文件中是否成功设置了googlehost作为resource:
6、根据实际情况选择是否需要配置DNS和NIS服务
Google Cloud上默认的DNS服务可以用于LSF。
7、确认当前VM是否成功加入LSF集群
通过lsadmin limstartup,lsadmin resstartup和badmin hstartup命令启动LSF服务,并且通过lsload和bhosts命令确保当前VM作为动态节点(dynamic host)成功加入到LSF管理节点上的集群中。
这个过程可能需要2-3分钟的时间,如果长时间等待后,仍然没能加入集群,检查以下配置,然后重新启动LSF服务。
-
在VM instance属性的VPC网络里检查防火墙和防火墙规则。
-
管理节点和当前VM之间可以使用私有IP (private IP)互相ping通。
当前VM成功加入LSF集群之后,就可以将该计算节点VM关掉了(后面继续做VM镜像)。
8、为计算节点VM创建Google Cloud存储镜像(storage image)
我们可以在Google Cloud里面,根据刚才创建并且关掉的LSF计算节点VM来创建镜像,之后LSF需要更多节点来运算作业时,就可以从这个镜像创建VM,并作为动态节点加入到集群中进行工作了。
根据不同的需要,我们可以创建多个镜像,并设定不同的触发规则,让LSF根据不同的作业需求,从相应的镜像创建VM,也可以在创建VM时加入不同的CPU内存需求等条件。
首先我们从Google Cloud Console里创建镜像。
a.从菜单里选择Compute Engine,然后选择STORAGE>Images。
b.点击Create an image。
c.为镜像输入名称,然后点击Source>Disk,从Source disk list中选择刚才安装的LSF计算节点的VM。
d.点击Create并等待创建完成。
e. 登录LSF管理节点VM。
f.修改LSF_TOP/conf/resource_connector/google/conf/googleprov_templates.json文件,为刚才创建的镜像编写一个模板。参考如下:
{
"templateId": "gcloud-VM-1",
"maxNumber": 100,
"attributes": {
"type": ["String", "X86_64"],
"ncores": ["Numeric", "1"],
"ncpus": ["Numeric", "1"],
"nthreads": ["Numeric", "2"],
"ngpus": ["Numeric", "1"],
"ngpus_physical": ["Numeric", "1"],
"gpuextend":["String", "ngpus=1;nnumas=1;gbrand=Tesla;gmodel=K80;gmem=10240;nvlink=yes"],
"define_ncpus_threads": ["Boolean", "1"],
"mem": ["Numeric", "3840"],
"zone": ["String", "us_east1-d"],
"googlehost": ["Boolean", "1"]
},
"imageId": "lsf-gcloud-dynamic-vm",
"region": "us-east1",
"zone": "us-east1-d",
"vmType": "n1-standard-1",
"gpuType": "nvidia-tesla-k80",
"gpuNumber":"1",
"instanceTags" : "lsf-vpn-instance=gcloud-VM-1",
"userData": "zone=us-east1-d"
}
-
templateId表示在LSF中使用的该template的名称。
-
attributes里面定义的各种属性都是用于LSF在调度作业时选取哪一个template来创建VM的依据。
-
attributes之外的各种属性是在调用Google Cloud API来创建VM时所需的其它参数,这些参数的设置需要遵循Google Cloud API的要求和规则。
在定义好了template之后,你可以在LSF中提交以下作业进行测试:
LSF会检查集群中是否有空闲的带有“googlehost” 资源的VM,如果没有,LSF就会检查googleprov_templates.json中定义的templates,从中选择一个符合作业需求的template,然后调用Google API来根据所选择的template中的属性创建一个VM instance,当这个VM成功加入到集群后,作业就会调度到该VM运行。
9、根据Google Cloud的instance template创建VM
除了镜像,Google Cloud还提供了另一种方式来创建VM,就是instance template,LSF也可以根据这个方式来创建作业所需的VM。这种方式也需要我们事先根据之前创建好的LSF 计算节点来创建一个新的instance template。
a.从菜单中选择Compute Engine,然后选择VIRTUAL MACHINES>Instance templates。
点击CREATE INSTANCE TEMPLATE。
b.填写instance template的名称,并且在模板中选择CPU,内存,点击GPU可以选择GPU的类型/数量/内存等。
提示:选择不同的国家和地区,可以选择的CPU、GPU种类和数量也不同,可以参考Google Cloud官方文档来查找你需要的CPU、GPU 型号(某些规格的VM在一些国家和地区可能比其它地区更容易获取,如果某地区的相应资源都已经被其他用户占用了,创建VM的操作就会失败)。
c.点击Boot disk>Change来选择镜像和OS。
d.在Boot disk页面,点选Custom images,可以选择之前创建LSF计算节点。
e.点击Select进行选取,然后回到之前的页面,点击Mangement,security,disks,networking,sole tenancy展开Disks选取页面。
f.在Disk页面,你可以选择添加除系统磁盘之外的数据存储磁盘,点击Add new disk来添加额外存储磁盘。
g.在添加额外磁盘时,可以选择磁盘的种类,LSF对于Google Cloud中的SSD磁盘也提供了支持,可以在类型列表里选择Local SSD scratch disk来添加。
h.选择Local SSD scratch disk之后,有两个子类型:SCSI 和 NVMe,LSF都可以进行支持,同时LSF在LSF_TOP/10.1/resource_connector/google/scripts/user_data.sh文件中提供了自动挂载这两种磁盘到/tmp的示例。
i.选择完成后,点击Create创建instance template。
打开LSF_TOP/conf/resource_connector/google/conf/googleprov_templates.json文件,可以配置LSF调用Google Cloud API从instance template创建VM。
通过参数launchTemplateId来指定从那个instance template创建VM。
{
"templateId": "Template-VM-5",
"launchTemplateId":"lsfnode-gpu-temp1",
"maxNumber": 2,
"attributes": {
"type": ["String", "X86_64"],
"ncores": ["Numeric", "2"],
"ncpus": ["Numeric", "2"],
"nthreads": ["Numeric", "1"],
"mem": ["Numeric", "8000"],
"ngpus":["Numeric","2"],
"ngpus_physical":["Numeric","2"],
"gpuextend":["String","ngpus=2;nnumas=1;gbrand=Tesla;gmodel=K80;gmem=10240;nvlink=yes"],
"googlehost": ["Boolean", "1"]
},
"zone": "us-east1-b",
"instanceTags": "gputemp1"
}
在googleprov_templates.json中使用instance template创建VM时,launchTemplateId和zone两个属性是必须的,其他属性都是可选项,默认会使用Google Cloud中对应的instance template中的相应属性进行创建,但是如果在googleprov_templates.json中设置了某个属性,则会覆盖instance template中的相同属性。
在覆盖的时候有些需要注意的地方,就是instance template中将各种属性分为了不同类型,如果你指定了某一个属性,那么instance template中该属性所属类型的其他属性也会被覆盖,即使你在googleprov_template.json中没有定义其他同类型属性,那么Google Cloud将会用其他同类属性的默认值覆盖instance template中的对应设定。
例如,gpuType和gpuNumber属于同一个类别,如果你在googleprov_templates.json中指定了gpuType,但没有指定gpuNumber,那么,instance template中的gpuType就会被你指定的值取代,同时gpuNumber将被Google Cloud中的默认值取代。
Google Cloud中这种设定有些不太清楚,为了避免一些不必要的麻烦,建议要在googleprov_templates.json中为某个模板专门指定除launchTemplateId和zone之外的属性时,最好将同类别的属性一起指定。所有属性的分类如下:
Disk类别:
-
imageId
Network类别:
-
vpc
-
subnetId
-
privateNetworkOnlyFlag
GPU类别:
-
gpuType(参考https://cloud.google.com/compute/docs/gpus)
-
gpuNumber
其他类别:
-
vmType
-
minCpuPlatform
-
instanceTags
(Labels必须在googleprov_templates.json中定义,instance template中的labels都会被替换为默认值)
结束语
以上就是在Google Cloud上部署LSF集群的方法,也可以将管理节点设置在本地机器,来搭建混合云。
各个服务商的云部署还在不断的优化和发展,LSF也在不断提供对应的支持和新的功能。
欢迎关注下方微信公众号【HPC常青园】,共同交流HPC集群管理经验和最佳实践。如果您有关于HPC集群的具体需求,欢迎邮件沟通交流:hpc@ivyent.cn。