Skip to content

Commit 33bba23

Browse files
authored
Merge branch 'main' into lumina-naming-consistency
2 parents 1cd3dc1 + 748cb0f commit 33bba23

23 files changed

+1122
-197
lines changed

.github/workflows/pr_style_bot.yml

Lines changed: 40 additions & 157 deletions
Original file line numberDiff line numberDiff line change
@@ -9,160 +9,43 @@ permissions:
99
pull-requests: write
1010

1111
jobs:
12-
check-permissions:
13-
if: >
14-
contains(github.event.comment.body, '@bot /style') &&
15-
github.event.issue.pull_request != null
16-
runs-on: ubuntu-latest
17-
outputs:
18-
is_authorized: ${{ steps.check_user_permission.outputs.has_permission }}
19-
steps:
20-
- name: Check user permission
21-
id: check_user_permission
22-
uses: actions/github-script@v6
23-
with:
24-
script: |
25-
const comment_user = context.payload.comment.user.login;
26-
const { data: permission } = await github.rest.repos.getCollaboratorPermissionLevel({
27-
owner: context.repo.owner,
28-
repo: context.repo.repo,
29-
username: comment_user
30-
});
31-
const authorized = permission.permission === 'admin';
32-
console.log(`User ${comment_user} has permission level: ${permission.permission}, authorized: ${authorized} (only admins allowed)`);
33-
core.setOutput('has_permission', authorized);
34-
35-
run-style-bot:
36-
needs: check-permissions
37-
if: needs.check-permissions.outputs.is_authorized == 'true'
38-
runs-on: ubuntu-latest
39-
steps:
40-
- name: Extract PR details
41-
id: pr_info
42-
uses: actions/github-script@v6
43-
with:
44-
script: |
45-
const prNumber = context.payload.issue.number;
46-
const { data: pr } = await github.rest.pulls.get({
47-
owner: context.repo.owner,
48-
repo: context.repo.repo,
49-
pull_number: prNumber
50-
});
51-
52-
// We capture both the branch ref and the "full_name" of the head repo
53-
// so that we can check out the correct repository & branch (including forks).
54-
core.setOutput("prNumber", prNumber);
55-
core.setOutput("headRef", pr.head.ref);
56-
core.setOutput("headRepoFullName", pr.head.repo.full_name);
57-
58-
- name: Check out PR branch
59-
uses: actions/checkout@v3
60-
env:
61-
HEADREPOFULLNAME: ${{ steps.pr_info.outputs.headRepoFullName }}
62-
HEADREF: ${{ steps.pr_info.outputs.headRef }}
63-
with:
64-
# Instead of checking out the base repo, use the contributor's repo name
65-
repository: ${{ env.HEADREPOFULLNAME }}
66-
ref: ${{ env.HEADREF }}
67-
# You may need fetch-depth: 0 for being able to push
68-
fetch-depth: 0
69-
token: ${{ secrets.GITHUB_TOKEN }}
70-
71-
- name: Debug
72-
env:
73-
HEADREPOFULLNAME: ${{ steps.pr_info.outputs.headRepoFullName }}
74-
HEADREF: ${{ steps.pr_info.outputs.headRef }}
75-
PRNUMBER: ${{ steps.pr_info.outputs.prNumber }}
76-
run: |
77-
echo "PR number: $PRNUMBER"
78-
echo "Head Ref: $HEADREF"
79-
echo "Head Repo Full Name: $HEADREPOFULLNAME"
80-
81-
- name: Set up Python
82-
uses: actions/setup-python@v4
83-
84-
- name: Install dependencies
85-
run: |
86-
pip install .[quality]
87-
88-
- name: Download necessary files from main branch of Diffusers
89-
run: |
90-
curl -o main_Makefile https://raw.githubusercontent.com/huggingface/diffusers/main/Makefile
91-
curl -o main_setup.py https://raw.githubusercontent.com/huggingface/diffusers/refs/heads/main/setup.py
92-
curl -o main_check_doc_toc.py https://raw.githubusercontent.com/huggingface/diffusers/refs/heads/main/utils/check_doc_toc.py
93-
94-
- name: Compare the files and raise error if needed
95-
run: |
96-
diff_failed=0
97-
98-
if ! diff -q main_Makefile Makefile; then
99-
echo "Error: The Makefile has changed. Please ensure it matches the main branch."
100-
diff_failed=1
101-
fi
102-
103-
if ! diff -q main_setup.py setup.py; then
104-
echo "Error: The setup.py has changed. Please ensure it matches the main branch."
105-
diff_failed=1
106-
fi
107-
108-
if ! diff -q main_check_doc_toc.py utils/check_doc_toc.py; then
109-
echo "Error: The utils/check_doc_toc.py has changed. Please ensure it matches the main branch."
110-
diff_failed=1
111-
fi
112-
113-
if [ $diff_failed -eq 1 ]; then
114-
echo "❌ Error happened as we detected changes in the files that should not be changed ❌"
115-
exit 1
116-
fi
117-
118-
echo "No changes in the files. Proceeding..."
119-
rm -rf main_Makefile main_setup.py main_check_doc_toc.py
120-
121-
- name: Run make style and make quality
122-
run: |
123-
make style && make quality
124-
125-
- name: Commit and push changes
126-
id: commit_and_push
127-
env:
128-
HEADREPOFULLNAME: ${{ steps.pr_info.outputs.headRepoFullName }}
129-
HEADREF: ${{ steps.pr_info.outputs.headRef }}
130-
PRNUMBER: ${{ steps.pr_info.outputs.prNumber }}
131-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
132-
run: |
133-
echo "HEADREPOFULLNAME: $HEADREPOFULLNAME, HEADREF: $HEADREF"
134-
# Configure git with the Actions bot user
135-
git config user.name "github-actions[bot]"
136-
git config user.email "github-actions[bot]@users.noreply.github.com"
137-
138-
# Make sure your 'origin' remote is set to the contributor's fork
139-
git remote set-url origin "https://x-access-token:${GITHUB_TOKEN}@github.com/$HEADREPOFULLNAME.git"
140-
141-
# If there are changes after running style/quality, commit them
142-
if [ -n "$(git status --porcelain)" ]; then
143-
git add .
144-
git commit -m "Apply style fixes"
145-
# Push to the original contributor's forked branch
146-
git push origin HEAD:$HEADREF
147-
echo "changes_pushed=true" >> $GITHUB_OUTPUT
148-
else
149-
echo "No changes to commit."
150-
echo "changes_pushed=false" >> $GITHUB_OUTPUT
151-
fi
152-
153-
- name: Comment on PR with workflow run link
154-
if: steps.commit_and_push.outputs.changes_pushed == 'true'
155-
uses: actions/github-script@v6
156-
with:
157-
script: |
158-
const prNumber = parseInt(process.env.prNumber, 10);
159-
const runUrl = `${process.env.GITHUB_SERVER_URL}/${process.env.GITHUB_REPOSITORY}/actions/runs/${process.env.GITHUB_RUN_ID}`
160-
161-
await github.rest.issues.createComment({
162-
owner: context.repo.owner,
163-
repo: context.repo.repo,
164-
issue_number: prNumber,
165-
body: `Style fixes have been applied. [View the workflow run here](${runUrl}).`
166-
});
167-
env:
168-
prNumber: ${{ steps.pr_info.outputs.prNumber }}
12+
style:
13+
uses: huggingface/huggingface_hub/.github/workflows/style-bot-action.yml@main
14+
with:
15+
python_quality_dependencies: "[quality]"
16+
pre_commit_script_name: "Download and Compare files from the main branch"
17+
pre_commit_script: |
18+
echo "Downloading the files from the main branch"
19+
20+
curl -o main_Makefile https://raw.githubusercontent.com/huggingface/diffusers/main/Makefile
21+
curl -o main_setup.py https://raw.githubusercontent.com/huggingface/diffusers/refs/heads/main/setup.py
22+
curl -o main_check_doc_toc.py https://raw.githubusercontent.com/huggingface/diffusers/refs/heads/main/utils/check_doc_toc.py
23+
24+
echo "Compare the files and raise error if needed"
25+
26+
diff_failed=0
27+
if ! diff -q main_Makefile Makefile; then
28+
echo "Error: The Makefile has changed. Please ensure it matches the main branch."
29+
diff_failed=1
30+
fi
31+
32+
if ! diff -q main_setup.py setup.py; then
33+
echo "Error: The setup.py has changed. Please ensure it matches the main branch."
34+
diff_failed=1
35+
fi
36+
37+
if ! diff -q main_check_doc_toc.py utils/check_doc_toc.py; then
38+
echo "Error: The utils/check_doc_toc.py has changed. Please ensure it matches the main branch."
39+
diff_failed=1
40+
fi
41+
42+
if [ $diff_failed -eq 1 ]; then
43+
echo "❌ Error happened as we detected changes in the files that should not be changed ❌"
44+
exit 1
45+
fi
46+
47+
echo "No changes in the files. Proceeding..."
48+
rm -rf main_Makefile main_setup.py main_check_doc_toc.py
49+
style_command: "make style && make quality"
50+
secrets:
51+
bot_token: ${{ secrets.GITHUB_TOKEN }}

.github/workflows/pr_tests.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ name: Fast tests for PRs
33
on:
44
pull_request:
55
branches: [main]
6-
types: [synchronize]
76
paths:
87
- "src/diffusers/**.py"
98
- "benchmarks/**.py"

examples/advanced_diffusion_training/train_dreambooth_lora_flux_advanced.py

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -880,9 +880,7 @@ def save_embeddings(self, file_path: str):
880880
idx_to_text_encoder_name = {0: "clip_l", 1: "t5"}
881881
for idx, text_encoder in enumerate(self.text_encoders):
882882
train_ids = self.train_ids if idx == 0 else self.train_ids_t5
883-
embeds = (
884-
text_encoder.text_model.embeddings.token_embedding if idx == 0 else text_encoder.encoder.embed_tokens
885-
)
883+
embeds = text_encoder.text_model.embeddings.token_embedding if idx == 0 else text_encoder.shared
886884
assert embeds.weight.data.shape[0] == len(self.tokenizers[idx]), "Tokenizers should be the same."
887885
new_token_embeddings = embeds.weight.data[train_ids]
888886

@@ -904,9 +902,7 @@ def device(self):
904902
@torch.no_grad()
905903
def retract_embeddings(self):
906904
for idx, text_encoder in enumerate(self.text_encoders):
907-
embeds = (
908-
text_encoder.text_model.embeddings.token_embedding if idx == 0 else text_encoder.encoder.embed_tokens
909-
)
905+
embeds = text_encoder.text_model.embeddings.token_embedding if idx == 0 else text_encoder.shared
910906
index_no_updates = self.embeddings_settings[f"index_no_updates_{idx}"]
911907
embeds.weight.data[index_no_updates] = (
912908
self.embeddings_settings[f"original_embeddings_{idx}"][index_no_updates]
@@ -1749,7 +1745,7 @@ def load_model_hook(models, input_dir):
17491745
if args.enable_t5_ti: # whether to do pivotal tuning/textual inversion for T5 as well
17501746
text_lora_parameters_two = []
17511747
for name, param in text_encoder_two.named_parameters():
1752-
if "token_embedding" in name:
1748+
if "shared" in name:
17531749
# ensure that dtype is float32, even if rest of the model that isn't trained is loaded in fp16
17541750
param.data = param.to(dtype=torch.float32)
17551751
param.requires_grad = True

examples/community/README.md

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ PIXART-α Controlnet pipeline | Implementation of the controlnet model for pixar
8383
| [🪆Matryoshka Diffusion Models](https://huggingface.co/papers/2310.15111) | A diffusion process that denoises inputs at multiple resolutions jointly and uses a NestedUNet architecture where features and parameters for small scale inputs are nested within those of the large scales. See [original codebase](https://github.com/apple/ml-mdm). | [🪆Matryoshka Diffusion Models](#matryoshka-diffusion-models) | [![Hugging Face Space](https://img.shields.io/badge/🤗%20Hugging%20Face-Space-yellow)](https://huggingface.co/spaces/pcuenq/mdm) [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/gist/tolgacangoz/1f54875fc7aeaabcf284ebde64820966/matryoshka_hf.ipynb) | [M. Tolga Cangöz](https://github.com/tolgacangoz) |
8484
| Stable Diffusion XL Attentive Eraser Pipeline |[[AAAI2025 Oral] Attentive Eraser](https://github.com/Anonym0u3/AttentiveEraser) is a novel tuning-free method that enhances object removal capabilities in pre-trained diffusion models.|[Stable Diffusion XL Attentive Eraser Pipeline](#stable-diffusion-xl-attentive-eraser-pipeline)|-|[Wenhao Sun](https://github.com/Anonym0u3) and [Benlei Cui](https://github.com/Benny079)|
8585
| Perturbed-Attention Guidance |StableDiffusionPAGPipeline is a modification of StableDiffusionPipeline to support Perturbed-Attention Guidance (PAG).|[Perturbed-Attention Guidance](#perturbed-attention-guidance)|[Notebook](https://github.com/huggingface/notebooks/blob/main/diffusers/perturbed_attention_guidance.ipynb)|[Hyoungwon Cho](https://github.com/HyoungwonCho)|
86+
| CogVideoX DDIM Inversion Pipeline | Implementation of DDIM inversion and guided attention-based editing denoising process on CogVideoX. | [CogVideoX DDIM Inversion Pipeline](#cogvideox-ddim-inversion-pipeline) | - | [LittleNyima](https://github.com/LittleNyima) |
8687

8788
To load a custom pipeline you just need to pass the `custom_pipeline` argument to `DiffusionPipeline`, as one of the files in `diffusers/examples/community`. Feel free to send a PR with your own pipelines, we will merge them quickly.
8889

@@ -5222,3 +5223,39 @@ with torch.no_grad():
52225223

52235224
In the folder examples/pixart there is also a script that can be used to train new models.
52245225
Please check the script `train_controlnet_hf_diffusers.sh` on how to start the training.
5226+
5227+
# CogVideoX DDIM Inversion Pipeline
5228+
5229+
This implementation performs DDIM inversion on the video based on CogVideoX and uses guided attention to reconstruct or edit the inversion latents.
5230+
5231+
## Example Usage
5232+
5233+
```python
5234+
import torch
5235+
5236+
from examples.community.cogvideox_ddim_inversion import CogVideoXPipelineForDDIMInversion
5237+
5238+
5239+
# Load pretrained pipeline
5240+
pipeline = CogVideoXPipelineForDDIMInversion.from_pretrained(
5241+
"THUDM/CogVideoX1.5-5B",
5242+
torch_dtype=torch.bfloat16,
5243+
).to("cuda")
5244+
5245+
# Run DDIM inversion, and the videos will be generated in the output_path
5246+
output = pipeline_for_inversion(
5247+
prompt="prompt that describes the edited video",
5248+
video_path="path/to/input.mp4",
5249+
guidance_scale=6.0,
5250+
num_inference_steps=50,
5251+
skip_frames_start=0,
5252+
skip_frames_end=0,
5253+
frame_sample_step=None,
5254+
max_num_frames=81,
5255+
width=720,
5256+
height=480,
5257+
seed=42,
5258+
)
5259+
pipeline.export_latents_to_video(output.inverse_latents[-1], "path/to/inverse_video.mp4", fps=8)
5260+
pipeline.export_latents_to_video(output.recon_latents[-1], "path/to/recon_video.mp4", fps=8)
5261+
```

0 commit comments

Comments
 (0)