Qwen-Image 2.1 Fun ControlNet Union: 파일 하나로 8가지 제어

ComfyUI Wikinews

Alibaba PAI의 Qwen-Image 2.1용 ControlNet Union은 8가지 구조 제어와 인페인팅을 7.5 GB 브랜치 하나에 담았으며, ComfyUI 지원도 준비 중입니다.

Qwen-Image-2.1-Fun-Controlnet-Union (Hugging Face | VideoX-Fun | ComfyUI PR #16519)은 Qwen-Image 2.1용 Alibaba PAI의 ControlNet-Union 브랜치입니다. 7.5 GB checkpoint 하나가 8가지 구조 제어 조건과 인페인팅을 구동하며, 고정된 베이스 트랜스포머를 대체하는 것이 아니라 그 위에 로드됩니다.

Qwen-Image 2.1은 2026년 9월 20일, 동일한 가중치로 생성과 편집을 모두 수행하고 실제 RGBA 알파를 기록하는 7B 단일 스트림 DiT로 공개되었습니다. ControlNet-Union 브랜치는 Alibaba PAI가 MiniMax H3에서 택한 것과 같은 경로를 따릅니다. 즉 모든 조건을 포괄하는 단일 control checkpoint이므로 조건별로 가중치를 바꿔 끼울 필요가 없습니다.

브랜치 하나, 여덟 가지 조건

공개된 파일에는 control 브랜치만 들어 있습니다 (control_img_in과 16개의 control_blocks, model card 기준 약 7.0 GB, 디스크상 7.55 GB). 이 브랜치는 고정된 상태로 유지되는 베이스 Qwen-Image 2.1 트랜스포머 위에 strict=False로 로드되므로, 베이스 가중치는 있는 그대로 재사용됩니다.

제어 조건Canny, Depth, Grayscale, HED, Lineart, MLSD, Pose, Scribble
Control 브랜치 깊이16개 블록, 32개 트랜스포머 블록 중 매 2번째마다 스킵 하나 (control_layers = [0, 2, 4, ..., 30])
제어 입력 너비control_in_dim = 129: 제어 latent (64) + 마스크 (1) + 마스킹된 이미지 latent (64)
주입 방식각 제어 블록의 zero-gated before_proj / after_proj를 메인 브랜치에 다시 더함
샘플링CFG 증류 모델로, 예제 스크립트는 guidance_scale = 1.0에서 실행 (스텝당 forward pass 한 번)
텍스트 인코더 / VAE프롬프트와 조건 이미지에 Qwen3-VL 프로세서 사용, VAE가 RGBA를 디코딩하므로 프리뷰는 PNG로 저장됨

control_context_scale은 각 제어 스킵이 메인 브랜치에 더해지기 전에 그 값을 조절합니다. 1.0은 모든 공개 결과에 사용된 가장 강한 설정이고, 값을 낮추면 가이드가 약해지며, 0.0은 제어 브랜치를 끕니다.

제어 조건

조건제어 신호
CannyCanny 엣지 맵
Depth단안 깊이 맵
Grayscale그레이스케일(휘도) 이미지
HEDHED 엣지 감지 맵
Lineart라인아트 추출
MLSD선분 감지 맵
PoseDWPose 스켈레톤
Scribble자유 곡선 또는 스케치 선

대상 캔버스 크기의 일반적인 RGB 제어 이미지라면 무엇이든 사용할 수 있습니다. model card에 따르면 선 두께, 임계값, 크롭이 달라도 견딥니다. 아래 모든 샘플은 model card에서 40 추론 스텝, control_context_scale = 1.0, seed 43으로 생성한 것이며, 왼쪽이 제어 신호, 오른쪽이 생성 결과입니다.

Canny 제어Canny 결과
Canny 엣지 맵생성된 출력
Depth 제어Depth 결과
Depth 맵생성된 출력
Grayscale 제어Grayscale 결과
그레이스케일 이미지생성된 출력
Scribble 제어Scribble 결과
Scribble 스케치생성된 출력

나머지 조건(HED, Lineart, MLSD, Pose)도 모델 페이지에서 같은 패턴을 따릅니다.

인페인팅도 같은 브랜치를 공유합니다

제어 입력이 129채널로 확장된 이유는 바로 하나의 브랜치가 두 가지 작업을 모두 처리할 수 있게 하기 위해서입니다. 제어 latent, 유지 마스크, 마스킹된 이미지 latent가 브랜치에 들어가기 전에 연결됩니다. 순수 제어에서는 마스크와 마스킹된 이미지 채널이 0으로 패딩되므로 같은 checkpoint로 일반 Canny나 Depth도 실행할 수 있습니다. 인페인팅에서는 마스킹된 영역이 프롬프트에 따라 다시 그려지고 나머지 프레임은 보존되며, 두 방식을 결합할 수도 있습니다. 제어 이미지와 마스크를 함께 입력하면 다시 그려진 영역이 프롬프트와 주어진 구조를 모두 따릅니다.

마스크는 콘텐츠를 다시 생성할 곳이 흰색, 유지할 곳이 검정색입니다. 재생성된 픽셀은 VAE의 [-1, 1] 입력 범위에서 0에 해당하는 중간 회색으로 인코딩되므로, 손대지 않은 영역은 왕복 과정을 거쳐도 그대로 유지됩니다.

인페인트 소스인페인트 마스크Pose 제어인페인트 출력
소스 이미지마스크Pose 제어인페인트 출력

ComfyUI 지원

ComfyUI 지원은 아직 릴리스되지 않고 리뷰 중입니다. Kijai가 2026년 9월 24일 PR #16519("Support Qwen-Image 2.1 union fun controlnet")를 열었으며, 이 PR은 네 개의 파일을 변경합니다.

  • comfy/ldm/qwen_image21/model.py는 QwenImage21FunControl과 QwenImage21FunControlBlock을 추가합니다. VACE 스타일 브랜치로, 제어 latent를 대상 행에 시드하고 각 블록의 after_proj 스킵을 베이스 블록 하나 뒤에 다시 더합니다.
  • comfy_extras/nodes_model_patch.py는 ModelPatchLoader에 이 레이아웃을 인식시킵니다. control_img_in과 control_blocks.0.img_mlp.out.weight로 checkpoint를 감지하고, state dict에서 블록 수, control_in_dim, head dim, MLP 비율을 도출하므로 로더 하나로 이 checkpoint 계열을 처리할 수 있습니다. 양자화 파일은 mixed-precision 연산으로 로드되어 레이어는 양자화된 상태로 유지하면서 bf16 연산을 사용합니다.
  • comfy_extras/nodes_qwen.py는 QwenImage21FunControlNetApply("Apply Qwen Image 2.1 Fun ControlNet")를 추가합니다. 입력은 model과 model_patch, strength(기본값 1.0), start_percent / end_percent, 그리고 선택적 control_image, inpaint_image, mask("1은 재생성할 영역을 표시")입니다.
  • comfy/controlnet.py는 Qwen Fun 로더 감지를 더 엄격하게 다듬어 새 checkpoint가 예전 ControlNet 레이아웃으로 오인되지 않도록 합니다.

PR이 리뷰 중인 동안 Kijai가 변환한 ComfyUI 패치를 이미 공개했습니다.

Comfy-Org/workflow_templates에는 아직 이 기능을 위한 공식 워크플로 템플릿이 없습니다. 따라서 이전 Qwen-Image 템플릿(image_qwen_image_controlnet_patch, image_qwen_image_instantx_inpainting_controlnet)은 구형 모델용이며 여기에는 적용되지 않습니다.

사용 가능 여부

ComfyUI 외부에서 이 checkpoint는 VideoX-Fun을 통해 실행됩니다. VideoX-Fun을 복제하고, 베이스 Qwen-Image 2.1 모델과 제어 checkpoint를 models/Diffusion_Transformer/ 아래에 둔 다음, examples/qwenimage21_fun/predict_t2i_control.py(인페인팅은 predict_i2i_inpaint.py)를 실행하세요. 이 브랜치는 "Update Qwen Image 2.1 Control and Flex Forcing" 커밋에서 추가되었습니다.

model card에서 기억해 둘 만한 네 가지 사항이 있습니다.

  • config_path는 반드시 config/qwenimage21/qwenimage21_control.yaml이어야 합니다. 이 설정이 checkpoint가 기대하는 대로 제어 브랜치를 구성하며(control_layers: [0, 2, 4, ..., 30], control_in_dim: 129), 다른 config를 사용하면 제어 가중치가 조용히 누락되거나 잘못 배치되어 잘못된 출력이 나옵니다.
  • sample_size는 출력 캔버스를 설정합니다. 제어 맵이 왜곡되지 않도록 가로와 세로를 모두 16의 배수로 유지하세요.
  • use_kv_cache = True는 첫 디노이징 스텝 이후 텍스트와 조건 이미지 키를 캐시하여 고정 해상도에서 생성 속도를 높입니다.
  • 메모리: 트랜스포머와 Qwen3-VL 텍스트 인코더는 소비자용 GPU 한 장에 완전히 올라가지 않습니다. model card는 가장 빠른 옵션으로 model_group_offload를, 고용량 GPU 한 장에서는 model_cpu_offload_and_qfloat8을 권장합니다.

댓글

GitHub로 로그인하고 토론에 참여하세요.

댓글을 불러오는 중…
Qwen-Image 2.1 Fun ControlNet Union: 파일 하나로 8가지 제어 | ComfyUI Wiki