اجرای Stable Diffusion در Jupyter Notebook

🧠 مقدمه

در حالی که ابزارهایی مثل ComfyUI برای ساخت workflowهای بصری عالی هستند، گاهی نیاز دارید مستقیماً با کد Python کار کنید.

مثلاً برای:

  • تولید دسته‌ای تصاویر (Batch Generation)
  • آزمایش سریع مدل‌های جدید
  • ساخت اسکریپت‌های خودکار
  • یا ادغام Stable Diffusion در یک پروژه بزرگ‌تر

در این آموزش یاد می‌گیریم چگونه Stable Diffusion را در Jupyter Notebook اجرا کنیم و اولین تصویر خود را با Python تولید کنیم.

این روش از کتابخانه رسمی Diffusers از HuggingFace استفاده می‌کند که یکی از محبوب‌ترین ابزارها برای کار با مدل‌های diffusion است.


⚙️ مرحله ۱: نصب کتابخانه‌های مورد نیاز

اگر در آموزش قبلی Jupyter را نصب کرده‌ای، فقط کافی است پکیج‌های زیر را نصب کنی.

در یک سلول Notebook اجرا کن:

!pip install diffusers transformers accelerate safetensors torch torchvision pillow

این پکیج‌ها شامل:

کتابخانهکاربرد
diffusersاجرای مدل‌های diffusion
transformersمدیریت tokenizer و مدل‌های متنی
accelerateبهینه‌سازی اجرا روی GPU
torchاجرای مدل روی GPU
pillowذخیره و مدیریت تصاویر

⚡ مرحله ۲: بررسی GPU

قبل از اجرای مدل، بهتر است مطمئن شویم GPU در دسترس است.

در یک سلول جدید:

import torch

print("CUDA Available:", torch.cuda.is_available())

if torch.cuda.is_available():
    print("GPU:", torch.cuda.get_device_name(0))

اگر خروجی True باشد، یعنی Stable Diffusion روی GPU اجرا خواهد شد.


📦 مرحله ۳: لود کردن مدل Stable Diffusion

حالا می‌توانیم مدل را از HuggingFace لود کنیم.

from diffusers import StableDiffusionPipeline
import torch

model_id = "runwayml/stable-diffusion-v1-5"

pipe = StableDiffusionPipeline.from_pretrained(
    model_id,
    torch_dtype=torch.float16
)

pipe = pipe.to("cuda")

در اولین اجرا ممکن است دانلود مدل چند دقیقه طول بکشد.

مدل بعداً در کش سیستم ذخیره می‌شود.


🎨 مرحله ۴: تولید اولین تصویر

حالا یک prompt ساده می‌نویسیم و تصویر تولید می‌کنیم.

prompt = "a futuristic cyberpunk city at night, neon lights, ultra detailed"

image = pipe(
    prompt,
    num_inference_steps=30,
    guidance_scale=7.5
).images[0]

image

Jupyter تصویر را مستقیماً در خروجی سلول نمایش می‌دهد.


💾 مرحله ۵: ذخیره تصویر

برای ذخیره خروجی:

image.save("generated_image.png")

تصویر در همان پوشه Notebook ذخیره می‌شود.


🧪 مرحله ۶: استفاده از Negative Prompt

برای کنترل بهتر خروجی می‌توان از negative prompt استفاده کرد.

prompt = "portrait of a fantasy warrior, cinematic lighting"
negative_prompt = "blurry, low quality, distorted"

image = pipe(
    prompt,
    negative_prompt=negative_prompt,
    num_inference_steps=30,
    guidance_scale=8
).images[0]

image

🔁 مرحله ۷: تولید چند تصویر (Batch Generation)

گاهی می‌خواهیم چند تصویر مختلف از یک prompt تولید کنیم.

prompt = "ancient temple in a jungle, cinematic lighting"

images = pipe(
    prompt,
    num_images_per_prompt=4,
    num_inference_steps=30
).images

for i, img in enumerate(images):
    img.save(f"output_{i}.png")

این کد چهار تصویر مختلف تولید می‌کند.


📂 مرحله ۸: تولید تصاویر از لیست Prompt

اگر بخواهی چندین prompt را پشت سر هم اجرا کنی:

prompts = [
    "a futuristic robot portrait",
    "a fantasy castle on a mountain",
    "an astronaut riding a horse"
]

for i, prompt in enumerate(prompts):
    image = pipe(prompt).images[0]
    image.save(f"prompt_{i}.png")

این روش برای:

  • ساخت dataset
  • تست مدل
  • تولید مجموعه‌ای از تصاویر

خیلی مفید است.


⚙️ نکات بهینه‌سازی برای GPU ضعیف

اگر VRAM کارت گرافیک کم است، می‌توان چند بهینه‌سازی انجام داد.

روشتوضیح
کاهش resolutionمثلاً 512x512
کاهش stepsمثلاً 20
استفاده از float16کاهش مصرف VRAM
استفاده از attention slicingکاهش مصرف حافظه

مثال:

pipe.enable_attention_slicing()

🧭 Jupyter در مقابل ComfyUI

ویژگیJupyterComfyUI
نوع استفادهکدنویسی Pythonرابط گرافیکی
مناسب برایautomation و توسعهطراحی workflow
انعطاف‌پذیریبسیار بالامتوسط
مناسب مبتدی‌هاکمتربیشتر

بسیاری از کاربران حرفه‌ای از هر دو ابزار همزمان استفاده می‌کنند.


اگر نمی‌خواهی وقتت را صرف نصب و تنظیمات سرور کنی، می‌توانی یک سرور کاملاً آماده و از قبل پیاده‌سازی‌شده تهیه کنی و بلافاصله کار با GPU را شروع کنی.