اجرای 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
| ویژگی | Jupyter | ComfyUI |
|---|---|---|
| نوع استفاده | کدنویسی Python | رابط گرافیکی |
| مناسب برای | automation و توسعه | طراحی workflow |
| انعطافپذیری | بسیار بالا | متوسط |
| مناسب مبتدیها | کمتر | بیشتر |
بسیاری از کاربران حرفهای از هر دو ابزار همزمان استفاده میکنند.