ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Docker] ML + NLP Dockerfile 만들기
    💫 Computer Science/Python & AI Framework 2021. 5. 11. 11:30

    언제봐도 귀여운 로고

     

    케라스랑 자연어처리 쪽 도커 이미지를 많이 사용하는데,

    요즘 한국어 처리, 임베딩 하느라고 "한국어임베딩" 책의 이기창 저자님의 embedding이미지를 사용했었다.

     

    ratsgo/embedding

     

    ratsgo/embedding 에서 바로 사용 가능한 기법들

    단어 수준 임베딩
    - Latent Semantic Analysis
    - Word2Vec
    - GloVe
    - FastText
    - Swivel

    문장 수준 임베딩
    - Weighted Embeddings
    - Latent Semantic Analysis
    - Latent Dirichlet Allocation
    - Doc2VecEmbeddings from Language Models (ELMo)
    - Bidirectional Encoder Representations from Transformer (BERT)

     

    여러가지 테스트 해볼 거라면 위 이미지를 강추한다.
    docker pull ratsgo/embedding
    명령어로 이미지 다운받고 바로 docker run 하면 사용 가능하다.

    gpu버전을 사용할 거라면 --gpus all 옵션을 넣어주어야 한다.

     

     

     

    유명한 corpus 데이터부터, 전처리, 형태소분석기, 언어모델 pretrain, fine-tuning 까지 한번에 해결되는 것 같애서 사용했었는데

    파이썬 버전이 3.4고 버트 때문인지 텐서도 1버전이었다.

    근데 웬만한 전처리용 패키지들이 다 들어있고 자동화 스크립트로도 만들어 놓으셔서 편하게 사용했더랬다.

     

    그런데, 요즘 왈라스 연산자에 빠져있어서 파이썬 3.8버전 이상을 쓰고 싶고, 케라스를 사용할거라 텐서플로우도 2버전 이상이 필요했다. 또 주피터 랩도..

    그래서 해당 Dockerfile에 추가해서 사용해볼까하다가 이미 용량이 7기가 정도 되는 이미지이기도 하고

    주피터에 파이썬 버전 여러개 설치하고 여러 커널을 사용하다가 뭔가 충돌이 난 적이 많아서

    이참에 요즘 사용하는 패키지들을 추가한 전용 이미지를 하나 만들었다.

     

    그리고 deepo라는 이미지도 있는데 텐서플로우, 케라스, 파이토치, 티아노, darknet까지 정말 딥러닝을 위한 모든게 들어있는 이미지가 있는데 용량이 매우 크다. 10기가 이상이고 안쓰는 패키지가 태반일 것 같아서 딱 필요한 것만 일단 생성했다.

     

    필요한 것들은 다음과 같다.

     

    • gpu용 nvidia/cuda 베이스 이미지
    • 우분투 기본 utils(bzip2, sudo, vim 등등)
    • 최신 파이썬과 텐서플로우
    • KoNLPy 설치를 위한 jdk, jre
    • 주피터랩
    • 파이썬 패키지들(nlkt, pandas, seaborn, sklearn 등등)

     

     

    # Base Image
    FROM nvidia/cuda:11.2.0-base-ubuntu20.04
    ENV LC_ALL=C.UTF-8

    base 이미지로 nvidia/cuda를 사용했고 11.2는 내가 사용할 서버에 설치된 cuda 버전이므로

    자신이 사용할 cuda 버전에 맞게 tag를 선택해주어야 한다. 우분투 버전도 마찬가지

     

    # Basic Utils
    RUN . /etc/os-release; \
    	printf "deb http://ppa.launchpad.net/jonathonf/vim/ubuntu %s main" "$UBUNTU_CODENAME" main | tee /etc/apt/sources.list.d/vim-ppa.list && \
    	apt-key  adv --keyserver hkps://keyserver.ubuntu.com --recv-key 4AB0F789CBA31744CC7DA76A8CF63AD3F06FC659 && \
    	apt-get update --fix-missing && \
    	env DEBIAN_FRONTEND=noninteractive apt-get dist-upgrade --autoremove --purge --no-install-recommends -y \
    	build-essential \
    	bzip2 \
    	ca-certificates \
    	curl \
    	git \
    	libcanberra-gtk-module \
    	libgtk2.0-0 \
    	libx11-6 \
    	sudo \
    	graphviz \
    	vim

    그리고 우분투에 필요한 기본 util들을 설치해준다. 원하는 유틸들을 고르거나 추가해서 적어주면 된다.

    apt-get git bzip2 ca-certificates는 미니콘다 설치할 때 필요하므로 먼저 선행해주어야 한다.

     

     

    # Install Miniconda
    ENV LANG=C.UTF-8 LC_ALL=C.UTF-8
    ENV PATH /opt/conda/bin:$PATH
    RUN apt-get install -y wget bzip2 ca-certificates \
    	libglib2.0-0 libxext6 libsm6 libxrender1 \
    	git mercurial subversion
    RUN wget --quiet https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda.sh && \
    	/bin/bash ~/miniconda.sh -b -p /opt/conda && \
    	rm ~/miniconda.sh && \
    	ln -s /opt/conda/etc/profile.d/conda.sh /etc/profile.d/conda.sh && \
    	echo ". /opt/conda/etc/profile.d/conda.sh" >> ~/.bashrc && \
    	echo "conda activate base" >> ~/.bashrc
    RUN apt-get install -y default-jdk default-jre
    RUN apt-get install -y curl grep sed dpkg && \
    	TINI_VERSION=`curl https://github.com/krallin/tini/releases/latest | grep -o "/v.*\"" | sed 's:^..\(.*\).$:\1:'` && \
    	curl -L "https://github.com/krallin/tini/releases/download/v${TINI_VERSION}/tini_${TINI_VERSION}.deb" > tini.deb && \
    	dpkg -i tini.deb && \
    	rm tini.deb && \
    	apt-get clean

    그리고 미니콘다 설치하고 환경변수 등록하고, jdk, jde까지 설치하고 apt-get으로 설치했던 것을 지워준다.

     

     

    # Install Python Packages
    RUN pip install tensorflow && \
    	pip install cython && \
    	pip install nltk && \
    	pip install pandas && \
    	pip install seaborn && \
    	pip install sklearn && \
    	pip install simplejson && \
    	pip install psycopg2-binary && \
    	conda install av -c conda-forge && \
    	pip install jupyterlab jupyterhub

    필요한 파이썬 패키지들을 pip으로 설치했다. 간혹 conda로만 설치되는 패키지도 있다.

     

     

    # KoLNPy
    RUN mkdir -p /workspace
    WORKDIR /workspace
    RUN pip install jpype1-py3 konlpy
    RUN cd /workspace && \
    	curl -s https://raw.githubusercontent.com/konlpy/konlpy/master/scripts/mecab.sh | bash -s
    
    # Requirements.txt 있을때
    # COPY requirements.txt /tmp
    # WORKDIR /tmp
    # RUN pip install -r requirements.txt 

    마지막으로 KoNLPy를 설치해줬다.

     

     

     

     

    최종 Dockerfile

    # Base Image
    FROM nvidia/cuda:11.2.0-base-ubuntu20.04
    ENV LC_ALL=C.UTF-8
    
    # Basic Utils
    RUN . /etc/os-release; \
    	printf "deb http://ppa.launchpad.net/jonathonf/vim/ubuntu %s main" "$UBUNTU_CODENAME" main | tee /etc/apt/sources.list.d/vim-ppa.list && \
    	apt-key  adv --keyserver hkps://keyserver.ubuntu.com --recv-key 4AB0F789CBA31744CC7DA76A8CF63AD3F06FC659 && \
    	apt-get update --fix-missing && \
    	env DEBIAN_FRONTEND=noninteractive apt-get dist-upgrade --autoremove --purge --no-install-recommends -y \
    	build-essential \
    	bzip2 \
    	ca-certificates \
    	curl \
    	git \
    	libcanberra-gtk-module \
    	libgtk2.0-0 \
    	libx11-6 \
    	sudo \
    	graphviz \
    	vim
    
    # Install Miniconda
    ENV LANG=C.UTF-8 LC_ALL=C.UTF-8
    ENV PATH /opt/conda/bin:$PATH
    RUN apt-get install -y wget bzip2 ca-certificates \
    	libglib2.0-0 libxext6 libsm6 libxrender1 \
    	git mercurial subversion
    RUN wget --quiet https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda.sh && \
    	/bin/bash ~/miniconda.sh -b -p /opt/conda && \
    	rm ~/miniconda.sh && \
    	ln -s /opt/conda/etc/profile.d/conda.sh /etc/profile.d/conda.sh && \
    	echo ". /opt/conda/etc/profile.d/conda.sh" >> ~/.bashrc && \
    	echo "conda activate base" >> ~/.bashrc
    RUN apt-get install -y default-jdk default-jre
    RUN apt-get install -y curl grep sed dpkg && \
    	TINI_VERSION=`curl https://github.com/krallin/tini/releases/latest | grep -o "/v.*\"" | sed 's:^..\(.*\).$:\1:'` && \
    	curl -L "https://github.com/krallin/tini/releases/download/v${TINI_VERSION}/tini_${TINI_VERSION}.deb" > tini.deb && \
    	dpkg -i tini.deb && \
    	rm tini.deb && \
    	apt-get clean
    
    # Install Python Packages
    RUN pip install tensorflow && \
    	pip install cython && \
    	pip install nltk && \
    	pip install pandas && \
    	pip install seaborn && \
    	pip install sklearn && \
    	pip install simplejson && \
    	pip install psycopg2-binary && \
    	conda install av -c conda-forge && \
    	pip install jupyterlab jupyterhub
    
    # KoLNPy
    RUN mkdir -p /workspace
    WORKDIR /workspace
    RUN pip install jpype1-py3 konlpy
    RUN cd /workspace && \
    	curl -s https://raw.githubusercontent.com/konlpy/konlpy/master/scripts/mecab.sh | bash -s
    
    # Requirements.txt 있을때
    # COPY requirements.txt /tmp
    # WORKDIR /tmp
    # RUN pip install -r requirements.txt 

     

    Dockerfile을 다 작성했으면 docker build 해주면 되는데, vim으로 작성했어서 띄어쓰기 같은거 공백 같은거 잘 봐줘야 했다.

    Dockerfile이 있는 위치로 가서,

     

    docker build -f Dockerfile -t 원하는이미지명 .

     

    명령어로 빌드해준다.

    nvidia-docker 가 있으면 nvidia-docker 명령어로 빌드해줘도 된다.

    nvidia-docker로 빌드했을 경우 run 할 때도 nvidia-docker로 해줘야 한다.

     

    빌드 중 에러가 나면 어느 부분에서 에러가 났는지 나오기 때문에,

    Dockerfile에서 해당 부분을 찾아 수정하고 다시 빌드해주면 이전까지 빌드됬던 것에서 이어서 빌드하게 된다.

    이미 빌드된 과정을 수정했을 때는 캐시 때문에 오류날 수 있기 때문에

     

    docker builder prune 

     

    명령어로 캐시를 지워주면 된다.

     

    이미지가 다 빌드 됬으면 

    docker run 명령어로 사용하면 된다. 여기서 추가적으로 옵션을 지정해주어야 하는데, 내가 사용한 옵션은 다음과 같다.

     

    docker run -it --rm -v 호스트볼륨:컨테이너내폴더 --name 컨테이너명 -p 호스트포트:컨테이너포트 --link 연결할다른컨테이너ID --gpus all 생성된이미지명 bash

     

     

     

     

     

     

     

     

    References

     

    Docker build 공식문서

     

    댓글

Designed by Tistory.