Text-to-Image
Diffusers
Safetensors
LibreFluxIPAdapterPipeline
neuralvfx's picture
Update README.md
416cb7d verified
---
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
![Example: Control image vs result](examples/matrix_edge.png)
This model/pipeline is the product of my [LibreFlux IP-Adapter training repo](https://github.com/NeuralVFX/LibreFLUX-IP-Adapter), which uses [LibreFLUX](https://huggingface.co/jimmycarter/LibreFLUX) as the underlying Transformer model. The IP Adapter and Attention Wrapper design is roughly based on the [InstantX IP Adapter](https://huggingface.co/InstantX/FLUX.1-dev-IP-Adapter/)
I used transfer learning, to fintune the InstantX weights until they worked with LibreFlux and attention masking. For the dataset, I trained on [laion2b-squareish-1024px](https://huggingface.co/datasets/opendiffusionai/laion2b-squareish-1024px/) for roughly 20,000 iterations.
# 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
# Fun Facts
- Fine tuned from these weights: [https://huggingface.co/InstantX/FLUX.1-dev-IP-Adapter/](https://huggingface.co/InstantX/FLUX.1-dev-IP-Adapter/)
- Trained on the [laion2b-squareish-1024px Dataset](https://huggingface.co/datasets/opendiffusionai/laion2b-squareish-1024px/)
- Trained using this repo: [https://github.com/NeuralVFX/LibreFLUX-IP-Adapter](https://github.com/NeuralVFX/LibreFLUX-IP-Adapter)
- Transformer model used: [https://huggingface.co/jimmycarter/LibreFlux](https://huggingface.co/jimmycarter/LibreFlux)
- Inference code roughly adapted from: [https://github.com/bghira/SimpleTuner](https://github.com/bghira/SimpleTuner)
# 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"
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",
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 IP Adapter Image
hf_hub_download(repo_id="neuralvfx/LibreFlux-IP-Adapter",
filename="examples/david.jpg",
local_dir=".",
local_dir_use_symlinks=False)
# Load IP Adapter Image
ip_image = Image.open("examples/david.jpg").convert("RGB")
ip_image = ip_image.resize((512, 512))
prompt = "george washington"
negative_prompt = "blurry, low quality"
generator = torch.Generator(device="cuda").manual_seed(1995)
images = pipe(
prompt=prompt,
negative_prompt=negative_prompt,
return_dict=False,
ip_adapter_image=ip_image,
ip_adapter_scale=1.0,
height=512,
width=512,
num_inference_steps=75,
generator=generator
)[0][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"
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",
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",
],
)
freeze(pipe.transformer)
freeze(pipe.ip_adapter)
# Enable Model Offloading
pipe.enable_model_cpu_offload()
```