Tüm Ürünler
Search
Belge Merkezi

Platform For AI:AI video üretimi için ComfyUI hizmeti dağıtma

Son Güncelleme:Oct 04, 2026

ComfyUI, Stable Diffusion üzerine inşa edilmiş, düğüm tabanlı bir AIGC aracıdır ve kısa form video üretimi ile animasyon prodüksiyonu için tasarlanmıştır. PAI-EAS, ComfyUI hizmetlerinin senaryo tabanlı dağıtımını destekler.

Başlamadan önce

Önemli sınırlamalar ve hususlar

Kaynak israfını ve yaygın hataları önlemek için dağıtım işlemine başlamadan önce bu bölümü okuyun.

  • Dağıtım kaynakları: GU30, NVIDIA A10 veya NVIDIA T4 GPU örnek türlerini kullanmanızı öneririz. ml.gu7i.c16m60.1-gu30 örnek türü en iyi fiyat/performans oranını sunar.

    Önemli

    Her PAI-EAS örneği tek bir ComfyUI işlemi çalıştırır ve yalnızca bir GPU'yu destekler (tek örnek-tek GPU veya çoklu örnek-tek GPU). Çoklu GPU paralel çıkarımı desteklenmez. Çoklu GPU örnek türlerini (örneğin 2×A10) seçmeyin. Çoklu GPU örnek türleri kaynak israfına neden olur ve tek görev performansını artırmaz.

  • Yatay ölçeklendirme: Eşzamanlılığı artırmak için çoklu GPU örnek türü seçmek yerine API Sürümünü kullanın ve çoğaltma sayısını artırın.

Bir dağıtım sürümü seçin

Kullanım durumunuza en uygun sürümü seçin:

Sürüm

Kullanım durumu

Erişim yöntemi

Temel özellikler

Faturalama yöntemi

Standart Sürüm

Tek kullanıcılı geliştirme ve test

  • WebUI

  • API çağrıları (senkron, çevrimiçi hata ayıklama ile)

  • Sınırlı eşzamanlılık

  • Tek bir örnek dağıtma

Ortak kaynaklarda dağıtıldığında, herhangi bir API çağrısı olmasa bile örnek çalışmaya başladığı anda faturalandırma başlar.

API Sürümü

Yüksek eşzamanlı üretim iş yükleri

API çağrıları (asenkron)

  • PAI-EAS kuyruk hizmeti üzerine kuruludur

  • Ek CPU kaynakları gerektirir

  • Yük dengelemeyi destekler

Küme Sürümü WebUI

Çok kullanıcılı ekipler ve eğitim

WebUI

  • İzole kullanıcı ortamları

  • Paylaşılan GPU kaynakları

  • Daha yüksek kaynak tüketimi

Bunun nasıl çalıştığı hakkında daha fazla bilgi için bkz. Küme Sürümü'nün çalışma şekli

Daha fazla faturalama bilgisi için bkz. Elastic Algorithm Service (EAS) faturalandırması.

Not

Senkron ve asenkron API çağrıları, PAI-EAS kuyruk hizmetinin kullanılıp kullanılmadığına göre farklılık gösterir:

  • Senkron çağrı: PAI-EAS kuyruk hizmetini kullanmadan isteği doğrudan çıkarım örneğine gönderir.

  • Asenkron çağrı: PAI-EAS kuyruk hizmetini kullanır. İstekler bir giriş kuyruğuna gönderilir ve sonuçlar bir abonelik modeli aracılığıyla iletilir.

ComfyUI kendi yerleşik asenkron kuyruk sistemine sahip olduğundan, senkron çağrılar bile arka planda asenkron olarak işlenir. Bir istek gönderdikten sonra sistem, çıkarım sonucunu yoklamak için kullandığınız bir Prompt ID döndürür.

Hizmeti dağıtma

Standart Sürüm, Küme Sürümü ve API Sürümü: Basitleştirilmiş bir deneyim için senaryo tabanlı model dağıtımını veya gelişmiş yapılandırma seçenekleri için özel model dağıtımını kullanabilirsiniz.

Yöntem 1: Senaryo tabanlı model dağıtımı (önerilen)

  1. PAI konsolu na oturum açın. Sayfanın üst kısmından bir bölge seçin. Ardından istenen çalışma alanını seçin ve Enter Elastic Algorithm Service (EAS) seçeneğine tıklayın.

  2. Elastic Algorithm Service (EAS) sayfasında Deploy Service seçeneğine tıklayın. Scenario-based Model Deployment bölümünde AI Video Generation: ComfyUI-based Deployment seçeneğine tıklayın.

  3. Aşağıdaki temel parametreleri yapılandırın ve diğer parametreleri gerektiği gibi ayarlayın:

    • Version: Bkz. Bir dağıtım sürümü seçin.

    • Model Settings: Örneğin, Object Storage Service (OSS) kullanarak bir paket ve dizin seçin. Dağıtım başarılı olduktan sonra sistem bu konumda gerekli ComfyUI dizinlerini otomatik olarak oluşturur.

      Önemli

      PAI-EAS, ComfyUI Manager veya Git Clone aracılığıyla ağdan doğrudan özel düğümlerin (eklentilerin) yüklenmesini desteklemez. Kendi modellerinizi kullanmak, özel düğümleri yüklemek veya API çağrıları yapmak için bu depolama bağlamasını yapılandırmanız gerekir.

    • Resource Configuration: Bir GPU örnek türü seçmelisiniz. GU30, NVIDIA A10 veya NVIDIA T4 önerilir. ml.gu7i.c16m60.1-gu30 en iyi fiyat/performans oranını sunar. Bu örnek türü mevcut değilse bunun yerine ecs.gn6i-c16g1.4xlarge seçin.

  4. Deploy seçeneğine tıklayın. Yaklaşık 5 dakika bekleyin. Service Status durumu Running olarak değiştiğinde dağıtım tamamlanır.

Yöntem 2: Özel model dağıtımı

  1. PAI konsolu na oturum açın. Sayfanın üst kısmından bir bölge seçin. Ardından istenen çalışma alanını seçin ve Enter Elastic Algorithm Service (EAS) seçeneğine tıklayın.

  2. Deploy Service seçeneğine tıklayın. Inference Service bölümünde, Custom Model Deployment bölümündeki Custom Deployment seçeneğine tıklayın.

  3. Aşağıdaki temel parametreleri yapılandırın:

    • Deployment Method: Image-based Deployment seçeneğini seçin ve Enable Web App onay kutusunu işaretleyin.

    • Image Configuration: Alibaba Cloud Image listesinde comfyui:2.3 seçeneğini belirleyin. Görüntü sürümü adlandırma kuralı: Standart Sürüm için x.x, API Sürümü için x.x-api ve Küme Sürümü için x.x-cluster.

      Not
      • Sürümler sık sık güncellendiğinden, dağıtım sırasında mevcut en son görüntü sürümünü seçin.

      • Her sürümün kullanım durumları için bkz. Bir dağıtım sürümü seçin.

    • Mount storage: Örnek olarak Object Storage Service (OSS) kullanarak bir paket ve dizin seçin. Dağıtım başarılı olduktan sonra sistem bu konumda gerekli ComfyUI dizinlerini otomatik olarak oluşturur. Paketin PAI-EAS hizmetiyle aynı bölgede olduğundan emin olun.

      Önemli

      PAI-EAS, ComfyUI Manager veya Git Clone aracılığıyla ağdan doğrudan özel düğümlerin (eklentilerin) yüklenmesini desteklemez. Kendi modellerinizi kullanmak, özel düğümleri yüklemek veya API çağrıları yapmak için bu depolama bağlamasını yapılandırmanız gerekir.

      • URI: Mevcut bir OSS dizini seçmek için image simgesine tıklayın. Örneğin, oss://bucket-test/data-oss/.

      • Mount Path: OSS dizinini konteyner yoluna /mnt/data bağlamak için bunu /mnt/data olarak ayarlayın.

    • Command to Run:

      • Bir görüntü sürümü seçtikten sonra sistem çalışma zamanı komutunu otomatik olarak yapılandırır.

      • Bir depolama bağlantısı yapılandırdıysanız, Command alanına --data-dir parametresini eklemeniz ve değerin Mount Path ile tam olarak eşleşmesi gerekir. Örneğin, python main.py --listen --port 8000 --data-dir /mnt/data --cache-root /stable-diffusion-cache.

    • Resource Type: Public Resources seçeneğini belirleyin.

    • Deployment: Bir GPU örnek türü seçmelisiniz. GU30, NVIDIA A10 veya NVIDIA T4 önerilir. ml.gu7i.c16m60.1-gu30 en iyi fiyat/performans oranını sunar. Bu örnek türü mevcut değilse bunun yerine ecs.gn6i-c16g1.4xlarge seçin.

  4. Deploy seçeneğine tıklayın. Dağıtım yaklaşık 5 dakika sürer. Service Status durumu Running olarak değiştiğinde hizmet dağıtılır.

WebUI aracılığıyla hizmeti kullanma

Önemli

Standart Sürüm ve Küme Sürümü, WebUI üzerinden erişimi destekler.

Web arayüzünü açma

Hedef hizmetin adına tıklayarak Overview sayfasını açın ve ardından sağ üst köşedeki Web Application seçeneğine tıklayın.

Sayfanın yüklenmesi uzun sürerse bkz. Sayfa donuyor veya yüklenmesi çok uzun sürüyor .

Şablon iş akışı kullanma

ComfyUI, yaygın görevler için önceden hazırlanmış şablonlar sağlar.

  1. Bir şablon seçin (örneğin, Wan VACE Text to Video).

    Not

    Şablonlar ComfyUI görüntü sürümleri arasında farklılık gösterir. Örnek şablon mevcut değilse farklı bir şablon seçin veya yerel dosya sisteminden bir iş akışı dosyası yükleyin.

  2. İş akışı yüklendikten sonra eksik modellerle ilgili hatalar görebilirsiniz. Bu hataları kapatın (bu mesajı bir daha göstermemeyi seçmenizi öneririz).

  3. Model yolları değişmiş olabileceğinden, iş akışını doğrudan çalıştırmak aşağıdaki hatayı üretebilir:

    Prompt outputs failed validation:
    UNETLoader:
    - Value not in list: unet_name: 'wan2.1_vace_14B_fp16.safetensors' not in (list of length 200)
    LoraLoader:
    - Value not in list: lora_name: 'Wan21_CausVid_14B_T2V_lora_rank32.safetensors' not in (list of length 364)

    Load models here bölümünde, UNET yükleyicisinde wan2.1_vace_14B_fp16.safetensors ve LoRA yükleyicisinde Wan21_CausVid_14B_T2V_lora_rank32.safetensors öğelerini yeniden seçin.

  4. İş akışı başarıyla çalıştıktan sonra oluşturulan video Save Video bölümünde görünür. image

Özel modeller ve düğümler kullanma

  1. Hizmetin yapılandırılmış bir depolama bağlantısına sahip olduğundan emin olun. Hizmet dağıtıldıktan sonra sistem, bağlı OSS veya NAS depolamasında aşağıdaki dizin yapısını otomatik olarak oluşturur.

    data-oss/
    ├── custom_nodes/     # Custom node files (ComfyUI plugins)
    ├── models/           # Model files
    ├── input/
    ├── output/
    ├── unet/
    └── temp/
  2. Model veya düğüm dosyalarını yükleyin. Örneğin, OSS kullanabilir ve konsol aracılığıyla dosyaları OSS'ye yükleyebilirsiniz. Büyük dosyalar için bkz. Büyük nesneleri OSS'ye nasıl yüklerim?.

    • Model dosyalarını yükleme: Modeli kullanan düğümün kaynak deposunun belgelerine bakın ve modeli models altındaki ilgili alt dizine yükleyin. Örneğin:

      • Checkpoint loader: Modelleri models/checkpoints dizinine yükleyin.

      • Style model loader: Modelleri models/styles dizinine yükleyin.

    • Düğüm dosyalarını yükleme: Özel düğümleri bağlı depolamadaki custom_nodes dizinine yükleyin.

  3. Yeni içeriği yükleyin.

    • Modeller: Sayfanın üst kısmında PaiCustom > Load New Models seçeneğine tıklayın. Model hala görünmüyorsa PaiCustom > Restart Process seçeneğine tıklayın. İşlem yeniden başladıktan sonra tarayıcı sayfasını yenileyin.

    • Düğümler: Restart Process seçeneğine tıklayın. İşlem yeniden başladıktan sonra tarayıcı sayfasını yenileyin.

API aracılığıyla hizmeti çağırma

Otomatik içerik üretimi için uygulamalarınıza entegre etmek üzere ComfyUI hizmetini API'si aracılığıyla çağırabilirsiniz. Temel iş akışı: bir iş akışı JSON'u gönderin > bir görev kimliği alın > oluşturma sonucunu almak için görev kimliğini kullanın.

Önemli
  • Sürüm desteği: Standart Sürüm yalnızca senkron çağrıları destekler ve çevrimiçi hata ayıklama sağlar. API Sürümü yalnızca asenkron çağrıları ve yalnızca /prompt uç noktasını destekler.

  • Oluşturulan çıktının alınması: Oluşturulan resimler ve videolar bağlı output dizininde saklanır. API yanıtları, dosyaların kendisi yerine dosya adlarını ve alt dizin adlarını döndürür. OSS için dosyaları indirmek üzere tam dosya yolunu oluşturun. Daha fazla bilgi için bkz. Alibaba Cloud SDK kullanarak OSS dosyalarını indirme.

API istek gövdesini hazırlama

İstek gövdesi biçimi çağrı yöntemine bağlıdır:

  • Senkron çağrı: İş akışı JSON içeriğini bir prompt anahtar-değer çiftinin içine sarın.

  • Asenkron çağrı: İstek gövdesi doğrudan iş akışı JSON içeriğidir.

Not

İş akışını indirme yöntemi: ComfyUI sayfasının sol üst köşesinde image > File > Export (API) seçeneğine tıklayın.

Yukarıdaki Wan VACE Text to Video iş akışı zaman alıcı olduğundan, daha kolay test için aşağıdaki test iş akışı sağlanmıştır (her çalıştırma yaklaşık 3 dakika sürer).

Test iş akışı için istek gövdesi örneğini görüntülemek için tıklayın

Senkron çağrı

{
    "prompt": {
        "3": {
            "inputs": {
                "seed": 423988542100860,
                "steps": 40,
                "cfg": 7,
                "sampler_name": "dpmpp_sde_gpu",
                "scheduler": "karras",
                "denoise": 1,
                "model": [
                    "4",
                    0
                ],
                "positive": [
                    "6",
                    0
                ],
                "negative": [
                    "7",
                    0
                ],
                "latent_image": [
                    "5",
                    0
                ]
            },
            "class_type": "KSampler",
            "_meta": {
                "title": "KSampler"
            }
        },
        "4": {
            "inputs": {
                "ckpt_name": "LandscapeBING_v10.safetensors"
            },
            "class_type": "CheckpointLoaderSimple",
            "_meta": {
                "title": "Checkpoint Loader (Simple)"
            }
        },
        "5": {
            "inputs": {
                "width": 720,
                "height": 1280,
                "batch_size": 1
            },
            "class_type": "EmptyLatentImage",
            "_meta": {
                "title": "Empty Latent"
            }
        },
        "6": {
            "inputs": {
                "text": "Rocket takes off from the ground, fire,sky, airplane",
                "speak_and_recognation": {
                    "__value__": [
                        false,
                        true
                    ]
                },
                "clip": [
                    "4",
                    1
                ]
            },
            "class_type": "CLIPTextEncode",
            "_meta": {
                "title": "CLIP Text Encoder"
            }
        },
        "7": {
            "inputs": {
                "text": "",
                "speak_and_recognation": {
                    "__value__": [
                        false,
                        true
                    ]
                },
                "clip": [
                    "4",
                    1
                ]
            },
            "class_type": "CLIPTextEncode",
            "_meta": {
                "title": "CLIP Text Encoder"
            }
        },
        "8": {
            "inputs": {
                "samples": [
                    "3",
                    0
                ],
                "vae": [
                    "4",
                    2
                ]
            },
            "class_type": "VAEDecode",
            "_meta": {
                "title": "VAE Decode"
            }
        },
        "9": {
            "inputs": {
                "filename_prefix": "ComfyUI",
                "images": [
                    "8",
                    0
                ]
            },
            "class_type": "SaveImage",
            "_meta": {
                "title": "Save Image"
            }
        },
        "13": {
            "inputs": {
                "seed": 788620942678235,
                "steps": 40,
                "cfg": 2.5,
                "sampler_name": "euler_ancestral",
                "scheduler": "karras",
                "denoise": 1,
                "model": [
                    "17",
                    0
                ],
                "positive": [
                    "16",
                    0
                ],
                "negative": [
                    "16",
                    1
                ],
                "latent_image": [
                    "16",
                    2
                ]
            },
            "class_type": "KSampler",
            "_meta": {
                "title": "KSampler"
            }
        },
        "14": {
            "inputs": {
                "samples": [
                    "13",
                    0
                ],
                "vae": [
                    "18",
                    2
                ]
            },
            "class_type": "VAEDecode",
            "_meta": {
                "title": "VAE Decode"
            }
        },
        "15": {
            "inputs": {
                "filename_prefix": "ComfyUI",
                "fps": 10.000000000000002,
                "lossless": false,
                "quality": 85,
                "method": "default",
                "images": [
                    "14",
                    0
                ]
            },
            "class_type": "SaveAnimatedWEBP",
            "_meta": {
                "title": "Save WEBP"
            }
        },
        "16": {
            "inputs": {
                "width": 512,
                "height": 768,
                "video_frames": 35,
                "motion_bucket_id": 140,
                "fps": 15,
                "augmentation_level": 0.15000000000000002,
                "clip_vision": [
                    "18",
                    1
                ],
                "init_image": [
                    "8",
                    0
                ],
                "vae": [
                    "18",
                    2
                ]
            },
            "class_type": "SVD_img2vid_Conditioning",
            "_meta": {
                "title": "SVD_Image to Video_Conditioning"
            }
        },
        "17": {
            "inputs": {
                "min_cfg": 1,
                "model": [
                    "18",
                    0
                ]
            },
            "class_type": "VideoLinearCFGGuidance",
            "_meta": {
                "title": "Linear CFG Guidance"
            }
        },
        "18": {
            "inputs": {
                "ckpt_name": "svd_xt.safetensors"
            },
            "class_type": "ImageOnlyCheckpointLoader",
            "_meta": {
                "title": "Checkpoint Loader (Image Only)"
            }
        },
        "19": {
            "inputs": {
                "frame_rate": 10,
                "loop_count": 0,
                "filename_prefix": "comfyUI",
                "format": "video/h264-mp4",
                "pix_fmt": "yuv420p",
                "crf": 20,
                "save_metadata": true,
                "trim_to_audio": false,
                "pingpong": false,
                "save_output": true,
                "images": [
                    "14",
                    0
                ]
            },
            "class_type": "VHS_VideoCombine",
            "_meta": {
                "title": "Combine to Video"
            }
        }
    }
}

Asenkron çağrı

{
    "3": {
        "inputs": {
            "seed": 423988542100860,
            "steps": 40,
            "cfg": 7,
            "sampler_name": "dpmpp_sde_gpu",
            "scheduler": "karras",
            "denoise": 1,
            "model": [
                "4",
                0
            ],
            "positive": [
                "6",
                0
            ],
            "negative": [
                "7",
                0
            ],
            "latent_image": [
                "5",
                0
            ]
        },
        "class_type": "KSampler",
        "_meta": {
            "title": "KSampler"
        }
    },
    "4": {
        "inputs": {
            "ckpt_name": "LandscapeBING_v10.safetensors"
        },
        "class_type": "CheckpointLoaderSimple",
        "_meta": {
            "title": "Checkpoint Loader (Simple)"
        }
    },
    "5": {
        "inputs": {
            "width": 720,
            "height": 1280,
            "batch_size": 1
        },
        "class_type": "EmptyLatentImage",
        "_meta": {
            "title": "Empty Latent"
        }
    },
    "6": {
        "inputs": {
            "text": "Rocket takes off from the ground, fire,sky, airplane",
            "speak_and_recognation": {
                "__value__": [
                    false,
                    true
                ]
            },
            "clip": [
                "4",
                1
            ]
        },
        "class_type": "CLIPTextEncode",
        "_meta": {
            "title": "CLIP Text Encoder"
        }
    },
    "7": {
        "inputs": {
            "text": "",
            "speak_and_recognation": {
                "__value__": [
                    false,
                    true
                ]
            },
            "clip": [
                "4",
                1
            ]
        },
        "class_type": "CLIPTextEncode",
        "_meta": {
            "title": "CLIP Text Encoder"
        }
    },
    "8": {
        "inputs": {
            "samples": [
                "3",
                0
            ],
            "vae": [
                "4",
                2
            ]
        },
        "class_type": "VAEDecode",
        "_meta": {
            "title": "VAE Decode"
        }
    },
    "9": {
        "inputs": {
            "filename_prefix": "ComfyUI",
            "images": [
                "8",
                0
            ]
        },
        "class_type": "SaveImage",
        "_meta": {
            "title": "Save Image"
        }
    },
    "13": {
        "inputs": {
            "seed": 788620942678235,
            "steps": 40,
            "cfg": 2.5,
            "sampler_name": "euler_ancestral",
            "scheduler": "karras",
            "denoise": 1,
            "model": [
                "17",
                0
            ],
            "positive": [
                "16",
                0
            ],
            "negative": [
                "16",
                1
            ],
            "latent_image": [
                "16",
                2
            ]
        },
        "class_type": "KSampler",
        "_meta": {
            "title": "KSampler"
        }
    },
    "14": {
        "inputs": {
            "samples": [
                "13",
                0
            ],
            "vae": [
                "18",
                2
            ]
        },
        "class_type": "VAEDecode",
        "_meta": {
            "title": "VAE Decode"
        }
    },
    "15": {
        "inputs": {
            "filename_prefix": "ComfyUI",
            "fps": 10.000000000000002,
            "lossless": false,
            "quality": 85,
            "method": "default",
            "images": [
                "14",
                0
            ]
        },
        "class_type": "SaveAnimatedWEBP",
        "_meta": {
            "title": "Save WEBP"
        }
    },
    "16": {
        "inputs": {
            "width": 512,
            "height": 768,
            "video_frames": 35,
            "motion_bucket_id": 140,
            "fps": 15,
            "augmentation_level": 0.15000000000000002,
            "clip_vision": [
                "18",
                1
            ],
            "init_image": [
                "8",
                0
            ],
            "vae": [
                "18",
                2
            ]
        },
        "class_type": "SVD_img2vid_Conditioning",
        "_meta": {
            "title": "SVD_Image to Video_Conditioning"
        }
    },
    "17": {
        "inputs": {
            "min_cfg": 1,
            "model": [
                "18",
                0
            ]
        },
        "class_type": "VideoLinearCFGGuidance",
        "_meta": {
            "title": "Linear CFG Guidance"
        }
    },
    "18": {
        "inputs": {
            "ckpt_name": "svd_xt.safetensors"
        },
        "class_type": "ImageOnlyCheckpointLoader",
        "_meta": {
            "title": "Checkpoint Loader (Image Only)"
        }
    },
    "19": {
        "inputs": {
            "frame_rate": 10,
            "loop_count": 0,
            "filename_prefix": "comfyUI",
            "format": "video/h264-mp4",
            "pix_fmt": "yuv420p",
            "crf": 20,
            "save_metadata": true,
            "trim_to_audio": false,
            "pingpong": false,
            "save_output": true,
            "images": [
                "14",
                0
            ]
        },
        "class_type": "VHS_VideoCombine",
        "_meta": {
            "title": "Combine to Video"
        }
    }
}

Senkron çağrılar

Senkron çağrılar, istekleri doğrudan PAI-EAS hizmet örneğine gönderir. Bu yöntem geliştirme, test ve düşük eşzamanlılık senaryoları için uygundur.

Çevrimiçi hata ayıklama

Çevrimiçi hata ayıklama, kod yazmadan konsolda doğrudan API çağrılarını test etmenizi sağlar. Bu, iş akışı yapılandırmalarını hızlı bir şekilde doğrulamak için kullanışlıdır.

Elastic Algorithm Service (EAS) sayfasında, hedef hizmetin Actions sütunundaki Online Debugging seçeneğine tıklayarak çevrimiçi hata ayıklama sayfasını açın.

  1. Prompt ID'yi almak için bir POST isteği gönderin.

    1. Hata ayıklama sayfasının Request Parameter Online Tuning bölümünde, hazırlanan istek gövdesini Body alanına girin ve istek URL'sine /prompt ekleyin.

    2. Send Request seçeneğine tıklayarak yanıtı Debugging Information bölümünde görüntüleyin.

      İstek gönderildikten sonra sağ taraftaki Debug Info paneli yanıtı görüntüler: Durum Kodu 200'dür ve Yanıt Gövdesi prompt_id (örneğin, 130bc***c8c-3a1359a04e5d), number ve node_errors alanlarını içerir. Bir sonraki adımda kullanmak üzere prompt_id değerini kaydedin.

  2. Prompt ID'yi kullanarak çıkarım sonucunu almak için bir GET isteği gönderin.

    1. Request Parameter Online Tuning bölümünde, istek yöntemini GET olarak değiştirin ve URL alanına /history/<prompt id> girin.

      <prompt id> ifadesini 1. Adımda elde edilen Prompt ID ile değiştirin.

    2. Çıkarım sonucunu almak için Send Request seçeneğine tıklayın.

      Oluşturulan çıktıyı bağlı depolamanın output dizininde bulabilirsiniz.

Kod tabanlı çağrılar

ComfyUI'yi uygulamalarınıza entegre etmek için API'yi kod aracılığıyla çağırabilirsiniz. İş akışı çevrimiçi hata ayıklama ile aynıdır: önce Prompt ID'yi alın, ardından çıkarım sonucunu sorgulayın.

  1. Çağrı bilgilerini görüntüleyin.

    1. Inference Services sekmesinde, hedef hizmetin adına tıklayarak Overview sayfasını açın.

    2. Basic Information bölümünde View Call Information seçeneğine tıklayın.

    3. Call Information panelinde erişim uç noktasını ve belirteci kopyalayın:

      Call Information panelinde iki sekme bulunur: Shared Gateway ve VPC Direct Connection. Genel uç nokta, VPC uç noktası ve belirteç Shared Gateway sekmesindedir.

      • Gerektiğine göre Public Endpoint veya VPC Endpoint seçeneğini belirleyin.

      • Aşağıdaki örneklerde erişim uç noktası için ve belirteç için kullanılmaktadır.

  2. Prompt ID'yi almak için bir istek gönderin.

    • HTTP yöntemi: POST.

    • İstek URL'si: <EAS_ENDPOINT>/prompt. <EAS_ENDPOINT> şu şekilde biterse /, sondaki eğik çizgiyi kaldırın. Son URL şu şekilde görünür: http://comfyui****.175805416243****.cn-beijing.pai-eas.aliyuncs.com/prompt.

    • İstek üstbilgileri:


      Header


      Value


      Description


      Authorization


      <EAS_TOKEN>


      Yetkilendirme belirteci.


      Content-Type


      application/json


      İstek gövdesi biçimini belirtir.

    Kod örnekleri:

    cURL

    curl --location --request POST '<EAS_ENDPOINT>/prompt' \
    --header 'Authorization: <EAS_TOKEN>' \
    --header 'Content-Type: application/json' \
    --data-raw '{
        "prompt":
        ...omitted
    }'

    --data-raw parametresi istek gövdesini içerir.

    Python

    Kod örneği:

    import requests
    import json
    
    # Replace <EAS_ENDPOINT> and <EAS_TOKEN> with the endpoint and token from Step 1.
    service_url = "<EAS_ENDPOINT>"
    token = "<EAS_TOKEN>"
    
    if service_url[-1] == "/":
        service_url = service_url[:-1]
    
    # Request body: set the "prompt" value to the workflow JSON content.
    payload = """{
        "prompt":
        ...omitted
    }"""
    payload = json.loads(payload)
    
    session = requests.session()
    session.headers.update({"Authorization": token})
      
    response = session.post(url=f'{service_url}/prompt', json=payload)
    if response.status_code != 200:
        raise Exception(response.content)
    
    data = response.json()
    print(data)

    Örnek yanıt:

    {
        "prompt_id": "021ebc5b-e245-4e37-8bd3-00f7b949****",
        "number": 5,
        "node_errors": {}
    }

    Prompt ID'yi yanıttan ayıklayın.

  3. Çıkarım sonucunu alın.

    • HTTP yöntemi: GET

    • İstek URL'si: <EAS_ENDPOINT>/history/<prompt_id>. <prompt_id> ifadesini 1. Adımda elde edilen prompt_id ile değiştirin.

    • İstek üstbilgileri:


      Header


      Value


      Description


      Authorization


      <EAS_TOKEN>


      1. Adımda elde edilen yetkilendirme belirteci.

    Kod örnekleri:

    cURL

    curl --location --request GET '<EAS_ENDPOINT>/history/<prompt_id>' \
         --header 'Authorization: <EAS_TOKEN>'

    Python

    import requests
    
    # Replace <EAS_ENDPOINT> and <EAS_TOKEN> with the endpoint and token from Step 1.
    # Replace <prompt_id> with the prompt_id obtained in Step 2.
    service_url = "<EAS_ENDPOINT>"
    token = "<EAS_TOKEN>"
    prompt_id = "<prompt_id>"
    
    if service_url[-1] == "/":
        service_url = service_url[:-1]
    
    session = requests.session()
    session.headers.update({"Authorization": token})
    
    response = session.get(url=f'{service_url}/history/{prompt_id}')
    
    if response.status_code != 200:
        raise Exception(response.content)
    
    data = response.json()
    print(data)

    Örnek yanıt:

    Yanıt örneğini görüntülemek için tıklayın

    {
        "130bcd6b-5bb5-496c-9c8c-3a1359a0****": {
            "prompt": "...(omitted)",
            "outputs": {
                "9": {
                    "images": [
                        {
                            "filename": "ComfyUI_1712645398_18dba34d-df87-4735-a577-c63d5506a6a1_.png",
                            "subfolder": "",
                            "type": "output"
                        }
                    ]
                },
                "15": {
                    "images": [
                        {
                            "filename": "ComfyUI_1712645867_.webp",
                            "subfolder": "",
                            "type": "output"
                        }
                    ],
                    "animated": [
                        true
                    ]
                },
                "19": {
                    "gifs": [
                        {
                            "filename": "comfyUI_00002.mp4",
                            "subfolder": "",
                            "type": "output",
                            "format": "video/h264-mp4"
                        }
                    ]
                }
            },
            "status": {
                "status_str": "success",
                "completed": true,
                "messages": "...(omitted)"
            }
        }
    }

    Yanıttaki outputs alanı oluşturulan resimleri (PNG/WebP) ve videoları (MP4) içerir. Dosya adlarını aratarak bu dosyaları bağlı depolamanın output dizininde bulabilirsiniz.

Asenkron çağrılar

Asenkron çağrılar yüksek eşzamanlı üretim iş yükleri için tasarlanmıştır. Bu yöntem yük dengeleme için PAI-EAS kuyruk hizmetini kullanır. İstekler hemen yanıt verir ve sonuçları sonuç kuyruğuna abone olarak alırsınız.

Önemli

Asenkron çağrılar yalnızca api_prompt uç noktasını destekler. task_id parametresi, istekleri sonuçlarla eşleştirmek için kritik bir tanımlayıcıdır. İsteği ilgili kuyruk sonucuyla ilişkilendirebilmek için her istek için benzersiz bir değer atayın. İstek yolu şöyledir:

{service_url}/api_prompt?task_id={benzersiz bir değer atayın}

  1. Çağrı bilgilerini görüntüleyin.

    Inference Services sekmesinde, hedef hizmetin adına tıklayarak Overview sayfasını açın. Basic Information bölümünde View Call Information seçeneğine tıklayın. Call Information iletişim kutusunun Asynchronous Call sekmesinde hizmet erişim uç noktasını ve belirteci görüntüleyin.

    image

    Aşağıdaki bölümlerde <EAS_ENDPOINT> Internet Input Endpoint (çağrı yapan PAI-EAS ile aynı VPC'deyse VPC Input Endpoint kullanabilirsiniz) ve <EAS_TOKEN> ise Token anlamına gelir.

  2. Bir istek gönderin.

    Kod örneği:

    import requests
    import json
    
    service_url = "<EAS_ENDPOINT>"
    token = "<EAS_TOKEN>"
    
    if service_url[-1] == "/":
        service_url = service_url[:-1]
    
    session = requests.session()
    session.headers.update({"Authorization":token})
    
    # Request body - workflow JSON, no need to wrap with "prompt".
    # Use triple quotes to define it as a multi-line string, otherwise you need to capitalize the boolean values (true and false) in the workflow JSON.
    payload = """{
        '3':
        ...omitted
      }
      """
    payload = json.loads(payload)
    
    for i in range(5):
      # task_id is the key identifier for matching requests and results. Assign a unique value to each request to correlate with the queue results later.
      response = session.post(url=f'{service_url}/api_prompt?task_id=txt2img_{i}', json=payload)
      if response.status_code != 200:
        exit(f"send request error:{response.content}")
      else:
        print(f"send {i} success, index is {response.content}")
  3. Sonuçlara abone olun.

    1. eas_prediction SDK'yı yükleyin.

      pip install eas_prediction  --user
    2. Sonucu almak için aşağıdaki kodu çalıştırın.

      from eas_prediction import QueueClient
      from urllib.parse import urlparse, urlunparse
      
      service_url     = "<EAS_ENDPOINT>"
      token           = "<EAS_TOKEN>"
      
      # Parse service URL
      def parse_service_url(service_url):
          parsed = urlparse(service_url)
          service_domain = f"{parsed.scheme}://{parsed.netloc}"
          path_parts = [p for p in parsed.path.strip('/').split('/') if p]
          service_name = path_parts[-1]
          return service_domain, service_name
      
      service_domain, service_name = parse_service_url(service_url)
      print(f"service_domain: {service_domain}, service_name: {service_name}.")
      
      # Create result queue client
      sink_queue = QueueClient(service_domain, f'{service_name}/sink')
      sink_queue.set_token(token)
      sink_queue.init()
      
      # Listen for results
      watcher = sink_queue.watch(0, 5, auto_commit=False)
      for x in watcher.run():
          if 'task_id' in x.tags:
              print('index {} task_id is {}'.format(x.index, x.tags['task_id']))
          print(f'index {x.index} data is {x.data}')
          # Commit acknowledgment
          sink_queue.commit(x.index)

      Örnek yanıt:

      index 42 task_id is txt2img_0
      index 42 data is b'[{"type": "executed", "data": {"node": "9", "output": {"images": [{"filename": "ComfyUI_1712647318_8e7f3c93-d2a8-4377-92d5-8eb552adc172_.png", "subfolder": "", "type": "output"}]}, "prompt_id": "c3c983b6-f92b-4dd5-b4dc-442db4d1736f"}}, {"type": "executed", "data": {"node": "15", "output": {"images": [{"filename": "ComfyUI_1712647895_.webp", "subfolder": "", "type": "output"}], "animated": [true]}, "prompt_id": "c3c983b6-f92b-4dd5-b4dc-442db4d1736f"}}, {"type": "executed", "data": {"node": "19", "output": {"gifs": [{"filename": "comfyUI_00001.mp4", "subfolder": "", "type": "output", "format": "video/h264-mp4"}]}, "prompt_id": "c3c983b6-f92b-4dd5-b4dc-442db4d1736f"}}, {"9": {"images": [{"filename": "ComfyUI_1712647318_8e7f3c93-d2a8-4377-92d5-8eb552adc172_.png", "subfolder": "", "type": "output"}]}, "15": {"images": [{"filename": "ComfyUI_1712647895_.webp", "subfolder": "", "type": "output"}], "animated": [true]}, "19": {"gifs": [{"filename": "comfyUI_00001.mp4", "subfolder": "", "type": "output", "format": "video/h264-mp4"}]}}]'
      index 43 task_id is txt2img_1
      index 43 data is b'[{"9": {"images": [{"filename": "ComfyUI_1712647318_8e7f3c93-d2a8-4377-92d5-8eb552adc172_.png", "subfolder": "", "type": "output"}]}, "15": {"images": [{"filename": "ComfyUI_1712647895_.webp", "subfolder": "", "type": "output"}], "animated": [true]}, "19": {"gifs": [{"filename": "comfyUI_00001.mp4", "subfolder": "", "type": "output", "format": "video/h264-mp4"}]}}]'
      index 44 task_id is txt2img_2
      index 44 data is b'[{"9": {"images": [{"filename": "ComfyUI_1712647318_8e7f3c93-d2a8-4377-92d5-8eb552adc172_.png", "subfolder": "", "type": "output"}]}, "15": {"images": [{"filename": "ComfyUI_1712647895_.webp", "subfolder": "", "type": "output"}], "animated": [true]}, "19": {"gifs": [{"filename": "comfyUI_00001.mp4", "subfolder": "", "type": "output", "format": "video/h264-mp4"}]}}]'
      index 45 task_id is txt2img_3
      index 45 data is b'[{"9": {"images": [{"filename": "ComfyUI_1712647318_8e7f3c93-d2a8-4377-92d5-8eb552adc172_.png", "subfolder": "", "type": "output"}]}, "15": {"images": [{"filename": "ComfyUI_1712647895_.webp", "subfolder": "", "type": "output"}], "animated": [true]}, "19": {"gifs": [{"filename": "comfyUI_00001.mp4", "subfolder": "", "type": "output", "format": "video/h264-mp4"}]}}]'
      index 46 task_id is txt2img_4
      index 46 data is b'[{"9": {"images": [{"filename": "ComfyUI_1712647318_8e7f3c93-d2a8-4377-92d5-8eb552adc172_.png", "subfolder": "", "type": "output"}]}, "15": {"images": [{"filename": "ComfyUI_1712647895_.webp", "subfolder": "", "type": "output"}], "animated": [true]}, "19": {"gifs": [{"filename": "comfyUI_00001.mp4", "subfolder": "", "type": "output", "format": "video/h264-mp4"}]}}]'

      Çıkarım sonucu dosyalarını bağlı depolamanın output dizininde bulabilirsiniz.

SSS

Aşağıda ComfyUI dağıtımı ve kullanımı için yaygın sorunlar ve çözümler yer almaktadır.

Dağıtım sorunları

S: Hizmet bekleme durumunda kalıyor veya ComfyUI çıktı üretemiyor

Bu genellikle yetersiz kaynaklardan kaynaklanır. Hizmet görüntüsünün ve örnek türünün doğru yapılandırıldığını doğrulayın. GU30, NVIDIA A10 veya NVIDIA T4 GPU örnek türlerini öneririz. ml.gu7i.c16m60.1-gu30 örnek türü en iyi fiyat/performans oranını sunar.

Model ve düğüm sorunları

S: WebUI'da "Missing Model" hatası görüntüleniyor

Sorun: Missing Model başlıklı bir iletişim kutusu, checkpoints/v1-5-pruned-emaonly-fp16.safetensors konumundaki modelin eksik olduğunu gösterir ve soldaki kırmızı uyarı Invalid directory specified (does this require custom nodes?) şeklinde görünür.

Çözüm: Bu hatayı güvenle yok sayabilirsiniz. Bu doğrulama kontrolü PAI üzerinde dağıtılan ComfyUI için geçerli değildir. Bunun yerine gerçek çalışma zamanı hatalarına bakın.

Bu mesajı bir daha gösterme seçeneğini seçmenizi veya Settings içinde model doğrulamayı devre dışı bırakmanızı öneririz.

S: Yeni bir model yükledim ancak bulamıyorum

Çözüm:

  1. PaiCustom seçeneğine tıklayın ve Load New Models seçeneğini belirleyin.

  2. Model hala görünmüyorsa Restart Process seçeneğine tıklayın.

S: Model yükleyici "undefined" gösteriyor

Önce model dosyasının model yükleyici düğümü tarafından gereken doğru dizine yerleştirildiğini doğrulayın.

Dağıtımdan sonra modeli yüklediyseniz hizmeti yeniden başlatın.

S: Düğüm bulunamıyor

S: ComfyUI Manager modelleri indiremiyor veya düğümleri yükleyemiyor

PAI-EAS üzerinde dağıtılan ComfyUI ile ComfyUI Manager kullanmanızı önermiyoruz. ComfyUI Manager, GitHub gibi harici kaynaklardan model ve eklenti kodlarını indirir; bu işlem ağ kısıtlamaları nedeniyle sık sık başarısız olur.

Bunun yerine model ve düğüm dosyalarını bağlı depolamaya yükleyin. Daha fazla bilgi için bkz. Özel modeller kullanma ve düğümleri (ComfyUI eklentileri) yükleme.

S: Kullanılabilir model dosyaları ve düğümler (ComfyUI eklentileri) nasıl görüntülenir

  • Model dosyaları: İlgili model yükleyici düğümünden kontrol edin. Örneğin, Checkpoint loader'ın açılır listesindeki kullanılabilir model dosyalarını görüntüleyin.

  • Düğümler: WebUI sayfasına sağ tıklayın ve bağlam menüsünde Add Node seçeneğine tıklayarak yüklü tüm ComfyUI eklentilerini görüntüleyin.

Çalışma zamanı hataları

S: Sayfa donuyor veya yüklenmesi çok uzun sürüyor

  • Sayfayı yenileyin, tarayıcı önbelleğini temizleyin veya hizmeti gizli/özel tarama modunda açın.

  • Depolama bağlıysa input/, output/ ve temp/ dizinlerindeki dosyaları silin.

  • Hizmeti yeniden başlatmayı deneyin.

S: İşlem iş akışı sırasında yeniden başlıyor

Örnek günlüklerinde run.sh: line 54: 531285 Killed python -u main_run.py "$@" ifadesi varsa, işlem bellek yetersizliği (OOM) nedeniyle sonlandırılmıştır. OOM olayından sonra işlem otomatik olarak yeniden başlar.

S: RuntimeError: CUDA error: out of memory

Bu, GPU belleğinin tükendiği anlamına gelir. Resim modelleri için resim çözünürlüğünü veya toplu iş boyutunu azaltın. Video modelleri için kare sayısını veya çözünürlüğü azaltın.

S: API çağrısı "url not found" veya "404 page not found" döndürüyor

  1. API uç noktası URL'sinin eksiksiz olduğunu doğrulayın. Senkron çağrılar için /prompt yolunu eklemeniz gerekir.

Diğer

S: xFormers hızlandırma performansı

xFormers, resim ve video oluşturma süresini ve GPU bellek kullanımını azaltan açık kaynaklı bir Transformer tabanlı hızlandırma aracıdır.

ComfyUI görüntülerinde xFormers hızlandırması varsayılan olarak etkindir. Hızlandırma etkisi iş akışının boyutuna bağlıdır ve özellikle NVIDIA GPU'lar ile GPU yoğun işlemlerde en belirgin iyileşmeler görülür.

Sonraki adımlar

ComfyUI hizmetini dağıttıktan sonra şunları yapabilirsiniz:

  • Hizmet izleme: Hizmet sağlığını gerçek zamanlı olarak izlemek için izleme ve uyarıları yapılandırın. Daha fazla bilgi için bkz. Hizmet izleme ölçümlerini görüntüleme.

  • Auto Scaling: Kaynak kullanımını ve maliyetleri optimize etmek için iş yüküne göre Auto Scaling ilkelerini yapılandırın. Daha fazla bilgi için bkz. Auto Scaling.

  • Maliyet optimizasyonu: PAI-EAS faturalandırma yöntemlerini anlayın ve maliyetleri düşürmek için doğru örnek türünü ve dağıtım sürümünü seçin. Daha fazla bilgi için bkz. Faturalandırmaya genel bakış.

Referans

Python paketlerini yükleme

Komut çalıştırarak .whl paketi yükleme

  1. Hizmetin yapılandırılmış bir depolama bağlantısına sahip olduğundan emin olun. Örneğin, OSS yolu (URI) oss://examplebucket/comfyui/ ve bağlama yolu /mnt/data/ olsun.

  2. .whl dosyasını oss://examplebucket/comfyui/models/whl dizinine yükleyin. whl dizini mevcut değilse önce oluşturun.

  3. Hizmetin Command to Run alanını güncelleyin: Çalışma zamanı komutunun başına pip install /mnt/data/models/whl/xxx.whl ekleyin. Bu komutta /mnt/data OSS bağlama yoludur ve xxx.whl .whl paketinin adıdır.

  4. Hizmeti yeniden başlatın.

Üçüncü taraf kitaplık yapılandırması aracılığıyla paket yükleme

  1. Hizmet ayrıntıları sayfasında sağ üst köşedeki Update seçeneğine tıklayın.

  2. Hizmet senaryo tabanlı model dağıtımı aracılığıyla dağıtıldıysa özel model dağıtımına geçiş yapın.

  3. Environment Information bölümünde, bağımlılıkları Third-party Library Configuration alanında yapılandırın.

  4. Güncellemeyi uygulamak için sayfanın alt kısmındaki Update seçeneğine tıklayın.

Görüntü sürümünü güncelleme

Hizmette OSS veya NAS depolaması bağlıysa özel modeller OSS veya NAS depolamasında saklanır ve görüntü sürümü güncellemesinden etkilenmez.

  1. Hizmet ayrıntıları sayfasında sağ üst köşedeki Update seçeneğine tıklayın.

  2. Hizmet senaryo tabanlı model dağıtımı aracılığıyla dağıtıldıysa özel model dağıtımına geçiş yapın.

  3. Service Configuration bölümünde JSON yapılandırmasını düzenleyin ve containers altındaki image alanını istenen sürüme güncelleyin (örneğin, 1.9'u hedef sürümle değiştirin).

  4. Update Directly seçeneğine tıklayın.

Özel geçerlilik süresiyle oturum açma gerektirmeyen bir URL oluşturma

Belirtilen bir geçerlilik süresiyle oturum açma gerektirmeyen bir web erişim URL'si oluşturmak için bir API kullanabilirsiniz.

  1. DescribeServiceSignedUrl API sayfasına gidin.

  2. Hizmet uç noktasını seçin.

  3. Aşağıdaki parametreleri ayarlayın:

    • ClusterId (Bölge) ve ServiceName: Bölgeyi ve hizmetin adını girin.

      EAS hizmetine genel bakış sayfasında Service Name alanı ServiceName değerini gösterir. Bölge, düğüm görüntüsü adresine gömülüdür (örneğin, cn-hangzhou ClusterId bölge değerine karşılık gelir). Hizmeti açmak için sağ üst köşedeki View Web Application seçeneğine tıklayabilirsiniz.

    • Type (Sayfa türü): Açılır listeden webview seçeneğini belirleyin.

    • Expire (Son kullanma süresi): Saniye cinsinden bir tamsayı girin. Maksimum değer 43200 saniyedir (12 saat). Gerektiğine göre ayarlayın.

    • Internal (VPC erişimi): false (genel erişim) veya true (VPC erişimi) olarak ayarlayın.

  4. Call API seçeneğine tıklayın. Yanıttaki SignedUrl alanı oturum açma gerektirmeyen web erişim URL'sini içerir.

WebUI'nın varsayılan dilini değiştirme

  1. WebUI sayfasında sol alt köşedeki Settings düğmesine tıklayın.

  2. Aşağıdaki iki konumda dili yapılandırın, ardından sayfayı yenileyip yeniden yükleyin.

    • Comfy > Locale.

    • Language > Locale.

Ek

Küme Sürümü'nün çalışma şekli

Aşağıdaki diyagram mimariyi göstermektedir:

image

Küme Sürümü, çok kullanıcılı senaryolar için tasarlanmıştır. İstemcileri arka uç çıkarım örneklerinden ayıran bir proxy katmanı sunar.

  • Her kullanıcı bağımsız bir arka uç ortamına ve çalışma dizinine sahiptir ancak arka uç GPU çıkarım örnek havuzunu paylaşır.

  • Bir kullanıcı çıkarım isteği gönderdiğinde proxy, isteği işlemek için havuzdan kullanılabilir bir örnek seçer.

Bu zaman çoğullama mekanizması, kullanıcı ortamlarını izole ederken çok kullanıcılı senaryolarda GPU kaynak kullanımını maksimize eder ve çıkarım maliyetlerini azaltır.