| --- |
| license: |
| - apache-2.0 |
| - other |
| license_name: flux-1-dev-non-commercial-license |
| license_link: https://huggingface.co/black-forest-labs/FLUX.1-dev/blob/main/LICENSE.md |
| library_name: diffusers |
| pipeline_tag: text-to-image |
| datasets: |
| - SA1B |
| - opendiffusionai/laion2b-squareish-1024px |
| base_model: |
| - jimmycarter/LibreFLUX |
| --- |
| # LibreFLUX-IP-Adapter-ControlNet |
|  |
|
|
| This model/pipeline combines my [LibreFlux-IP-Adapter](https://huggingface.co/neuralvfx/LibreFlux-IP-Adapter) and [LibreFlux ControlNet](https://huggingface.co/neuralvfx/LibreFlux-ControlNet), into a single pipeline. [LibreFLUX](https://huggingface.co/jimmycarter/LibreFLUX) is used as the underlying Transformer model. |
|
|
| # How does this relate to LibreFLUX? |
| - Base model is [LibreFLUX](https://huggingface.co/jimmycarter/LibreFLUX) |
| - Trained in same non-distilled fashion |
| - Uses Attention Masking |
| - Uses CFG during Inference |
| |
| # Compatibility |
| ```py |
| pip install -U diffusers==0.35.2 |
| pip install -U transformers==4.57.1 |
| ``` |
|
|
| Low VRAM: |
| ```py |
| pip install optimum.quanto |
| ``` |
|
|
|
|
| # Load Pipeline |
| ```py |
| import torch |
| from diffusers import DiffusionPipeline |
| from huggingface_hub import hf_hub_download |
| |
| model_id = "neuralvfx/LibreFlux-IP-Adapter-ControlNet" |
| |
| device = "cuda" if torch.cuda.is_available() else "cpu" |
| dtype = torch.bfloat16 if device == "cuda" else torch.float32 |
| |
| pipe = DiffusionPipeline.from_pretrained( |
| model_id, |
| custom_pipeline=model_id, |
| trust_remote_code=True, |
| torch_dtype=dtype, |
| safety_checker=None |
| ) |
| |
| # Optional way to download the weights |
| hf_hub_download(repo_id="neuralvfx/LibreFlux-IP-Adapter-ControlNet", |
| filename="ip_adapter.pt", |
| local_dir=".", |
| local_dir_use_symlinks=False) |
| |
| pipe.load_ip_adapter('ip_adapter.pt') |
| |
| pipe.to(device) |
| ``` |
|
|
| # Inference |
| ```py |
| from PIL import Image |
| from torchvision.transforms import ToTensor |
| |
| |
| # Optional way to download test Control Net Image |
| hf_hub_download(repo_id="neuralvfx/LibreFlux-IP-Adapter-ControlNet", |
| filename="examples/libre_flux_control_image.png", |
| local_dir=".", |
| local_dir_use_symlinks=False) |
| |
| # Load Control Image |
| cond = Image.open("examples/libre_flux_control_image.png").convert("RGB") |
| cond = cond.resize((1024, 1024)) |
| |
| # Optional way to download test IP Adapter Image |
| hf_hub_download(repo_id="neuralvfx/LibreFlux-IP-Adapter-ControlNet", |
| filename="examples/merc.jpeg", |
| local_dir=".", |
| local_dir_use_symlinks=False) |
| |
| # Load IP Adapter Image |
| ip_image = Image.open("examples/merc.jpeg").convert("RGB") |
| ip_image = ip_image.resize((512, 512)) |
| |
| out = pipe( |
| prompt="the words libre flux", |
| negative_prompt="blurry", |
| control_image=cond, # Use the tensor here |
| num_inference_steps=75, |
| guidance_scale=4.0, |
| controlnet_conditioning_scale=1.0, |
| ip_adapter_image=ip_image, |
| ip_adapter_scale=1.0, |
| num_images_per_prompt=1, |
| generator= torch.Generator().manual_seed(74), |
| return_dict=True, |
| ) |
| out.images[0] |
| ``` |
|
|
| # Load Pipeline ( Low VRAM ) |
| ```py |
| import torch |
| from huggingface_hub import hf_hub_download |
| from diffusers import DiffusionPipeline |
| from optimum.quanto import freeze, quantize, qint8 |
| |
| model_id = "neuralvfx/LibreFlux-IP-Adapter-ControlNet" |
| |
| device = "cuda" if torch.cuda.is_available() else "cpu" |
| dtype = torch.bfloat16 if device == "cuda" else torch.float32 |
| |
| pipe = DiffusionPipeline.from_pretrained( |
| model_id, |
| custom_pipeline=model_id, |
| trust_remote_code=True, |
| torch_dtype=dtype, |
| safety_checker=None |
| ) |
| |
| # Optional way to download the weights |
| hf_hub_download(repo_id="neuralvfx/LibreFlux-IP-Adapter-ControlNet", |
| filename="ip_adapter.pt", |
| local_dir=".", |
| local_dir_use_symlinks=False) |
| |
| # Load the IP Adapter First |
| pipe.load_ip_adapter('ip_adapter.pt') |
| |
| # Quantize and Freeze |
| quantize( |
| pipe.transformer, |
| weights=qint8, |
| exclude=[ |
| "*.norm", "*.norm1", "*.norm2", "*.norm2_context", |
| "proj_out", "x_embedder", "norm_out", "context_embedder", |
| ], |
| ) |
| |
| quantize( |
| pipe.ip_adapter, |
| weights=qint8, |
| exclude=[ |
| "*.norm", "*.norm1", "*.norm2", "*.norm2_context", |
| "proj_out", "x_embedder", "norm_out", "context_embedder", |
| ], |
| ) |
| |
| quantize( |
| pipe.controlnet, |
| weights=qint8, |
| exclude=[ |
| "*.norm", "*.norm1", "*.norm2", "*.norm2_context", |
| "proj_out", "x_embedder", "norm_out", "context_embedder", |
| ], |
| ) |
| |
| freeze(pipe.transformer) |
| freeze(pipe.ip_adapter) |
| freeze(pipe.controlnet) |
| |
| # Enable Model Offloading |
| pipe.enable_model_cpu_offload() |
| ``` |
|
|