Docker 설치
다운로드 url: https://www.docker.com/products/docker-desktop/
실습
ultralytics/ultralytics
QuickStart url: https://docs.ultralytics.com/quickstart/#conda-docker-image
- Dockerfile: GPU image recommended for training.
- Dockerfile-arm64: Optimized for ARM64 architecture, allowing deployment on devices like Raspberry Pi and other ARM64-based platforms.
- Dockerfile-cpu: Ubuntu-based CPU-only version suitable for inference and environments without GPUs.
- Dockerfile-jetson: Tailored for NVIDIA Jetson devices, integrating GPU support optimized for these platforms.
- Dockerfile-python: Minimal image with just Python and necessary dependencies, ideal for lightweight applications and development.
- Dockerfile-conda: Based on Miniconda3 with conda installation of ultralytics package.
1
2
3
4
5
6
7
8
# Set image name as a variable
t=ultralytics/ultralytics:latest
# Pull the latest ultralytics image from Docker Hub
sudo docker pull $t
# Run the ultralytics image in a container with GPU support
`docker run -it --ipc=host docker.io/ultralytics/ultralytics:latest`
Docker run option 설명
-it
-i
옵션은 컨테이너의 표준 입력(STDIN)을 열어두어 대화형으로 만들고,-t
옵션은 가상 터미널(TTY)을 할당- 함께 사용할 경우
-it
는 컨테이너와의 대화형 세션을 가능하게 해주어 사용자가 컨테이너 내부에서 셸을 사용할 수 있도록 함
--ipc=host
--ipc
옵션은 IPC(Inter-Process Communication) 네임스페이스 설정host
를 설정함으로써, 컨테이너는 호스트의 IPC 네임스페이스를 사용. 즉, 컨테이너는 호스트 시스템의 메모리 공간과 세마포어 등 IPC 자원을 공유하게 됨- 이는 성능상의 이유로, 특히 고성능 컴퓨팅 작업이나 병렬 처리 작업을 할 때 컨테이너 간 통신이 필요할 경우 유용
docker.io/ultralytics/ultralytics:latest
GPU를 위해 NVIDIA 설치 사이트
https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html
노트
Ultralytics Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# Ultralytics YOLO 🚀, AGPL-3.0 license
# Builds ultralytics/ultralytics:latest image on DockerHub https://hub.docker.com/r/ultralytics/ultralytics
# Image is CUDA-optimized for YOLOv8 single/multi-GPU training and inference
# Start FROM PyTorch image https://hub.docker.com/r/pytorch/pytorch or nvcr.io/nvidia/pytorch:23.03-py3
FROM pytorch/pytorch:2.1.0-cuda12.1-cudnn8-runtime
RUN pip install --no-cache nvidia-tensorrt --index-url https://pypi.ngc.nvidia.com
# Downloads to user config dir
ADD https://ultralytics.com/assets/Arial.ttf https://ultralytics.com/assets/Arial.Unicode.ttf /root/.config/Ultralytics/
# Install linux packages
# g++ required to build 'tflite_support' and 'lap' packages, libusb-1.0-0 required for 'tflite_support' package
RUN apt update \
&& apt install --no-install-recommends -y gcc git zip curl htop libgl1 libglib2.0-0 libpython3-dev gnupg g++ libusb-1.0-0
# Security updates
# https://security.snyk.io/vuln/SNYK-UBUNTU1804-OPENSSL-3314796
RUN apt upgrade --no-install-recommends -y openssl tar
# Create working directory
WORKDIR /usr/src/ultralytics
# Copy contents
# COPY . /usr/src/ultralytics # git permission issues inside container
RUN git clone https://github.com/ultralytics/ultralytics -b main /usr/src/ultralytics
ADD https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8n.pt /usr/src/ultralytics/
# Install pip packages
RUN python3 -m pip install --upgrade pip wheel
RUN pip install --no-cache -e ".[export]" albumentations comet pycocotools pytest-cov
# Run exports to AutoInstall packages
RUN yolo export model=tmp/yolov8n.pt format=edgetpu imgsz=32
RUN yolo export model=tmp/yolov8n.pt format=ncnn imgsz=32
# Requires <= Python 3.10, bug with paddlepaddle==2.5.0 https://github.com/PaddlePaddle/X2Paddle/issues/991
RUN pip install --no-cache paddlepaddle==2.4.2 x2paddle
# Fix error: `np.bool` was a deprecated alias for the builtin `bool` segmentation error in Tests
RUN pip install --no-cache numpy==1.23.5
# Remove exported models
RUN rm -rf tmp
# Set environment variables
ENV OMP_NUM_THREADS=1
# Avoid DDP error "MKL_THREADING_LAYER=INTEL is incompatible with libgomp.so.1 library" https://github.com/pytorch/pytorch/issues/37377
ENV MKL_THREADING_LAYER=GNU
# Usage Examples -------------------------------------------------------------------------------------------------------
# Build and Push
# t=ultralytics/ultralytics:latest && sudo docker build -f docker/Dockerfile -t $t . && sudo docker push $t
# Pull and Run with access to all GPUs
# t=ultralytics/ultralytics:latest && sudo docker pull $t && sudo docker run -it --ipc=host --gpus all $t
# Pull and Run with access to GPUs 2 and 3 (inside container CUDA devices will appear as 0 and 1)
# t=ultralytics/ultralytics:latest && sudo docker pull $t && sudo docker run -it --ipc=host --gpus '"device=2,3"' $t
# Pull and Run with local directory access
# t=ultralytics/ultralytics:latest && sudo docker pull $t && sudo docker run -it --ipc=host --gpus all -v "$(pwd)"/datasets:/usr/src/datasets $t
# Kill all
# sudo docker kill $(sudo docker ps -q)
# Kill all image-based
# sudo docker kill $(sudo docker ps -qa --filter ancestor=ultralytics/ultralytics:latest)
# DockerHub tag update
# t=ultralytics/ultralytics:latest tnew=ultralytics/ultralytics:v6.2 && sudo docker pull $t && sudo docker tag $t $tnew && sudo docker push $tnew
# Clean up
# sudo docker system prune -a --volumes
# Update Ubuntu drivers
# https://www.maketecheasier.com/install-nvidia-drivers-ubuntu/
# DDP test
# python -m torch.distributed.run --nproc_per_node 2 --master_port 1 train.py --epochs 3
# GCP VM from Image
# docker.io/ultralytics/ultralytics:latest
만약 프로젝트 Dockerfile을 만든다면,
FROM ultralytics/ultralytics
로 시작하여 Dockerfile을 작성하면 될것 같다
Mount
호스트 시스템의 파일 또는 디렉토리를 컨테이너 내부의 파일시스템에 연결하는 것을 의미
볼륨(Volume) 마운트:
- 볼륨은 도커 호스트에 의해 관리되는 데이터의 저장소입니다. 볼륨은 컨테이너가 삭제되어도 남아있고, 여러 컨테이너가 동시에 볼륨을 마운트하여 사용할 수 있습니다.
- 볼륨을 사용하면 호스트 파일시스템의 특정 위치에 종속되지 않으므로, 휴대성과 보안에 유리합니다.
- 예:
docker run -v my_volume:/path/in/container ...
바인드 마운트:
- 호스트 시스템의 어떤 파일이나 디렉토리를 컨테이너에 마운트합니다. 바인드 마운트는 호스트 시스템의 특정 경로를 대상으로 하며, 개발 환경에서 코드를 빠르게 반영하기 위해 자주 사용됩니다.
- 바인드 마운트는 볼륨 마운트보다 호스트에 더 강하게 결합되어 있어, 파일시스템의 경로에 의존합니다.
- 예:
docker run -v /path/on/host:/path/in/container ...
tmpfs 마운트:
- 호스트의 메모리에 저장되는 일시적인 파일시스템을 컨테이너에 마운트합니다. 컨테이너가 종료되면, tmpfs에 저장된 데이터는 삭제됩니다. 이 방법은 민감한 정보를 처리할 때 유용합니다.
- 예:
docker run --tmpfs /path/in/container ...
마운트를 사용할 때의 몇 가지 주의사항:
- 볼륨 마운트는 호스트에 종속되지 않아 여러 도커 호스트에서 볼륨을 쉽게 공유할 수 있습니다.
- 바인드 마운트는 호스트 시스템의 구체적인 경로를 컨테이너에 연결하므로, 개발 환경에서는 편리하지만 배포 환경에서는 볼륨 마운트를 사용하는 것이 좋습니다.
- 도커 컴포즈(Docker Compose)를 사용하면 볼륨과 바인드 마운트를 더 선언적으로 관리할 수 있습니다.
컨테이너에 마운트를 추가하는 전형적인 docker run
명령은 다음과 같습니다:
bashCopy code
docker run -v type=volume,source=my_volume,target=/path/in/container ...
혹은 바인드 마운트를 사용할 때는 다음과 같이 사용할 수 있습니다:
bashCopy code
docker run -v /path/on/host:/path/in/container ...
이렇게 마운트를 사용하면, 컨테이너 내부의 /path/in/container
에 호스트의 /path/on/host
가 연결되어, 컨테이너에서 해당 경로를 통해 파일을 읽고 쓸 수 있게 됩니다.