پرش به محتوا
← همهٔ یادداشت‌ها

Docker روی GPU ابری: اجرای ایمیج دلخواه با کارت گرافیک

·۷ دقیقه مطالعه·تیم جی‌پی‌یو

یک نهنگ گوژپشت که تقریباً تمام بدنش را از آب آبی بیرون کشیده و در حال پرش است، با صخره‌ها و جنگل کاج در ساحل پشت سرش.

اگر برنامه یا مدل‌تان را در یک ایمیج Docker بسته‌بندی کرده‌اید، می‌توانید همان را روی GPU ابری جی‌پی‌یو اجرا کنید: یک ماشین با قالب Ubuntu 22.04 VM اجاره می‌کنید، Docker و ابزار NVIDIA Container Toolkit را نصب می‌کنید و ایمیج خودتان را با دسترسی کامل به کارت گرافیک بالا می‌آورید. این راه برای کسی است که محیطش را دقیقاً همان‌طور که روی لپ‌تاپ یا سرور شرکت ساخته، روی یک سرور GPU قوی‌تر می‌خواهد.

کل کار، از اجاره تا اجرای اولین کانتینر با کارت گرافیک، حدود ۲۰ تا ۳۰ دقیقه طول می‌کشد. با یک کارت اقتصادی، هزینهٔ همین آزمایش در زمان نوشتن این مطلب کمتر از قیمت یک ساعت اجاره، یعنی زیر ۳۰ هزار تومان است.

پیش‌نیازها

چرا قالب Ubuntu 22.04 VM؟

بیشتر قالب‌های جی‌پی‌یو، مثل ComfyUI یا PyTorch، خودشان داخل یک کانتینر اجرا می‌شوند. اجرای Docker داخل کانتینر معمولاً کار نمی‌کند یا دردسر زیادی دارد. قالب Ubuntu 22.04 VM یک ماشین مجازی کامل اوبونتو است؛ آن‌جا سیستم‌عامل مال خودتان است و می‌توانید سرویس Docker را مثل یک سرور معمولی نصب و اجرا کنید.

اگر فقط به یک محیط آمادهٔ PyTorch یا TensorFlow نیاز دارید، Docker لازم نیست و قالب‌های آماده سریع‌ترند؛ فهرست کاملشان را در سرور GPU آماده: قالب‌ها چیست و کدام را انتخاب کنیم؟ آورده‌ایم. Docker وقتی به کار می‌آید که ایمیج اختصاصی خودتان را دارید یا می‌خواهید چند سرویس را با docker compose کنار هم بالا بیاورید.

انتخاب ماشین مناسب

خود Docker کارت خاصی نمی‌خواهد؛ انتخاب کارت به برنامه‌ای بستگی دارد که داخل کانتینر اجرا می‌کنید. برای آزمایش و یادگیری همین آموزش، یک کارت ۱۲ گیگابایتی کافی است. برای مدل‌های زبانی یا تصویری بزرگ‌تر، ۲۴ گیگابایت VRAM انتخاب امن‌تری است.

قیمت‌ها در زمان نوشتن این مطلب، برای ارزان‌ترین ماشین هر کارت در بازار:

کارت گرافیک VRAM قیمت ساعتی (در زمان نوشتن این مطلب)
RTX 3060 ۱۲ گیگابایت از حدود ۲۵ هزار تومان
RTX A4000 ۱۶ گیگابایت از حدود ۳۴ هزار تومان
RTX 3090 ۲۴ گیگابایت از حدود ۵۴ هزار تومان
RTX 4090 ۲۴ گیگابایت از حدود ۱۲۴ هزار تومان

پیشنهاد اقتصادی: RTX 3060 برای ساختن و آزمودن ایمیج. پیشنهاد سریع: RTX 4090 وقتی ایمیج آماده است و کار سنگین دارید. ماشین را از بازار GPU با فیلتر مدل کارت و قیمت پیدا کنید.

اجاره و راه‌اندازی

  1. در بازار روی ماشین دلخواه بزنید و در بخش قالب، Ubuntu 22.04 VM را انتخاب کنید.
  2. اجاره را تأیید کنید و صبر کنید تا وضعیت ماشین «در حال اجرا» شود.
  3. در صفحهٔ ماشین، دستور SSH آماده را با یک کلیک کپی کنید و در ترمینال خودتان اجرا کنید.

بعد از ورود، اول مطمئن شوید کارت گرافیک دیده می‌شود:

nvidia-smi

اگر جدولی با نام کارت و مقدار حافظه دیدید، درایور سر جایش است. اگر خطا گرفتید، پیش از ادامه با پشتیبانی تماس بگیرید. بعد ببینید Docker از قبل نصب است یا نه:

docker --version

نصب Docker

اگر دستور بالا نسخه‌ای نشان نداد، Docker را با اسکریپت رسمی خودش نصب کنید. این روش در مستندات Docker آمده است:

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

نصب یکی دو دقیقه طول می‌کشد. با این دستور مطمئن شوید سرویس کار می‌کند:

sudo docker run hello-world

نصب NVIDIA Container Toolkit

Docker به‌تنهایی کارت گرافیک را به کانتینر نمی‌دهد. ابزار NVIDIA Container Toolkit این پل را می‌سازد. دستورهای زیر از راهنمای نصب رسمی NVIDIA برداشته شده‌اند:

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
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit

حالا Docker را برای استفاده از این ابزار تنظیم و دوباره راه‌اندازی کنید:

sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

اولین کانتینر با دسترسی به GPU

آزمون اصلی این است که nvidia-smi از داخل یک کانتینر هم کارت را ببیند:

sudo docker run --rm --gpus all nvidia/cuda:12.4.1-base-ubuntu22.04 nvidia-smi

اگر همان جدول قبلی را دیدید، کار تمام است: هر کانتینری که با --gpus all اجرا کنید به کارت گرافیک دسترسی دارد. چون ماشین خارج از ایران است، دریافت ایمیج‌ها از Docker Hub روی خود ماشین با سرعت بالا انجام می‌شود و به اینترنت شما ربطی ندارد.

ساخت و اجرای ایمیج خودتان

فرض کنید یک اسکریپت پایتون دارید که با PyTorch روی GPU کار می‌کند. یک پوشه بسازید و یک اسکریپت آزمایشی در آن بگذارید:

mkdir ~/myapp && cd ~/myapp
cat > app.py <<'EOF'
import torch
print("CUDA:", torch.cuda.is_available())
print("GPU:", torch.cuda.get_device_name(0))
x = torch.rand(8192, 8192, device="cuda")
print("sum:", (x @ x).sum().item())
EOF

حالا یک Dockerfile کنار آن بنویسید. ایمیج پایه، نسخهٔ رسمی PyTorch با CUDA است و حدود ۴ گیگابایت حجم دارد:

cat > Dockerfile <<'EOF'
FROM pytorch/pytorch:2.14.1-cuda12.6-cudnn9-runtime
WORKDIR /app
COPY app.py .
CMD ["python", "app.py"]
EOF

ایمیج را بسازید و با دسترسی به GPU اجرا کنید:

sudo docker build -t myapp .
sudo docker run --rm --gpus all myapp

خروجی باید CUDA: True و نام کارت را نشان دهد. اگر ایمیجتان از قبل در Docker Hub یا رجیستری دیگری است، به‌جای build مستقیم docker pull بزنید.

اجرای سرویس وب داخل کانتینر

اگر کانتینرتان یک رابط وب یا API دارد، پورتش را روی ماشین باز کنید؛ مثلاً -p 8000:8000. بعد با دستور «تونل امن» که صفحهٔ ماشین به شما می‌دهد، همان پورت را از طریق SSH به لپ‌تاپ خودتان بیاورید و در مرورگر باز کنید. این‌طوری سرویس فقط از طریق کلید SSH شما در دسترس است.

اگر به مشکل خوردید

  • خطای could not select device driver "" with capabilities: [[gpu]]: Container Toolkit نصب یا تنظیم نشده. دو دستور nvidia-ctk runtime configure و systemctl restart docker را دوباره اجرا کنید.
  • خطای permission denied روی سوکت Docker: دستور را با sudo بزنید، یا کاربرتان را با sudo usermod -aG docker $USER به گروه docker اضافه کنید و یک بار از SSH خارج و دوباره وارد شوید.
  • خطای ناسازگاری نسخهٔ CUDA: نسخهٔ CUDA ایمیج نباید از نسخه‌ای که بالای خروجی nvidia-smi نوشته شده جدیدتر باشد. ایمیج پایه با CUDA قدیمی‌تر بردارید.
  • پر شدن دیسک: ایمیج‌های GPU چند گیگابایت‌اند. با df -h فضای خالی را ببینید و ایمیج‌های بلااستفاده را با sudo docker image prune -a پاک کنید.
  • CUDA out of memory داخل کانتینر: کانتینر همان VRAM کارت را می‌بیند؛ اندازهٔ batch یا مدل را کوچک کنید یا کارت با حافظهٔ بیشتر اجاره کنید.

هزینه و صرفه‌جویی

نصب Docker و Container Toolkit حدود ۱۰ دقیقه وقت می‌گیرد و فقط بار اول لازم است. هزینه دقیقه‌ای از کیف پول کم می‌شود و فقط وقتی ماشین در حال اجراست پول می‌دهید؛ پس وقتی کارتان تمام شد، ماشین را متوقف کنید. اگر دیگر لازمش ندارید، حذفش کنید.

یادتان باشد با حذف ماشین، دیسک و همهٔ ایمیج‌ها پاک می‌شوند و فضای ذخیره‌سازی دائمی نداریم. اگر ایمیج اختصاصی ساخته‌اید، قبل از حذف آن را به رجیستری خودتان push کنید، یا با sudo docker save myapp -o myapp.tar در یک فایل بریزید و با scp دانلود کنید. خروجی‌های برنامه را هم پیش از حذف بردارید.

قدم بعدی

حالا که کانتینرتان روی کارت گرافیک اجرا می‌شود، اگر کار پردازشی سنگین دارید، Jupyter روی GPU ابری: اولین کد PyTorch شما را هم ببینید تا بدانید کی یک قالب آماده از Docker سریع‌تر است. برای انتقال فایل‌های بزرگ به ماشین هم دانلود مدل هوش مصنوعی روی سرور GPU: scp و rsync به کارتان می‌آید.

پرسش‌های متداول

آیا می‌توان Docker را روی سرور GPU اجاره‌ای نصب کرد؟

بله، روی قالب Ubuntu 22.04 VM که یک ماشین مجازی کامل است. Docker و NVIDIA Container Toolkit را با دستورهای رسمی نصب می‌کنید و کانتینرها با گزینهٔ --gpus all به کارت گرافیک دسترسی پیدا می‌کنند.

چرا داخل قالب‌های ComfyUI یا PyTorch نمی‌شود Docker اجرا کرد؟

این قالب‌ها خودشان داخل کانتینر اجرا می‌شوند و اجرای Docker داخل کانتینر معمولاً ممکن نیست. برای Docker، ماشین مجازی لازم است.

چطور کانتینر Docker به GPU دسترسی پیدا می‌کند؟

با ابزار NVIDIA Container Toolkit. بعد از نصب و اجرای nvidia-ctk runtime configure، هر کانتینری که با --gpus all اجرا شود کارت را می‌بیند و nvidia-smi داخلش کار می‌کند.

آیا ایمیج‌های Docker بعد از حذف ماشین می‌مانند؟

نه. با حذف ماشین دیسکش پاک می‌شود. ایمیج را قبل از حذف به رجیستری خودتان بفرستید یا با docker save در یک فایل ذخیره و دانلود کنید.

برای اجرای Docker چه کارت گرافیکی اجاره کنم؟

به برنامهٔ داخل کانتینر بستگی دارد، نه به خود Docker. برای آزمایش یک کارت ۱۲ گیگابایتی مثل RTX 3060 کافی است؛ برای مدل‌های بزرگ‌تر، کارت ۲۴ گیگابایتی مثل RTX 3090 یا RTX 4090 بگیرید.


تصویر کاور: «Humpback Whale Breaching in Hervey Bay, Alaska» اثر NPS / Kaitlin Thoreson، از ویکی‌مدیا کامنز، لایسنس Public Domain.