Skip to content

Commit 3d90a9e

Browse files
dxqbclaude
andcommitted
Merge ctk_copy: transformers 5.9, torch 2.12, compile thread-safety
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2 parents 647afc2 + a0bd3e4 commit 3d90a9e

80 files changed

Lines changed: 164 additions & 346 deletions

File tree

Some content is hidden

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

.github/pull_request_template.md

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<!--
2+
Thanks for contributing to OneTrainer.
3+
Please read docs/Contributing.md / docs/ProjectStructure.md for the project guide.
4+
-->
5+
6+
## Summary
7+
8+
<!-- What this PR changes and why. Link an issue or discussion if relevant. -->
9+
10+
## Test plan
11+
12+
<!--
13+
OneTrainer has no automated test suite. Manual verification is expected.
14+
Describe what you actually did, not what you "would do".
15+
-->
16+
17+
- [ ] `pre-commit run --all-files` passes
18+
- [ ] Launched the affected UI or script and exercised the change
19+
- [ ] Tested with at least one real preset / config when relevant (note which: ____)
20+
21+
## AI assistance
22+
23+
<!--
24+
This project welcomes AI-assisted contributions but the reviewer should not have to be
25+
your co-author. Pick exactly one option below, delete the others.
26+
-->
27+
28+
- No AI involvement
29+
- AI-assisted — I have read every line in this diff and can defend each change
30+
- Early AI prototype — opened for discussion, **not ready for review**
31+
32+
<!-- By opening this PR (and not marking it as an early prototype, aka a draft) I confirm I have read every line in this diff and have tested it locally. -->

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ debug*.py
1111

1212
# user data
1313
/workspace*
14-
/models*
14+
/models/*
15+
!/models/.gitkeep
1516
/training_concepts
1617
/training_samples
1718
/training_user_settings

.pre-commit-config.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ repos:
1414
- id: check-yaml
1515

1616
- repo: https://github.com/astral-sh/ruff-pre-commit
17-
rev: v0.15.14
17+
rev: v0.15.15
1818
hooks:
1919
# Run the Ruff linter, but not the formatter.
2020
- id: ruff

models/.gitkeep

Whitespace-only changes.

modules/dataLoader/ErnieBaseDataLoader.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
from modules.util import factory
88
from modules.util.config.TrainConfig import TrainConfig
99
from modules.util.enum.ModelType import ModelType
10-
from modules.util.thread_safety import apply_thread_safe_forward
1110
from modules.util.TrainProgress import TrainProgress
1211

1312
from mgds.pipelineModules.DecodeTokens import DecodeTokens
@@ -32,8 +31,6 @@ def _preparation_modules(self, config: TrainConfig, model: ErnieModel):
3231
image_sample = SampleVAEDistribution(in_name='latent_image_distribution', out_name='latent_image', mode='mean')
3332
downscale_mask = ScaleImage(in_name='mask', out_name='latent_mask', factor=0.125)
3433
tokenize_prompt = Tokenize(in_name='prompt', tokens_out_name='tokens', mask_out_name='tokens_mask', tokenizer=model.tokenizer, max_token_length=PROMPT_MAX_LENGTH)
35-
if config.dataloader_threads > 1:
36-
apply_thread_safe_forward(model.text_encoder) # workaround for transformers#42673, unclear if Mistral is affected
3734
encode_prompt = EncodeMistralText(tokens_name='tokens', tokens_attention_mask_in_name='tokens_mask', hidden_state_out_name='text_encoder_hidden_state', tokens_attention_mask_out_name='tokens_mask',
3835
text_encoder=model.text_encoder, hidden_state_output_index=HIDDEN_STATES_LAYER, autocast_contexts=[model.autocast_context], dtype=model.train_dtype.torch_dtype())
3936

modules/dataLoader/Flux2BaseDataLoader.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
from modules.util import factory
1515
from modules.util.config.TrainConfig import TrainConfig
1616
from modules.util.enum.ModelType import ModelType
17-
from modules.util.thread_safety import apply_thread_safe_forward
1817
from modules.util.TrainProgress import TrainProgress
1918

2019
from mgds.pipelineModules.DecodeTokens import DecodeTokens
@@ -43,8 +42,6 @@ def _preparation_modules(self, config: TrainConfig, model: Flux2Model):
4342
tokenize_prompt = Tokenize(in_name='prompt', tokens_out_name='tokens', mask_out_name='tokens_mask', tokenizer=model.tokenizer, max_token_length=config.text_encoder_sequence_length,
4443
apply_chat_template = lambda caption: mistral_format_input([caption], MISTRAL_SYSTEM_MESSAGE), apply_chat_template_kwargs = {'add_generation_prompt': False},
4544
)
46-
if config.dataloader_threads > 1:
47-
apply_thread_safe_forward(model.text_encoder) # workaround for transformers#42673
4845
encode_prompt = EncodeMistralText(tokens_name='tokens', tokens_attention_mask_in_name='tokens_mask', hidden_state_out_name='text_encoder_hidden_state', tokens_attention_mask_out_name='tokens_mask',
4946
text_encoder=model.text_encoder, autocast_contexts=[model.autocast_context], dtype=model.train_dtype.torch_dtype(),
5047
hidden_state_output_index=MISTRAL_HIDDEN_STATES_LAYERS,
@@ -53,8 +50,6 @@ def _preparation_modules(self, config: TrainConfig, model: Flux2Model):
5350
tokenize_prompt = Tokenize(in_name='prompt', tokens_out_name='tokens', mask_out_name='tokens_mask', tokenizer=model.tokenizer, max_token_length=config.text_encoder_sequence_length,
5451
apply_chat_template = lambda caption: qwen3_format_input(caption), apply_chat_template_kwargs = {'add_generation_prompt': True, 'enable_thinking': False}
5552
)
56-
if config.dataloader_threads > 1:
57-
apply_thread_safe_forward(model.text_encoder) # workaround for transformers#42673
5853
encode_prompt = EncodeQwenText(tokens_name='tokens', tokens_attention_mask_in_name='tokens_mask', hidden_state_out_name='text_encoder_hidden_state', tokens_attention_mask_out_name='tokens_mask',
5954
text_encoder=model.text_encoder, hidden_state_output_index=QWEN3_HIDDEN_STATES_LAYERS, autocast_contexts=[model.autocast_context], dtype=model.train_dtype.torch_dtype())
6055

modules/dataLoader/ZImageBaseDataLoader.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
from modules.util import factory
1010
from modules.util.config.TrainConfig import TrainConfig
1111
from modules.util.enum.ModelType import ModelType
12-
from modules.util.thread_safety import apply_thread_safe_forward
1312
from modules.util.TrainProgress import TrainProgress
1413

1514
from mgds.pipelineModules.DecodeTokens import DecodeTokens
@@ -38,8 +37,6 @@ def _preparation_modules(self, config: TrainConfig, model: ZImageModel):
3837
tokenize_prompt = Tokenize(in_name='prompt', tokens_out_name='tokens', mask_out_name='tokens_mask', tokenizer=model.tokenizer, max_token_length=PROMPT_MAX_LENGTH,
3938
apply_chat_template = lambda caption: format_input(caption), apply_chat_template_kwargs = {'add_generation_prompt': True, 'enable_thinking': True}
4039
)
41-
if config.dataloader_threads > 1:
42-
apply_thread_safe_forward(model.text_encoder) # workaround for transformers#42673
4340
encode_prompt = EncodeQwenText(tokens_name='tokens', tokens_attention_mask_in_name='tokens_mask', hidden_state_out_name='text_encoder_hidden_state', tokens_attention_mask_out_name='tokens_mask',
4441
text_encoder=model.text_encoder, hidden_state_output_index=-2, autocast_contexts=[model.autocast_context], dtype=model.train_dtype.torch_dtype())
4542
prune_masked_tokens = PruneMaskedTokens(tokens_name='tokens', tokens_mask_name='tokens_mask', hidden_state_name='text_encoder_hidden_state')

modules/model/ChromaModel.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ def __init__(
4040
class ChromaModel(BaseModel):
4141
# base model data
4242
tokenizer: T5Tokenizer | None
43+
orig_tokenizer: T5Tokenizer | None
4344
noise_scheduler: FlowMatchEulerDiscreteScheduler | None
4445
text_encoder: T5EncoderModel | None
4546
vae: AutoencoderKL | None
@@ -72,6 +73,7 @@ def __init__(
7273
)
7374

7475
self.tokenizer = None
76+
self.orig_tokenizer = None
7577
self.noise_scheduler = None
7678
self.text_encoder = None
7779
self.vae = None
@@ -141,13 +143,13 @@ def eval(self):
141143
self.text_encoder.eval()
142144
self.transformer.eval()
143145

144-
def create_pipeline(self) -> DiffusionPipeline:
146+
def create_pipeline(self, use_original_tokenizers: bool = False) -> DiffusionPipeline:
145147
return ChromaPipeline(
146148
transformer=self.transformer,
147149
scheduler=self.noise_scheduler,
148150
vae=self.vae,
149151
text_encoder=self.text_encoder,
150-
tokenizer=self.tokenizer,
152+
tokenizer=self.orig_tokenizer if use_original_tokenizers else self.tokenizer,
151153
)
152154

153155
def add_text_encoder_embeddings_to_prompt(self, prompt: str) -> str:

modules/model/FluxModel.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,9 @@ def __init__(
5050
class FluxModel(BaseModel):
5151
# base model data
5252
tokenizer_1: CLIPTokenizer | None
53+
orig_tokenizer_1: CLIPTokenizer | None
5354
tokenizer_2: T5Tokenizer | None
55+
orig_tokenizer_2: T5Tokenizer | None
5456
noise_scheduler: FlowMatchEulerDiscreteScheduler | None
5557
text_encoder_1: CLIPTextModel | None
5658
text_encoder_2: T5EncoderModel | None
@@ -86,7 +88,9 @@ def __init__(
8688
)
8789

8890
self.tokenizer_1 = None
91+
self.orig_tokenizer_1 = None
8992
self.tokenizer_2 = None
93+
self.orig_tokenizer_2 = None
9094
self.noise_scheduler = None
9195
self.text_encoder_1 = None
9296
self.text_encoder_2 = None
@@ -177,15 +181,15 @@ def eval(self):
177181
self.text_encoder_2.eval()
178182
self.transformer.eval()
179183

180-
def create_pipeline(self) -> DiffusionPipeline:
184+
def create_pipeline(self, use_original_tokenizers: bool = False) -> DiffusionPipeline:
181185
return FluxPipeline(
182186
transformer=self.transformer,
183187
scheduler=self.noise_scheduler,
184188
vae=self.vae,
185189
text_encoder=self.text_encoder_1,
186-
tokenizer=self.tokenizer_1,
190+
tokenizer=self.orig_tokenizer_1 if use_original_tokenizers else self.tokenizer_1,
187191
text_encoder_2=self.text_encoder_2,
188-
tokenizer_2=self.tokenizer_2,
192+
tokenizer_2=self.orig_tokenizer_2 if use_original_tokenizers else self.tokenizer_2,
189193
)
190194

191195
def add_text_encoder_1_embeddings_to_prompt(self, prompt: str) -> str:

modules/model/HiDreamModel.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -267,19 +267,19 @@ def eval(self):
267267
self.text_encoder_4.eval()
268268
self.transformer.eval()
269269

270-
def create_pipeline(self, use_original_modules: bool) -> DiffusionPipeline:
270+
def create_pipeline(self, use_original_tokenizers: bool = False) -> DiffusionPipeline:
271271
return HiDreamImagePipeline(
272272
transformer=self.transformer,
273273
scheduler=self.noise_scheduler,
274274
vae=self.vae,
275275
text_encoder=self.text_encoder_1,
276-
tokenizer=self.orig_tokenizer_1 if use_original_modules else self.tokenizer_1,
276+
tokenizer=self.orig_tokenizer_1 if use_original_tokenizers else self.tokenizer_1,
277277
text_encoder_2=self.text_encoder_2,
278-
tokenizer_2=self.orig_tokenizer_2 if use_original_modules else self.tokenizer_2,
278+
tokenizer_2=self.orig_tokenizer_2 if use_original_tokenizers else self.tokenizer_2,
279279
text_encoder_3=self.text_encoder_3,
280-
tokenizer_3=self.orig_tokenizer_3 if use_original_modules else self.tokenizer_3,
280+
tokenizer_3=self.orig_tokenizer_3 if use_original_tokenizers else self.tokenizer_3,
281281
text_encoder_4=self.text_encoder_4,
282-
tokenizer_4=self.orig_tokenizer_4 if use_original_modules else self.tokenizer_4,
282+
tokenizer_4=self.orig_tokenizer_4 if use_original_tokenizers else self.tokenizer_4,
283283
)
284284

285285
def add_text_encoder_1_embeddings_to_prompt(self, prompt: str) -> str:

0 commit comments

Comments
 (0)