Cloud/Kubernates

# docker + k8s + tensorflow-gpu 구성

skysoo1111 2019. 9. 26. 17:11

[ 설치 환경 ]

- centos7
- Docker version 19.03.2
- GeForce 940M
- k8s 1.15.3

 

[ docker 설치 ]

$ sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine docker-ce
				  
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
  
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
	
$ sudo yum install docker-ce docker-ce-cli containerd.io
	=> 특정 버전 설치시 yum install -y docker-ce-18.06.1

$ sudo systemctl start docker

$ sudo docker run hello-world
	=> 테스트

 

[ NVIDIA Drive 설치 ]

※ tensorflow 이용가능한 GPU는 NVIDIA Device 3.0 보다 커야한다.
※ GPU별 계산 능력표 확인 사이트 https://developer.nvidia.com/cuda-gpus#compute

# nouveau 사용 확인
$ lshw -numeric -C display

# NVIDIA Download
$ wget https://us.download.nvidia.com/XFree86/Linux-x86_64/418.88/NVIDIA-Linux-x86_64-418.88.run


$ sudo yum update

$ sudo yum group install "Development Tools"
$ sudo yum install kernel-devel

$ sudo yum -y install epel-release
$ sudo yum -y install dkms

# nouveau 해제
$ sudo vi /etc/default/grub
> modprobe.blacklist=nouveau

# BIOS
$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg

# UEFI
$ sudo grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg

# 재기동
$ sudo reboot

# nouveau 사용 확인
$ lshw -numeric -C display
	=> nouveau 사용하지 않고 있어야한다.

# 텍스트 모드
$ systemctl isolate multi-user.target

# NVIDIA Drive 설치
$ sudo sh NVIDIA-Linux-x86_64-418.88.run
	=> 설치 과정에서 dkms를 이용한 설치를 할거냐고 물으면 NO

# 재기동
$ reboot

# NVIDIA 정상 설치 확인
$ nvidia-smi

 

[ nvidia-docker 설치 및 진행 ]

$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)

# nvidia-docker 저장소 설치
$ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.repo | sudo tee /etc/yum.repos.d/nvidia-docker.repo
  
# nvidia-docker 설치
$ sudo yum install -y nvidia-docker2
$ sudo pkill -SIGHUP dockerd

# nvidia 실행
$ docker run --runtime=nvidia --rm nvidia/cuda:10.1-base nvidia-smi

 

[ tensorflow docker image pull ]

# tensorflow-gpu 실행
$docker run --runtime=nvidia -it -p 8888:8888 -p 8889:6006 -v ${HOME}/code:/tf/lab tensorflow/tensorflow:1.13.1-gpu-py3-jupyter

--runtime=nvidia                              nvidia 사용
-p 8888:8888                                  port 사용 jupyter notebook 사용 포트
-v ${HOME}/code:/tf/lab                       공유 폴더
tensorflow/tensorflow:latest-gpu-py3-jupyter  tensorflow-gpu image

# 실행하면 나오는 token 값 따록 기록
 http://(782cc760c0b8 or 127.0.0.1):8888/?token=~~~~
 
# container 빠져나오기
$ ctrl+p, ctrl+q

 

[ k8s-device-plugin 설치 ]

# docker의 default-runtime을 nvidia로 설정
$ vi /etc/docker/daemon.json
{
        "default-runtime": "nvidia",   # 해당 라인 추가
        "runtimes": {
                "nvidia": {
                        "path": "nvidia-container-runtime",
                        "runtimeArgs": []
                        }
                }
}

$ systemctl restart docker
$ systemctl daemon-reload

$ kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/1.0.0-beta/nvidia-device-plugin.yml
	=> pod에 등록된 nvidia-device-plugin 확인
    
$ kubectl get pods -A

 

[ GPU Container 기동 ]

# GPU Container 배포 파일 작성
$ vi k8s-tensorflow-gpu-deploy.yaml
apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: k8s-tensorflow-gpu
  namespace: tensorflow
spec:
  replicas: 1
  selector:
    matchLabels:
      app: k8s-tensorflow-gpu
  template:
    metadata:
      name: k8s-tensorflow-gpu-pod
      labels:
        app: k8s-tensorflow-gpu 
    spec:
      containers:
        - name: k8s-tensorflow-gpu
          image: "tensorflow/tensorflow:latest-gpu-py3-jupyter"
          resources:
            limits:
              nvidia.com/gpu: 1   # gpu 갯수 지정
          ports:
            - containerPort: 8888
              name: jupyter
            - containerPort: 6006
              name: tensorboard
---
apiVersion: v1
kind: Service
metadata:
  name: tensorflow-gpu-svc
  namespace: tensorflow
spec:
  selector:
    app: k8s-tensorflow-gpu
  ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: 8888
  type: LoadBalancer

# 배포 파일 실행
$ kubectl create -f k8s-tensorflow-gpu-deploy.yaml

 

'Cloud > Kubernates' 카테고리의 다른 글

# k8s Horizontal Pod Autoscaler (HPA) 실습 - 1  (0) 2019.10.23
# k8s Pod Autoscaler 개념  (2) 2019.10.23
# k8s 외부 ETCD HA 구성  (0) 2019.09.10
# k8s + keepalived + haproxy HA 구성  (6) 2019.09.06
# k8s + docker 개념  (0) 2019.09.06