$ docker run -it -d -v ~/ZERO123:/workspace -p 7860:7860 -u kmk --name zero123 --gpus all jameskoo0503/zero123:v1.2 bash
Docker란, container라는 소프트웨어 유닛 안에 어플리케이션과, 어플리케이션을 구동하기 위해 필요한 환경설정 및 필요 라이브러리 등을 하나로 묶어 어느 PC에서도 안정적으로 구동되도록 도와주는 패키징 툴.
가상머신(VM)과 다른 점은, 무거운 운영체제(OS)를 포함하지 않는다는 것. 각 guest OS를 포함하는 VM과는 달리, host OS위에 설치된 단일 container engine을 통해 별도의 OS 없이도 각 container는 host OS를 공유하여 구동됨. 그 원리에 대해선 운영체제와 커널에 대한 구체적인 이해 필요. 그러한 container engine 중에 업계 표준으로 사용되고 있는 것이 바로 Docker.
Docker는 container를 1) 만들고, 2) 배포하고, 3) 구동함. Container를 만드는 과정은, 1-a) Dockerfile을 작성하고, 이를 이용해 1-b) image를 만들어, 1-c) container를 구동하는 순서로 요약됨.
Container를 어떻게 만들어야 하는지에 대한 설명서. 아래와 같이 구성.
어플리케이션을 실행하기 위해 필요한 코드, 런타임 환경, 시스템 툴, 시스템 라이브러리 등의 모든 환경에 해당. 실행되고 있는 어플리케이션의 상태를 일종의 스냅 샷으로 저장해 두는 것.
잘 캡쳐해둔 어플리케이션의 이미지를 고립된 환경에서 실행할 수 있도록 구성된 공간. Image는 캡쳐했을 당시의 불변하는 상태, container에서 각각 동작하는 어플리케이션은 개별적으로 파일을 만들거나 수정이 가능한 유동적인 상태. Container에서의 수정사항은 image에 영향을 미치지 않음. Image는 class, container는 instance의 개념에 대응.
Local machine에서 image를 만들어 GitHub과 같은 container registry에 push한 후, 필요한 (Docker와 같은 container engine이 설치되어 있는) 다른 서버에서 pull하여 그대로 실행.
$ docker pull {IMAGE}[:TAG]
$ docker images
$ docker run -it {IMAGE}
$ docker run -it --name {NAME} {IMAGE}
$ docker run -it --gpus all --name {NAME} {IMAGE}
$ docker run [OPTIONS] {IMAGE} [COMMAND] [ARG...]
$ docker ps -a
$ docker exec -it [CONTAINER_NAMES] bash
$ docker run -it -v {HOST_VOLUME}:{CONTAINER_VOLUME} {IMAGE}
ex. $ docker run -it --gpus all -v ~/FILM:/workspace pytorch/pytorch:1.13.1-cuda11.6-cudnn8-runtime
$ docker run -it ... --shm-size=8G
$ docker logs -f {CONTAINER_NAMES}
$ docker commit {CONTAINER ID} {IMAGE NAME}[:TAG]
$ docker stop/start {CONTAINER ID}
$ docker rm {CONTAINER ID}
$ docker rm $(docker ps -a -q -f status=exited)
$ docker rm $(docker ps -a -q -f ancestor=docker ps -a -q -f ancestor=pytorch/pytorch:1.13.1-cuda11.6-cudnn8-runtime)
$ docker rmi {IMAGE ID}
$ docker rmi {IMAGE NAME}[:TAG]
$ docker login --username={DOCKERHUB_USERNAME}
$ docker tag {CONTAINER_ID} {DOCKERHUB_USERNAME}/{REPOSITORY_NAME}[:TAG]
$ docker push {DOCKERHUB_USERNAME}/{REPOSITORY_NAME}
$ docker save -o {PATH_FOR_GENERATED_TAR_FILE} {IMAGE_NAME}
(docker image file transfer)
$ docker load -i {PATH_TO_IMAGE_TAR_FILE}
DOCKER_BUILDKIT=1 docker build -t myapp --target runtime -f docker/Dockerfile .
(SOLVED) $ 'docker pull pytorch/pytorch:1.13.1-cuda11.6-cudnn8-runtime' 실행 과정에서 아래의 저장 공간 오류 발생. (Docker image를 저장하는 공간이 어디로 설정되어 있는지 확인 요망)
failed to register layer: Error processing tar file(exit status 1): write /opt/conda/lib/libmkl_intel_thread.so.1: no space left on device
Docker의 data root directory를 다른 디스크가 마운트된 디렉토리로 옮겨주어야 함.
- $ docker info | grep 'Docker Root Dir' 커맨드로 현재 data root directory 확인. 기본값인 '/var/lib/docker'로 설정되어 있었음.
- $ df -h /var/lib/docker 커맨드로 해당 디렉토리가 마운트된 디스크 확인. 거의 꽉 차있는 엄한 디스크였으며, 현재 작업 중인 큰 디스크로 옮겨야 함.
- '/lib/systemd/system/docker.service' 파일 열어 ExecStart로 시작하는 라인에 '--data-root=/mnt/xvdb/docker' 추가.
- $ mkdir /mnt/xvdb/docker
- $ cp -R /var/lib/docker /mnt/xvdb/docker 커맨드로 기존 파일 이동.
- $ sudo systemctl daemon-reload
- $ sudo systemctl restart docker 커맨드로 docker 재시작.
(SOLVED) $ 'docker run -it --gpus all pytorch/pytorch:1.13.1-cuda11.6-cudnn8-runtime' 실행 과정에서 아래의 gpu 에러 발생.
docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]].
ERRO[0000] error waiting for container: context canceled
Docker container 내에선 GPU를 실행할 수 없기에 host gpu driver와 Docker를 연동시켜주는 Nvidia-docker를 설치해 주어야 함.
- $ distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
&& curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \
&& curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
커맨드로 nvidia repository 추가.- $ sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit 커맨드로 nvidia-container-toolkit 추가.
- $ sudo systemctl restart docker 커맨드로 docker 재시작.
(SOLVED) Container를 실행하면 기본적으로 root 계정으로 실행되어 pip install 등의 커맨드 입력 시 아래와 같은 warning 발생.
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
실행 중인 container에서 새로운 user를 추가해준 뒤 image를 만들고, 해당 user로 새로운 container를 실행('-u {USERNAME}' 옵션 추가)하여 해결.
- $ docker exec -it zero123 bash
- $ adduser kmk
- $ exit
- $ docker commit zero123 jameskoo0503/zero123:v1.2
- $ docker run -it -u kmk -v ~/ZERO123:/workspace --gpus all --name zero123 jameskoo0503/zero123:v1.2 bash
(SOLVED) 'zero123/gradio_new.py' 실행 시 public URL(https://3865d9589035b13189.gradio.live)으로는 연결되나 local URL(http://127.0.0.1:7860)으로는 연결되지 않는 문제 발생.
: Container에 '-p 7860:7860' 옵션을 추가해준 뒤 실행하면 '127.0.0.1에서 전송한 데이터가 없습니다.' 에러 발생.
Gradio launch 코드에 server ip 번호 명시해주어 해결. (기본값으로 실행되는 127.0.0.1은 docker에서만 local로 인식하여 외부와 연결되지 않음)
demo.launch(server_name='0.0.0.0', enable_queue=True, share=True)
RealFusion의 'raymarching' 라이브러리 설치 중 아래와 같은 에러 발생.
OSError: CUDA_HOME environment variable is not set. Please set it to your CUDA install root.
'export CUDA_HOME=/usr/local/cuda' 커맨드로 지정해주면 아래의 에러 발생.
error: [Errno 2] No such file or directory: '/usr/local/cuda/bin/nvcc'
: 'which nvcc' 커맨드 입력해도 cuda 경로가 출력되지 않음. (container 외부의 root 권한으론 출력됨)
Unsolved...
Unsolved...
FROM continuumio/miniconda3:latest
WORKDIR /app
COPY environment.yaml /app/environment.yaml
RUN conda update -n base -c defaults conda
RUN conda env create -f environment.yaml
WORKDIR /workspace
RUN echo "source activate midas" >> ~/.bashrc
SHELL ["/bin/bash", "--login", "-c"]
CMD ["bash", "--login"]
$ docker run -it -d -v ~/MiDaS:/workspace -p 7860:7860 --name midas_gradio --gpus all jameskoo0503/midas:latest bash
$ docker pull gcr.io/deeplearning-platform-release/tf2-gpu.2-6:latest
$ docker run -it -v ~/FILM:/workspace --name film gcr.io/deeplearning-platform-release/tf2-gpu.2-6
$ docker run -it -v ~/FILM:/workspace --name film jameskoo0503/film:v1.1
$ docker exec -it film bash
$ cd workspace
# One mid-frame interpolation
$ python3 -m eval.interpolator_test \
--frame1 photos/one.png \
--frame2 photos/two.png \
--model_path checkpoints/film_net/Style/saved_model \
--output_frame photos/output_middle.png
# Many in-between frames interpolation ('photos/01/one.jpg' 형태로 파일 저장)
$ python3 -m eval.interpolator_cli \
--pattern “photos/*” \
--model_path checkpoints/film_net/Style/saved_model \
--times_to_interpolate 6 \
--output_video
$ docker pull python:3.9.17
$ docker run -it -v ~/ZERO123:/workspace --gpus all --name zero123 python:3.9.17 bash
$ cd zero123
$ pip install -r requirements.txt
$ git clone https://github.com/CompVis/taming-transformers.git
$ pip install -e taming-transformers/
$ git clone https://github.com/openai/CLIP.git
$ pip install -e CLIP/
$ pip uninstall gradio
$ pip install gradio
$ docker commit 1020a1fe04f0 jameskoo0503/zero123:v1.1
[Dockerfile]
FROM nvcr.io/nvidia/pytorch:23.06-py3
RUN apt-get update && apt-get install -y wget curl bzip2
RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh \
&& bash miniconda.sh -b -p /opt/conda \
&& rm miniconda.sh
ENV PATH /opt/conda/bin:$PATH
COPY environment.yaml .
RUN conda create -n stablesr && conda env update -n stablesr --file environment.yaml
$ docker build -t myapp --target runtime -f docker/Dockerfile .