Diffusers documentation
Sử dụng Khối Tùy Chỉnh với Mellon
Sử dụng Khối Tùy Chỉnh với Mellon
Mellon là giao diện quy trình trực quan tích hợp với Modular Diffusers và được thiết kế cho các quy trình dựa trên node.
Mellon đang trong giai đoạn phát triển ban đầu và chưa sẵn sàng cho việc sử dụng trong môi trường sản xuất. Hãy xem đây là một cái nhìn trước về cách tích hợp hoạt động!
Các khối tùy chỉnh hoạt động ngay lập tức trong Mellon - bạn chỉ cần thêm mellon_pipeline_config.json vào kho của mình. Tệp cấu hình này cho Mellon biết cách hiển thị các tham số của khối dưới dạng các thành phần UI.
Dưới đây là cách nó hoạt động với khối Gemini Prompt Expander:

Để sử dụng khối tùy chỉnh dạng module của diffusers trong Mellon:
- Kéo một Dynamic Block Node từ phần ModularDiffusers
- Nhập
repo_id(ví dụ:diffusers/gemini-prompt-expander-mellon) - Nhấp vào Tải khối tùy chỉnh
- Nút được biến đổi để hiển thị các đầu vào và đầu ra của khối của bạn
Bây giờ, chúng ta sẽ cùng tìm hiểu cách tạo cấu hình này cho khối tùy chỉnh của riêng bạn.
Các bước để tạo cấu hình Mellon
- Chỉ định kiểu Mellon cho các tham số của bạn - Mỗi
InputParam/OutputParamcần một kiểu để cho Mellon biết thành phần UI nào cần hiển thị (ví dụ:"textbox","dropdown","image"). - Tạo
mellon_pipeline_config.json- Sử dụng tiện ích của chúng tôi để tạo mẫu cấu hình và đẩy nó lên kho Hub của bạn. - (Tùy chọn) Điều chỉnh thủ công cấu hình - Tinh chỉnh cấu hình đã tạo cho nhu cầu cụ thể của bạn.
Chỉ định các kiểu Mellon cho các tham số
Các kiểu Mellon xác định cách mỗi tham số được hiển thị trong giao diện người dùng. Nếu bạn không chỉ định kiểu cho một tham số, nó sẽ mặc định là "custom", được hiển thị dưới dạng một điểm kết nối đơn giản. Bạn luôn có thể điều chỉnh điều này sau trong cấu hình đã tạo.
| Loại | Đầu vào/Đầu ra | Mô tả |
|---|---|---|
image | Cả hai | Ảnh (Ảnh PIL) |
video | Cả hai | Video |
text | Cả hai | Hiển thị văn bản |
textbox | Đầu vào | Đầu vào văn bản |
dropdown | Đầu vào | Menu chọn dạng thả xuống |
slider | Đầu vào | Thanh trượt cho giá trị số |
number | Đầu vào | Đầu vào dạng số |
checkbox | Đầu vào | Chuyển đổi Boolean |
Đối với các tham số cần cấu hình nhiều hơn (như menu thả xuống có các tùy chọn, hoặc thanh trượt có giá trị min/max), hãy truyền trực tiếp một instance của MellonParam thay vì một chuỗi. Bạn có thể sử dụng một trong các phương thức lớp bên dưới, hoặc tạo một instance hoàn toàn tùy chỉnh bằng MellonParam(name, label, type, ...).
| Phương pháp | Mô tả |
|---|---|
MellonParam.Input.image(name) | Đầu vào hình ảnh |
MellonParam.Input.textbox(name, default) | Đầu vào văn bản dưới dạng textarea |
MellonParam.Input.dropdown(name, options, default) | Chọn từ danh sách thả xuống |
MellonParam.Input.slider(name, default, min, max, step) | Thanh trượt cho giá trị số |
MellonParam.Input.number(name, default, min, max, step) | Đầu vào số (không có thanh trượt) |
MellonParam.Input.seed(name, default) | Đặt đầu vào ngẫu nhiên với nút ngẫu nhiên hóa |
MellonParam.Input.checkbox(name, default) | Hộp kiểm tra Boolean |
MellonParam.Input.model(name) | Đầu vào mô hình cho các thành phần của diffusers |
MellonParam.Output.image(name) | Đầu ra hình ảnh |
MellonParam.Output.video(name) | Đầu ra video |
MellonParam.Output.text(name) | Đầu ra văn bản |
MellonParam.Output.model(name) | Đầu ra của mô hình cho các thành phần của diffusers |
Chọn một trong các phương pháp bên dưới để chỉ định một kiểu Mellon.
Sử dụng metadata trong định nghĩa khối
Nếu bạn đang định nghĩa một khối tùy chỉnh từ đầu, hãy thêm metadata={"mellon": "<type>"} trực tiếp vào định nghĩa InputParam và OutputParam của bạn. Nếu bạn đang chỉnh sửa một khối tùy chỉnh hiện có từ Hub, hãy xem Chỉnh sửa khối tùy chỉnh để biết cách tải nó về máy cục bộ.
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
)
]Để có toàn quyền kiểm soát cấu hình UI, hãy truyền trực tiếp một instance 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"])},
)Sử dụng input_types và output_types khi Tạo Cấu hình
Nếu bạn đang làm việc với một pipeline có sẵn hoặc muốn giữ cho các định nghĩa block của mình gọn gàng, hãy chỉ định các kiểu dữ liệu khi tạo cấu hình bằng cách sử dụng đối số 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"}
)Khi cả
metadatavàinput_types/output_typesđược chỉ định, các đối số sẽ ghi đè lênmetadata.
Tạo và đẩy cấu hình Mellon
Sau khi thêm metadata vào block của bạn, hãy tạo mẫu cấu hình Mellon mặc định và đẩy nó lên 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
)Điều này tạo ra tệp mellon_pipeline_config.json trong kho của bạn.
Xem xét và điều chỉnh cấu hình
Mẫu được tạo ra là điểm khởi đầu - bạn có thể muốn điều chỉnh nó cho phù hợp với nhu cầu của mình. Hãy cùng xem qua cấu hình được tạo ra cho 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"
}
}
}Hiểu về Cấu trúc
Từ điển params định nghĩa cách mỗi phần tử UI được hiển thị. Các danh sách input_names, model_input_names và output_names ánh xạ các phần tử UI này đến giao diện I/O của ModularPipelineBlocks bên dưới:
| Cấu hình Mellon | ModularPipelineBlocks |
|---|---|
input_names | thuộc tính inputs |
model_input_names | thuộc tính expected_components |
output_names | Thuộc tính intermediate_outputs |
Trong ví dụ này: prompt là đầu vào duy nhất. Không có thành phần mô hình nào, và các đầu ra bao gồm out_prompt, old_prompt và doc.
Bây giờ hãy xem xét dict params:
prompt: Một tham số đầu vào códisplay: "textarea"(hiển thị dưới dạng ô nhập văn bản),label: "Prompt"(hiển thị trong giao diện người dùng) vàdefault: ""(bắt đầu ở trạng thái trống). Trườngtype: "string"rất quan trọng trong Mellon vì nó quyết định các nút nào có thể kết nối với nhau - chỉ các kiểu dữ liệu khớp nhau mới có thể được liên kết bằng “noodles”.out_prompt: Đầu ra của prompt đã được mở rộng. Tiền tốout_được thêm tự động vì đầu vào và đầu ra cùng tên (prompt), nhằm tránh xung đột tên trong cấu hình. Nó códisplay: "output", hiển thị dưới dạng cổng đầu ra.old_prompt: Cótype: "custom"vì chúng ta không chỉ định metadata. Điều này hiển thị dưới dạng một chấm đơn giản trong UI. Vì chúng ta thực sự không muốn hiển thị nó trong UI, chúng ta có thể xóa nó.doc: Đầu ra tài liệu, được thêm tự động vào tất cả các khối tùy chỉnh.
Thực hiện các điều chỉnh
Xóa old_prompt khỏi cả params và output_names vì bạn sẽ không cần sử dụng nó nữa.
{
"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"
}
}
}Xem cấu hình cuối cùng tại diffusers/gemini-prompt-expander-mellon.
Update on GitHub