Buckets:
Mellon에서 사용자 정의 블록 사용
Mellon은 Modular Diffusers와 통합되는 시각적 워크플로 인터페이스로, 노드 기반 워크플로를 위해 설계되었습니다.
Mellon은 초기 개발 단계에 있으며 아직 프로덕션 사용에 적합하지 않습니다. 이 내용을 통합이 어떻게 작동하는지에 대한 미리보기로 생각해 주세요!
Mellon에서는 커스텀 블록이 기본적으로 작동합니다 - 저장소에 mellon_pipeline_config.json만 추가하면 됩니다. 이 설정 파일은 Mellon이 블록의 매개변수를 UI 컴포넌트로 렌더링하는 방법을 알려줍니다.
Gemini Prompt Expander 블록을 사용한 실제 동작은 다음과 같습니다:
Mellon에서 모듈형 diffusers 커스텀 블록을 사용하려면:
- ModularDiffusers 섹션에서 Dynamic Block Node를 드래그합니다
repo_id를 입력하세요 (예:diffusers/gemini-prompt-expander-mellon)- 커스텀 블록 로드를 클릭하세요
- 노드는 블록의 입력과 출력을 표시하도록 변환됩니다
자신만의 커스텀 블록에 대해 이 config를 생성하는 방법을 살펴보겠습니다.
Mellon 설정을 만드는 단계
- 파라미터에 Mellon 유형 지정 - 각
InputParam/OutputParam에는 Mellon이 어떤 UI 컴포넌트를 렌더링할지 알려주는 유형(예:"textbox","dropdown","image")이 필요합니다. mellon_pipeline_config.json생성 - 유틸리티를 사용하여 설정 템플릿을 생성하고 Hub 저장소에 푸시합니다.- (선택 사항) config 수동 조정 - 특정 요구 사항에 맞게 생성된 config를 세밀하게 조정합니다.
매개변수에 대한 Mellon 유형 지정
Mellon 타입은 각 파라미터가 UI에서 어떻게 렌더링되는지를 결정합니다. 파라미터의 타입을 지정하지 않으면 "custom"로 기본 설정되며, 이는 단순한 연결 점으로 렌더링됩니다. 생성된 config에서 나중에 언제든지 이 값을 조정할 수 있습니다.
| 유형 | 입력/출력 | 설명 |
|---|---|---|
image |
둘 다 | 이미지 (PIL Image) |
video |
둘 다 | Video |
text |
둘 다 | 텍스트 표시 |
textbox |
입력 | 텍스트 입력 |
dropdown |
입력 | 드롭다운 선택 메뉴 |
slider |
입력 | 숫자 값을 위한 슬라이더 |
number |
입력 | 숫자 입력 |
checkbox |
입력 | Boolean 토글 |
추가 구성이 필요한 파라미터(옵션이 있는 드롭다운, min/max 값이 있는 슬라이더 등)의 경우, 문자열 대신 MellonParam 인스턴스를 직접 전달합니다. 아래 클래스 메서드 중 하나를 사용하거나, MellonParam(name, label, type, ...)으로 완전히 사용자 정의된 인스턴스를 생성할 수 있습니다.
| 메서드 | 설명 |
|---|---|
MellonParam.Input.image(name) |
이미지 입력 |
MellonParam.Input.textbox(name, default) |
textarea로 텍스트 입력 |
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) |
randomize 버튼으로 시드 입력 |
MellonParam.Input.checkbox(name, default) |
Boolean 체크박스 |
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의 기존 커스텀 블록을 편집하는 경우, 로컬로 다운로드하는 방법은 커스텀 블록 편집을 참고하세요.
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
)
]
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 설정을 생성하고 push합니다
블록에 메타데이터를 추가한 후, 기본 Mellon 구성 템플릿을 생성하여 Hub에 push합니다:
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 파일을 생성합니다.
config 검토 및 조정
생성된 템플릿은 시작점일 뿐이며, 필요에 맞게 조정할 수 있습니다. 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 딕셔너리는 각 UI 요소가 어떻게 렌더링되는지 정의합니다. input_names, model_input_names, output_names 목록은 이러한 UI 요소를 ModularPipelineBlocks의 I/O 인터페이스에 매핑합니다:
| 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"(UI에 표시됨),default: ""(빈 상태로 시작)를 가진 입력 매개변수입니다. Mellon에서type: "string"필드는 어떤 노드끼리 연결될 수 있는지를 결정하기 때문에 중요합니다. 동일한 타입끼리만 "noodles"로 연결할 수 있습니다.out_prompt: 확장된 프롬프트 출력입니다. 입력과 출력이 동일한 이름(prompt)을 공유하므로 설정에서 이름 충돌을 피하기 위해out_접두사가 자동으로 추가되었습니다.display: "output"를 가지고 있어 출력 소켓으로 렌더링됩니다.old_prompt: 메타데이터를 지정하지 않았기 때문에type: "custom"입니다. UI에서는 단순한 점으로 표시됩니다. 실제로 UI에 노출할 의도가 없으므로 제거할 수 있습니다.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에서 확인하세요.
Xet Storage Details
- Size:
- 11.4 kB
- Xet hash:
- 26304cc1de0668ad17a5ed1ae83a0639d89b27d9d73ba41d3c5af34eb1ac7ab9
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.
