Qwen-Image 2.1 Fun ControlNet Union: 파일 하나로 8가지 제어
Alibaba PAI의 Qwen-Image 2.1용 ControlNet Union은 8가지 구조 제어와 인페인팅을 7.5 GB 브랜치 하나에 담았으며, ComfyUI 지원도 준비 중입니다.
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은 제어 브랜치를 끕니다.
제어 조건
| 조건 | 제어 신호 |
|---|---|
| Canny | Canny 엣지 맵 |
| Depth | 단안 깊이 맵 |
| Grayscale | 그레이스케일(휘도) 이미지 |
| HED | HED 엣지 감지 맵 |
| Lineart | 라인아트 추출 |
| MLSD | 선분 감지 맵 |
| Pose | DWPose 스켈레톤 |
| Scribble | 자유 곡선 또는 스케치 선 |
대상 캔버스 크기의 일반적인 RGB 제어 이미지라면 무엇이든 사용할 수 있습니다. model card에 따르면 선 두께, 임계값, 크롭이 달라도 견딥니다. 아래 모든 샘플은 model card에서 40 추론 스텝, control_context_scale = 1.0, seed 43으로 생성한 것이며, 왼쪽이 제어 신호, 오른쪽이 생성 결과입니다.
![]() | ![]() |
|---|---|
| Canny 엣지 맵 | 생성된 출력 |
![]() | ![]() |
|---|---|
| Depth 맵 | 생성된 출력 |
![]() | ![]() |
|---|---|
| 그레이스케일 이미지 | 생성된 출력 |
![]() | ![]() |
|---|---|
| Scribble 스케치 | 생성된 출력 |
나머지 조건(HED, Lineart, MLSD, Pose)도 모델 페이지에서 같은 패턴을 따릅니다.
인페인팅도 같은 브랜치를 공유합니다
제어 입력이 129채널로 확장된 이유는 바로 하나의 브랜치가 두 가지 작업을 모두 처리할 수 있게 하기 위해서입니다. 제어 latent, 유지 마스크, 마스킹된 이미지 latent가 브랜치에 들어가기 전에 연결됩니다. 순수 제어에서는 마스크와 마스킹된 이미지 채널이 0으로 패딩되므로 같은 checkpoint로 일반 Canny나 Depth도 실행할 수 있습니다. 인페인팅에서는 마스킹된 영역이 프롬프트에 따라 다시 그려지고 나머지 프레임은 보존되며, 두 방식을 결합할 수도 있습니다. 제어 이미지와 마스크를 함께 입력하면 다시 그려진 영역이 프롬프트와 주어진 구조를 모두 따릅니다.
마스크는 콘텐츠를 다시 생성할 곳이 흰색, 유지할 곳이 검정색입니다. 재생성된 픽셀은 VAE의 [-1, 1] 입력 범위에서 0에 해당하는 중간 회색으로 인코딩되므로, 손대지 않은 영역은 왕복 과정을 거쳐도 그대로 유지됩니다.
![]() | ![]() | ![]() | ![]() |
|---|---|---|---|
| 소스 이미지 | 마스크 | 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 패치를 이미 공개했습니다.
- qwen_image_2.1_fun_controlnet_union_bf16.safetensors
- qwen_image_2.1_fun_controlnet_union_int8_convrot.safetensors
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로 로그인하고 토론에 참여하세요.