Kubernets에서 GPU를 사용하여 tensorflow 학습하기 (1)

Azure Container Service와 tensorflow를 사용하여 학습을 할 때의 설정 포인트를 자신의 메모로 적어 둡니다.
  • Kubernets에서 GPU를 사용하여 tensorflow 학습하기 (2)
  • Kubernets에서 GPU를 사용하여 tensorflow 학습하기 (3)

  • 최강 튜토리얼을 붙여 둔다. 이것을 기본 팔로우하고 있다.
  • wbuchwalter/tensorflow-k8s-azure



  • 1. GPU용 기본 이미지 사용



    첫 번째 포인트는 tensorflow 이미지가 있지만 GPU 전용을 사용합니다. CPU용의 사이즈가 400MB 정도인 것에 대해 GPU용은 1G, 2G 정도의 사이즈가 되지만 그런 것.
  • tensorflow/tensorflow

  • 2. Kubernetes를 GPU VM으로 프로비저닝


    westus2 또는 uksouth에서 GPU VM을 지정하여 프로비저닝합니다. 예를 들면 Standard_NC6. GPU 클러스터 배포는 평소보다 많이 걸립니다 (10-15 분) 이것은 NVIDIA 드라이버를 설치하기 때문에. 리전에 따라서는 용량이 제한되어 있으므로 요 확인.

    이런 느낌.
    az group create --name RemoveGPU --location westus2
    az acs create --agent-vm-size Standard_NC6 --resource-group RemoveGPU --name gpucluster --orchestrator-type kubernetes --agent-count 2 --location westus2 ```
    
    kubeconfig の取得は下記の通り。
    
    

    az acs kubernetes get-credentials --name gpucluster --resource-group RemoveGPU
    ``

    덧붙여서 이 커멘드라면, 기존의 kubeconfig 가 존재하는 경우는, ~/.kube/config 를 지우지 않고 클러스터가 추가되므로, context 를 전환해 새로운 클러스터를 사용할 수 있게 된다.

    확인 방법은
    $ kubectl get nodes
    NAME                        STATUS    ROLES     AGE       VERSION
    k8s-agentpool0-03479696-0   Ready     agent     21h       v1.7.9
    k8s-agentpool0-03479696-1   Ready     agent     21h       v1.7.9
    k8s-agentpool0-03479696-2   Ready     agent     17h       v1.7.9
    k8s-master-03479696-0       Ready     master    21h       v1.7.9
    $ kubectl describe node k8s-agentpool0-03479696-0
       :
    Capacity:
     alpha.kubernetes.io/nvidia-gpu:  1
       :
    

    그건 그렇고, 에이전트 수를 변경하고 싶다면
    az acs scale -g RemoveGPU -n gpucluster --new-agent-count 3
    

    GPU 이미지 용 yaml 파일을 작성하는 방법



    GPU 이미지 선택



    tensorflow의 경우 이미지



    tensorflow/tensorflow:1.4.0-gpu-py3 (GPU)
    tensorflow/tensorflow:1.4.0-py3 for (CPU)

    CNTK



    microsoft/cntk:2.2-gpu-python3.5-cuda8.0-cudnn6.0 (GPU)
    microsoft/cntk:2.2-python3.5 for (CPU)

    GPU 요청



    k8s는 CPU에 관해서는 디폴트로 CPU를 확보해 주지만, GPU는 그렇지 않기 때문에, YAML에 자원의 설정을 한다.
    containers:
          - name: tensorflow
            image: tensorflow/tensorflow:latest-gpu
            resources:
              limits:
                alpha.kubernetes.io/nvidia-gpu: 1 
    

    이런 느낌.

    드라이버를 컨테이너에 공유



    NVIDIA 드라이버를 컨테이너에서 참조하도록 설정
            volumeMounts: # Where the drivers should be mounted in the container
            - name: lib
              mountPath: /usr/local/nvidia/lib64
            - name: libcuda
              mountPath: /usr/lib/x86_64-linux-gnu/libcuda.so.1
          volumes: # Where the drivers are located on the node
            - name: lib
              hostPath: 
                path: /usr/lib/nvidia-384
            - name: libcuda
              hostPath:
                path: /usr/lib/x86_64-linux-gnu/libcuda.so.1
    

    요약



    GPU 클러스터를 만들고 다음 세 가지를 설정하면 OK
  • GPU 이미지 선택
  • GPU 요청
  • NVIDA 드라이버를 컨테이너에서 참조

  • 다음은 k8s에서 사용할 수 있는 편리한 툴이나, 스케일시의 고려 등

    좋은 웹페이지 즐겨찾기