1
0
Fork 0

feat: split up UNet and VAE tile size and overlap/stride params

This commit is contained in:
Sean Sube 2023-11-04 20:41:58 -05:00
parent e9b1375440
commit e8d7d9a881
Signed by: ssube
GPG Key ID: 3EED7B957D362AF1
19 changed files with 210 additions and 157 deletions

View File

@ -43,7 +43,7 @@ def stage_highres(
outscale=highres.scale, outscale=highres.scale,
), ),
chain=chain, chain=chain,
overlap=params.overlap, overlap=params.vae_overlap,
) )
else: else:
logger.debug("using simple upscaling for highres") logger.debug("using simple upscaling for highres")
@ -51,14 +51,14 @@ def stage_highres(
UpscaleSimpleStage(), UpscaleSimpleStage(),
stage, stage,
method=highres.method, method=highres.method,
overlap=params.overlap, overlap=params.vae_overlap,
upscale=upscale.with_args(scale=highres.scale, outscale=highres.scale), upscale=upscale.with_args(scale=highres.scale, outscale=highres.scale),
) )
chain.stage( chain.stage(
BlendImg2ImgStage(), BlendImg2ImgStage(),
stage, stage,
overlap=params.overlap, overlap=params.vae_overlap,
prompt_index=prompt_index + i, prompt_index=prompt_index + i,
strength=highres.strength, strength=highres.strength,
) )

View File

@ -60,9 +60,9 @@ class SourceTxt2ImgStage(BaseStage):
) )
if params.is_xl(): if params.is_xl():
tile_size = max(stage.tile_size, params.tiles) tile_size = max(stage.tile_size, params.unet_tile)
else: else:
tile_size = params.tiles tile_size = params.unet_tile
# this works for panorama as well, because tile_size is already max(tile_size, *size) # this works for panorama as well, because tile_size is already max(tile_size, *size)
latent_size = size.min(tile_size, tile_size) latent_size = size.min(tile_size, tile_size)

View File

@ -106,5 +106,5 @@ class UpscaleBSRGANStage(BaseStage):
params: ImageParams, params: ImageParams,
size: Size, size: Size,
) -> int: ) -> int:
tile = min(params.tiles, self.max_tile) tile = min(params.unet_tile, self.max_tile)
return size.width // tile * size.height // tile return size.width // tile * size.height // tile

View File

@ -71,7 +71,7 @@ class UpscaleOutpaintStage(BaseStage):
outputs.append(source) outputs.append(source)
continue continue
tile_size = params.tiles tile_size = params.unet_tile
size = Size(*source.size) size = Size(*source.size)
latent_size = size.min(tile_size, tile_size) latent_size = size.min(tile_size, tile_size)

View File

@ -266,14 +266,13 @@ def load_pipeline(
# update panorama params # update panorama params
if params.is_panorama(): if params.is_panorama():
latent_window = params.tiles // 8 unet_stride = (params.unet_tile * (1 - params.unet_overlap)) // 8
latent_stride = params.stride // 8 logger.debug("setting panorama window parameters: %s/%s for UNet, %s/%s for VAE", params.unet_tile, unet_stride, params.vae_tile, params.vae_overlap)
pipe.set_window_size(params.unet_tile // 8, unet_stride)
pipe.set_window_size(latent_window, latent_stride)
for vae in VAE_COMPONENTS: for vae in VAE_COMPONENTS:
if hasattr(pipe, vae): if hasattr(pipe, vae):
getattr(pipe, vae).set_window_size(latent_window, params.overlap) getattr(pipe, vae).set_window_size(params.vae_tile // 8, params.vae_overlap)
run_gc([device]) run_gc([device])
@ -626,8 +625,8 @@ def patch_pipeline(
server, server,
original_decoder, original_decoder,
decoder=True, decoder=True,
window=params.tiles, window=params.unet_tile,
overlap=params.overlap, overlap=params.vae_overlap,
) )
logger.debug("patched VAE decoder with wrapper") logger.debug("patched VAE decoder with wrapper")
@ -637,8 +636,8 @@ def patch_pipeline(
server, server,
original_encoder, original_encoder,
decoder=False, decoder=False,
window=params.tiles, window=params.unet_tile,
overlap=params.overlap, overlap=params.vae_overlap,
) )
logger.debug("patched VAE encoder with wrapper") logger.debug("patched VAE encoder with wrapper")

View File

@ -44,9 +44,9 @@ def run_txt2img_pipeline(
) -> None: ) -> None:
# if using panorama, the pipeline will tile itself (views) # if using panorama, the pipeline will tile itself (views)
if params.is_panorama() or params.is_xl(): if params.is_panorama() or params.is_xl():
tile_size = max(params.tiles, size.width, size.height) tile_size = max(params.unet_tile, size.width, size.height)
else: else:
tile_size = params.tiles tile_size = params.unet_tile
# prepare the chain pipeline and first stage # prepare the chain pipeline and first stage
chain = ChainPipeline() chain = ChainPipeline()
@ -57,11 +57,11 @@ def run_txt2img_pipeline(
), ),
size=size, size=size,
prompt_index=0, prompt_index=0,
overlap=params.overlap, overlap=params.vae_overlap,
) )
# apply upscaling and correction, before highres # apply upscaling and correction, before highres
stage = StageParams(tile_size=params.tiles) stage = StageParams(tile_size=params.unet_tile)
first_upscale, after_upscale = split_upscale(upscale) first_upscale, after_upscale = split_upscale(upscale)
if first_upscale: if first_upscale:
stage_upscale_correction( stage_upscale_correction(
@ -139,14 +139,14 @@ def run_img2img_pipeline(
# prepare the chain pipeline and first stage # prepare the chain pipeline and first stage
chain = ChainPipeline() chain = ChainPipeline()
stage = StageParams( stage = StageParams(
tile_size=params.tiles, tile_size=params.unet_tile,
) )
chain.stage( chain.stage(
BlendImg2ImgStage(), BlendImg2ImgStage(),
stage, stage,
prompt_index=0, prompt_index=0,
strength=strength, strength=strength,
overlap=params.overlap, overlap=params.vae_overlap,
) )
# apply upscaling and correction, before highres # apply upscaling and correction, before highres
@ -236,7 +236,7 @@ def run_inpaint_pipeline(
full_res_inpaint_padding: float, full_res_inpaint_padding: float,
) -> None: ) -> None:
logger.debug("building inpaint pipeline") logger.debug("building inpaint pipeline")
tile_size = params.tiles tile_size = params.unet_tile
if mask is None: if mask is None:
# if no mask was provided, keep the full source image # if no mask was provided, keep the full source image
@ -332,7 +332,7 @@ def run_inpaint_pipeline(
fill_color=fill_color, fill_color=fill_color,
mask_filter=mask_filter, mask_filter=mask_filter,
noise_source=noise_source, noise_source=noise_source,
overlap=params.overlap, overlap=params.vae_overlap,
prompt_index=0, prompt_index=0,
) )
@ -410,7 +410,7 @@ def run_upscale_pipeline(
) -> None: ) -> None:
# set up the chain pipeline, no base stage for upscaling # set up the chain pipeline, no base stage for upscaling
chain = ChainPipeline() chain = ChainPipeline()
stage = StageParams(tile_size=params.tiles) stage = StageParams(tile_size=params.unet_tile)
# apply upscaling and correction, before highres # apply upscaling and correction, before highres
first_upscale, after_upscale = split_upscale(upscale) first_upscale, after_upscale = split_upscale(upscale)

View File

@ -204,8 +204,10 @@ class ImageParams:
input_negative_prompt: str input_negative_prompt: str
loopback: int loopback: int
tiled_vae: bool tiled_vae: bool
tiles: int unet_tile: int
overlap: float unet_overlap: float
vae_tile: int
vae_overlap: float
def __init__( def __init__(
self, self,
@ -224,9 +226,10 @@ class ImageParams:
input_negative_prompt: Optional[str] = None, input_negative_prompt: Optional[str] = None,
loopback: int = 0, loopback: int = 0,
tiled_vae: bool = False, tiled_vae: bool = False,
tiles: int = 512, unet_overlap: float = 0.25,
overlap: float = 0.25, unet_tile: int = 512,
stride: int = 64, vae_overlap: float = 0.25,
vae_tile: int = 512,
) -> None: ) -> None:
self.model = model self.model = model
self.pipeline = pipeline self.pipeline = pipeline
@ -243,9 +246,10 @@ class ImageParams:
self.input_negative_prompt = input_negative_prompt or negative_prompt self.input_negative_prompt = input_negative_prompt or negative_prompt
self.loopback = loopback self.loopback = loopback
self.tiled_vae = tiled_vae self.tiled_vae = tiled_vae
self.tiles = tiles self.unet_overlap = unet_overlap
self.overlap = overlap self.unet_tile = unet_tile
self.stride = stride self.vae_overlap = vae_overlap
self.vae_tile = vae_tile
def do_cfg(self): def do_cfg(self):
return self.cfg > 1.0 return self.cfg > 1.0
@ -312,9 +316,10 @@ class ImageParams:
"input_negative_prompt": self.input_negative_prompt, "input_negative_prompt": self.input_negative_prompt,
"loopback": self.loopback, "loopback": self.loopback,
"tiled_vae": self.tiled_vae, "tiled_vae": self.tiled_vae,
"tiles": self.tiles, "unet_overlap": self.unet_overlap,
"overlap": self.overlap, "unet_tile": self.unet_tile,
"stride": self.stride, "vae_overlap": self.vae_overlap,
"vae_tile": self.vae_tile,
} }
def with_args(self, **kwargs): def with_args(self, **kwargs):
@ -334,9 +339,10 @@ class ImageParams:
kwargs.get("input_negative_prompt", self.input_negative_prompt), kwargs.get("input_negative_prompt", self.input_negative_prompt),
kwargs.get("loopback", self.loopback), kwargs.get("loopback", self.loopback),
kwargs.get("tiled_vae", self.tiled_vae), kwargs.get("tiled_vae", self.tiled_vae),
kwargs.get("tiles", self.tiles), kwargs.get("unet_overlap", self.unet_overlap),
kwargs.get("overlap", self.overlap), kwargs.get("unet_tile", self.unet_tile),
kwargs.get("stride", self.stride), kwargs.get("vae_overlap", self.vae_overlap),
kwargs.get("vae_tile", self.vae_tile),
) )

View File

@ -117,32 +117,35 @@ def build_params(
get_config_value("steps", "max"), get_config_value("steps", "max"),
get_config_value("steps", "min"), get_config_value("steps", "min"),
) )
tiled_vae = get_boolean(data, "tiledVAE", get_config_value("tiledVAE")) tiled_vae = get_boolean(data, "tiled_vae", get_config_value("tiled_vae"))
tiles = get_and_clamp_int( unet_overlap = get_and_clamp_float(
data, data,
"tiles", "unet_overlap",
get_config_value("tiles"), get_config_value("unet_overlap"),
get_config_value("tiles", "max"), get_config_value("unet_overlap", "max"),
get_config_value("tiles", "min"), get_config_value("unet_overlap", "min"),
) )
overlap = get_and_clamp_float( unet_tile = get_and_clamp_int(
data, data,
"overlap", "unet_tile",
get_config_value("overlap"), get_config_value("unet_tile"),
get_config_value("overlap", "max"), get_config_value("unet_tile", "max"),
get_config_value("overlap", "min"), get_config_value("unet_tile", "min"),
) )
stride = get_and_clamp_int( vae_overlap = get_and_clamp_float(
data, data,
"stride", "vae_overlap",
get_config_value("stride"), get_config_value("vae_overlap"),
get_config_value("stride", "max"), get_config_value("vae_overlap", "max"),
get_config_value("stride", "min"), get_config_value("vae_overlap", "min"),
)
vae_tile = get_and_clamp_int(
data,
"vae_tile",
get_config_value("vae_tile"),
get_config_value("vae_tile", "max"),
get_config_value("vae_tile", "min"),
) )
if stride > tiles:
logger.info("limiting stride to tile size, %s > %s", stride, tiles)
stride = tiles
seed = int(data.get("seed", -1)) seed = int(data.get("seed", -1))
if seed == -1: if seed == -1:
@ -163,9 +166,10 @@ def build_params(
control=control, control=control,
loopback=loopback, loopback=loopback,
tiled_vae=tiled_vae, tiled_vae=tiled_vae,
tiles=tiles, unet_overlap=unet_overlap,
overlap=overlap, unet_tile=unet_tile,
stride=stride, vae_overlap=vae_overlap,
vae_tile=vae_tile,
) )
return params return params

View File

@ -141,12 +141,6 @@
"max": 4, "max": 4,
"step": 1 "step": 1
}, },
"overlap": {
"default": 0.25,
"min": 0.0,
"max": 0.9,
"step": 0.01
},
"pipeline": { "pipeline": {
"default": "", "default": "",
"keys": [ "keys": [
@ -197,21 +191,9 @@
"max": 1, "max": 1,
"step": 0.01 "step": 0.01
}, },
"stride": { "tiled_vae": {
"default": 128,
"min": 64,
"max": 512,
"step": 64
},
"tiledVAE": {
"default": false "default": false
}, },
"tiles": {
"default": 512,
"min": 128,
"max": 2048,
"step": 128
},
"tileOrder": { "tileOrder": {
"default": "spiral", "default": "spiral",
"keys": [ "keys": [
@ -225,6 +207,18 @@
"max": 1024, "max": 1024,
"step": 8 "step": 8
}, },
"unet_overlap": {
"default": 0.25,
"min": 0.0,
"max": 0.9,
"step": 0.01
},
"unet_tile": {
"default": 512,
"min": 128,
"max": 2048,
"step": 128
},
"upscaleOrder": { "upscaleOrder": {
"default": "correction-first", "default": "correction-first",
"keys": [ "keys": [
@ -237,6 +231,18 @@
"default": "", "default": "",
"keys": [] "keys": []
}, },
"vae_overlap": {
"default": 0.25,
"min": 0.0,
"max": 0.9,
"step": 0.01
},
"vae_tile": {
"default": 512,
"min": 256,
"max": 1024,
"step": 128
},
"width": { "width": {
"default": 512, "default": 512,
"min": 128, "min": 128,

View File

@ -305,12 +305,12 @@ TEST_DATA = [
), ),
TestCase( TestCase(
"txt2img-panorama-1024x768-muffin", "txt2img-panorama-1024x768-muffin",
"txt2img?prompt=a+giant+muffin&seed=0&scheduler=ddim&width=1024&height=768&pipeline=panorama&tiledVAE=true", "txt2img?prompt=a+giant+muffin&seed=0&scheduler=ddim&width=1024&height=768&pipeline=panorama&tiled_vae=true",
max_attempts=VERY_SLOW_TEST, max_attempts=VERY_SLOW_TEST,
), ),
TestCase( TestCase(
"img2img-panorama-1024x768-pumpkin", "img2img-panorama-1024x768-pumpkin",
"img2img?prompt=a+giant+pumpkin&seed=0&scheduler=ddim&sourceFilter=none&pipeline=panorama&tiledVAE=true", "img2img?prompt=a+giant+pumpkin&seed=0&scheduler=ddim&sourceFilter=none&pipeline=panorama&tiled_vae=true",
source="txt2img-panorama-1024x768-muffin-0", source="txt2img-panorama-1024x768-muffin-0",
max_attempts=VERY_SLOW_TEST, max_attempts=VERY_SLOW_TEST,
), ),

View File

@ -70,10 +70,11 @@ export function makeImageURL(root: string, type: string, params: BaseImgParams):
url.searchParams.append('cfg', params.cfg.toFixed(FIXED_FLOAT)); url.searchParams.append('cfg', params.cfg.toFixed(FIXED_FLOAT));
url.searchParams.append('eta', params.eta.toFixed(FIXED_FLOAT)); url.searchParams.append('eta', params.eta.toFixed(FIXED_FLOAT));
url.searchParams.append('steps', params.steps.toFixed(FIXED_INTEGER)); url.searchParams.append('steps', params.steps.toFixed(FIXED_INTEGER));
url.searchParams.append('tiledVAE', String(params.tiledVAE)); url.searchParams.append('tiled_vae', String(params.tiled_vae));
url.searchParams.append('tiles', params.tiles.toFixed(FIXED_INTEGER)); url.searchParams.append('unet_overlap', params.unet_overlap.toFixed(FIXED_FLOAT));
url.searchParams.append('overlap', params.overlap.toFixed(FIXED_FLOAT)); url.searchParams.append('unet_tile', params.unet_tile.toFixed(FIXED_INTEGER));
url.searchParams.append('stride', params.stride.toFixed(FIXED_INTEGER)); url.searchParams.append('vae_overlap', params.vae_overlap.toFixed(FIXED_FLOAT));
url.searchParams.append('vae_tile', params.vae_tile.toFixed(FIXED_INTEGER));
if (doesExist(params.scheduler)) { if (doesExist(params.scheduler)) {
url.searchParams.append('scheduler', params.scheduler); url.searchParams.append('scheduler', params.scheduler);

View File

@ -1,3 +1,4 @@
/* eslint-disable camelcase */
import { doesExist, mustDefault, mustExist } from '@apextoaster/js-utils'; import { doesExist, mustDefault, mustExist } from '@apextoaster/js-utils';
import { Casino } from '@mui/icons-material'; import { Casino } from '@mui/icons-material';
import { Button, Checkbox, FormControlLabel, Stack } from '@mui/material'; import { Button, Checkbox, FormControlLabel, Stack } from '@mui/material';
@ -47,9 +48,6 @@ export function ImageControl(props: ImageControlProps) {
staleTime: STALE_TIME, staleTime: STALE_TIME,
}); });
// max stride is the lesser of tile size and server's max stride
const maxStride = Math.min(state.tiles, params.stride.max);
return <Stack spacing={2}> return <Stack spacing={2}>
<Stack direction='row' spacing={4}> <Stack direction='row' spacing={4}>
<QueryList <QueryList
@ -156,58 +154,74 @@ export function ImageControl(props: ImageControlProps) {
}} }}
/> />
<NumericField <NumericField
label={t('parameter.tiles')} label={t('parameter.unet_tile')}
min={params.tiles.min} min={params.unet_tile.min}
max={params.tiles.max} max={params.unet_tile.max}
step={params.tiles.step} step={params.unet_tile.step}
value={state.tiles} value={state.unet_tile}
onChange={(tiles) => { onChange={(unet_tile) => {
props.onChange({ props.onChange({
...state, ...state,
tiles, unet_tile,
});
}}
/>
<NumericField
label={t('parameter.unet_overlap')}
min={params.unet_overlap.min}
max={params.unet_overlap.max}
step={params.unet_overlap.step}
value={state.unet_overlap}
onChange={(unet_overlap) => {
props.onChange({
...state,
unet_overlap,
});
}}
/>
<FormControlLabel
label={t('parameter.tiled_vae')}
control={<Checkbox
checked={state.tiled_vae}
value='check'
onChange={(event) => {
props.onChange({
...state,
tiled_vae: state.tiled_vae === false,
});
}}
/>}
/>
<NumericField
decimal
disabled={state.tiled_vae === false}
label={t('parameter.vae_overlap')}
min={params.vae_overlap.min}
max={params.vae_overlap.max}
step={params.vae_overlap.step}
value={state.vae_overlap}
onChange={(vae_tile) => {
props.onChange({
...state,
vae_tile,
}); });
}} }}
/> />
<NumericField <NumericField
decimal decimal
label={t('parameter.overlap')} disabled={state.tiled_vae === false}
min={params.overlap.min} label={t('parameter.vae_tile')}
max={params.overlap.max} min={params.vae_tile.min}
step={params.overlap.step} max={params.vae_tile.max}
value={state.overlap} step={params.vae_tile.step}
onChange={(overlap) => { value={state.vae_tile}
onChange={(vae_tile) => {
props.onChange({ props.onChange({
...state, ...state,
overlap, vae_tile,
}); });
}} }}
/> />
<NumericField
label={t('parameter.stride')}
min={params.stride.min}
max={maxStride}
step={params.stride.step}
value={state.stride}
onChange={(stride) => {
props.onChange({
...state,
stride,
});
}}
/>
<FormControlLabel
label={t('parameter.tiledVAE')}
control={<Checkbox
checked={state.tiledVAE}
value='check'
onChange={(event) => {
props.onChange({
...state,
tiledVAE: state.tiledVAE === false,
});
}}
/>}
/>
</Stack> </Stack>
<PromptInput <PromptInput
selector={selector} selector={selector}

View File

@ -131,12 +131,6 @@
"max": 4, "max": 4,
"step": 1 "step": 1
}, },
"overlap": {
"default": 0.25,
"min": 0.0,
"max": 0.9,
"step": 0.01
},
"pipeline": { "pipeline": {
"default": "", "default": "",
"keys": [ "keys": [
@ -193,15 +187,9 @@
"max": 512, "max": 512,
"step": 64 "step": 64
}, },
"tiledVAE": { "tiled_vae": {
"default": false "default": false
}, },
"tiles": {
"default": 512,
"min": 128,
"max": 1024,
"step": 128
},
"tileOrder": { "tileOrder": {
"default": "spiral", "default": "spiral",
"keys": [ "keys": [
@ -215,6 +203,18 @@
"max": 1024, "max": 1024,
"step": 8 "step": 8
}, },
"unet_overlap": {
"default": 0.25,
"min": 0.0,
"max": 0.9,
"step": 0.01
},
"unet_tile": {
"default": 512,
"min": 128,
"max": 1024,
"step": 128
},
"upscaleOrder": { "upscaleOrder": {
"default": "correction-first", "default": "correction-first",
"keys": [ "keys": [
@ -227,6 +227,12 @@
"default": "", "default": "",
"keys": [] "keys": []
}, },
"vae_overlap": {
"default": 0.25,
"min": 0.0,
"max": 0.9,
"step": 0.01
},
"width": { "width": {
"default": 512, "default": 512,
"min": 256, "min": 256,

View File

@ -1,3 +1,4 @@
/* eslint-disable camelcase */
/* eslint-disable max-lines */ /* eslint-disable max-lines */
/* eslint-disable no-null/no-null */ /* eslint-disable no-null/no-null */
import { Maybe } from '@apextoaster/js-utils'; import { Maybe } from '@apextoaster/js-utils';
@ -267,10 +268,11 @@ export function baseParamsFromServer(defaults: ServerParams): Required<BaseImgPa
scheduler: defaults.scheduler.default, scheduler: defaults.scheduler.default,
steps: defaults.steps.default, steps: defaults.steps.default,
seed: defaults.seed.default, seed: defaults.seed.default,
tiledVAE: defaults.tiledVAE.default, tiled_vae: defaults.tiled_vae.default,
tiles: defaults.tiles.default, unet_overlap: defaults.unet_overlap.default,
overlap: defaults.overlap.default, unet_tile: defaults.unet_tile.default,
stride: defaults.stride.default, vae_overlap: defaults.vae_overlap.default,
vae_tile: defaults.vae_tile.default,
}; };
} }

View File

@ -162,9 +162,11 @@ export const I18N_STRINGS_DE = {
steps: 'Schritte', steps: 'Schritte',
strength: 'Stärke', strength: 'Stärke',
stride: '', stride: '',
tiledVAE: '', tiled_vae: '',
tiles: '', tiles: '',
tileOrder: '', tileOrder: '',
unet_overlap: '',
unet_tile: '',
upscale: { upscale: {
label: '', label: '',
denoise: 'Entrauschen', denoise: 'Entrauschen',
@ -172,6 +174,8 @@ export const I18N_STRINGS_DE = {
order: '', order: '',
outscale: 'Ausgangsskala', outscale: 'Ausgangsskala',
}, },
vae_overlap: '',
vae_tile: '',
width: 'Breite', width: 'Breite',
correction: { correction: {
label: 'Gesichtskorrektur', label: 'Gesichtskorrektur',

View File

@ -215,10 +215,10 @@ export const I18N_STRINGS_EN = {
sourceFilter: 'Source Filter', sourceFilter: 'Source Filter',
steps: 'Steps', steps: 'Steps',
strength: 'Strength', strength: 'Strength',
stride: 'UNet Stride', tiled_vae: 'Tiled VAE',
tiledVAE: 'Tiled VAE',
tiles: 'Tile Size',
tileOrder: 'Tile Order', tileOrder: 'Tile Order',
unet_overlap: 'UNet Overlap',
unet_tile: 'UNet Tile Size',
upscale: { upscale: {
label: 'Upscale', label: 'Upscale',
denoise: 'Denoise', denoise: 'Denoise',
@ -226,6 +226,8 @@ export const I18N_STRINGS_EN = {
order: 'Upscale Order', order: 'Upscale Order',
outscale: 'Outscale', outscale: 'Outscale',
}, },
vae_overlap: 'UNet Overlap',
vae_tile: 'VAE Tile Size',
width: 'Width', width: 'Width',
correction: { correction: {
label: 'Face Correction', label: 'Face Correction',

View File

@ -162,9 +162,11 @@ export const I18N_STRINGS_ES = {
steps: 'Pasos', steps: 'Pasos',
strength: 'Fuerza', strength: 'Fuerza',
stride: '', stride: '',
tiledVAE: '', tiled_vae: '',
tiles: '', tiles: '',
tileOrder: 'Orden de secciones', tileOrder: 'Orden de secciones',
unet_overlap: '',
unet_tile: '',
upscale: { upscale: {
label: 'Aumento', label: 'Aumento',
denoise: '', denoise: '',
@ -172,6 +174,8 @@ export const I18N_STRINGS_ES = {
order: '', order: '',
outscale: 'Escala de producción', outscale: 'Escala de producción',
}, },
vae_overlap: '',
vae_tile: '',
width: 'Anchura', width: 'Anchura',
correction: { correction: {
label: 'Corrección facial', label: 'Corrección facial',

View File

@ -162,9 +162,11 @@ export const I18N_STRINGS_FR = {
steps: '', steps: '',
strength: '', strength: '',
stride: '', stride: '',
tiledVAE: '', tiled_vae: '',
tiles: '', tiles: '',
tileOrder: '', tileOrder: '',
unet_overlap: '',
unet_tile: '',
upscale: { upscale: {
label: '', label: '',
denoise: '', denoise: '',
@ -172,6 +174,8 @@ export const I18N_STRINGS_FR = {
order: '', order: '',
outscale: '', outscale: '',
}, },
vae_overlap: '',
vae_tile: '',
width: '', width: '',
correction: { correction: {
label: '', label: '',

View File

@ -50,10 +50,11 @@ export interface BaseImgParams {
negativePrompt?: string; negativePrompt?: string;
batch: number; batch: number;
tiledVAE: boolean; tiled_vae: boolean;
tiles: number; vae_overlap: number;
overlap: number; vae_tile: number;
stride: number; unet_overlap: number;
unet_tile: number;
cfg: number; cfg: number;
steps: number; steps: number;