Kubernetes - Kubernetes에 Tensorflow 클러스터 배포
9056 단어 tensorflowDockerKubernetes
지식 준비
1,kubernetes의 기본 개념, 예를 들어deployment,statefulset,rc,svc,pod 등이다.
2,tensorflow 분포식 집단.
Tensorflow 아키텍처 소개
Tensorflow를 사용하여 훈련하는 것은 단기 모드와 분포식 집단 모드로 나뉜다
단기 모드의 비교적 간단함(약간)
분산 모드에는 다음과 같은 몇 가지 역할이 포함됩니다.
ps 서버: 매개 변수 처리
worker 서버: 계단식 계산(GPU 서버)
tensorboard 서버:tensorboard 디스플레이 계산도 실행
client 서버: 트레이닝 프로그램 실행
분포식 모드에서 ps와worker 서버는grpc 포트를 노출하고client 서버는grpc를 통해 원격 훈련을 수행합니다
데모 코드는 다음과 같습니다.
ps 및 Worker 시작
...
...
def main(unused_args):
# Create Protobuf ServerDef
server_def = tf.train.ServerDef(protocol="grpc")
# Cluster info
server_def.cluster = tf.train.ClusterSpec({
"worker": [
"worker-1:2222",
"worker-2:2222",
"worker-3:2222",
"worker-4:2222"
],
"ps":[
"ps-1:2222",
"ps-2:2222"
]})
# Job name
if not FLAGS.job_name:
raise ValueError("Empty job_name")
server_def.job_name = FLAGS.job_name
# Task index
if FLAGS.task_id < 0:
raise ValueError("Invalid task_id: %d" % FLAGS.task_id)
server_def.task_index = FLAGS.task_id
# Create GRPC Server instance
server = tf.train.Server(server_def)
# join() is blocking, unlike start()
server.join()
if __name__ == "__main__":
tf.app.run()
Kubernetes에 분산 Tensorflow 배포
사고방식을 실현하다
1. ps/worker 서비스는 각각statefulset에 대응하고 ps/worker의 개수는statefulset의 사본 수이다. 예를 들어 3개의 ps 서버를 만들려면 3개의 사본을 포함하는statefulset을 만들고 ps/worker에tensorflow를 설치하고grpc 서비스를 시작해야 한다.
==> 왜 statefulset을 사용합니까, 분포식 집단은 집단을 기록하는cluster_스펙, 즉 ps와worker 노드의grpc_url(호스트 이름, 포트 포함), deployment/rc를 통해 만든pod 호스트 이름은 무작위이고pod 재구성 후 호스트 이름이 변하기 때문에 기록할 수 없습니다.statefulset에서 만든pod는 변하지 않습니다. 만약에 Pod가 재조정되어 만든지라도, 예를 들어 사본 수가 3이고 ps의statefulset을 만든지,pod의 이름은 ps-1,ps-2,ps-3로 고정됩니다. 이렇게 이름과 개수에 따라grpcurl를 알 수 있습니다.
2,client 서비스는 하나의job에 대응하고svc를 만들어서 외부 접근을 노출하는 데 사용합니다(주로jupyter와sshd에 접근합니다),client에tensorflow,jupyter,sshd를 설치해야 합니다
==> 왜 Job을 사용합니까?client 서비스에서 주로 트레이닝 스크립트를 실행하고job 자원을 사용하면 트레이닝 스크립트가 실행되면 Pod가 자동으로 삭제되기 때문이다
3.tensorboard 서비스는 하나의 Replicaset에 대응하고svc를 만들어서 서비스가 외부를 통해tensorboard에 접근하는 것을 포함하여tensorboard에 tfboard를 설치하고 서비스를 시작해야 한다.
4. pvc를 만들고 각 서비스의Pod는 pvc로 데이터를 공유한다
예제 설명:
Kubernetes에서 tf-dis-task라는 tensorflow 집단을 만듭니다. 이 집단은 ps 서버 2개와worker 서버 3개를 포함합니다.
다음 자원은 창설된 후에 이 집단에 대응하는 모든 자원입니다
[root@k8s-node1 example]# kubectl --namespace=admin get all --selector=taskname=tf-dis-task
NAME READY STATUS RESTARTS AGE
pod/tf-dis-task-ps-0 1/1 Running 0 12m
pod/tf-dis-task-ps-1 1/1 Running 0 12m
pod/tf-dis-task-session-v7j7f 1/1 Running 0 16m
pod/tf-dis-task-tf-board-tbq69 2/2 Running 0 16m
pod/tf-dis-task-worker-0 1/1 Running 0 17m
pod/tf-dis-task-worker-1 1/1 Running 0 17m
pod/tf-dis-task-worker-2 1/1 Running 0 17m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/tf-dis-task-session NodePort 10.10.11.19 8888:32500/TCP 16m
service/tf-dis-task-session-ssh NodePort 10.10.240.74 22:32051/TCP 16m
service/tf-dis-task-tf-board NodePort 10.10.185.71 2080:32200/TCP 16m
NAME DESIRED CURRENT READY AGE
replicaset.apps/tf-dis-task-tf-board 1 1 1 16m
NAME READY AGE
statefulset.apps/tf-dis-task-ps 2/2 12m
statefulset.apps/tf-dis-task-worker 3/3 17m
NAME COMPLETIONS DURATION AGE
job.batch/tf-dis-task-session 0/1 16m 16m
자세한 설명
1. 각각 ps와worker의statefulset을 만듭니다. 대응하는 명칭은 tf-dis-task-ps와 tf-dis-task-worker입니다. 대응하는pod명칭은 각각 tf-dis-task-ps-0,tf-dis-task-worker-0,tf-dis-task-worker-1,tf-task-worker-2입니다.
이렇게 군집하는cluster_사양:
"worker": [
"tf-dis-task-worker-0.tf-dis-task-worker:2222",
"tf-dis-task-worker-1.tf-dis-task-worker:2222",
"tf-dis-task-worker-2.tf-dis-task-worker:2222"
],
"ps":[
"tf-dis-task-ps-0.tf-dis-task-ps:2222",
"tf-dis-task-ps-1.tf-dis-task-ps:2222"
]
statefuleset에서 환경 변수 설정
ps|tf-dis-task-ps-0.tf-dis-task-ps:2222;tf-dis-task-ps-1.tf-dis-task-ps:2222,worker|tf-dis-task-worker-0.tf-dis-task-worker:2222;tf-dis-task-worker-1.tf-dis-task-worker:2222;tf-dis-task-worker-2.tf-dis-task-worker:2222
2. 클라이언트의job를 만듭니다. 이름은 tf-dis-task-session이고 2개의 서비스를 만듭니다. 각각 tf-dis-task-session, tf-dis-task-session-ssh입니다. 각각 jupyter의 포트(8888)와 sshd의 포트(22)가 노출됩니다. 이것은 호스트를 통해 콘덴서의 jupyter와 ssh에 접근할 수 있습니다.
3. tf-dis-task-tf-board라는 리플리케이션을 만들고 tf-dis-task-tf-board라는 포트를 노출하는 서비스를 만듭니다.
4. ps와worker의statefulset 설정 환경 변수는 다음과 같다.
# PS
[root@k8s-node1 example]# kubectl --namespace=admin get statefulsets.apps tf-dis-task-ps -oyaml
...
...
- env:
- name: TASK_NAME
value: tf-dis-task
- name: CLUSTER_SPEC
value: ps|tf-dis-task-ps-0.tf-dis-task-ps:2222;tf-dis-task-ps-1.tf-dis-task-ps:2222,worker|tf-dis-task-worker-0.tf-dis-task-worker:2222;tf-dis-task-worker-1.tf-dis-task-worker:2222;tf-dis-task-worker-2.tf-dis-task-worker:2222
- name: RESOURCE_TYPE
value: compute
- name: RESOURCE_NAME
value: ps
# Worker
[root@k8s-node1 example]# kubectl --namespace=admin get statefulsets.apps tf-dis-task-worker -oyaml
...
...
- env:
- name: TASK_NAME
value: tf-dis-task
- name: CLUSTER_SPEC
value: ps|tf-dis-task-ps-0.tf-dis-task-ps:2222;tf-dis-task-ps-1.tf-dis-task-ps:2222,worker|tf-dis-task-worker-0.tf-dis-task-worker:2222;tf-dis-task-worker-1.tf-dis-task-worker:2222;tf-dis-task-worker-2.tf-dis-task-worker:2222
- name: RESOURCE_TYPE
value: compute
- name: RESOURCE_NAME
value: worker
5. ps와worker의 용기 시작 방식은grpc 서버를 시작하는 것입니다. startup 스크립트는 다음과 같습니다.
...
...
function run_tensorflow_cluster() {
# hostname index
TASK_INDEX=$(hostname | awk -F'-' '{print $NF}')
SCRIPT_DIR=$( cd ${0%/*} && pwd -P )
# grpc_tensorflow_server.py grpc server,
exec python ${SCRIPT_DIR}/grpc_tensorflow_server.py --cluster_spec=$CLUSTER_SPEC --job_name=$RESOURCE_NAME --task_id=$TASK_INDEX
}
...
case $RESOURCE_TYPE in
"compute" ) run_tensorflow_cluster ;;
"tensorboard" ) run_tensorboard ;;
"session" ) run_tensorflow_session ;;
esac
6.client와tensorboard의 용기는 각각jupyter와tensorboard를 시작합니다.
7. 상기 방식을 통해 ps/worker/client/tfboard에서 하나의 렌즈를 사용할 수 있으며 RESOUCE_를 통해TYPE을 사용하여 부팅 방식 구분
자원 스케줄링
kubernetes의 node 노드는 다음과 같은 몇 가지 장면을 포함한다
1. Node 노드는 CPU만 있습니다.
2. Node 노드에는 CPU와 GPU가 있습니다.
3. 일부 Node 노드는 다른 서비스를 실행하고tensorflow를 실행하고 싶지 않음
4, GPU Node 노드의 gpu 모델 불일치
5. 일부 Node 노드는 특정한 사용자 또는 특정한 집단에게만 단독으로 사용하고 다른 집단의 서비스 스케줄링을 원하지 않는다
전체 스케줄링:
1.nodetype=tensorflow를 설정하고,tensorflow 집단은nodetype=tensorflow의 노드에만 스케줄링됩니다.
2. cputype, gputype, ps/client/tfboard 스케줄링을 설정할 때 cputype을 선택하고,worker 스케줄링을 설정할 때 구체적인 선택에 따라 cpu 또는 gpu를 선택할 수 있으며, gpu는 구체적인 모델의 gpu를 선택할 수 있다.
3.pooltype(shared/unshared)을 설정하면 노드가 공유되는지, 공유되면 모든 집단의 서비스가 노드로 스케줄링됩니다.
4. privatename를 설정합니다. 이 탭은 unshared 상황에서만 사용되며, 독점적인 경우privatename=username 또는taskname를 설정합니다.
[root@k8s-node1 example]# kubectl get node --label-columns=nodetype,cputype,gputype,pooltype
NAME STATUS ROLES AGE VERSION NODETYPE CPUTYPE GPUTYPE POOLTYPE
k8s-node1 Ready master,node 9d v1.13.4 tensorflow intel-xeon-e5-2620-v4 nvidia-geforce-gtx-1080-ti shared
k8s-node2 Ready node 9d v1.13.4 tensorflow intel-xeon-e5-2620-v4 nvidia-geforce-gtx-1080-ti shared
문제점
1.tensorflow의 cpu와 gpu 렌즈는 다르지만worker만 gpu를 필요로 하기 때문에 같은 렌즈를 사용할 수 없습니다. gpu 훈련이라면worker만 gpu 렌즈를 사용하고 다른 서비스는 cpu 렌즈를 사용합니다.
2. 분포식 모드에서 각 gprc 서버가 시작될 때cluster_에 따라스펙 정보는 다른 서버를 연결하려고 시도합니다. 이것은 시간을 초과한 것입니다. k8s의statefulset 자원은 Pod를 만들 때 순서대로 시작합니다. 즉, tf-dis-task-ps-0만 생성된 후에 tf-dis-task-ps-1/2/...이것은 ps/worker가 비교적 많은 상황에서 (우리의 한 프로젝트에 12개의 ps가 있고 20개의 worker가 있다)task-ps-0는 처음에 만들어진 후에 다른 서버를 연결하려고 시도했지만 시간이 오래 걸려야 만들 수 있다.task-ps-11 구축이 성공하기 전에task-ps-0은 연결이 시간이 초과되어 시작에 실패했다. 이 프로젝트의 해결 방식은 전체적으로 집단 창설을 수정하는 방안이다.모든 ps/worker는 rc와 서비스를 만듭니다. 즉, ps 2개와 worker 3개의 집단은 5개의 복사본 수가 1인 rc를 만듭니다. 이름은 각각task-ps-0,task-ps-1,task-worker-0,task-worker-1,task-worker-2, 그리고 같은 이름의svc 5개로 용기에 전달되는 CLUSTER_SPEC 환경 변수도 직접svc의 이름입니다. 모든 ps/worker를 병렬적으로 만들 수 있고pod의 재조정은grpcurl의 변화를 초래하지 않습니다
소스 참조https://github.com/Aaron-DH/tensorflow_on_k8s
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Mediapipe를 사용한 맞춤형 인간 포즈 분류OpenCV의 도움으로 Mediapipe를 사용하여 사용자 지정 포즈 분류 만들기 Yoga Pose Dataset을 사용하여 사용자 정의 인간 포즈 분류를 생성하겠습니다. 1. 리포지토리 복제: 데이터세트 다운로드:...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.