Skip to content

Commit 029a953

Browse files
fix(diffusers): forward original config for single files
Assisted-by: Codex:gpt-5
1 parent b13c429 commit 029a953

9 files changed

Lines changed: 77 additions & 9 deletions

File tree

backend/backend.proto

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -498,6 +498,7 @@ message ModelOptions {
498498
// applied verbatim to the backend's engine constructor (e.g. vLLM AsyncEngineArgs).
499499
// Unknown keys produce an error at LoadModel time.
500500
string EngineArgs = 73;
501+
string OriginalConfigFile = 76;
501502

502503
// Proxy carries the cloud-proxy backend's per-model configuration.
503504
// Empty for non-proxy backends.

backend/python/diffusers/backend.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
get_available_pipelines,
3636
load_diffusers_pipeline,
3737
)
38+
from load_options import single_file_load_kwargs
3839

3940
# Import specific items still needed for special cases and safety checker
4041
from diffusers import DiffusionPipeline, ControlNetModel
@@ -464,6 +465,9 @@ def _load_pipeline(self, request, model_ref, from_single_file, local_only, torch
464465

465466
# Build kwargs for dynamic loading
466467
load_kwargs = {"torch_dtype": torchType}
468+
load_kwargs.update(
469+
single_file_load_kwargs(request.OriginalConfigFile, from_single_file)
470+
)
467471

468472
# Add variant if not loading from single file
469473
if not from_single_file and variant:
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# SPDX-License-Identifier: MIT
2+
3+
4+
def single_file_load_kwargs(original_config_file: str, from_single_file: bool) -> dict:
5+
if from_single_file and original_config_file:
6+
return {"original_config_file": original_config_file}
7+
return {}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# SPDX-License-Identifier: MIT
2+
3+
import unittest
4+
5+
from backend.python.diffusers.load_options import single_file_load_kwargs
6+
7+
8+
class SingleFileLoadKwargsTest(unittest.TestCase):
9+
def test_includes_original_config_for_single_file(self):
10+
self.assertEqual(
11+
single_file_load_kwargs("configs/v1-inference.yaml", True),
12+
{"original_config_file": "configs/v1-inference.yaml"},
13+
)
14+
15+
def test_omits_original_config_for_pretrained_model(self):
16+
self.assertEqual(
17+
single_file_load_kwargs("configs/v1-inference.yaml", False),
18+
{},
19+
)
20+
21+
def test_omits_empty_original_config(self):
22+
self.assertEqual(single_file_load_kwargs("", True), {})
23+
24+
25+
if __name__ == "__main__":
26+
unittest.main()

core/backend/options.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -425,6 +425,7 @@ func grpcModelOpts(c config.ModelConfig, modelPath string) *pb.ModelOptions {
425425
EnableScore: c.HasUsecases(config.FLAG_SCORE),
426426
CLIPSkip: int32(c.Diffusers.ClipSkip),
427427
ControlNet: c.Diffusers.ControlNet,
428+
OriginalConfigFile: c.Diffusers.OriginalConfigFile,
428429
ContextSize: int32(ctxSize),
429430
Seed: getSeed(c),
430431
NBatch: int32(b),

core/backend/options_internal_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,21 @@ var _ = Describe("grpcModelOpts EngineArgs", func() {
4444
})
4545
})
4646

47+
var _ = Describe("grpcModelOpts Diffusers options", func() {
48+
It("forwards original_config_file without rewriting it", func() {
49+
threads := 1
50+
cfg := config.ModelConfig{
51+
Threads: &threads,
52+
Diffusers: config.Diffusers{
53+
OriginalConfigFile: "configs/v1-inference.yaml",
54+
},
55+
}
56+
57+
opts := grpcModelOpts(cfg, "/tmp/models")
58+
Expect(opts.OriginalConfigFile).To(Equal("configs/v1-inference.yaml"))
59+
})
60+
})
61+
4762
// Guards the DisableReasoning -> enable_thinking metadata conversion that the
4863
// per-request reasoning_effort feature (issue #10072) relies on: the request
4964
// merge sets ReasoningConfig.DisableReasoning, and gRPCPredictOpts is where it

core/config/model_config.go

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1104,15 +1104,16 @@ type GRPC struct {
11041104

11051105
// @Description Diffusers configuration
11061106
type Diffusers struct {
1107-
CUDA bool `yaml:"cuda,omitempty" json:"cuda,omitempty"`
1108-
PipelineType string `yaml:"pipeline_type,omitempty" json:"pipeline_type,omitempty"`
1109-
SchedulerType string `yaml:"scheduler_type,omitempty" json:"scheduler_type,omitempty"`
1110-
EnableParameters string `yaml:"enable_parameters,omitempty" json:"enable_parameters,omitempty"` // A list of comma separated parameters to specify
1111-
IMG2IMG bool `yaml:"img2img,omitempty" json:"img2img,omitempty"` // Image to Image Diffuser
1112-
ClipSkip int `yaml:"clip_skip,omitempty" json:"clip_skip,omitempty"` // Skip every N frames
1113-
ClipModel string `yaml:"clip_model,omitempty" json:"clip_model,omitempty"` // Clip model to use
1114-
ClipSubFolder string `yaml:"clip_subfolder,omitempty" json:"clip_subfolder,omitempty"` // Subfolder to use for clip model
1115-
ControlNet string `yaml:"control_net,omitempty" json:"control_net,omitempty"`
1107+
CUDA bool `yaml:"cuda,omitempty" json:"cuda,omitempty"`
1108+
PipelineType string `yaml:"pipeline_type,omitempty" json:"pipeline_type,omitempty"`
1109+
SchedulerType string `yaml:"scheduler_type,omitempty" json:"scheduler_type,omitempty"`
1110+
OriginalConfigFile string `yaml:"original_config_file,omitempty" json:"original_config_file,omitempty"`
1111+
EnableParameters string `yaml:"enable_parameters,omitempty" json:"enable_parameters,omitempty"` // A list of comma separated parameters to specify
1112+
IMG2IMG bool `yaml:"img2img,omitempty" json:"img2img,omitempty"` // Image to Image Diffuser
1113+
ClipSkip int `yaml:"clip_skip,omitempty" json:"clip_skip,omitempty"` // Skip every N frames
1114+
ClipModel string `yaml:"clip_model,omitempty" json:"clip_model,omitempty"` // Clip model to use
1115+
ClipSubFolder string `yaml:"clip_subfolder,omitempty" json:"clip_subfolder,omitempty"` // Subfolder to use for clip model
1116+
ControlNet string `yaml:"control_net,omitempty" json:"control_net,omitempty"`
11161117
}
11171118

11181119
// @Description LLMConfig is a struct that holds the configuration that are generic for most of the LLM backends.

docs/content/advanced/model-configuration.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -715,6 +715,7 @@ For image generation models using the `diffusers` backend:
715715
| `diffusers.cuda` | bool | Enable CUDA for diffusers |
716716
| `diffusers.pipeline_type` | string | Pipeline type (e.g., `stable-diffusion`, `stable-diffusion-xl`) |
717717
| `diffusers.scheduler_type` | string | Scheduler type (e.g., `euler`, `ddpm`) |
718+
| `diffusers.original_config_file` | string | Local path or URL to the original configuration for loading a single-file checkpoint |
718719
| `diffusers.enable_parameters` | string | Comma-separated parameters to enable |
719720
| `diffusers.cfg_scale` | float32 | Classifier-free guidance scale |
720721
| `diffusers.img2img` | bool | Enable image-to-image transformation |

docs/content/features/image-generation.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,18 @@ diffusers:
224224
cfg_scale: 8
225225
```
226226

227+
For an offline single-file checkpoint that needs its original Diffusers configuration, keep both files in the mounted models directory:
228+
229+
```yaml
230+
name: offline-stable-diffusion
231+
parameters:
232+
model: model.safetensors
233+
backend: diffusers
234+
diffusers:
235+
pipeline_type: StableDiffusionPipeline
236+
original_config_file: /models/v1-inference.yaml
237+
```
238+
227239
#### Configuration parameters
228240

229241
The following parameters are available in the configuration file:

0 commit comments

Comments
 (0)