Docker روی GPU ابری: اجرای ایمیج دلخواه با کارت گرافیک
·۷ دقیقه مطالعه·تیم جیپییو
اگر برنامه یا مدلتان را در یک ایمیج Docker بستهبندی کردهاید، میتوانید همان را روی GPU ابری جیپییو اجرا کنید: یک ماشین با قالب Ubuntu 22.04 VM اجاره میکنید، Docker و ابزار NVIDIA Container Toolkit را نصب میکنید و ایمیج خودتان را با دسترسی کامل به کارت گرافیک بالا میآورید. این راه برای کسی است که محیطش را دقیقاً همانطور که روی لپتاپ یا سرور شرکت ساخته، روی یک سرور GPU قویتر میخواهد.
کل کار، از اجاره تا اجرای اولین کانتینر با کارت گرافیک، حدود ۲۰ تا ۳۰ دقیقه طول میکشد. با یک کارت اقتصادی، هزینهٔ همین آزمایش در زمان نوشتن این مطلب کمتر از قیمت یک ساعت اجاره، یعنی زیر ۳۰ هزار تومان است.
پیشنیازها
- یک حساب در جیپییو. اگر ندارید، از صفحهٔ ثبتنام بسازید.
- موجودی کیف پول دستکم به اندازهٔ یک ساعت از نرخ ماشینی که انتخاب میکنید. روش شارژ با کارت به کارت را در اجاره کارت گرافیک ساعتی: شارژ کیف پول و محاسبهٔ هزینه توضیح دادهایم.
- یک کلید SSH ثبتشده در صفحهٔ حساب. ساخت و ثبت کلید را در شروع اجاره GPU: اولین ماشین در ۱۰ دقیقه ببینید.
- آشنایی مقدماتی با دستورهای
docker runوdocker build.
چرا قالب 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 با فیلتر مدل کارت و قیمت پیدا کنید.
اجاره و راهاندازی
- در بازار روی ماشین دلخواه بزنید و در بخش قالب، Ubuntu 22.04 VM را انتخاب کنید.
- اجاره را تأیید کنید و صبر کنید تا وضعیت ماشین «در حال اجرا» شود.
- در صفحهٔ ماشین، دستور 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.