Skip to content

Commit 732356a

Browse files
authored
Merge branch 'main' into patch-1
2 parents 7d18503 + 748cb0f commit 732356a

File tree

49 files changed

+3725
-301
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+3725
-301
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: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ def log_validation(
227227
pipeline.set_progress_bar_config(disable=True)
228228

229229
# run inference
230-
generator = torch.Generator(device=accelerator.device).manual_seed(args.seed) if args.seed else None
230+
generator = torch.Generator(device=accelerator.device).manual_seed(args.seed) if args.seed is not None else None
231231
autocast_ctx = nullcontext()
232232

233233
with autocast_ctx:
@@ -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/advanced_diffusion_training/train_dreambooth_lora_sd15_advanced.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1883,7 +1883,11 @@ def compute_text_embeddings(prompt, text_encoders, tokenizers):
18831883
pipeline.set_progress_bar_config(disable=True)
18841884

18851885
# run inference
1886-
generator = torch.Generator(device=accelerator.device).manual_seed(args.seed) if args.seed else None
1886+
generator = (
1887+
torch.Generator(device=accelerator.device).manual_seed(args.seed)
1888+
if args.seed is not None
1889+
else None
1890+
)
18871891
pipeline_args = {"prompt": args.validation_prompt}
18881892

18891893
if torch.backends.mps.is_available():
@@ -1987,7 +1991,9 @@ def compute_text_embeddings(prompt, text_encoders, tokenizers):
19871991
)
19881992
# run inference
19891993
pipeline = pipeline.to(accelerator.device)
1990-
generator = torch.Generator(device=accelerator.device).manual_seed(args.seed) if args.seed else None
1994+
generator = (
1995+
torch.Generator(device=accelerator.device).manual_seed(args.seed) if args.seed is not None else None
1996+
)
19911997
images = [
19921998
pipeline(args.validation_prompt, num_inference_steps=25, generator=generator).images[0]
19931999
for _ in range(args.num_validation_images)

examples/advanced_diffusion_training/train_dreambooth_lora_sdxl_advanced.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ def log_validation(
269269
pipeline.set_progress_bar_config(disable=True)
270270

271271
# run inference
272-
generator = torch.Generator(device=accelerator.device).manual_seed(args.seed) if args.seed else None
272+
generator = torch.Generator(device=accelerator.device).manual_seed(args.seed) if args.seed is not None else None
273273
# Currently the context determination is a bit hand-wavy. We can improve it in the future if there's a better
274274
# way to condition it. Reference: https://github.com/huggingface/diffusers/pull/7126#issuecomment-1968523051
275275
if torch.backends.mps.is_available() or "playground" in args.pretrained_model_name_or_path:

examples/cogvideo/train_cogvideox_image_to_video_lora.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -722,7 +722,7 @@ def log_validation(
722722
# pipe.set_progress_bar_config(disable=True)
723723

724724
# run inference
725-
generator = torch.Generator(device=accelerator.device).manual_seed(args.seed) if args.seed else None
725+
generator = torch.Generator(device=accelerator.device).manual_seed(args.seed) if args.seed is not None else None
726726

727727
videos = []
728728
for _ in range(args.num_validation_videos):

examples/cogvideo/train_cogvideox_lora.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -739,7 +739,7 @@ def log_validation(
739739
# pipe.set_progress_bar_config(disable=True)
740740

741741
# run inference
742-
generator = torch.Generator(device=accelerator.device).manual_seed(args.seed) if args.seed else None
742+
generator = torch.Generator(device=accelerator.device).manual_seed(args.seed) if args.seed is not None else None
743743

744744
videos = []
745745
for _ in range(args.num_validation_videos):

0 commit comments

Comments
 (0)