[태그:] docker

  • opencv 시작하기

    유명한 opencv를 시작했다. docker python 이미지를 찾아 쉽게 시작했다. python 3.7, opencv4를 설치한 이미지다.

    docker pull jjanzic/docker-python3-opencv

    몇 번 시행착오를 거쳤으나 여러 사이트를 참조하여 결과만 남긴다. 먼저 docker 내용을 host에 넘기기 위해 xhost +를 실행했다. 그 뒤 sudo 명령어로 docker를 실행했다. 여기에 좋은 내용이 있다. docker run 옵션은 다음과 같다.

    sudo docker run --device=/dev/video0:/dev/video0 -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY -p 5000:5000 -p 8888:8888 -it -v /home/now0930/codeForPython3/opencv:/home/code  --env QT_X11_NO_MITSHM=1 jjanzic/docker-python3-opencv_modified /bin/bash

    중간에 –env QT_X11_NO_MITSHM=1 를 넣어 시작하지 않으면 다음 에러가 난다.

    cv2.error: OpenCV(4.1.1) /opencv-4.1.1/modules/highgui/src/window.cpp:627: error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvShowImage'

    시작 후 docker 내부에서 pip로 opencv-python 모듈을 설치한다. opencv-python를 설치하지 않으면 video를 사용하여 이미지를 저장할 수 없다.

    python -m pip install opencv-python

    root 권한으로 libget2.0-dev, pkg-config를 설치했는데 영향을 모르겠다. 일단 되니 고.

    apt reinstall libgtk2.0-dev pkg-config

    여기 코드를 그대로 사용하여 실행 됨을 확인한다.

    sudo로 docker를 실행하면 보안 문제가 있다고 한다. video를 사용할 수 있도록 host에 권한을 할당했다.

    sudo usermod -a -G video now0930

    다음을 실행하면, 윈도우가 무한대로 뜬다. cv2.imshow를 하나만 사용해야 된다. 여러 개를 사용하면 무엇이 문제인지 모르겠으나, 안된다. matplot으로 창을 띄워도 되나 너무 느리다. 찾아보면 해결 방법을 찾겠지만, 그냥 cv2.imshow로 가기로 했다.

    import cv2
    import numpy as np
    import matplotlib.pyplot as plt  
    cap = cv2.VideoCapture(0)
    
    #while(1):
    #videocapture로 들어오는 이미지를 matplot으로 실시간 표시
    #plt.ion()
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
    
    while cap.isOpened():
    
        # Take each frame
        _, frame = cap.read()
        # Our operations on the frame come here
        #gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    
    
        # Convert BGR to HSV
        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
        #hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    
        # define range of blue color in HSV
        lower_blue = np.array([110,50,50])
        upper_blue = np.array([130,255,255])
    
        # Threshold the HSV image to get only blue colors
        mask = cv2.inRange(hsv, lower_blue, upper_blue)
    
        # Bitwise-AND mask and original image
        res = cv2.bitwise_and(frame,frame, mask= mask)
    
        #cv2.imshow("frame",frame)
        #cv2.imshow("mask",mask)
        cv2.imshow("res",res)
    
    
        #plt.subplot(2,2,1),plt.imshow(frame)
        #plt.subplot(2,2,2),plt.imshow(mask)
        #plt.subplot(2,2,3),plt.imshow(res)
        #plt.pause(0.001)
        #plt.show()
    
        if cv2.waitKey(10) & 0xFF == ord('q'):
            break
    cv2.destroyAllWindows()
    

  • tensorflow 2.1.0 compile

    tensorflow 2.1.0 compile

    남는 시간에 tensorflow 2.0을 컴파일에 도전했다. 현실은 실패하여 2.1로 목표 재설정. docker 이미지를 사용하면 쉬운데, avx2를 지원하지 않는 CPU를 사용하여 선택할 수 없다. 직접 컴파일하지 않는 한 사용할 수 없다. 최근 개발 이미지를 찾아보니 cuda 10.1, python3 이었다. nvidia-driver는 여러 버전이 설정 되었는데, host pc 버전으로 구동하나 보다. bazel 버전은 3.0이다.

    bazel 버전을 2.1.0에 맞는 0.27로 바꿨다. compile 하면 약 6시간 정도 걸린다. 문제가 몇 개 있었다. 전에 램 12GB로 컴파일을 성공했다. 지금 8GB로 해보니, 10,000번 스텝넘어 동작을 멈추고 실패했다. 램을 사기 애매하여 일단 SWAP을 30GB 만들어 컴파일에 성공했다. 그런데 상당히 느리다. 결국 램 8GB를 구매했다. 그런데도 firefox를 띄우고 컴파일하면 에러난다.

    메뉴얼은 host에 CUDA를 설치할 필요 없다고 했다. nvidia-driver를 440 버전으로 업데이트 하면 CUDA 10.2를 기본 설치한다. 이게 뭐가 문제냐면 docker gpu 이미지가 10.2을 지원하지 않아 gpu를 사용할 수 없다. 일단 nvidia docker가 10.1 이미지를 띄우면 cuda 10.0으로 내릴 수 없다. 드라이버도 같이 내려야 하는데, 사용 중이어 수정할 수 없나보다. 실패하여 cuda 10.1 이미지를 사용했다. 그러나 nvidia-driver-440으로 cuda 10.1을 사용할 수 없다. 결국 host pc 드라이버를 438로 내렸다.

    nvidia driver version 440.82는 CUDA 10.2를 기본 설치한다.

    tensorflow 1.12 버전은 host pc driver 440으로 잘 구동한다. 왜 9.0은 실행하는데 10.x 버전을 실행하지 못하는지 모르겠다.

    3일째 이 미친 짓을 하고 있다. 뭘 위해서 인지 모르겠다. 지금까지 버린 인건비와 전기 요금을 생각하면 PC 1/3대를 구입했다.

    결국 다음 조합으로 컴파일에 성공했다.

    • ubuntu 18.04
    • nvidia-driver 435, cuda 10.1
    • docker image: latest-devel-gpu-py3, cuda 10.1, python 3.

    컴파일 거의 마지막 단계에 host python 버전 2와 guest python 버전 3 환경 설정값 다름으로 컴파일을 실패했다. 여기를 참조하여 간단하게 tensorRT를 사용하지 않도록 설정했다. 어차피 내 그래픽 카드는 지원하지 않는다. python2 버전 이미지로 해도 될 듯 하다.

    ERROR: /tensorflow_src/tensorflow/tensorflow/python/keras/api/BUILD:129:1: Executing genrule //tensorflow/python/keras/api:keras_python_api_gen_compat_v2 failed (Exit 1)
    Traceback (most recent call last):
      File "/root/.cache/bazel/_bazel_root/51f904752746bc15a93061eb1cc3b8cc/execroot/org_tensorflow/bazel-out/host/bin/tensorflow/python/keras/api/create_tensorflow.python_api_2_keras_python_api_gen_compat_v2.runfiles/org_tensorflow/tensorflow/python/tools/api/generator/create_python_api.py", line 27, in <module>nvidia.com/compute/cuda/repos/ubuntu1804/x86_64  cuda-npp-10-1 10.1.243-1 [54.9 MB]
    Get:9 https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64  cuda-libraries-10-1 10.1.243-1 [2588 B]
    Get:10 https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64  cuda-nvrtc-dev-10-1 10.1.243-1 [8812 B]
    
        from tensorflow.python.tools.api.generator import doc_srcs
      File "/root/.cache/bazel/_bazel_root/51f904752746bc15a93061eb1cc3b8cc/execroot/org_tensorflow/bazel-out/host/bin/tensorflow/python/keras/api/create_tensorflow.python_api_2_keras_python_api_gen_compat_v2.runfiles/org_tensorflow/tensorflow/python/__init__.py", line 85, in <module>
        from tensorflow.python.ops.standard_ops import *
      File "/root/.cache/bazel/_bazel_root/51f904752746bc15a93061eb1cc3b8cc/execroot/org_tensorflow/bazel-out/host/bin/tensorflow/python/keras/api/create_tensorflow.python_api_2_keras_python_api_gen_compat_v2.runfiles/org_tensorflow/tensorflow/python/ops/standard_ops.py", line 117, in <module>
        from tensorflow.python.compiler.tensorrt import trt_convert as trt
      File "/root/.cache/bazel/_bazel_root/51f904752746bc15a93061eb1cc3b8cc/execroot/org_tensorflow/bazel-out/host/bin/tensorflow/python/keras/api/create_tensorflow.python_api_2_keras_python_api_gen_compat_v2.runfiles/org_tensorflow/tensorflow/python/compiler/tensorrt/__init__.py", line 22, in <module>
        from tensorflow.python.compiler.tensorrt import trt_convert as trt
      File "/root/.cache/bazel/_bazel_root/51f904752746bc15a93061eb1cc3b8cc/execroot/org_tensorflow/bazel-out/host/bin/tensorflow/python/keras/api/create_tensorflow.python_api_2_keras_python_api_gen_compat_v2.runfiles/org_tensorflow/tensorflow/python/compiler/tensorrt/trt_convert.py", line 28, in <module>
        from tensorflow.compiler.tf2tensorrt import wrap_py_utils
      File "/root/.cache/bazel/_bazel_root/51f904752746bc15a93061eb1cc3b8cc/execroot/org_tensorflow/bazel-out/host/bin/tensorflow/python/keras/api/create_tensorflow.python_api_2_keras_python_api_gen_compat_v2.runfiles/org_tensorflow/tensorflow/compiler/tf2tensorrt/wrap_py_utils.py", line 28, in <module>
        _wrap_py_utils = swig_import_helper()
      File "/root/.cache/bazel/_bazel_root/51f904752746bc15a93061eb1cc3b8cc/execroot/org_tensorflow/bazel-out/host/bin/tensorflow/python/keras/api/create_tensorflow.python_api_2_keras_python_api_gen_compat_v2.runfiles/org_tensorflow/tensorflow/compiler/tf2tensorrt/wrap_py_utils.py", line 24, in swig_import_helper
        _mod = imp.load_module('_wrap_py_utils', fp, pathname, description)
      File "/usr/lib/python3.6/imp.py", line 243, in load_module
        return load_dynamic(name, filename, file)
      File "/usr/lib/python3.6/imp.py", line 343, in load_dynamic
        return _load(spec)
    ImportError: /root/.cache/bazel/_bazel_root/51f904752746bc15a93061eb1cc3b8cc/execroot/org_tensorflow/bazel-out/host/bin/tensorflow/python/keras/api/create_tensorflow.python_api_2_keras_python_api_gen_compat_v2.runfiles/org_tensorflow/tensorflow/compiler/tf2tensorrt/_wrap_py_utils.so: undefined symbol: _ZN15stream_executor14StreamExecutor18EnablePeerAccessToEPS0_
    ----------------
    Note: The failure of target //tensorflow/python/keras/api:create_tensorflow.python_api_2_keras_python_api_gen_compat_v2 (with exit code 1) may have been caused by the fact that it is a Python 2 program that was built in the host configuration, which uses Python 3. You can change the host configuration (for the entire build) to instead use Python 2 by setting --host_force_python=PY2.
    
    If this error started occurring in Bazel 0.27 and later, it may be because the Python toolchain now enforces that targets analyzed as PY2 and PY3 run under a Python 2 and Python 3 interpreter, respectively. See https://github.com/bazelbuild/bazel/issues/7899 for more information.
    ----------------
    Target //tensorflow/tools/pip_package:build_pip_package failed to build
    Use --verbose_failures to see the command lines of failed build steps.
    INFO: Elapsed time: 26069.299s, Critical Path: 545.35s
    INFO: 26668 processes: 26668 local.
    FAILED: Build did NOT complete successfully

    드디어 2.1 컴파일을 성공했다. 한 번 컴파일 끝내기 위해 7시간씩 썼다. 총 5번은 실패했고 6번째 성공했다. 업데이트 전 제대로 실행됨을 확인했다. update 하고 실행하니 또 에러 뜬다. cuda 10.2 문제임을 여기에서 확인했다. 다시 버전을 내렸다.

    2020-04-28 11:13:07.200201: E tensorflow/stream_executor/cuda/cuda_blas.cc:238] failed to create cublas handle: CUBLAS_STATUS_NOT_INITIALIZED
    2020-04-28 11:13:07.202605: E tensorflow/stream_executor/cuda/cuda_blas.cc:238] failed to create cublas handle: CUBLAS_STATUS_NOT_INITIALIZED
    2020-04-28 11:13:07.202635: W tensorflow/stream_executor/stream.cc:2041] attempting to perform BLAS operation using StreamExecutor without BLAS support
    2020-04-28 11:13:07.202674: W tensorflow/core/common_runtime/base_collective_executor.cc:217] BaseCollectiveExecutor::StartAbort Internal: Blas GEMM launch failed : a.shape=(10000, 4), b.shape=(4, 1024), m=10000, n=1024, k=4
    	 [[{{node dense_1/MatMul}}]]
    Traceback (most recent call last):
      File "200428getSortedValuev3.py", line 198, in <module>
        model2.fit(x=fixed_sentence_by_index, y=training_result_asarray, epochs=10000, verbose=2, validation_split=0.3, callbacks=callbacks_list, batch_size=10000, shuffle=True)
      File "/usr/local/lib/python3.6/dist-packages/keras/engine/training.py", line 1239, in fit
        validation_freq=validation_freq)
      File "/usr/local/lib/python3.6/dist-packages/keras/engine/training_arrays.py", line 196, in fit_loop
        outs = fit_function(ins_batch)
      File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/backend.py", line 3727, in __call__
        outputs = self._graph_fn(*converted_inputs)
      File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/eager/function.py", line 1551, in __call__
        return self._call_impl(args, kwargs)
      File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/eager/function.py", line 1591, in _call_impl
        return self._call_flat(args, self.captured_inputs, cancellation_manager)
      File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/eager/function.py", line 1692, in _call_flat
        ctx, args, cancellation_manager=cancellation_manager))
      File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/eager/function.py", line 545, in call
        ctx=ctx)
      File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/eager/execute.py", line 67, in quick_execute
        six.raise_from(core._status_to_exception(e.code, message), None)
      File "<string>", line 3, in raise_from
    tensorflow.python.framework.errors_impl.InternalError:  Blas GEMM launch failed : a.shape=(10000, 4), b.shape=(4, 1024), m=10000, n=1024, k=4
    	 [[node dense_1/MatMul (defined at /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:3009) ]] [Op:__inference_keras_scratch_graph_1128]
    
    Function call stack:
    keras_scratch_graph

    미국 국방부가 리눅스로 무기 체계를 개발한다고 한다. 오픈소스를 사용하려면 이런 저런 문제점을 모두 직접 해결해야 한다. 정말 없는 길을 만들어 간다. 기업이 왜 오픈소스로 서비스하지 않는지 알 만하다. 구글같은 능력있는 회사정도 되야 오픈소스로 서비스 할 만하다. 누가 오픈소스로 서비스 한다고 하면 능력자라 인식해야겠다.

  • docker+tensorflow

    나는 구형 x1055 cpu를 사용하고 있다. 10년 넘어가고 있다. 다행히 6코어라 병렬처리 지원 프로그램은 빠르다. 요즘들어 병렬처리지원 프로그램을 많이 만드는 듯 하다. 아쉽게도 avx 등 명령세트를 지원하지 않는다. 구글이 컴파일한 whl버전을 설치하면 core dumped로 죽는다. 이를 해결하려면 내가 source build를 해야한다. source build하려면 우분투 16.04에 cuda, cudnn, bazel을 설치해야 한다. 얼마? 전 나온 ubuntu 18.04를 쓰고 싶은데, 컴파일할 수 없어 설치하기 꺼려진다. 게다가 conda, 가상화 등이 작업환경을 망치는 기분이다.

    이 중 docker를 알았다. host에 영향주지 않고, 안전하게 tensorflow를 쓸 수 있다. 시험으로 tensorflow 1.10 이미지에 내가 컴파일한 whl을 설치했다. 잘 된다. 이번에 밀어 버렸다.

    여기에 보면 아주 쉽게 build할 수 있다. 그러나 처음 시도한 이미지로 nvidia driver를 올릴 수 없었다. 다음으로 ubuntu 16.04에서 bazel, cuda, cudnn을 차근차근 설치했다. 이 이미지가 build를 못한다. Workspace 에러가 나를 막았다.

    이번에는 bazel 설치 이미지로 찾아 bazel test 했다. tensorflow cpu 컴파일도 Workspace 에러없었다. 컴파일 되는 이미지 dockerfile을 봤다. jdk8 버전에서 bazel을 설치했다.

    FROM openjdk:8
    # Bazel uses jdk8. Importing jdk8 image in advance, docker runs faster.
    # but there are some problem between openjdk8 and Bazel 0.5.3.
    
    MAINTAINER Tadashi KOJIMA <nsplat@gmail.com>
    
    # To install Bazel, see https://docs.bazel.build/versions/master/install-ubuntu.html#install-with-installer-ubuntu
    RUN apt-get update \
    	&& apt-get install -y pkg-config zip g++ zlib1g-dev unzip \
    	&& wget https://github.com/bazelbuild/bazel/releases/download/0.16.1/bazel-0.16.1-installer-linux-x86_64.sh \
    	&& chmod +x ./bazel-0.16.1-installer-linux-x86_64.sh \
    	&& ./bazel-0.16.1-installer-linux-x86_64.sh \
    
    # run bazel test
    	&& ls -l bin/ \
    	&& export PATH="$PATH:/root/bin" \
    	&& echo $PATH \
    	&& which bazel \
    	&& bazel \
    	&& echo "export PATH=\$PATH:/root/bin" >> /root/.bash_profile \
    	&& echo "exec /bin/bash" >> /root/.bash_profile \
    	&& . /root/.bash_profile
    
    # Set up workspace
    WORKDIR /home

    몇 줄 진행(한시간정도?)하다 컴파일 에러났다. 이번에는ubuntu 16.04에서 시작했다. cuda, cudnn, git 필요 모듈을 설치했다. 일단 컴파일은 에러없이 성공했다. 그러나 이 빌드 gpu 버전은 gpu를 동작시키지 않는다. 나중에 중요한 사실을 알았다. 구글이 source build 문서 아래에 검증된 tensorflow, bazel, cuda 버전을 기록했다. 내가 설치한 bazel 버전이 너무 높았다. 진작 알았으면 하루 벌었는데.

    https://www.tensorflow.org/install/source

    마지막으로 1.10-rc2-dev-gpu-py3 docker 이미지를 받아 해봤다. 너무나 쉽게 성공했다. docker 이미지가 한글을 지원하지 않아, 환경변수를 설정했다.

    python에서 한글 터미널 에러

    https://www.44bits.io/ko/post/setup_linux_locale_on_ubuntu_and_debian_container

    이거 한다고 주말을 다 날렸다. 컴파일하는데 약 3시간 걸렸다. 테스트 시간이 많아 확인하기 어려웠다.