"매 prompt 의 strict 의 dial". 매 diffusion 의 generation 의 매 conditioned (prompt) ↔ 매 unconditional 의 trade-off. 매 high CFG = 매 prompt 의 strict 가, 매 over-saturation. 매 sweet spot 7-9 (SDXL) / 3.5-7 (Flux).
📖 핵심
매 formula
\epsilon_{\text{guided}} = \epsilon_{\text{uncond}} + s \cdot (\epsilon_{\text{cond}} - \epsilon_{\text{uncond}})
매 s = CFG scale.
매 s = 1 → 매 unconditional (prompt 무시).
매 s = 7 → 매 typical.
매 s > 15 → 매 over-cooked.
매 negative prompt = 매 conditional 의 두 번째 (with -1 coefficient).
매 effect
CFG
결과
< 1
매 random / blank
1-3
매 loose, 매 creative
5-7
매 balanced (default)
7-12
매 prompt-strict
13-20
매 over-saturated, 매 burned
> 20
매 garbage
매 modern alternative
Flux (Black Forest Labs)
매 distilled CFG (CFG=1 가능).
매 inference 의 fast (no double pass).
Negative prompt
매 unconditional 의 noise 의 swap.
매 explicit avoidance.
Dynamic CFG
매 step 의 따라 변동.
매 early high → 매 late low.
Adaptive CFG (CFG++)
매 adaptive scale.
매 over-saturation 회피.
매 sampler 와 의 interaction
매 DPM++ 2M Karras: 20 step + CFG 7.
매 DPM++ SDE: 30 step + CFG 5.
매 Euler ancestral: 매 stochastic.
매 Flux: CFG=1 + 4-step.
매 prompt quality 와 의 관계
매 좋은 prompt + CFG 7 = 매 best.
매 나쁜 prompt + CFG ↑ = 매 더 나쁘게 (confident garbage).
매 negative prompt 의 keyword 매 wrong → 매 오히려 push.
→ CFG ↑ ≠ 매 quality ↑. 매 prompt quality 가 base.
매 typical setup
모델
CFG
Steps
Sampler
SD 1.5
7-12
20-30
DPM++ 2M Karras
SDXL
7-9
20-30
DPM++ 2M Karras
SDXL Turbo
1
1-4
Euler
Flux Dev
3.5
20-50
Euler
Flux Schnell
1
4
Euler
💻 패턴
Diffusers (basic)
fromdiffusersimportStableDiffusionXLPipelineimporttorchpipe=StableDiffusionXLPipeline.from_pretrained('stabilityai/stable-diffusion-xl-base-1.0',torch_dtype=torch.float16,).to('cuda')image=pipe(prompt='a cat with a hat, oil painting, vivid colors',negative_prompt='blurry, low quality, watermark',guidance_scale=7.0,# 매 CFGnum_inference_steps=30,).images[0]
fromdiffusersimportFluxPipelinepipe=FluxPipeline.from_pretrained('black-forest-labs/FLUX.1-dev',torch_dtype=torch.bfloat16).to('cuda')image=pipe(prompt='a cat with a hat',guidance_scale=3.5,# Flux devnum_inference_steps=50,).images[0]# Schnell (4-step, distilled)pipe_schnell=FluxPipeline.from_pretrained('black-forest-labs/FLUX.1-schnell',torch_dtype=torch.bfloat16).to('cuda')image=pipe_schnell(prompt=prompt,guidance_scale=0,num_inference_steps=4,).images[0]
Dynamic CFG
defdynamic_cfg_callback(pipe,step,timestep,callback_kwargs):"""매 early step 의 high CFG, 매 late 의 low."""progress=step/pipe.num_inference_stepscfg=12-7*progress# 12 → 5callback_kwargs['guidance_scale']=cfgreturncallback_kwargspipe(prompt=prompt,callback_on_step_end=dynamic_cfg_callback)
Custom CFG implementation
defclassifier_free_guidance(model,x_t,t,prompt_emb,neg_prompt_emb,scale):# 매 batched: cond + uncondemb_combined=torch.cat([neg_prompt_emb,prompt_emb])x_t_combined=torch.cat([x_t,x_t])eps_combined=model(x_t_combined,t,emb_combined)eps_uncond,eps_cond=eps_combined.chunk(2)# 매 guidedreturneps_uncond+scale*(eps_cond-eps_uncond)
CFG++ (adaptive)
defcfg_pp(eps_cond,eps_uncond,scale,x_t,alpha_t):"""CFG++ — 매 over-saturation 회피."""cfg_basic=eps_uncond+scale*(eps_cond-eps_uncond)# 매 sample-space adjustmentdelta=(cfg_basic-eps_uncond)*(1-alpha_t)returneps_uncond+scale*(eps_cond-eps_uncond)-delta
Negative prompt strategy
# 매 좋은 negative promptnegative_prompts={'photorealistic':'cartoon, anime, painting, drawing','illustration':'photo, photograph, photographic','quality':'blurry, low quality, jpeg artifacts, watermark, signature, deformed, ugly','anatomy':'extra limbs, deformed hands, missing fingers, distorted face',}prompt='a portrait of a woman'style='photorealistic'neg=negative_prompts['quality']+', '+negative_prompts[style]image=pipe(prompt=prompt,negative_prompt=neg,guidance_scale=7).images[0]
언제: 매 image generation tuning. 매 SD / Flux pipeline. 매 quality vs prompt-fidelity trade-off.
언제 X: 매 distilled model (CFG=1). 매 deterministic 매 sampler.
❌ 안티패턴
CFG 의 high 의 mean fix: 매 over-saturation.
Negative prompt 의 wrong word + high CFG: 매 confident garbage.