Diffusers documentation

Menggunakan Blok Kustom dengan Mellon

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.42.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Menggunakan Blok Kustom dengan Mellon

Mellon adalah antarmuka alur kerja visual yang terintegrasi dengan Modular Diffusers dan dirancang untuk alur kerja berbasis node.

Mellon masih dalam tahap pengembangan awal dan belum siap untuk penggunaan produksi. Anggap ini sebagai sekilas pandangan tentang cara kerja integrasinya!

Custom blocks berfungsi di Mellon secara langsung - Anda hanya perlu menambahkan mellon_pipeline_config.json ke repositori Anda. File konfigurasi ini memberi tahu Mellon cara merender parameter blok Anda sebagai komponen UI.

Berikut penampilannya saat digunakan dengan blok Gemini Prompt Expander:

Mellon custom block demo

Untuk menggunakan blok kustom diffusers modular di Mellon:

  1. Seret Dynamic Block Node dari bagian ModularDiffusers
  2. Masukkan repo_id (misalnya, diffusers/gemini-prompt-expander-mellon)
  3. Klik Load Custom Block
  4. Node berubah bentuk untuk menampilkan input dan output blok Anda

Sekarang, mari kita bahas cara membuat konfigurasi ini untuk blok kustom Anda sendiri.

Langkah-langkah untuk membuat konfigurasi Mellon

  1. Spesifikasikan tipe Mellon untuk parameter Anda - Setiap InputParam/OutputParam membutuhkan tipe yang memberi tahu Mellon komponen UI apa yang harus dirender (misalnya, "textbox", "dropdown", "image").
  2. Generate mellon_pipeline_config.json - Gunakan utilitas kami untuk membuat template konfigurasi dan mengirimkannya ke repositori Hub Anda.
  3. (Opsional) Sesuaikan konfigurasi secara manual - Haluskan konfigurasi yang dihasilkan untuk kebutuhan spesifik Anda.

Tentukan tipe Mellon untuk parameter

Tipe Mellon menentukan bagaimana setiap parameter dirender di UI. Jika Anda tidak menentukan tipe untuk suatu parameter, nilainya akan secara default menjadi "custom", yang dirender sebagai titik koneksi sederhana. Anda selalu dapat menyesuaikan ini kemudian di config yang dihasilkan.

TipeInput/OutputDeskripsi
imageKeduanyaGambar (PIL Image)
videoKeduanyaVideo
textKeduanyaTampilan teks
textboxInputInput teks
dropdownInputMenu pilihan dropdown
sliderInputSlider untuk nilai numerik
numberInputInput numerik
checkboxInputPengalih Boolean

Untuk parameter yang memerlukan konfigurasi lebih lanjut (seperti dropdown dengan opsi, atau slider dengan nilai min/max), berikan instance MellonParam secara langsung alih-alih string. Anda dapat menggunakan salah satu metode kelas di bawah ini, atau membuat yang sepenuhnya kustom dengan MellonParam(name, label, type, ...).

MetodeDeskripsi
MellonParam.Input.image(name)Input gambar
MellonParam.Input.textbox(name, default)Input teks sebagai textarea
MellonParam.Input.dropdown(name, options, default)Pemilihan dropdown
MellonParam.Input.slider(name, default, min, max, step)Slider untuk nilai numerik
MellonParam.Input.number(name, default, min, max, step)Input numerik (tanpa slider)
MellonParam.Input.seed(name, default)Input Seed dengan tombol acak
MellonParam.Input.checkbox(name, default)Kotak centang Boolean
MellonParam.Input.model(name)Input model untuk komponen diffusers
MellonParam.Output.image(name)Output gambar
MellonParam.Output.video(name)Output video
MellonParam.Output.text(name)Output teks
MellonParam.Output.model(name)Output model untuk komponen diffusers

Pilih salah satu metode di bawah ini untuk menentukan tipe Mellon.

Menggunakan metadata dalam definisi blok

Jika Anda mendefinisikan blok kustom dari awal, tambahkan metadata={"mellon": "<type>"} langsung ke definisi InputParam dan OutputParam Anda. Jika Anda mengedit blok kustom yang sudah ada dari Hub, lihat Mengedit blok kustom untuk cara mengunduhnya secara lokal.

class GeminiPromptExpander(ModularPipelineBlocks):
    
    @property
    def inputs(self) -> List[InputParam]:
        return [
            InputParam(
                "prompt",
                type_hint=str,
                required=True,
                description="Prompt to use",
                metadata={"mellon": "textbox"},  # Text input
            )
        ]
    
    @property
    def intermediate_outputs(self) -> List[OutputParam]:
        return [
            OutputParam(
                "prompt",
                type_hint=str,
                description="Expanded prompt by the LLM",
                metadata={"mellon": "text"},  # Text output
            ),
            OutputParam(
                "old_prompt",
                type_hint=str,
                description="Old prompt provided by the user",
<CopyLLMTxtMenu containerStyle="float: inline-end; margin-inline-start: 10px; display: inline-flex; position: relative; z-index: 10;"></CopyLLMTxtMenu>

                # No metadata - we don't want to render this in UI
            )
        ]

Untuk kontrol penuh atas konfigurasi UI, berikan instance MellonParam secara langsung:

from diffusers.modular_pipelines.mellon_node_utils import MellonParam

InputParam(
    "mode",
    type_hint=str,
    default="balanced",
    metadata={"mellon": MellonParam.Input.dropdown("mode", options=["fast", "balanced", "quality"])},
)

Menggunakan input_types dan output_types saat Membuat Config

Jika Anda bekerja dengan pipeline yang sudah ada atau lebih memilih untuk menjaga definisi blok tetap rapi, tentukan tipe saat menghasilkan config menggunakan argumen input_types/output_types:

from diffusers.modular_pipelines.mellon_node_utils import MellonPipelineConfig

mellon_config = MellonPipelineConfig.from_custom_block(
    blocks,
    input_types={"prompt": "textbox"},
    output_types={"prompt": "text"}
)

Ketika metadata dan input_types/output_types keduanya ditentukan, argumen tersebut mengesampingkan metadata.

Generate dan push konfigurasi Mellon

Setelah menambahkan metadata ke blok Anda, buat template konfigurasi default Mellon dan dorongnya ke Hub:

from diffusers import ModularPipelineBlocks
from diffusers.modular_pipelines.mellon_node_utils import MellonPipelineConfig

# load your custom blocks from your local dir
blocks = ModularPipelineBlocks.from_pretrained("/path/local/folder", trust_remote_code=True)

# Generate the default config template
mellon_config = MellonPipelineConfig.from_custom_block(blocks)
# push the default template to `repo_id`, you will need to pass the same local folder path so that it will save the config locally first
mellon_config.save(
    local_dir="/path/local/folder",
    repo_id= repo_id,
    push_to_hub=True
)

Ini membuat file mellon_pipeline_config.json di repositori Anda.

Tinjau dan sesuaikan konfigurasi

Template yang dihasilkan adalah titik awal - Anda mungkin ingin menyesuaikannya sesuai kebutuhan Anda. Mari kita telusuri konfigurasi yang dihasilkan untuk Gemini Prompt Expander:

{
  "label": "Gemini Prompt Expander",
  "default_repo": "",
  "default_dtype": "",
  "node_params": {
    "custom": {
      "params": {
        "prompt": {
          "label": "Prompt",
          "type": "string",
          "display": "textarea",
          "default": ""
        },
        "out_prompt": {
          "label": "Prompt",
          "type": "string",
          "display": "output"
        },
        "old_prompt": {
          "label": "Old Prompt",
          "type": "custom",
          "display": "output"
        },
        "doc": {
          "label": "Doc",
          "type": "string",
          "display": "output"
        }
      },
      "input_names": ["prompt"],
      "model_input_names": [],
      "output_names": ["out_prompt", "old_prompt", "doc"],
      "block_name": "custom",
      "node_type": "custom"
    }
  }
}

Memahami Struktur

Dict params mendefinisikan bagaimana setiap elemen UI dirender. Daftar input_names, model_input_names, dan output_names memetakan elemen-elemen UI ini ke antarmuka I/O dari ModularPipelineBlocks yang mendasarinya:

Konfigurasi MellonModularPipelineBlocks
input_namesproperti inputs
model_input_namesproperti expected_components
output_namesproperti intermediate_outputs

Pada contoh ini: prompt adalah satu-satunya input. Tidak ada komponen model, dan output mencakup out_prompt, old_prompt, dan doc.

Sekarang mari kita lihat dict params:

  • prompt: Parameter input dengan display: "textarea" (dirender sebagai kotak input teks), label: "Prompt" (ditampilkan di UI), dan default: "" (mulai dalam keadaan kosong). Field type: "string" penting di Mellon karena menentukan node mana yang dapat terhubung satu sama lain - hanya tipe yang cocok yang dapat dihubungkan dengan “noodles”.

  • out_prompt: Output prompt yang diperluas. Prefiks out_ ditambahkan secara otomatis karena input dan output memiliki nama yang sama (prompt), sehingga menghindari konflik penamaan di config. Memiliki display: "output" yang dirender sebagai socket output.

  • old_prompt: Memiliki type: "custom" karena kami tidak menentukan metadata. Ini dirender sebagai titik sederhana di UI. Karena kami sebenarnya tidak ingin mengekspos ini di UI, kami dapat menghapusnya.

  • doc: Output dokumentasi, ditambahkan secara otomatis ke semua blok kustom.

Melakukan Penyesuaian

Hapus old_prompt dari params dan output_names karena Anda tidak akan membutuhkannya.

{
  "label": "Gemini Prompt Expander",
  "default_repo": "",
  "default_dtype": "",
  "node_params": {
    "custom": {
      "params": {
        "prompt": {
          "label": "Prompt",
          "type": "string",
          "display": "textarea",
          "default": ""
        },
        "out_prompt": {
          "label": "Prompt",
          "type": "string",
          "display": "output"
        },
        "doc": {
          "label": "Doc",
          "type": "string",
          "display": "output"
        }
      },
      "input_names": ["prompt"],
      "model_input_names": [],
      "output_names": ["out_prompt", "doc"],
      "block_name": "custom",
      "node_type": "custom"
    }
  }
}

Lihat konfigurasi akhir di diffusers/gemini-prompt-expander-mellon.

Update on GitHub