Docker์—์„œ YOLOv5 ๐Ÿš€ ์‹œ์ž‘ํ•˜๊ธฐ

Welcome to the Ultralytics YOLOv5 Docker Quickstart Guide! This tutorial provides step-by-step instructions for setting up and running YOLOv5 within a Docker container. Using Docker enables you to run YOLOv5 in an isolated, consistent environment, simplifying deployment and dependency management across different systems. This approach leverages containerization to package the application and its dependencies together.

๋‹ค๋ฅธ ์„ค์ • ๋ฐฉ๋ฒ•์„ ์ฐพ์œผ์‹ ๋‹ค๋ฉด Colab ๋…ธํŠธ๋ถ Open In Colab Open In Kaggle, GCP Deep Learning VM ๋˜๋Š” Amazon AWS ๊ฐ€์ด๋“œ๋ฅผ ๊ณ ๋ คํ•ด ๋ณด์‹ญ์‹œ์˜ค. Ultralytics ๋ชจ๋ธ๊ณผ ํ•จ๊ป˜ Docker๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๊ฐœ์š”๋Š” Ultralytics Docker ํ€ต์Šคํƒ€ํŠธ ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๋‹ค์Œ ํ•ญ๋ชฉ์ด ์„ค์น˜๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค:

  1. Docker: ๊ณต์‹ Docker ์›น์‚ฌ์ดํŠธ์—์„œ Docker๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์—ฌ ์„ค์น˜ํ•˜์‹ญ์‹œ์˜ค. Docker๋Š” ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ ๋ฐ ๊ด€๋ฆฌ์— ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.
  2. NVIDIA ๋“œ๋ผ์ด๋ฒ„ (GPU ์ง€์›์— ํ•„์š”): NVIDIA ๋“œ๋ผ์ด๋ฒ„ ๋ฒ„์ „ 455.23 ์ด์ƒ์ด ์„ค์น˜๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ์ตœ์‹  ๋“œ๋ผ์ด๋ฒ„๋Š” NVIDIA ์›น์‚ฌ์ดํŠธ์—์„œ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. NVIDIA Container Toolkit (GPU ์ง€์›์— ํ•„์š”): ์ด ํˆดํ‚ท์„ ์‚ฌ์šฉํ•˜๋ฉด Docker ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ˜ธ์ŠคํŠธ ๋จธ์‹ ์˜ NVIDIA GPU์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ์ง€์นจ์€ ๊ณต์‹ NVIDIA Container Toolkit ์„ค์น˜ ๊ฐ€์ด๋“œ๋ฅผ ๋”ฐ๋ฅด์‹ญ์‹œ์˜ค.

NVIDIA Container Toolkit ์„ค์ • (GPU ์‚ฌ์šฉ์ž)

๋จผ์ € ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ NVIDIA ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์น˜๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค:

nvidia-smi

์ด ๋ช…๋ น์€ GPU ์ •๋ณด์™€ ์„ค์น˜๋œ ๋“œ๋ผ์ด๋ฒ„ ๋ฒ„์ „์„ ํ‘œ์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์œผ๋กœ NVIDIA Container Toolkit์„ ์„ค์น˜ํ•˜์‹ญ์‹œ์˜ค. ์•„๋ž˜ ๋ช…๋ น์€ Ubuntu์™€ ๊ฐ™์€ Debian ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ ๋ฐ Fedora/CentOS์™€ ๊ฐ™์€ RHEL ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ์— ์ผ๋ฐ˜์ ์ด์ง€๋งŒ, ์šด์˜์ฒด์ œ๋ณ„ ํŠน์ • ์ง€์นจ์€ ์œ„์— ๋งํฌ๋œ ๊ณต์‹ ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค:

curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
  && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list \
  | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' \
    | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

ํŒจํ‚ค์ง€ ๋ชฉ๋ก์„ ์—…๋ฐ์ดํŠธํ•˜๊ณ  nvidia-container-toolkit ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜์‹ญ์‹œ์˜ค:

sudo apt-get update

์ตœ์‹  ๋ฒ„์ „์˜ nvidia-container-toolkit์„ ์„ค์น˜ํ•˜์‹ญ์‹œ์˜ค:

sudo apt-get install -y nvidia-container-toolkit \
  nvidia-container-toolkit-base libnvidia-container-tools \
  libnvidia-container1
์„ ํƒ ์‚ฌํ•ญ: ํŠน์ • ๋ฒ„์ „์˜ nvidia-container-toolkit ์„ค์น˜

์„ ํƒ์ ์œผ๋กœ, NVIDIA_CONTAINER_TOOLKIT_VERSION ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜์—ฌ ํŠน์ • ๋ฒ„์ „์˜ nvidia-container-toolkit์„ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

export NVIDIA_CONTAINER_TOOLKIT_VERSION=1.17.8-1
sudo apt-get install -y \
  nvidia-container-toolkit=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
  nvidia-container-toolkit-base=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
  libnvidia-container-tools=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
  libnvidia-container1=${NVIDIA_CONTAINER_TOOLKIT_VERSION}
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

Docker๋กœ NVIDIA ๋Ÿฐํƒ€์ž„ ๊ฒ€์ฆ

docker info | grep -i runtime์„ ์‹คํ–‰ํ•˜์—ฌ ๋Ÿฐํƒ€์ž„ ๋ชฉ๋ก์— nvidia๊ฐ€ ๋‚˜ํƒ€๋‚˜๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค:

docker info | grep -i runtime

nvidia๊ฐ€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋Ÿฐํƒ€์ž„ ์ค‘ ํ•˜๋‚˜๋กœ ๋‚˜์—ด๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

1๋‹จ๊ณ„: YOLOv5 Docker ์ด๋ฏธ์ง€ ๊ฐ€์ ธ์˜ค๊ธฐ(Pull)

Ultralytics๋Š” Docker Hub์—์„œ ๊ณต์‹ YOLOv5 ์ด๋ฏธ์ง€๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. latest ํƒœ๊ทธ๋Š” ๊ฐ€์žฅ ์ตœ๊ทผ์˜ ์ €์žฅ์†Œ ์ปค๋ฐ‹์„ ์ถ”์ ํ•˜๋ฏ€๋กœ ํ•ญ์ƒ ์ตœ์‹  ๋ฒ„์ „์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜ค์‹ญ์‹œ์˜ค:

# Define the image name with tag
t=ultralytics/yolov5:latest

# Pull the latest YOLOv5 image from Docker Hub
sudo docker pull $t

Ultralytics YOLOv5 Docker Hub ์ €์žฅ์†Œ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ด๋ฏธ์ง€๋ฅผ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2๋‹จ๊ณ„: Docker ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ํ•˜๊ธฐ

์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜จ ํ›„์—๋Š” ์ปจํ…Œ์ด๋„ˆ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CPU๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ

CPU๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ€ํ™”ํ˜• ์ปจํ…Œ์ด๋„ˆ ์ธ์Šคํ„ด์Šค๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด -it ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. --ipc=host ํ”Œ๋ž˜๊ทธ๋Š” ํ˜ธ์ŠคํŠธ IPC ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ณต์œ ๋ฅผ ํ—ˆ์šฉํ•˜๋ฉฐ, ์ด๋Š” ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค์— ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

# Run an interactive container instance using CPU
sudo docker run -it --runtime=nvidia --ipc=host $t

GPU ์‚ฌ์šฉํ•˜๊ธฐ

์ปจํ…Œ์ด๋„ˆ ๋‚ด์—์„œ GPU ์•ก์„ธ์Šค๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด --gpus ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” NVIDIA Container Toolkit์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

# Run with access to all available GPUs
sudo docker run -it --runtime=nvidia --ipc=host --gpus all $t

# Run with access to specific GPUs (e.g., GPUs 2 and 3)
sudo docker run -it --runtime=nvidia --ipc=host --gpus '"device=2,3"' $t

๋ช…๋ น ์˜ต์…˜์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ Docker ์‹คํ–‰ ์ฐธ์กฐ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๋กœ์ปฌ ๋””๋ ‰ํ† ๋ฆฌ ๋งˆ์šดํŠธํ•˜๊ธฐ

์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ๋กœ์ปฌ ํŒŒ์ผ(๋ฐ์ดํ„ฐ์…‹, ๋ชจ๋ธ ๊ฐ€์ค‘์น˜ ๋“ฑ)์„ ์ž‘์—…ํ•˜๋ ค๋ฉด -v ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜ธ์ŠคํŠธ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ปจํ…Œ์ด๋„ˆ์— ๋งˆ์šดํŠธํ•˜์‹ญ์‹œ์˜ค:

# Mount /path/on/host (your local machine) to /path/in/container (inside the container)
sudo docker run -it --runtime=nvidia --ipc=host --gpus all -v /path/on/host:/path/in/container $t

/path/on/host๋ฅผ ๋จธ์‹ ์˜ ์‹ค์ œ ๊ฒฝ๋กœ๋กœ, /path/in/container๋ฅผ Docker ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ ์›ํ•˜๋Š” ๊ฒฝ๋กœ(์˜ˆ: /usr/src/datasets)๋กœ ๋ฐ”๊พธ์‹ญ์‹œ์˜ค.

3๋‹จ๊ณ„: Docker ์ปจํ…Œ์ด๋„ˆ ๋‚ด์—์„œ YOLOv5 ๐Ÿš€ ์‚ฌ์šฉํ•˜๊ธฐ

You are now inside the running YOLOv5 Docker container! From here, you can execute standard YOLOv5 commands for various Machine Learning and Deep Learning tasks like Object Detection.

# Train a YOLOv5 model on your custom dataset (ensure data is mounted or downloaded)
python train.py --data your_dataset.yaml --weights yolov5s.pt --img 640 # Start training

# Validate the trained model's performance (Precision, Recall, mAP)
python val.py --weights path/to/your/best.pt --data your_dataset.yaml # Validate accuracy

# Run inference on images or videos using a trained model
python detect.py --weights yolov5s.pt --source path/to/your/images_or_videos # Perform detection

# Export the trained model to various formats like ONNX, CoreML, or TFLite for deployment
python export.py --weights yolov5s.pt --include onnx coreml tflite # Export model

๋‹ค์–‘ํ•œ ๋ชจ๋“œ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์‚ฌ์šฉ๋ฒ•์€ ๋ฌธ์„œ๋ฅผ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค:

์ •๋ฐ€๋„(Precision), ์žฌํ˜„์œจ(Recall) ๋ฐ mAP์™€ ๊ฐ™์€ ํ‰๊ฐ€ ์ง€ํ‘œ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด์‹ญ์‹œ์˜ค. ONNX, CoreML, TFLite์™€ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ๋‚ด๋ณด๋‚ด๊ธฐ ํ˜•์‹์„ ์ดํ•ดํ•˜๊ณ  ๋‹ค์–‘ํ•œ ๋ชจ๋ธ ๋ฐฐํฌ ์˜ต์…˜์„ ํƒ์ƒ‰ํ•˜์‹ญ์‹œ์˜ค. ๋ชจ๋ธ ๊ฐ€์ค‘์น˜๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

Running YOLOv5 inside a Docker container on GCP

Docker ์ปจํ…Œ์ด๋„ˆ ๋‚ด์—์„œ YOLOv5๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์„ค์ •ํ•˜๊ณ  ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋Œ“๊ธ€