Arena在多用戶場(chǎng)景下最佳實(shí)踐
本文通過(guò)實(shí)現(xiàn)五個(gè)目標(biāo)任務(wù)舉例說(shuō)明如何在多用戶場(chǎng)景下使用Arena。
操作視頻
前提條件
請(qǐng)確保您已完成以下操作:
創(chuàng)建一個(gè)ACK集群。詳情請(qǐng)參見(jiàn)創(chuàng)建ACK托管集群。
在ACK集群同VPC下,創(chuàng)建一個(gè)操作系統(tǒng)為L(zhǎng)inux的ECS實(shí)例。具體操作步驟請(qǐng)參見(jiàn)自定義購(gòu)買實(shí)例。
本示例中,ECS實(shí)例被稱為Client機(jī)器。Client機(jī)器作為Arena的工作站,提交作業(yè)至ACK集群。
安裝最新版本Arena。具體操作步驟請(qǐng)參見(jiàn)配置Arena客戶端。
背景信息
當(dāng)多個(gè)開(kāi)發(fā)人員在一個(gè)公司或大團(tuán)體下使用Arena進(jìn)行工作時(shí),為了有效管理,您可能需要對(duì)這些人員進(jìn)行小組劃分,且每個(gè)小組需要彼此隔離。這樣在同一個(gè)集群內(nèi),小組就是您分配、隔離資源和權(quán)限的基本單元。
通常您需要將整個(gè)集群的資源(GPU、CPU、MEM)根據(jù)具體需求劃分給每個(gè)組,并且給組內(nèi)成員分配不同權(quán)限,以及提供各自獨(dú)立的Arena使用環(huán)境。其中權(quán)限包括:用戶對(duì)于作業(yè)的可見(jiàn)、可操作權(quán)限,用戶的作業(yè)對(duì)特定數(shù)據(jù)的讀寫權(quán)限。
本文示例中的ACK集群和Client機(jī)器的節(jié)點(diǎn)信息如下表所示。
主機(jī)名 | 角色 | IP地址 | GPU卡數(shù) | CPU核數(shù) | MEM |
client01 | Client | 10.0.0.97(私有)39.98.xxx.xxx(公) | 0 | 2 | 8 GiB |
master01 | Master | 10.0.0.91(私有) | 0 | 4 | 8 GiB |
master02 | Master | 10.0.0.92(私有) | 0 | 4 | 8 GiB |
master03 | Master | 10.0.0.93(私有) | 0 | 4 | 8 GiB |
worker01 | Worker | 10.0.0.94(私有) | 1 | 4 | 30 GiB |
worker02 | Worker | 10.0.0.95(私有) | 1 | 4 | 30 GiB |
worker03 | Worker | 10.0.0.96(私有) | 1 | 4 | 30 GiB |
如無(wú)特殊說(shuō)明,本文操作均為集群管理員(admin)操作,操作節(jié)點(diǎn)為Client機(jī)器。
目標(biāo)任務(wù)
本文最佳實(shí)踐的示例中將達(dá)成以下五個(gè)目標(biāo)任務(wù):
目標(biāo)一:您需要為當(dāng)前ACK集群創(chuàng)建兩個(gè)分組dev1和dev2,并且為這兩個(gè)分組各添加一個(gè)用戶bob和tom。
目標(biāo)二:每個(gè)用戶只能通過(guò)自己的賬號(hào)和密碼登錄到Client機(jī)器,使用自己環(huán)境下的Arena。
目標(biāo)三:bob和tom只對(duì)自己提交的作業(yè)可見(jiàn),以及進(jìn)行管理。
目標(biāo)四:按組劃分Worker節(jié)點(diǎn)GPU、CPU、MEM資源(注:僅Worker節(jié)點(diǎn)的計(jì)算資源才能被Arena作業(yè)使用)。
目標(biāo)五:創(chuàng)建組內(nèi)共享的數(shù)據(jù)卷,和組與組之間全局共享的數(shù)據(jù)卷。
表 1. 數(shù)據(jù)配置表
組名 | 用戶 | GPU | CPU | MEM | 共享數(shù)據(jù)卷 |
dev1 | bob | 1 | 不限制 | 不限制 | dev1-public和department1-public-dev1 |
dev2 | tom | 2 | 8 | 60 GiB | dev2-public和department1-public-dev2 |
department1-public-dev1和department1-public-dev2數(shù)據(jù)卷指向的是同一份數(shù)據(jù);組dev1和dev2為所有用戶共享;dev1-public和dev2-public分別對(duì)應(yīng)分組dev1、dev2用戶獨(dú)享的數(shù)據(jù)。
步驟一:創(chuàng)建和管理ACK集群的用戶和組
為了安全起見(jiàn),不建議您直接登錄ACK集群的Master節(jié)點(diǎn)安裝使用Arena以及對(duì)集群進(jìn)行操作,因此建議您在與ACK集群同一個(gè)VPC下創(chuàng)建ECS實(shí)例(Client機(jī)器)。通過(guò)配置KubeConfig文件,使用ECS實(shí)例節(jié)點(diǎn)對(duì)ACK集群進(jìn)行訪問(wèn)。
創(chuàng)建Client機(jī)器上的用戶和組。
通過(guò)kubectl連接ACK集群。
使用kubectl命令連接ACK集群時(shí),您需要安裝kubectl客戶端工具和配置供集群管理員admin操作ACK集群的KubeConfig文件。有關(guān)具體的操作步驟,請(qǐng)參見(jiàn)獲取集群KubeConfig并通過(guò)kubectl工具連接集群。
說(shuō)明要求kubectl的版本大于或等于1.10。
執(zhí)行以下代碼在Client機(jī)器上創(chuàng)建對(duì)應(yīng)的Linux UID和GID。
集群管理員需要為bob、tom以及分組dev1、dev2,在Client機(jī)器上創(chuàng)建對(duì)應(yīng)的Linux UID和GID。通過(guò)Linux自身的賬號(hào)系統(tǒng)機(jī)制,實(shí)現(xiàn)目標(biāo)二,即每個(gè)用戶只能通過(guò)自己的賬號(hào)和密碼登錄到Client機(jī)器,使用自己環(huán)境下的Arena。
# 創(chuàng)建Linux用戶組dev1和dev2 groupadd -g 10001 dev1 groupadd -g 10002 dev2 # 創(chuàng)建Linux用戶bob和tom adduser -u 20001 -s /bin/bash -G dev1 -m bob adduser -u 20002 -s /bin/bash -G dev2 -m tom # 設(shè)置用戶bob登錄操作AI平臺(tái)的Linux節(jié)點(diǎn)的密碼。 passwd bob # 設(shè)置tom登錄操作AI平臺(tái)的Linux節(jié)點(diǎn)的密碼。 passwd tom
創(chuàng)建ACK集群中的用戶(服務(wù)賬號(hào))和組(命名空間)。
提交給AI平臺(tái)的作業(yè)都將在ACK集群中運(yùn)行。在ACK中,作業(yè)的擁有者以服務(wù)賬號(hào)(ServiceAccount)區(qū)分,作業(yè)運(yùn)行的環(huán)境以命名空間(Namespace)區(qū)分。運(yùn)維管理員admin將創(chuàng)建ServiceAccount和Namespace,并保證與在Client機(jī)器上創(chuàng)建的用戶和組對(duì)應(yīng)。可以將Namespace對(duì)應(yīng)組,ServiceAccount對(duì)應(yīng)用戶。
admin以root身份登錄Client機(jī)器,并確保擁有操作集群的權(quán)限(通過(guò)kubectl連接ACK集群步驟中完成)。執(zhí)行以下操作:
# 創(chuàng)建用戶組dev1對(duì)應(yīng)的命名空間 kubectl create namespace dev1 # 創(chuàng)建用戶組dev2對(duì)應(yīng)的命名空間 kubectl create namespace dev2 # 創(chuàng)建用戶bob對(duì)應(yīng)的服務(wù)賬號(hào) kubectl create serviceaccount bob -n dev1 # 創(chuàng)建用戶tom對(duì)應(yīng)的服務(wù)賬號(hào) kubectl create serviceaccount tom -n dev2
預(yù)期輸出:
$ kubectl create namespace dev1 namespace/dev1 created $ kubectl create namespace dev2 namespace/dev2 created $ kubectl create serviceaccount bob -n dev1 serviceaccount/bob created $ kubectl create serviceaccount tom -n dev2 serviceaccount/tom created
步驟二:為用戶配置Arena的使用環(huán)境
安裝Arena。
集群管理員在Client機(jī)器上安裝Arena。首先集群管理員以root身份登錄到Client機(jī)器,下載社區(qū)最新Arena發(fā)布的release安裝包,然后解壓并執(zhí)行安裝包中install.sh腳本。有關(guān)具體的操作步驟,請(qǐng)參見(jiàn)配置Arena客戶端。
說(shuō)明在同一臺(tái)Linux操作系統(tǒng)上,您只需安裝一份Arena工具。管理員通過(guò)為每位用戶配置各自的配置文件,從而實(shí)現(xiàn)隔離,便于用戶以不同的權(quán)限使用Arena工具。
為用戶創(chuàng)建Arena配置文件。
為了使不同用戶以各自的身份和權(quán)限正確操作AI平臺(tái)集群(ACK集群),首先您需要?jiǎng)?chuàng)建不同用戶用于Arena連接ACK集群的環(huán)境配置文件(即創(chuàng)建在各自ServiceAccount下使用的KubeConfig文件)。
集群管理員以root身份登錄到Client機(jī)器上,創(chuàng)建如下腳本并保存為generate-kubeconfig.sh:
#!/usr/bin/env bash set -e NAMESPACE= SERVICE_ACCOUNT= DURATION= OUTPUT= help() { echo "Usage: $0 -n <namespace> -s <service-account> -d <duration> -o <output-file>" echo "" echo "Options:" echo "-n, --namespace <namespace> Namespace of the service account." echo "-s, --service-account <name> Name of the service account." echo "-d, --duration <duration> Duration of the token e.g. 30d." echo "-o, --output <file> Output file name. If not set, a temporary file will be created." } parse() { while [ $# -gt 0 ]; do case $1 in -n | --namespace) NAMESPACE="$2" shift 2 ;; -s | --service-account) SERVICE_ACCOUNT="$2" shift 2 ;; -d | --duration) DURATION="$2" shift 2 ;; -o | --output) OUTPUT="$2" shift 2 ;; *) help exit 0 ;; esac done if [ -z "${NAMESPACE}" ] || [ -z "${SERVICE_ACCOUNT}" ] || [ -z "${DURATION}" ]; then help exit 0 fi if [ -z "${OUTPUT}" ]; then OUTPUT=$(mktemp -d)/config elif [ -f "${OUTPUT}" ]; then echo "Output file \"${OUTPUT}\" already exists." exit 1 fi } # Generate kubeconfig generate_kubeconfig() { CONTEXT=$(kubectl config current-context) CLUSTER=$(kubectl config view -o jsonpath="{.contexts[?(@.name==\"${CONTEXT}\")].context.cluster}") SERVER=$(kubectl config view -o jsonpath="{.clusters[?(@.name==\"${CLUSTER}\")].cluster.server}") TOKEN=$(kubectl create token "${SERVICE_ACCOUNT}" --namespace "${NAMESPACE}" --duration="${DURATION}") CERT=$(mktemp) mkdir -p "$(dirname "${OUTPUT}")" kubectl config view --raw=true -o jsonpath="{.clusters[?(@.name==\"${CLUSTER}\")].cluster.certificate-authority-data}" | base64 -d >"${CERT}" kubectl config set-cluster "${CLUSTER}" --kubeconfig="${OUTPUT}" --server="${SERVER}" --embed-certs=true --certificate-authority="${CERT}" >/dev/null kubectl config set-credentials "${SERVICE_ACCOUNT}" --kubeconfig="${OUTPUT}" --token="${TOKEN}" >/dev/null kubectl config set-context "${CLUSTER}-${NAMESPACE}-${SERVICE_ACCOUNT}-context" --kubeconfig="${OUTPUT}" --cluster="${CLUSTER}" --user="${SERVICE_ACCOUNT}" --namespace="${NAMESPACE}" >/dev/null kubectl config use-context "${CLUSTER}-${NAMESPACE}-${SERVICE_ACCOUNT}-context" --kubeconfig="${OUTPUT}" >/dev/null rm "${CERT}" echo "Saved kubeconfig to \"${OUTPUT}\"." } main() { parse "$@" generate_kubeconfig } main "$@"
執(zhí)行如下命令,為用戶創(chuàng)建KubeConfig文件并保存至各自的家目錄下,您可以自定義過(guò)期時(shí)間,例如下面示例將過(guò)期時(shí)間設(shè)置為720小時(shí):
bash generate-kubeconfig.sh -n dev1 -s bob -d 720h -o /home/bob/.kube/config bash generate-kubeconfig.sh -n dev2 -s tom -d 720h -o /home/tom/.kube/config
預(yù)期輸出如下:
$ bash generate-kubeconfig.sh -n dev1 -s bob -d 720h -o /home/bob/.kube/config Saved kubeconfig to "/home/bob/.kube/config". $ bash generate-kubeconfig.sh -n dev2 -s tom -d 720h -o /home/tom/.kube/config Saved kubeconfig to "/home/tom/.kube/config".
步驟三:為用戶配置Arena的權(quán)限
在ACK集群中為每個(gè)組(Namespace),按需創(chuàng)建組內(nèi)的角色(Role)。
集群管理員可以為每個(gè)組(Namespace)在ACK集群的具體操作權(quán)限配置不同的角色(Role)。一個(gè)角色(Role)代表組(Namespace)內(nèi)一系列具體權(quán)限規(guī)則的集合。有關(guān)ACK集群中角色(Role)的定義方法,請(qǐng)參見(jiàn)Using RBAC Authorization。
創(chuàng)建權(quán)限定義文件。
因?yàn)樾枰WC組dev1下用戶bob和組dev2下用戶tom的作業(yè)彼此不可見(jiàn),并且獨(dú)立管理各自的作業(yè),所以需要給組dev1和dev2創(chuàng)建最小權(quán)限,并綁定到對(duì)應(yīng)的用戶上(即用戶bob和tom對(duì)應(yīng)的ServiceAccount)。
為用戶組dev1創(chuàng)建如下權(quán)限定義文件并保存為dev1_roles.yaml;
kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: arena-topnode rules: - apiGroups: - "" resources: - pods - services - deployments - nodes - nodes/* - services/proxy - persistentvolumes verbs: - get - list --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: arena namespace: dev1 rules: - apiGroups: - "" resources: - configmaps verbs: - '*' - apiGroups: - "" resources: - services/proxy - persistentvolumeclaims - events verbs: - get - list - apiGroups: - "" resources: - pods - pods/log - services verbs: - '*' - apiGroups: - "" - apps - extensions resources: - deployments - replicasets verbs: - '*' - apiGroups: - kubeflow.org resources: - '*' verbs: - '*' - apiGroups: - batch resources: - jobs verbs: - '*'
為用戶組dev2創(chuàng)建如下權(quán)限定義文件并保存為dev2_roles.yaml:
kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: arena-topnode rules: - apiGroups: - "" resources: - pods - services - deployments - nodes - nodes/* - services/proxy - persistentvolumes verbs: - get - list --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: arena namespace: dev2 rules: - apiGroups: - "" resources: - configmaps verbs: - '*' - apiGroups: - "" resources: - services/proxy - persistentvolumeclaims - events verbs: - get - list - apiGroups: - "" resources: - pods - pods/log - services verbs: - '*' - apiGroups: - "" - apps - extensions resources: - deployments - replicasets verbs: - '*' - apiGroups: - kubeflow.org resources: - '*' verbs: - '*' - apiGroups: - batch resources: - jobs verbs: - '*'
集群管理員執(zhí)行以下命令,使之在ACK集群中生效。
kubectl apply -f dev1_roles.yaml kubectl apply -f dev2_roles.yaml
預(yù)期輸出如下:
$ kubectl apply -f dev1_roles.yaml clusterrole.rbac.authorization.k8s.io/arena-topnode created role.rbac.authorization.k8s.io/arena created $ kubectl apply -f dev2_roles.yaml clusterrole.rbac.authorization.k8s.io/arena-topnode unchanged role.rbac.authorization.k8s.io/arena created
集群管理員可以通過(guò)以下命令查看集群中不同Namespace下的角色。
kubectl get role -n dev1 kubectl get role -n dev2
預(yù)期輸出如下:
$ kubectl get role -n dev1 NAME CREATED AT arena 2024-09-14T08:25:34Z $ kubectl get role -n dev2 NAME CREATED AT arena 2024-09-14T08:25:39Z
為用戶配置在集群內(nèi)的權(quán)限(賦權(quán))。
組的角色創(chuàng)建完成后,我們需要給用戶綁定這個(gè)角色,使之作用在組里的成員上,即賦權(quán)給用戶。集群管理員通過(guò)將組(Namespace)內(nèi)的某些角色(Role)與用戶(ServiceAccount)進(jìn)行綁定,來(lái)為每位用戶在組內(nèi)賦權(quán)。
通過(guò)角色綁定,集群管理員可以為用戶賦予多個(gè)組內(nèi)的角色權(quán)限。這既包括用戶所屬的用戶組的組內(nèi)權(quán)限,也包括其他組內(nèi)的權(quán)限。這樣集群管理員就可以動(dòng)態(tài)地管理任何用戶在任何組內(nèi)的權(quán)限,只需要更新用戶與角色的對(duì)應(yīng)關(guān)系即可。
ACK中通過(guò)定義RoleBinding和ClusterRoleBinding對(duì)象來(lái)聲明用戶(ServiceAccount)在不同組(Namespaces)或者整個(gè)集群所有組中可以扮演的角色而獲取權(quán)限。ACK中角色綁定(RoleBinding和ClusterRoleBinding)的定義方法可以參見(jiàn)官方的文檔Using RBAC Authorization。
本文以目標(biāo)三為例,僅需要將用戶bob和tom分別綁定各自組的權(quán)限即可(步驟三中創(chuàng)建的角色)。操作步驟如下:
集群管理員以root身份登錄Client機(jī)器后,為用戶bob創(chuàng)建如下授權(quán)文件并保存為bob_rolebindings.yaml:
kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: bob-arena-topnode namespace: dev1 roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: arena-topnode subjects: - kind: ServiceAccount name: bob namespace: dev1 --- kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: bob-arena namespace: dev1 roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: arena subjects: - kind: ServiceAccount name: bob namespace: dev1
為用戶tom創(chuàng)建用戶授權(quán)文件并保存為tom_rolebindings.yaml:
kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: tom-arena-topnode namespace: dev2 roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: arena-topnode subjects: - kind: ServiceAccount name: tom namespace: dev2 --- kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: tom-arena namespace: dev2 roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: arena subjects: - kind: ServiceAccount name: tom namespace: dev2
執(zhí)行如下命令完成用戶和角色的綁定,即用戶賦權(quán)。
kubectl apply -f bob_rolebindings.yaml kubectl apply -f tom_rolebindings.yaml
預(yù)期輸出:
$ kubectl apply -f bob_rolebindings.yaml clusterrolebinding.rbac.authorization.k8s.io/bob-arena-topnode created rolebinding.rbac.authorization.k8s.io/bob-arena created $ kubectl apply -f tom_rolebindings.yaml clusterrolebinding.rbac.authorization.k8s.io/tom-arena-topnode created rolebinding.rbac.authorization.k8s.io/tom-arena created
集群管理員通過(guò)以下命令查看集群中不同Namespace下對(duì)不同用戶的角色賦權(quán)情況。
kubectl get rolebinding -n dev1 kubectl get rolebinding -n dev2
預(yù)期輸出如下:
$ kubectl get rolebinding -n dev1 NAME ROLE AGE bob-arena Role/arena 34s $ kubectl get rolebinding -n dev2 NAME ROLE AGE tom-arena Role/arena 33s
至此,本文示例已完成了上述的前三個(gè)目標(biāo)任務(wù)。
步驟四:配置用戶組資源配額
AI平臺(tái)通過(guò)ACK統(tǒng)一管理所有集群資源。為了保證不同組和用戶安全、有效地使用集群資源,需要為小組分配資源配額。AI平臺(tái)會(huì)在用戶提交作業(yè)時(shí),自動(dòng)檢查用戶有權(quán)限運(yùn)行作業(yè)的組配額使用情況。如果作業(yè)需求量超過(guò)配額上限,則提交會(huì)被拒絕。
在ACK中資源配額(ResourceQuota)的作用域是命名空間(Namespace),即對(duì)應(yīng)本文中的用戶組。ResourceQuota支持的資源類型很多,既包括CPU、Memory,也包括Nvidia GPU這類擴(kuò)展資源。ResourceQuota也能夠限制一個(gè)Namespace中容器及其它Kubernetes對(duì)象的使用量。有關(guān)更詳細(xì)的說(shuō)明,請(qǐng)參見(jiàn)Resource Quotas。
根據(jù)目標(biāo)四中的描述,本文示例按照組劃分當(dāng)前集群的GPU、CPU、MEM等資源。示例假設(shè)劃分的配置如數(shù)據(jù)配置表所示。本文示例將分配組dev1一張GPU卡,不劃分CPU和MEM,即可以使用整個(gè)集群的CPU和MEM。分配組dev2兩張GPU卡,八核CPU和60 GiB MEM。具體的操作步驟如下:
集群管理員登錄Client機(jī)器后,為用戶組dev1創(chuàng)建如下資源配額文件并保存為dev1_quota.yaml
apiVersion: v1 kind: ResourceQuota metadata: name: dev1-compute-resources namespace: dev1 spec: hard: requests.cpu: "10" requests.memory: 10Gi limits.cpu: "15" limits.memory: 20Gi requests.nvidia.com/gpu: 2
為用戶組dev2創(chuàng)建如下資源配置文件并保存為dev2_quota.yaml:
apiVersion: v1 kind: ResourceQuota metadata: name: dev2-compute-resources namespace: dev2 spec: hard: requests.nvidia.com/gpu: 2
執(zhí)行以下命令使之在集群中生效。
kubectl apply -f dev1_quota.yaml kubectl apply -f dev2_quota.yaml
創(chuàng)建后,集群管理員可以通過(guò)以下命令查看ResourceQuota是否生效,并可以看到定義的配額以及組內(nèi)已經(jīng)分配掉的資源。
# 查看組dev1下的資源配額。 kubectl get resourcequotas -n dev1 # 查看組dev2下的資源配額。 kubectl get resourcequotas -n dev2 # 查看組dev1資源配額的使用情況。 kubectl describe resourcequotas dev1-compute-resources -n dev1 # 查看組dev2資源配額的使用情況。 kubectl describe resourcequotas dev2-compute-resources -n dev2
預(yù)期輸出:
$ kubectl get resourcequotas -n dev1 NAME AGE REQUEST LIMIT dev1-compute-resources 9s requests.cpu: 0/10, requests.memory: 0/10Gi, requests.nvidia.com/gpu: 0/2 limits.cpu: 0/15, limits.memory: 0/20Gi $ kubectl get resourcequotas -n dev2 NAME AGE REQUEST LIMIT dev2-compute-resources 10s requests.nvidia.com/gpu: 0/2 $ kubectl describe resourcequotas dev1-compute-resources -n dev1 Name: dev1-compute-resources Namespace: dev1 Resource Used Hard -------- ---- ---- limits.cpu 0 15 limits.memory 0 20Gi requests.cpu 0 10 requests.memory 0 10Gi requests.nvidia.com/gpu 0 2 $ kubectl describe resourcequotas dev2-compute-resources -n dev2 Name: dev2-compute-resources Namespace: dev2 Resource Used Hard -------- ---- ---- requests.nvidia.com/gpu 0 2
至此,本文完成了上述的目標(biāo)四的按照組劃分ACK集群計(jì)算資源。
步驟五:配置多級(jí)別共享存儲(chǔ)NAS
根據(jù)用戶組織內(nèi)對(duì)數(shù)據(jù)共享的控制規(guī)則,可以為AI平臺(tái)內(nèi)的組和用戶分別配置帶有相應(yīng)權(quán)限控制的數(shù)據(jù)卷掛載,方便用戶間安全地共享數(shù)據(jù)。
本文示例目標(biāo)五需要?jiǎng)?chuàng)建兩類共享數(shù)據(jù)卷。一類用于存放全局的共享數(shù)據(jù),所有組內(nèi)成員都可以訪問(wèn)和使用,另一類僅僅用于各個(gè)小組內(nèi)共享。本文假設(shè)共享數(shù)據(jù)卷的需求如數(shù)據(jù)配置表所示。四個(gè)數(shù)據(jù)卷dev1-public、dev2-public、department1-public-dev1、department1-public-dev2中的department1-public-dev1和department1-public-dev2指向NAS盤的同一個(gè)目錄,組dev1和dev2共享這一份數(shù)據(jù)。dev1-public、dev2-public分別指向組dev1和組dev2所屬NAS盤的不同目錄,組dev1 、dev2獨(dú)享這份數(shù)據(jù)。具體操作如下:
創(chuàng)建NAS實(shí)例。
在阿里云NAS控制臺(tái)開(kāi)通、購(gòu)買NAS實(shí)例,并創(chuàng)建掛載點(diǎn)。有關(guān)詳細(xì)步驟,請(qǐng)參見(jiàn)配置NAS共享存儲(chǔ)。
配置ACK集群的存儲(chǔ)卷(PV)和存儲(chǔ)聲明(PVC)。
創(chuàng)建PV。
分別創(chuàng)建4個(gè)PV。有關(guān)創(chuàng)建PV的具體操作步驟,請(qǐng)參見(jiàn)創(chuàng)建PV。department1-public-dev1和department1-public-dev2是用于dev1和dev2兩組分別共享部門department1的數(shù)據(jù)。dev1-public和dev2-public是用于dev1和dev2各自組內(nèi)共享數(shù)據(jù)。創(chuàng)建PV的參數(shù)配置如下圖所示。
說(shuō)明設(shè)置掛載點(diǎn)時(shí),選擇上一步驟創(chuàng)建NAS實(shí)例時(shí)創(chuàng)建的掛載點(diǎn)。
創(chuàng)建PVC。
使用上一步創(chuàng)建的PV,分別創(chuàng)建PVC。有關(guān)創(chuàng)建PVC的具體操作步驟,請(qǐng)參見(jiàn)創(chuàng)建PVC。
完成創(chuàng)建PVC后,可以看到在命名空間dev1下給dev1組分配部門和小組兩級(jí)共享的NAS數(shù)據(jù)卷:department1-public-dev1和dev1-public。在命名空間dev2下給dev2組分配部門和小組兩級(jí)共享的NAS數(shù)據(jù)卷:department1-public-dev2和dev2-public。
檢查數(shù)據(jù)卷的配置。
集群管理員以root身份登錄Client機(jī)器,執(zhí)行以下命令查看為不同組分配的NAS數(shù)據(jù)情況。
# 查看組dev1可以使用的數(shù)據(jù)卷。 arena data list -n dev1 # 查看組dev2可以使用的數(shù)據(jù)卷。 arena data list -n dev2
預(yù)期輸出:
至此,本文已經(jīng)完成了所有目標(biāo)。接下來(lái)本文將會(huì)以bob和tom賬戶進(jìn)行登錄使用Arena。
步驟六:模擬多用戶操作
用戶bob
登錄Client機(jī)器,執(zhí)行以下命令查看當(dāng)前可用的共享數(shù)據(jù)卷。
# 使用bob賬號(hào)登錄Client機(jī)器 ssh bob@39.98.xxx.xx # 通過(guò)arena data list查看當(dāng)前用戶可用共享數(shù)據(jù)卷。 arena data list
預(yù)期輸出:
執(zhí)行以下命令提交一個(gè)需要1張GPU卡的訓(xùn)練作業(yè)。
arena submit tf \ --name=tf-git-bob-01 \ --gpus=1 \ --image=tensorflow/tensorflow:1.5.0-devel-gpu \ --sync-mode=git \ --sync-source=https://code.aliyun.com/xiaozhou/tensorflow-sample-code.git \ "python code/tensorflow-sample-code/tfjob/docker/mnist/main.py --max_steps 10000 --data_dir=code/tensorflow-sample-code/data"
執(zhí)行以下命令列出當(dāng)前用戶提交的作業(yè)。
arena list
預(yù)期輸出:
執(zhí)行以下命令再提交一個(gè)使用一張GPU卡的訓(xùn)練作業(yè)。
arena submit tf \ --name=tf-git-bob-02 \ --gpus=1 \ --image=tensorflow/tensorflow:1.5.0-devel-gpu \ --sync-mode=git \ --sync-source=https://code.aliyun.com/xiaozhou/tensorflow-sample-code.git \ "python code/tensorflow-sample-code/tfjob/docker/mnist/main.py --max_steps 10000 --data_dir=code/tensorflow-sample-code/data"
由于本文示例只給dev1組分配了一張GPU卡,所以預(yù)期這個(gè)作業(yè)不會(huì)被調(diào)度啟動(dòng)。
可以看到,雖然整個(gè)集群還有剩余資源,但是由于bob所在的組只被分配了一張GPU卡資源,并且當(dāng)前已經(jīng)有了一個(gè)作業(yè)占用了資源,所以bob后續(xù)的提交的作業(yè)就會(huì)被暫停。
用戶tom
執(zhí)行以下命令登錄Client機(jī)器,查看當(dāng)前可用的共享數(shù)據(jù)卷。
# 使用tom賬號(hào)登錄Client機(jī)器。 ssh tom@39.98.xx.xx # 通過(guò)arena data list查看當(dāng)前用戶可用共享數(shù)據(jù)卷。 arena data list
預(yù)期輸出:
執(zhí)行以下命令列出當(dāng)前用戶提交的作業(yè)。
arena list
此時(shí)看不到bob提交的作業(yè)。
執(zhí)行以下命令提交一個(gè)需要1張GPU卡的訓(xùn)練作業(yè)。
arena submit tf \ --name=tf-git-tom-01 \ --gpus=1 \ --chief-cpu=2 \ --chief-memory=10Gi \ --image=tensorflow/tensorflow:1.5.0-devel-gpu \ --sync-mode=git \ --sync-source=https://code.aliyun.com/xiaozhou/tensorflow-sample-code.git \ "python code/tensorflow-sample-code/tfjob/docker/mnist/main.py --max_steps 10000 --data_dir=code/tensorflow-sample-code/data"
說(shuō)明由于示例分配了組dev2的GPU、CPU、MEM資源,因此在dev2組里的用戶提交作業(yè)的時(shí)候需要明確指定GPU、CPU、MEM的使用資源。
執(zhí)行以下命令再次提交一個(gè)需要1張GPU卡的訓(xùn)練作業(yè)。
arena submit tf \ --name=tf-git-tom-02 \ --gpus=1 \ --chief-cpu=2 \ --chief-memory=10Gi \ --image=tensorflow/tensorflow:1.5.0-devel-gpu \ --sync-mode=git \ --sync-source=https://code.aliyun.com/xiaozhou/tensorflow-sample-code.git \ "python code/tensorflow-sample-code/tfjob/docker/mnist/main.py --max_steps 10000 --data_dir=code/tensorflow-sample-code/data"
執(zhí)行以下命令列出當(dāng)前用戶提交的作業(yè)。
arena list
預(yù)期輸出:
執(zhí)行結(jié)果
從上述操作可以看到,目前分別位于兩個(gè)組的用戶bob、tom可以通過(guò)自己的賬號(hào)登錄Client機(jī)器獨(dú)立地使用Arena ,并通過(guò)Arena查看和使用用戶當(dāng)前所在組可訪問(wèn)的存儲(chǔ)資源和計(jì)算資源,以及管理各自的作業(yè)。