Skip to content

Commit 16adfa1

Browse files
authored
Feat_flux2_klein_preset (#76)
* feat: sdxs preset * fix(doc): improve help output * feat: flux 2 klein presets * fix: qwen3 9B download link * fix(cli): enable flash attention when low-vram flag is set
1 parent 515ba10 commit 16adfa1

5 files changed

Lines changed: 334 additions & 38 deletions

File tree

cli/README.md

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,28 +2,28 @@
22

33
## Usage
44
```
5-
cli.exe --preset flux1schnell --random-seed "a lovely duck holding a sign says 'drink your water'"
5+
cli.exe flux1schnell "a lovely duck holding a sign says 'drink your water'" --random-seed --token YourHfHubToken
66
```
77
## Help
88
```
99
Usage: cli.exe [OPTIONS] --preset <PRESET> <PROMPT>
1010
1111
Arguments:
12+
<PRESET> The preset to use [possible values: StableDiffusion1_4, StableDiffusion1_5, StableDiffusion2_1, StableDiffusion3Medium, StableDiffusion3_5Medium, StableDiffusion3_5Large, StableDiffusion3_5LargeTurbo, SDXLBase1_0, SDTurbo, SDXLTurbo1_0, Flux1Dev, Flux1Schnell, Flux1Mini, JuggernautXL11, Chroma, NitroSDRealism, NitroSDVibrant, DiffInstructStar, ChromaRadiance, SSD1B, Flux2Dev, ZImageTurbo, QwenImage, OvisImage, DreamShaperXL2_1Turbo, TwinFlowZImageTurboExp, SDXS512DreamShaper, Flux2Klein4B, Flux2KleinBase4B, Flux2Klein9B, Flux2KleinBase9B]
1213
<PROMPT> The prompt to render
1314
1415
Options:
1516
-n, --negative <NEGATIVE> Negative prompt
16-
-p, --preset <PRESET> The preset to use [possible values: StableDiffusion1_4, StableDiffusion1_5, StableDiffusion2_1, StableDiffusion3Medium, StableDiffusion3_5Medium, StableDiffusion3_5Large, StableDiffusion3_5LargeTurbo, SDXLBase1_0, SDTurbo, SDXLTurbo1_0, Flux1Dev, Flux1Schnell, Flux1Mini, JuggernautXL11, Chroma, NitroSDRealism, NitroSDVibrant, DiffInstructStar, ChromaRadiance, SSD1B, Flux2Dev, ZImageTurbo, QwenImage, OvisImage]
17-
-w, --weights <WEIGHTS> Optionally which type of quantization to use [possible values: F32, F16, Q4_0, Q4_1, Q5_0, Q5_1, Q8_0, Q8_1, Q2_K, Q3_K, Q4_K, Q5_K, Q6_K, Q8_K, IQ2_XXS, IQ2_XS, IQ3_XXS, IQ1_S, IQ4_NL, IQ3_S, IQ2_S, IQ4_XS, I8, I16, I32, I64, F64, IQ1_M, BF16, TQ1_0, TQ2_0, MXFP4, F8_E4M3]
18-
-s, --steps <STEPS> Numer of inference steps
19-
-w, --width <WIDTH> Width
20-
-h, --height <HEIGHT> Height
21-
-b, --batch <BATCH> Number of images to generate [default: 1]
17+
--weights <WEIGHTS> Optionally which type of quantization to use [possible values: F32, F16, Q4_0, Q4_1, Q5_0, Q5_1, Q8_0, Q8_1, Q2_K, Q3_K, Q4_K, Q5_K, Q6_K, Q8_K, IQ2_XXS, IQ2_XS, IQ3_XXS, IQ1_S, IQ4_NL, IQ3_S, IQ2_S, IQ4_XS, I8, I16, I32, I64, F64, IQ1_M, BF16, TQ1_0, TQ2_0, MXFP4, F8_E4M3]
18+
-s, --steps <STEPS> Override the preset default number of inference steps
19+
--width <WIDTH> Override the preset default width
20+
--height <HEIGHT> Override the preset default height
21+
-b, --batch <BATCH> Number of images to generate (default 1) [default: 1]
2222
-o, --output <OUTPUT> Output Folder [default: ./]
2323
-p, --preview <PREVIEW> Enable preview [possible values: fast, accurate]
24-
-t, --token <TOKEN> Set Huggingface Hub token
25-
-l, --low-vram Enable optimization for gpu with lower GB
26-
-r, --random-seed Enable Random Seed: different runs will produce different results
24+
-t, --token <TOKEN> Set Huggingface Hub token. Only used when downloading models that have not been cached before
25+
-l, --low-vram Enable optimization to use less VRAM: clip_on_cpu, vae tiling, flash_attention, offload_params_to_cpu
26+
-r, --random-seed Enable Random Seed: different runs will produce different results
2727
-h, --help Print help
2828
-V, --version Print version
2929
```

cli/src/main.rs

Lines changed: 40 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use diffusion_rs::{
77
api::{PreviewType, gen_img},
88
preset::{
99
ChromaRadianceWeight, ChromaWeight, DiffInstructStarWeight, Flux1MiniWeight, Flux1Weight,
10+
Flux2Klein4BWeight, Flux2Klein9BWeight, Flux2KleinBase4BWeight, Flux2KleinBase9BWeight,
1011
Flux2Weight, NitroSDRealismWeight, NitroSDVibrantWeight, OvisImageWeight, Preset,
1112
PresetBuilder, PresetDiscriminants, QwenImageWeight, SSD1BWeight,
1213
TwinFlowZImageTurboExpWeight, WeightType, ZImageTurboWeight,
@@ -32,34 +33,34 @@ enum PreviewMode {
3233
#[derive(Parser)]
3334
#[command(version, about, long_about = None)]
3435
struct Args {
36+
/// The preset to use
37+
#[arg(ignore_case = true, value_parser = clap_enum_variants!(PresetDiscriminants))]
38+
preset: PresetDiscriminants,
39+
3540
/// The prompt to render
3641
prompt: String,
3742

3843
/// Negative prompt
3944
#[arg(short, long)]
4045
negative: Option<String>,
4146

42-
/// The preset to use
43-
#[arg(short, long, ignore_case = true, value_parser = clap_enum_variants!(PresetDiscriminants))]
44-
preset: PresetDiscriminants,
45-
4647
/// Optionally which type of quantization to use
47-
#[arg(short, long, ignore_case = true, value_parser = clap_enum_variants!(WeightType))]
48+
#[arg(long, ignore_case = true, value_parser = clap_enum_variants!(WeightType))]
4849
weights: Option<WeightType>,
4950

50-
/// Numer of inference steps
51+
/// Override the preset default number of inference steps
5152
#[arg(short, long)]
5253
steps: Option<i32>,
5354

54-
/// Width
55-
#[arg(short, long)]
55+
/// Override the preset default width
56+
#[arg(long)]
5657
width: Option<i32>,
5758

58-
/// Height
59-
#[arg(short, long)]
59+
/// Override the preset default height
60+
#[arg(long)]
6061
height: Option<i32>,
6162

62-
/// Number of images to generate
63+
/// Number of images to generate (default 1)
6364
#[arg(short, long, default_value_t = 1)]
6465
batch: i32,
6566

@@ -71,11 +72,11 @@ struct Args {
7172
#[arg(short, long, ignore_case = true)]
7273
preview: Option<PreviewMode>,
7374

74-
/// Set Huggingface Hub token
75+
/// Set Huggingface Hub token. Only used when downloading models that have not been cached before
7576
#[arg(short, long)]
7677
token: Option<String>,
7778

78-
/// Enable optimization for gpu with lower GB
79+
/// Enable optimization to use less VRAM: clip_on_cpu, vae tiling, flash_attention, offload_params_to_cpu
7980
#[arg(short, long, default_value_t = false)]
8081
low_vram: bool,
8182

@@ -142,6 +143,7 @@ fn main() {
142143
model_config
143144
.clip_on_cpu(true)
144145
.vae_tiling(true)
146+
.flash_attention(true)
145147
.offload_params_to_cpu(true);
146148
}
147149

@@ -268,6 +270,31 @@ fn get_preset(args: &Args) -> Preset {
268270
.try_into()
269271
.unwrap(),
270272
),
273+
PresetDiscriminants::SDXS512DreamShaper => Preset::SDXS512DreamShaper,
274+
PresetDiscriminants::Flux2Klein4B => Preset::Flux2Klein4B(
275+
args.weights
276+
.unwrap_or_else(|| Flux2Klein4BWeight::default().into())
277+
.try_into()
278+
.unwrap(),
279+
),
280+
PresetDiscriminants::Flux2KleinBase4B => Preset::Flux2KleinBase4B(
281+
args.weights
282+
.unwrap_or_else(|| Flux2KleinBase4BWeight::default().into())
283+
.try_into()
284+
.unwrap(),
285+
),
286+
PresetDiscriminants::Flux2Klein9B => Preset::Flux2Klein9B(
287+
args.weights
288+
.unwrap_or_else(|| Flux2Klein9BWeight::default().into())
289+
.try_into()
290+
.unwrap(),
291+
),
292+
PresetDiscriminants::Flux2KleinBase9B => Preset::Flux2KleinBase9B(
293+
args.weights
294+
.unwrap_or_else(|| Flux2KleinBase9BWeight::default().into())
295+
.try_into()
296+
.unwrap(),
297+
),
271298
};
272299
preset
273300
}

src/preset.rs

Lines changed: 83 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@ use crate::{
77
api::{Config, ConfigBuilder, ConfigBuilderError, ModelConfig, ModelConfigBuilder},
88
preset_builder::{
99
chroma, chroma_radiance, diff_instruct_star, dream_shaper_xl_2_1_turbo, flux_1_dev,
10-
flux_1_mini, flux_1_schnell, flux_2_dev, juggernaut_xl_11, nitro_sd_realism,
11-
nitro_sd_vibrant, ovis_image, qwen_image, sd_turbo, sdxl_base_1_0, sdxl_turbo_1_0, ssd_1b,
12-
stable_diffusion_1_4, stable_diffusion_1_5, stable_diffusion_2_1,
13-
stable_diffusion_3_5_large, stable_diffusion_3_5_large_turbo, stable_diffusion_3_5_medium,
14-
stable_diffusion_3_medium, twinflow_z_image_turbo, z_image_turbo,
10+
flux_1_mini, flux_1_schnell, flux_2_dev, flux_2_klein_4b, flux_2_klein_9b,
11+
flux_2_klein_base_4b, flux_2_klein_base_9b, juggernaut_xl_11, nitro_sd_realism,
12+
nitro_sd_vibrant, ovis_image, qwen_image, sd_turbo, sdxl_base_1_0, sdxl_turbo_1_0,
13+
sdxs512_dream_shaper, ssd_1b, stable_diffusion_1_4, stable_diffusion_1_5,
14+
stable_diffusion_2_1, stable_diffusion_3_5_large, stable_diffusion_3_5_large_turbo,
15+
stable_diffusion_3_5_medium, stable_diffusion_3_medium, twinflow_z_image_turbo,
16+
z_image_turbo,
1517
},
1618
};
1719

@@ -30,7 +32,11 @@ use crate::{
3032
ZImageTurboWeight(derive(Default)),
3133
QwenImageWeight(derive(Default)),
3234
OvisImageWeight(derive(Default)),
33-
TwinFlowZImageTurboExpWeight(derive(Default))
35+
TwinFlowZImageTurboExpWeight(derive(Default)),
36+
Flux2Klein4BWeight(derive(Default)),
37+
Flux2KleinBase4BWeight(derive(Default)),
38+
Flux2Klein9BWeight(derive(Default)),
39+
Flux2KleinBase9BWeight(derive(Default))
3440
)]
3541
#[derive(Debug, Clone, Copy, EnumString, VariantNames)]
3642
#[strum(ascii_case_insensitive)]
@@ -55,7 +61,11 @@ pub enum WeightType {
5561
ZImageTurboWeight,
5662
QwenImageWeight,
5763
OvisImageWeight(default),
58-
TwinFlowZImageTurboExpWeight(default)
64+
TwinFlowZImageTurboExpWeight(default),
65+
Flux2Klein4BWeight,
66+
Flux2KleinBase4BWeight,
67+
Flux2Klein9BWeight(default),
68+
Flux2KleinBase9BWeight(default)
5969
)]
6070
Q4_0,
6171
#[subenum(Flux2Weight, QwenImageWeight)]
@@ -84,7 +94,10 @@ pub enum WeightType {
8494
ZImageTurboWeight,
8595
QwenImageWeight,
8696
OvisImageWeight,
87-
TwinFlowZImageTurboExpWeight
97+
TwinFlowZImageTurboExpWeight,
98+
Flux2Klein4BWeight(default),
99+
Flux2KleinBase4BWeight(default),
100+
Flux2Klein9BWeight
88101
)]
89102
Q8_0,
90103
Q8_1,
@@ -149,7 +162,11 @@ pub enum WeightType {
149162
ZImageTurboWeight,
150163
QwenImageWeight,
151164
OvisImageWeight,
152-
TwinFlowZImageTurboExpWeight
165+
TwinFlowZImageTurboExpWeight,
166+
Flux2Klein4BWeight,
167+
Flux2KleinBase4BWeight,
168+
Flux2Klein9BWeight,
169+
Flux2KleinBase9BWeight
153170
)]
154171
BF16,
155172
TQ1_0,
@@ -229,6 +246,20 @@ pub enum Preset {
229246
/// Requires access rights to <https://huggingface.co/black-forest-labs/FLUX.1-schnell> providing a token via [crate::util::set_hf_token]
230247
/// Enabled [crate::api::SampleMethod::DPM2_SAMPLE_METHOD] and [crate::api::Scheduler::SMOOTHSTEP_SCHEDULER]. cfg_scale 1.0. 3 steps. Flash attention enabled. 1024x512. Vae-tiling enabled.
231248
TwinFlowZImageTurboExp(TwinFlowZImageTurboExpWeight),
249+
/// cfg_scale 1.0. 1 steps. 512x512
250+
SDXS512DreamShaper,
251+
/// Requires access rights to <https://huggingface.co/black-forest-labs/FLUX.2-dev> providing a token via [crate::util::set_hf_token]
252+
/// cfg scale 1.0. 4 steps. Flash attention enabled. Offload params to CPU enabled. 1024x1024. Vae-tiling enabled
253+
Flux2Klein4B(Flux2Klein4BWeight),
254+
/// Requires access rights to <https://huggingface.co/black-forest-labs/FLUX.2-dev> providing a token via [crate::util::set_hf_token]
255+
/// cfg scale 4.0. 20 steps. Flash attention enabled. Offload params to CPU enabled. 1024x1024. Vae-tiling enabled
256+
Flux2KleinBase4B(Flux2KleinBase4BWeight),
257+
/// Requires access rights to <https://huggingface.co/black-forest-labs/FLUX.2-dev> providing a token via [crate::util::set_hf_token]
258+
/// cfg scale 1.0. 4 steps. Flash attention enabled. Offload params to CPU enabled. 1024x1024. Vae-tiling enabled
259+
Flux2Klein9B(Flux2Klein9BWeight),
260+
/// Requires access rights to <https://huggingface.co/black-forest-labs/FLUX.2-dev> providing a token via [crate::util::set_hf_token]
261+
/// cfg scale 4.0. 20 steps. Flash attention enabled. Offload params to CPU enabled. 1024x1024. Vae-tiling enabled
262+
Flux2KleinBase9B(Flux2KleinBase9BWeight),
232263
}
233264

234265
impl Preset {
@@ -261,6 +292,11 @@ impl Preset {
261292
Preset::OvisImage(sd_type_t) => ovis_image(sd_type_t),
262293
Preset::DreamShaperXL2_1Turbo => dream_shaper_xl_2_1_turbo(),
263294
Preset::TwinFlowZImageTurboExp(sd_type_t) => twinflow_z_image_turbo(sd_type_t),
295+
Preset::SDXS512DreamShaper => sdxs512_dream_shaper(),
296+
Preset::Flux2Klein4B(sd_type_t) => flux_2_klein_4b(sd_type_t),
297+
Preset::Flux2KleinBase4B(sd_type_t) => flux_2_klein_base_4b(sd_type_t),
298+
Preset::Flux2Klein9B(sd_type_t) => flux_2_klein_9b(sd_type_t),
299+
Preset::Flux2KleinBase9B(sd_type_t) => flux_2_klein_base_9b(sd_type_t),
264300
};
265301

266302
// Metal workaround.
@@ -343,8 +379,10 @@ mod tests {
343379
api::gen_img,
344380
preset::{
345381
ChromaRadianceWeight, ChromaWeight, DiffInstructStarWeight, Flux1MiniWeight,
346-
Flux1Weight, Flux2Weight, NitroSDRealismWeight, NitroSDVibrantWeight, OvisImageWeight,
347-
QwenImageWeight, SSD1BWeight, TwinFlowZImageTurboExpWeight, ZImageTurboWeight,
382+
Flux1Weight, Flux2Klein4BWeight, Flux2Klein9BWeight, Flux2KleinBase4BWeight,
383+
Flux2KleinBase9BWeight, Flux2Weight, NitroSDRealismWeight, NitroSDVibrantWeight,
384+
OvisImageWeight, QwenImageWeight, SSD1BWeight, TwinFlowZImageTurboExpWeight,
385+
ZImageTurboWeight,
348386
},
349387
util::set_hf_token,
350388
};
@@ -531,4 +569,38 @@ mod tests {
531569
TwinFlowZImageTurboExpWeight::Q3_K,
532570
));
533571
}
572+
573+
#[ignore]
574+
#[test]
575+
fn test_sdxs512_dream_shaper() {
576+
run(Preset::SDXS512DreamShaper);
577+
}
578+
579+
#[ignore]
580+
#[test]
581+
fn test_flux_2_klein_4b() {
582+
set_hf_token(include_str!("../token.txt"));
583+
run(Preset::Flux2Klein4B(Flux2Klein4BWeight::Q8_0));
584+
}
585+
586+
#[ignore]
587+
#[test]
588+
fn test_flux_2_klein_base_4b() {
589+
set_hf_token(include_str!("../token.txt"));
590+
run(Preset::Flux2KleinBase4B(Flux2KleinBase4BWeight::Q8_0));
591+
}
592+
593+
#[ignore]
594+
#[test]
595+
fn test_flux_2_klein_9b() {
596+
set_hf_token(include_str!("../token.txt"));
597+
run(Preset::Flux2Klein9B(Flux2Klein9BWeight::Q4_0));
598+
}
599+
600+
#[ignore]
601+
#[test]
602+
fn test_flux_2_klein_base_9b() {
603+
set_hf_token(include_str!("../token.txt"));
604+
run(Preset::Flux2KleinBase9B(Flux2KleinBase9BWeight::Q4_0));
605+
}
534606
}

0 commit comments

Comments
 (0)