Diffusers documentation

استخدام كتل مخصصة مع Mellon

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

استخدام كتل مخصصة مع Mellon

Mellon هو واجهة عمل مرئية تتكامل مع Modular Diffusers، وهو مصمم لتدفقات العمل القائمة على العقد.

لا يزال Mellon في مرحلة التطوير المبكر وغير جاهز للاستخدام في بيئة الإنتاج بعد. فكّر في هذا كلمحة مبكرة عن آلية عمل التكامل!

تعمل الكتل المخصصة في Mellon دون أي إعداد مسبق - كل ما عليك فعله هو إضافة mellon_pipeline_config.json إلى مستودعك. يخبر هذا الملف الإعدادي Mellon كيفية عرض معاملات كتلتك كمكونات واجهة مستخدم.

إليك كيف يبدو في العمل مع كتلة Gemini Prompt Expander:

Mellon custom block demo

للاستخدام كتلة مخصصة من diffusers في Mellon:

  1. اسحب عقدة كتلة ديناميكية من قسم ModularDiffusers
  2. أدخل repo_id (على سبيل المثال، diffusers/gemini-prompt-expander-mellon)
  3. انقر على تحميل كتلة مخصصة
  4. يتحول العقدة لعرض مدخلات ومخرجات كتلتك

الآن، دعونا نستعرض كيفية إنشاء هذا الإعداد الخاص بكِ بلوك مخصص.

الخطوات لإنشاء تكوين Mellon

  1. حدد أنواع Mellon لمعاملاتك - يحتاج كل InputParam/OutputParam إلى نوع يخبر Mellon بمكوّن واجهة المستخدم الذي يجب عرضه (مثل "textbox"، "dropdown"، "image").
  2. إنشاء mellon_pipeline_config.json - استخدم أداة المساعدة لدينا لإنشاء قالب إعدادات ودفعه إلى مستودعك على Hub.
  3. (اختياري) ضبط الإعدادات يدويًا - قم بتعديل الإعدادات المولّدة لتناسب احتياجاتك الخاصة.

تحديد أنواع Mellon للمعاملات

تحدد أنواع Mellon كيفية عرض كل معامل في واجهة المستخدم. إذا لم تحدد نوعًا لمعامل، فسيكون النوع الافتراضي "custom"، والذي يُعرض كنقطة اتصال بسيطة. يمكنك دائمًا تعديل ذلك لاحقًا في الإعدادات المولّدة.

النوعالمدخلات/المخرجاتالوصف
imageكلاهماصورة (صورة PIL)
videoكلاهمافيديو
textكلاهماعرض النص
textboxالمدخلإدخال نص
dropdownالمدخلقائمة اختيار منسدلة
sliderالمدخلشريط تمرير للقيم الرقمية
numberالمدخلإدخال رقمي
checkboxالمدخلمفتاح منطقي

بالنسبة للمعاملات التي تتطلب مزيدًا من التهيئة (مثل القوائم المنسدلة مع خيارات، أو أشرطة التمرير بقيم دنيا/قصوى)، قم بتمرير كائن MellonParam مباشرةً بدلاً من نص. يمكنك استخدام إحدى طرق الفئة أدناه، أو إنشاء كائن مخصص بالكامل باستخدام MellonParam(name, label, type, ...).

الطريقةالوصف
MellonParam.Input.image(name)إدخال الصورة
MellonParam.Input.textbox(name, default)إدخال النص كحقل نصي
MellonParam.Input.dropdown(name, options, default)اختيار القائمة المنسدلة
MellonParam.Input.slider(name, default, min, max, step)شريط تمرير للقيم الرقمية
MellonParam.Input.number(name, default, min, max, step)إدخال رقمي (بدون شريط تمرير)
MellonParam.Input.seed(name, default)بذر الإدخال مع زر التوليد العشوائي
MellonParam.Input.checkbox(name, default)خانة اختيار منطقي
MellonParam.Input.model(name)مدخلات النموذج لمكونات diffusers
MellonParam.Output.image(name)إخراج الصورة
MellonParam.Output.video(name)مخرجات الفيديو
MellonParam.Output.text(name)نص المخرجات
MellonParam.Output.model(name)مخرجات النموذج لمكونات diffusers

اختر إحدى الطرق أدناه لتحديد نوع Mellon.

استخدام البيانات الوصفية في تعريفات الكتل

إذا كنت تُعرّف كتلة مخصصة من الصفر، أضف metadata={"mellon": "<type>"} مباشرةً إلى تعريفات InputParam وOutputParam الخاصة بك. أما إذا كنت تعدّل كتلة مخصصة موجودة مسبقًا من Hub، فراجع تعديل الكتل المخصصة لمعرفة كيفية تنزيلها محليًا.

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
            )
        ]

للحصول على تحكم كامل في تكوين واجهة المستخدم، قم بتمرير كائن MellonParam مباشرة:

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"])},
)

استخدام input_types وoutput_types عند توليد الإعداد

إذا كنت تعمل مع خط أنابيب قائم أو تفضل إبقاء تعريفات الكتل نظيفة، فحدد الأنواع عند توليد الإعداد باستخدام الحجة 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"}
)

عند تحديد كل من metadata وinput_types/output_types، تتغلب الحجج على metadata.

إنشاء وإرسال تكوين Mellon

بعد إضافة البيانات الوصفية إلى كتلتك، قم بتوليد قالب إعدادات Mellon الافتراضي ودفعه إلى 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
)

يؤدي هذا إلى إنشاء ملف mellon_pipeline_config.json في مستودعك.

مراجعة وضبط الإعداد

القالب المولّد هو نقطة انطلاق - قد ترغب في تعديله ليناسب احتياجاتك. دعونا نستعرض الإعدادات المولّدة لـ 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"
    }
  }
}

فهم البنية

تعرف قاموس params كيفية عرض كل عنصر من عناصر واجهة المستخدم. وتقوم قوائم input_names وmodel_input_names وoutput_names بربط هذه العناصر بواجهة الإدخال/الإخراج الخاصة بـ ModularPipelineBlocks الأساسية:

إعدادات MellonModularPipelineBlocks
input_namesخاصية inputs
model_input_namesخاصية expected_components
output_namesخاصية intermediate_outputs

في هذا المثال: prompt هو المدخل الوحيد. لا توجد مكونات نموذج، وتشمل المخرجات out_prompt وold_prompt وdoc.

الآن لنلقِ نظرة على قاموس params:

  • prompt: معامل إدخال يحتوي على display: "textarea" (يُعرض كصندوق إدخال نصي)، وlabel: "Prompt" (يظهر في واجهة المستخدم)، وdefault: "" (يبدأ فارغاً). حقل type: "string" مهم في Mellon لأنه يحدد العقد التي يمكن ربطها ببعضها - ففقط الأنواع المتطابقة يمكن ربطها عبر “noodles”.

  • out_prompt: مخرجات المُوجِّه الموسَّعة. أُضيف البادئة out_ تلقائيًا لأن المدخل والمخرج يتشاركان الاسم نفسه (prompt)، لتجنّب تعارض الأسماء في الإعداد. يحتوي على display: "output" الذي يُعرض كمخرج.

  • old_prompt: يحتوي على type: "custom" لأننا لم نحدد البيانات الوصفية. يظهر هذا كنقطة بسيطة في واجهة المستخدم. وبما أننا لا نريد في الواقع عرض هذا في الواجهة، يمكننا حذفه.

  • doc: مخرجات التوثيق، تُضاف تلقائيًا إلى جميع الكتل المخصصة.

إجراء تعديلات

أزل old_prompt من كلٍّ من params وoutput_names لأنك لن تحتاج إلى استخدامه.

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

يمكنك الاطلاع على الإعداد النهائي في diffusers/gemini-prompt-expander-mellon.

Update on GitHub