Buckets:

mishig's picture
|
download
raw
12.6 kB
## استخدام كتل مخصصة مع Mellon
[Mellon](https://github.com/cubiq/Mellon) هو واجهة عمل مرئية تتكامل مع Modular Diffusers، وهو مصمم لتدفقات العمل القائمة على العقد.
> [!WARNING]
> لا يزال Mellon في مرحلة التطوير المبكر وغير جاهز للاستخدام في بيئة الإنتاج بعد. فكّر في هذا كلمحة مبكرة عن آلية عمل التكامل!
تعمل الكتل المخصصة في Mellon دون أي إعداد مسبق - كل ما عليك فعله هو إضافة `mellon_pipeline_config.json` إلى مستودعك. يخبر هذا الملف الإعدادي Mellon كيفية عرض معاملات كتلتك كمكونات واجهة مستخدم.
إليك كيف يبدو عند استخدامه مع كتلة [Gemini Prompt Expander](https://huggingface.co/diffusers/gemini-prompt-expander-mellon):
![Mellon custom block demo](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/modular_demo_dynamic.gif)
للاستخدام كتلة مخصصة من 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` في تعريفات الكتل
إذا كنت تُعرّف كتلة مخصصة من الصفر، أضف `metadata={"mellon": "<type>"}` مباشرةً إلى تعريفات `InputParam` و`OutputParam` الخاصة بك. أما إذا كنت تعدّل كتلة مخصصة موجودة مسبقًا من Hub، فراجع [تعديل الكتل المخصصة](./custom_blocks#editing-custom-blocks) لمعرفة كيفية تنزيلها محليًا.
```python
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` مباشرة:
```python
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`:
```python
from diffusers.modular_pipelines.mellon_node_utils import MellonPipelineConfig
mellon_config = MellonPipelineConfig.from_custom_block(
blocks,
input_types={"prompt": "textbox"},
output_types={"prompt": "text"}
)
```
> [!NOTE]
> عند تحديد كل من `metadata` و`input_types`/`output_types`، تتغلب الحجج على `metadata`.
## إنشاء وإرسال تكوين Mellon
بعد إضافة البيانات الوصفية إلى كتلتك، قم بتوليد قالب إعدادات Mellon الافتراضي ودفعه إلى Hub:
```python
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:
```json
{
"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](/docs/diffusers/v0.43.0/ar/api/modular_diffusers/pipeline_blocks#diffusers.ModularPipelineBlocks):
| إعدادات Mellon | ModularPipelineBlocks |
|---------------|----------------------|
| `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` لأنك لن تحتاج إلى استخدامه.
```json
{
"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](https://huggingface.co/diffusers/gemini-prompt-expander-mellon).

Xet Storage Details

Size:
12.6 kB
·
Xet hash:
9c13002775e86ff1c53379b3ff13bbaa00c0f57c2912b463a182fdae3d9b05d5

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.