All Products
Search
Document Center

Platform For AI:Terapkan layanan ComfyUI untuk pembuatan video AI

Last Updated:Aug 27, 2026

ComfyUI adalah alat AIGC berbasis node yang dibangun di atas Stable Diffusion, dirancang untuk pembuatan video pendek dan produksi animasi. PAI-EAS mendukung penerapan layanan ComfyUI berdasarkan skenario.

Sebelum memulai

Batasan dan pertimbangan utama

Baca bagian ini sebelum menerapkan untuk menghindari pemborosan sumber daya dan kesalahan umum.

  • Sumber Daya Penerapan: Kami merekomendasikan tipe instans GPU GU30, NVIDIA A10, atau NVIDIA T4. Tipe instans ml.gu7i.c16m60.1-gu30 menawarkan rasio harga-kinerja terbaik.

    Penting

    Setiap instans PAI-EAS menjalankan satu proses ComfyUI dan hanya mendukung satu GPU (single-instance single-GPU atau multi-instance single-GPU). Inferensi paralel multi-GPU tidak didukung. Jangan memilih tipe instans multi-GPU (misalnya 2×A10). Tipe instans multi-GPU memboroskan sumber daya dan tidak meningkatkan kinerja tugas tunggal.

  • Scaling Horizontal: Untuk meningkatkan konkurensi, gunakan API Edition dan tingkatkan jumlah replica alih-alih memilih tipe instans multi-GPU.

Pilih edisi penerapan

Pilih edisi yang paling sesuai dengan kasus penggunaan Anda:

Edition

Use case

Access method

Key features

Billing method

Standard Edition

Pengembangan dan pengujian oleh pengguna tunggal

  • WebUI

  • Panggilan API (sinkron, dengan debugging online)

  • Konkurensi terbatas

  • Men-deploy instans tunggal

Jika diterapkan pada sumber daya publik, penagihan dimulai segera setelah instans berjalan, meskipun tidak ada panggilan API.

API Edition

Beban kerja produksi dengan konkurensi tinggi

Panggilan API (asinkron)

  • Dibangun di atas layanan antrian PAI-EAS

  • Memerlukan sumber daya CPU tambahan

  • Mendukung load balancing

Cluster Edition WebUI

Tim multi-pengguna dan pelatihan

WebUI

  • Lingkungan pengguna terisolasi

  • Sumber daya GPU bersama

  • Konsumsi sumber daya lebih tinggi

Untuk informasi selengkapnya tentang cara kerjanya, lihat Cara Kerja Cluster Edition

Untuk informasi penagihan lebih lanjut, lihat Penagihan Elastic Algorithm Service (EAS).

Catatan

Panggilan API sinkron dan asinkron berbeda berdasarkan apakah layanan antrian PAI-EAS digunakan:

  • Panggilan Sinkron: Mengirim permintaan langsung ke instans inferensi tanpa menggunakan layanan antrian PAI-EAS.

  • Panggilan Asinkron: Menggunakan layanan antrian PAI-EAS. Permintaan dikirim ke antrian input, dan hasil dikirimkan melalui model langganan.

Karena ComfyUI memiliki sistem antrian asinkron bawaan sendiri, bahkan panggilan sinkron diproses secara asinkron di balik layar. Setelah Anda mengirim permintaan, sistem mengembalikan Prompt ID yang digunakan untuk polling hasil inferensi.

Terapkan layanan

Standard Edition, Cluster Edition, dan API Edition: Anda dapat menggunakan penerapan model berbasis skenario untuk pengalaman yang disederhanakan, atau penerapan model kustom untuk opsi konfigurasi lanjutan.

Metode 1: Penerapan model berbasis skenario (direkomendasikan)

  1. Masuk ke Konsol PAI. Pilih wilayah di bagian atas halaman. Lalu, pilih ruang kerja yang diinginkan dan klik Elastic Algorithm Service (EAS).

  2. Pada halaman Elastic Algorithm Service (EAS), klik Deploy Service. Di bagian Scenario-based Model Deployment, klik AI Video Generation: ComfyUI-based Deployment.

  3. Konfigurasikan parameter utama berikut dan atur parameter lain sesuai kebutuhan:

    • Version: Lihat Pilih edisi penerapan.

    • Model Settings: Misalnya, menggunakan Object Storage Service (OSS), pilih bucket dan direktori. Setelah penerapan berhasil, sistem secara otomatis membuat direktori ComfyUI yang diperlukan di lokasi ini.

      Penting

      PAI-EAS tidak mendukung instalasi node kustom (plugin) langsung dari jaringan melalui ComfyUI Manager atau Git Clone. Untuk menggunakan model Anda sendiri, menginstal node kustom, atau melakukan panggilan API, Anda harus mengonfigurasi mount penyimpanan ini.

    • Resource Configuration: Anda harus memilih tipe instans GPU. Kami merekomendasikan GU30, NVIDIA A10, atau NVIDIA T4. ml.gu7i.c16m60.1-gu30 menawarkan rasio harga-kinerja terbaik. Jika tipe instans ini tidak tersedia, pilih ecs.gn6i-c16g1.4xlarge sebagai gantinya.

  4. Klik Deploy. Tunggu sekitar 5 menit. Ketika Service Status berubah menjadi Running, penerapan selesai.

Metode 2: Penerapan model kustom

  1. Masuk ke Konsol PAI. Pilih wilayah di bagian atas halaman. Lalu, pilih ruang kerja yang diinginkan dan klik Elastic Algorithm Service (EAS).

  2. Klik Deploy Service. Di bagian Custom Model Deployment, klik Custom Deployment.

  3. Konfigurasikan parameter utama berikut:

    • Deployment Method: Pilih Image-based Deployment dan centang kotak pilihan Enable Web App.

    • Image Configuration: Di daftar Alibaba Cloud Image, pilih comfyui:2.3. Konvensi penamaan versi gambar: x.x untuk Standard Edition, x.x-api untuk API Edition, dan x.x-cluster untuk Cluster Edition.

      Catatan
      • Karena versi sering diperbarui, pilih versi gambar terbaru yang tersedia saat menerapkan.

      • Untuk kasus penggunaan setiap edisi, lihat Pilih edisi penerapan.

    • Mount storage: Sebagai contoh menggunakan Object Storage Service (OSS), pilih bucket dan direktori. Setelah penerapan berhasil, sistem secara otomatis membuat direktori ComfyUI yang diperlukan di lokasi ini. Pastikan bucket berada di wilayah yang sama dengan layanan PAI-EAS.

      Penting

      PAI-EAS tidak mendukung instalasi node kustom (plugin) langsung dari jaringan melalui ComfyUI Manager atau Git Clone. Untuk menggunakan model Anda sendiri, menginstal node kustom, atau melakukan panggilan API, Anda harus mengonfigurasi mount penyimpanan ini.

      • URI: Klik image untuk memilih direktori OSS yang sudah ada. Misalnya, oss://bucket-test/data-oss/.

      • Mount Path: Atur ke /mnt/data untuk memasang direktori OSS ke path kontainer /mnt/data.

    • Command to Run:

      • Setelah Anda memilih versi gambar, sistem secara otomatis mengonfigurasi perintah waktu proses.

      • Jika Anda mengonfigurasi mount penyimpanan, Anda harus menambahkan parameter --data-dir ke Command, dan nilainya harus persis sesuai dengan Mount Path. Misalnya, python main.py --listen --port 8000 --data-dir /mnt/data --cache-root /stable-diffusion-cache.

    • Resource Type: Pilih Public Resources.

    • Deployment: Anda harus memilih tipe instans GPU. Kami merekomendasikan GU30, NVIDIA A10, atau NVIDIA T4. ml.gu7i.c16m60.1-gu30 menawarkan rasio harga-kinerja terbaik. Jika tipe instans ini tidak tersedia, pilih ecs.gn6i-c16g1.4xlarge sebagai gantinya.

  4. Klik Deploy. Penerapan memerlukan waktu sekitar 5 menit. Ketika Service Status berubah menjadi Running, layanan telah diterapkan.

Gunakan layanan melalui WebUI

Penting

Standard Edition dan Cluster Edition mendukung akses melalui WebUI.

Buka antarmuka web

Klik nama layanan target untuk membuka halaman Overview, lalu klik Web Application di pojok kanan atas.

Jika halaman memerlukan waktu lama untuk dimuat, lihat Halaman hang atau memerlukan waktu terlalu lama untuk dimuat.

Gunakan alur kerja templat

ComfyUI menyediakan templat bawaan untuk tugas-tugas umum.

  1. Pilih templat (misalnya, Wan VACE Text to Video).

    Catatan

    Templat bervariasi tergantung versi gambar ComfyUI. Jika templat contoh tidak tersedia, pilih templat lain atau muat file alur kerja dari sistem file lokal.

  2. Setelah alur kerja dimuat, Anda mungkin melihat error tentang model yang hilang. Anda dapat mengabaikan error ini (kami merekomendasikan memilih opsi untuk tidak menampilkan pesan ini lagi).

  3. Karena path model mungkin telah berubah, menjalankan alur kerja secara langsung dapat menghasilkan error berikut:

    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)

    Di bagian Load models here, pilih ulang wan2.1_vace_14B_fp16.safetensors di loader UNET dan Wan21_CausVid_14B_T2V_lora_rank32.safetensors di loader LoRA.

  4. Setelah alur kerja berhasil dijalankan, video yang dihasilkan muncul di bagian Save Video. image

Gunakan model dan node kustom

  1. Pastikan layanan telah dikonfigurasi dengan mount penyimpanan. Setelah layanan diterapkan, sistem secara otomatis membuat struktur direktori berikut di penyimpanan OSS atau NAS yang dimount.

    data-oss/
    ├── custom_nodes/     # File node kustom (plugin ComfyUI)
    ├── models/           # File model
    ├── input/
    ├── output/
    ├── unet/
    └── temp/
  2. Unggah file model atau node. Misalnya, Anda dapat menggunakan OSS dan mengunggah file ke OSS melalui konsol. Untuk file besar, lihat Bagaimana cara mengunggah objek besar ke OSS?.

    • Unggah file model: Periksa dokumentasi repositori sumber untuk node yang menggunakan model tersebut, dan unggah model ke subdirektori yang sesuai di bawah models. Misalnya:

      • Checkpoint loader: Unggah model ke models/checkpoints.

      • Style model loader: Unggah model ke models/styles.

    • Unggah file node: Unggah node kustom ke direktori custom_nodes di penyimpanan yang dimount.

  3. Muat konten baru.

    • Model: Di bagian atas halaman, klik PaiCustom > Load New Models. Jika model masih tidak muncul, klik PaiCustom > Restart Process. Setelah proses dimulai ulang, refresh halaman browser.

    • Node: Klik Restart Process. Setelah proses dimulai ulang, refresh halaman browser.

Panggil layanan melalui API

Anda dapat memanggil layanan ComfyUI melalui API-nya untuk mengintegrasikannya ke dalam aplikasi Anda guna pembuatan konten otomatis. Alur kerja inti: kirim JSON alur kerja > dapatkan ID tugas > gunakan ID tugas untuk mengambil hasil generasi.

Penting
  • Dukungan edisi: Standard Edition hanya mendukung panggilan sinkron dan menyediakan debugging online. API Edition hanya mendukung panggilan asinkron dan hanya endpoint /prompt.

  • Mengambil output yang dihasilkan: Gambar dan video yang dihasilkan disimpan di direktori output yang dimount. Respons API mengembalikan nama file dan nama subdirektori, bukan file itu sendiri. Untuk OSS, buat path file lengkap untuk mengunduh file tersebut. Untuk informasi selengkapnya, lihat Unduh file OSS menggunakan Alibaba Cloud SDK.

Siapkan badan permintaan API

Format badan permintaan tergantung pada metode pemanggilan:

  • Panggilan sinkron: Bungkus konten JSON alur kerja di dalam pasangan kunci-nilai prompt.

  • Panggilan asinkron: Badan permintaan adalah konten JSON alur kerja secara langsung.

Catatan

Cara mengunduh alur kerja: Di pojok kiri atas halaman ComfyUI, klik image > File > Export (API).

Karena alur kerja Wan VACE Text to Video di atas memakan waktu lama, alur kerja uji berikut disediakan untuk pengujian yang lebih mudah (setiap eksekusi memerlukan waktu sekitar 3 menit).

Klik untuk melihat contoh badan permintaan untuk alur kerja uji

Panggilan sinkron

{
    "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"
            }
        }
    }
}

Panggilan asinkron

{
    "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"
        }
    }
}

Panggilan sinkron

Panggilan sinkron mengirim permintaan langsung ke instans layanan PAI-EAS. Metode ini cocok untuk pengembangan, pengujian, dan skenario konkurensi rendah.

Debugging online

Debugging online memungkinkan Anda menguji panggilan API langsung di konsol tanpa menulis kode. Ini berguna untuk memvalidasi konfigurasi alur kerja dengan cepat.

Pada halaman Elastic Algorithm Service (EAS), klik Online Debugging di kolom Actions layanan target untuk membuka halaman debugging online.

  1. Kirim permintaan POST untuk mendapatkan Prompt ID.

    1. Di bagian Request Parameter Online Tuning halaman debugging, masukkan badan permintaan yang telah disiapkan di bidang Body, dan tambahkan /prompt ke URL permintaan.

    2. Klik Send Request untuk melihat respons di bagian Debugging Information.

      Setelah permintaan dikirim, panel Debug Info di sebelah kanan menampilkan respons: Kode Status adalah 200, dan Badan Respons berisi field prompt_id (misalnya, 130bc***c8c-3a1359a04e5d), number, dan node_errors. Catat nilai prompt_id untuk digunakan pada langkah berikutnya.

  2. Kirim permintaan GET untuk mengambil hasil inferensi menggunakan Prompt ID.

    1. Di bagian Request Parameter Online Tuning, ubah metode permintaan menjadi GET dan masukkan /history/<prompt id> di bidang URL.

      Ganti <prompt id> dengan Prompt ID yang diperoleh pada Langkah 1.

    2. Klik Send Request untuk mengambil hasil inferensi.

      Anda dapat menemukan output yang dihasilkan di direktori output penyimpanan yang dimount.

Panggilan berbasis kode

Anda dapat memanggil API melalui kode untuk mengintegrasikan ComfyUI ke dalam aplikasi Anda. Alur kerjanya sama dengan debugging online: pertama-tama dapatkan Prompt ID, lalu kueri hasil inferensi.

  1. Lihat informasi pemanggilan.

    1. Pada tab Inference Services, klik nama layanan target untuk membuka halaman Overview.

    2. Di bagian Basic Information, klik View Call Information.

    3. Di panel Call Information, salin titik akhir akses dan token:

      Panel Call Information memiliki dua tab: Shared Gateway dan VPC Direct Connection. Titik akhir publik, titik akhir VPC, dan token berada di tab Shared Gateway.

      • Pilih Public Endpoint atau VPC Endpoint sesuai kebutuhan.

      • Contoh di bawah menggunakan untuk titik akses dan untuk token.

  2. Kirim permintaan untuk mendapatkan Prompt ID.

    • Metode HTTP: POST.

    • URL Permintaan: <EAS_ENDPOINT>/prompt. Jika <EAS_ENDPOINT> diakhiri dengan /, hapus garis miring di akhir. URL akhir akan tampak seperti http://comfyui****.175805416243****.cn-beijing.pai-eas.aliyuncs.com/prompt.

    • Header permintaan:

      Header

      Value

      Description

      Authorization

      <EAS_TOKEN>

      Token otorisasi.

      Content-Type

      application/json

      Menentukan format badan permintaan.

    Contoh kode:

    cURL

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

    Parameter --data-raw berisi badan permintaan.

    Python

    Contoh kode:

    import requests
    import json
    
    # Ganti <EAS_ENDPOINT> dan <EAS_TOKEN> dengan endpoint dan token dari Langkah 1.
    service_url = "<EAS_ENDPOINT>"
    token = "<EAS_TOKEN>"
    
    if service_url[-1] == "/":
        service_url = service_url[:-1]
    
    # Badan permintaan: atur nilai "prompt" ke konten JSON alur kerja.
    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)

    Contoh respons:

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

    Ambil Prompt ID dari respons.

  3. Ambil hasil inferensi.

    • Metode HTTP: GET

    • URL Permintaan: <EAS_ENDPOINT>/history/<prompt_id>. Ganti <prompt_id> dengan prompt_id yang diperoleh pada Langkah 1.

    • Header permintaan:

      Header

      Value

      Description

      Authorization

      <EAS_TOKEN>

      Token otorisasi yang diperoleh pada Langkah 1.

    Contoh kode:

    cURL

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

    Python

    import requests
    
    # Ganti <EAS_ENDPOINT> dan <EAS_TOKEN> dengan endpoint dan token dari Langkah 1.
    # Ganti <prompt_id> dengan prompt_id yang diperoleh pada Langkah 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)

    Contoh respons:

    Klik untuk melihat contoh respons

    {
        "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)"
            }
        }
    }

    Field outputs dalam respons berisi gambar (PNG/WebP) dan video (MP4) yang dihasilkan. Anda dapat menemukan file-file ini di direktori output penyimpanan yang dimount dengan mencari nama file tersebut.

Panggilan asinkron

Panggilan asinkron dirancang untuk beban kerja produksi dengan konkurensi tinggi. Metode ini menggunakan layanan antrian PAI-EAS untuk load balancing. Permintaan langsung dikembalikan, dan Anda mengambil hasil dengan berlangganan ke antrian hasil.

Penting

Panggilan asinkron hanya mendukung endpoint api_prompt. Parameter task_id adalah pengenal penting untuk mencocokkan permintaan dengan hasil. Tetapkan nilai unik untuk setiap permintaan agar Anda dapat menghubungkannya dengan hasil antrian yang sesuai. Path permintaan adalah:

{service_url}/api_prompt?task_id={assign a unique value}

  1. Lihat informasi pemanggilan.

    Pada tab Inference Services, klik nama layanan target untuk membuka halaman Overview. Di bagian Basic Information, klik View Call Information. Pada tab Asynchronous Call dialog Call Information, lihat titik akses layanan dan token.

    image

    Bagian berikut menggunakan <EAS_ENDPOINT> untuk merujuk ke Internet Input Endpoint (jika pemanggil berada di VPC yang sama dengan PAI-EAS, Anda dapat menggunakan VPC Input Endpoint), dan <EAS_TOKEN> untuk merujuk ke Token.

  2. Kirim permintaan.

    Contoh kode:

    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})
    
    # Badan permintaan - JSON alur kerja, tidak perlu dibungkus dengan "prompt".
    # Gunakan tanda kutip tiga untuk mendefinisikannya sebagai string multi-baris, jika tidak Anda perlu menggunakan huruf kapital untuk nilai boolean (true dan false) dalam JSON alur kerja.
    payload = """{
        '3':
        ...omitted
      }
      """
    payload = json.loads(payload)
    
    for i in range(5):
      # task_id adalah pengenal utama untuk mencocokkan permintaan dan hasil. Tetapkan nilai unik untuk setiap permintaan agar dapat dikorelasikan dengan hasil antrian nanti.
      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. Berlangganan hasil.

    1. Instal SDK eas_prediction.

      pip install eas_prediction  --user
    2. Jalankan kode berikut untuk mengambil hasil.

      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)

      Contoh respons:

      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"}]}}]'

      Anda dapat menemukan file hasil inferensi di direktori output penyimpanan yang dimount.

FAQ

Berikut adalah masalah umum dan solusi untuk penerapan dan penggunaan ComfyUI.

Masalah penerapan

T: Layanan tetap dalam status menunggu atau ComfyUI tidak dapat menghasilkan output

Ini biasanya disebabkan oleh sumber daya yang tidak mencukupi. Verifikasi bahwa gambar layanan dan tipe instans dikonfigurasi dengan benar. Kami merekomendasikan tipe instans GPU GU30, NVIDIA A10, atau NVIDIA T4. Tipe instans ml.gu7i.c16m60.1-gu30 menawarkan rasio harga-kinerja terbaik.

Masalah model dan node

T: WebUI menampilkan error "Missing Model"

Masalah: Kotak dialog berjudul Missing Model menunjukkan bahwa model di checkpoints/v1-5-pruned-emaonly-fp16.safetensors hilang, dan peringatan merah di sebelah kiri menunjukkan Invalid directory specified (does this require custom nodes?).

Solusi: Anda dapat mengabaikan error ini dengan aman. Pemeriksaan validasi ini tidak berlaku untuk ComfyUI yang diterapkan di PAI. Rujuklah error runtime aktual sebagai gantinya.

Kami merekomendasikan memilih opsi untuk tidak menampilkan pesan ini lagi, atau nonaktifkan validasi model di Settings.

T: Saya mengunggah model baru tetapi tidak dapat menemukannya

Solusi:

  1. Klik PaiCustom dan pilih Load New Models.

  2. Jika model masih tidak muncul, klik Restart Process.

T: Pemuat model menampilkan "undefined"

Pertama, verifikasi bahwa file model ditempatkan di direktori yang benar sesuai persyaratan node loader model.

Jika Anda mengunggah model setelah penerapan, mulai ulang layanan.

T: Tidak dapat menemukan node

T: ComfyUI Manager gagal mengunduh model atau menginstal node

Kami tidak merekomendasikan menggunakan ComfyUI Manager dengan ComfyUI yang diterapkan di PAI-EAS. ComfyUI Manager mengunduh model dan kode plugin dari sumber eksternal seperti GitHub, yang sering gagal karena pembatasan jaringan.

Sebagai gantinya, unggah file model dan node ke penyimpanan yang dimount. Untuk informasi selengkapnya, lihat Gunakan model kustom dan instal node (plugin ComfyUI).

T: Cara melihat file model dan node (plugin ComfyUI) yang tersedia

  • File model: Periksa dari node loader model yang sesuai. Misalnya, lihat file model yang tersedia di daftar drop-down loader Checkpoint.

  • Node: Klik kanan halaman WebUI dan klik Add Node di menu konteks untuk melihat semua plugin ComfyUI yang terinstal.

Error runtime

T: Halaman hang atau memerlukan waktu terlalu lama untuk dimuat

  • Refresh halaman, bersihkan cache browser, atau akses layanan dalam mode penyamaran/privat.

  • Jika penyimpanan dimount, hapus file di direktori input/, output/, dan temp/.

  • Coba mulai ulang layanan.

T: Proses dimulai ulang di tengah alur kerja

Jika log instans berisi run.sh: line 54: 531285 Killed python -u main_run.py "$@", proses dihentikan karena kondisi kehabisan memori (OOM). Proses secara otomatis dimulai ulang setelah kejadian OOM.

T: RuntimeError: CUDA error: out of memory

Ini berarti memori GPU habis. Untuk model gambar, kurangi resolusi gambar atau ukuran batch. Untuk model video, kurangi jumlah frame atau resolusi.

T: Panggilan API mengembalikan "url not found" atau "404 page not found"

  1. Verifikasi bahwa URL endpoint API lengkap. Untuk panggilan sinkron, Anda harus menambahkan path /prompt.

Lainnya

T: Kinerja akselerasi xFormers

xFormers adalah tool akselerasi berbasis Transformer open-source yang mengurangi waktu generasi gambar dan video serta penggunaan memori GPU.

Gambar ComfyUI memiliki akselerasi xFormers yang diaktifkan secara default. Efek akselerasi tergantung pada ukuran alur kerja, dengan peningkatan paling terlihat pada operasi yang intensif GPU, terutama dengan GPU NVIDIA.

Langkah selanjutnya

Setelah Anda menerapkan layanan ComfyUI, Anda dapat:

  • Pemantauan Layanan: Konfigurasikan pemantauan dan peringatan untuk melacak kesehatan layanan secara real-time. Untuk informasi selengkapnya, lihat Lihat metrik pemantauan layanan.

  • Auto scaling: Konfigurasikan kebijakan auto scaling berdasarkan beban kerja untuk mengoptimalkan penggunaan sumber daya dan biaya. Untuk informasi selengkapnya, lihat Auto scaling.

  • Optimasi Biaya: Pahami metode penagihan PAI-EAS dan pilih tipe instans serta edisi penerapan yang tepat untuk mengurangi biaya. Untuk informasi selengkapnya, lihat Ikhtisar Penagihan.

Referensi

Instal paket Python

Instal paket .whl dengan menjalankan perintah

  1. Pastikan layanan telah dikonfigurasi dengan mount penyimpanan. Misalnya, asumsikan path OSS (URI) adalah oss://examplebucket/comfyui/ dan path mount adalah /mnt/data/.

  2. Unggah file .whl ke direktori oss://examplebucket/comfyui/models/whl. Jika direktori whl belum ada, buat terlebih dahulu.

  3. Perbarui Command to Run layanan: Tambahkan pip install /mnt/data/models/whl/xxx.whl di awal perintah waktu proses. Dalam perintah ini, /mnt/data adalah path mount OSS, dan xxx.whl adalah nama paket .whl.

  4. Mulai ulang layanan.

Instal paket melalui konfigurasi pustaka pihak ketiga

  1. Pada halaman detail layanan, klik Update di pojok kanan atas.

  2. Jika layanan diterapkan melalui penerapan model berbasis skenario, beralihlah ke penerapan model kustom.

  3. Di bagian Environment Information, konfigurasikan dependensi di area Third-party Library Configuration.

  4. Klik Update di bagian bawah halaman untuk menerapkan pembaruan.

Perbarui versi gambar

Jika layanan memiliki penyimpanan OSS atau NAS yang dimount, model kustom disimpan di penyimpanan OSS atau NAS tersebut dan tidak terpengaruh oleh pembaruan versi gambar.

  1. Pada halaman detail layanan, klik Update di pojok kanan atas.

  2. Jika layanan diterapkan melalui penerapan model berbasis skenario, beralihlah ke penerapan model kustom.

  3. Di bagian Service Configuration, edit konfigurasi JSON dan perbarui field image di bawah containers ke versi yang diinginkan (misalnya, ubah 1.9 ke versi target).

  4. Klik Update Directly.

Hasilkan URL akses web tanpa login dengan periode validitas kustom

Anda dapat menggunakan API untuk menghasilkan URL akses web tanpa login dengan periode validitas tertentu.

  1. Buka halaman API DescribeServiceSignedUrl.

  2. Pilih endpoint layanan.

  3. Atur parameter berikut:

    • ClusterId (Wilayah) dan ServiceName: Masukkan wilayah dan nama layanan.

      Di halaman ikhtisar layanan EAS, field Service Name menunjukkan nilai ServiceName. Wilayah tertanam dalam alamat gambar node (misalnya, cn-hangzhou sesuai dengan nilai wilayah ClusterId). Anda dapat mengklik View Web Application di pojok kanan atas untuk membuka layanan.

    • Type (Jenis halaman): Pilih webview dari daftar drop-down.

    • Expire (Waktu kedaluwarsa): Masukkan bilangan bulat dalam detik. Nilai maksimum adalah 43200 detik (12 jam). Atur sesuai kebutuhan.

    • Internal (Akses VPC): Atur ke false (akses publik) atau true (akses VPC).

  4. Klik Call API. Field SignedUrl dalam respons berisi URL akses web tanpa login.

Ubah bahasa default WebUI

  1. Di halaman WebUI, klik tombol Settings di pojok kiri bawah.

  2. Konfigurasikan bahasa di dua lokasi berikut, lalu refresh dan muat ulang halaman.

    • Comfy > Locale.

    • Language > Locale.

Lampiran

Cara Kerja Cluster Edition

Diagram berikut menunjukkan arsitekturnya:

Cluster Edition dirancang untuk skenario multi-pengguna. Ini memperkenalkan lapisan proxy yang memisahkan klien dari instans inferensi backend.

  • Setiap pengguna memiliki lingkungan backend dan direktori kerja independen, tetapi berbagi pool instans inferensi GPU backend.

  • Ketika pengguna mengirim permintaan inferensi, proxy memilih instans yang tersedia dari pool untuk menangani permintaan tersebut.

Mekanisme multiplexing waktu ini mengisolasi lingkungan pengguna sekaligus memaksimalkan pemanfaatan sumber daya GPU dan mengurangi biaya inferensi dalam skenario multi-pengguna.