Buckets:

mishig's picture
|
download
raw
12.2 kB
## Sử dụng Khối Tùy Chỉnh với Mellon
[Mellon](https://github.com/cubiq/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.
> [!WARNING]
> 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](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)
Để sử dụng khối tùy chỉnh dạng module của diffusers trong Mellon:
1. Kéo một **Dynamic Block Node** từ phần ModularDiffusers
2. Nhập `repo_id` (ví dụ: `diffusers/gemini-prompt-expander-mellon`)
3. Nhấp vào **Tải khối tùy chỉnh**
4. 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
1. **Chỉ định kiểu Mellon cho các tham số của bạn** - Mỗi `InputParam`/`OutputParam` cầ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"`).
2. **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.
3. **(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](./custom_blocks#editing-custom-blocks) để biết cách tải nó về máy cục bộ.
```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
)
]
```
Để 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`:
```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"])},
)
```
### 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`:
```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]
> Khi cả `metadata` và `input_types`/`output_types` được chỉ định, các đối số sẽ ghi đè lên `metadata`.
## 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:
```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
)
```
Đ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:
```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"
}
}
}
```
### 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](/docs/diffusers/main/vi/api/modular_diffusers/pipeline_blocks#diffusers.ModularPipelineBlocks) cơ bản:
| 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 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ường `type: "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.
```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"
}
}
}
```
Xem cấu hình cuối cùng tại [diffusers/gemini-prompt-expander-mellon](https://huggingface.co/diffusers/gemini-prompt-expander-mellon).

Xet Storage Details

Size:
12.2 kB
·
Xet hash:
a9069aeec70b2e761b989f5babba9f1b5d34c2f19d2da76f575aaa10167dc534

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