mirror of
https://github.com/vladmandic/automatic
synced 2026-09-18 16:54:33 +02:00
@@ -1,6 +1,8 @@
|
||||
{
|
||||
"MD004": false,
|
||||
"MD012": false,
|
||||
"MD013": false,
|
||||
"MD032": false,
|
||||
"MD033": false,
|
||||
"MD036": false,
|
||||
"MD041": false
|
||||
|
||||
+50
-39
@@ -1,6 +1,17 @@
|
||||
# Change Log for SD.Next
|
||||
|
||||
## Update for 07/26/2023
|
||||
## Update for 2023-07-30
|
||||
|
||||
Smaller release, but IMO worth a post...
|
||||
|
||||
- diffusers:
|
||||
- sd-xl lora's are now supported!
|
||||
- memory optimizations: Enhanced sequential CPU offloading, model CPU offload, FP16 VAE
|
||||
- significant impact if running SD-XL (for example, but applies to any model) with only 8GB VRAM
|
||||
- update packages
|
||||
- minor bugfixes
|
||||
|
||||
## Update for 2023-07-26
|
||||
|
||||
This is a big one, new models, new diffusers, new features and updated UI...
|
||||
|
||||
@@ -12,7 +23,7 @@ First, **SD-XL 1.0** is released and yes, SD.Next supports it out of the box!
|
||||
Also fresh is new **Kandinsky 2.2** model that does look quite nice:
|
||||
|
||||
- [Kandinsky Decoder](https://huggingface.co/kandinsky-community/kandinsky-2-2-decoder)
|
||||
- [Kandinsky Prior](kandinsky-community/kandinsky-2-2-prior)
|
||||
- [Kandinsky Prior](https://huggingface.co/kandinsky-community/kandinsky-2-2-prior)
|
||||
|
||||
Actual changelog is:
|
||||
|
||||
@@ -60,7 +71,7 @@ Actual changelog is:
|
||||
this now fully obsoletes `fallback_sampler` and `force_latent_sampler`
|
||||
|
||||
|
||||
## Update for 07/18/2023
|
||||
## Update for 2023-07-18
|
||||
|
||||
While we're waiting for official SD-XL release, here's another update with some fixes and enhancements...
|
||||
|
||||
@@ -90,7 +101,7 @@ While we're waiting for official SD-XL release, here's another update with some
|
||||
download using model downloader: `thu-ml/unidiffuser-v1`
|
||||
and set resolution to 512x512
|
||||
|
||||
## Update for 07/14/2023
|
||||
## Update for 2023-07-14
|
||||
|
||||
Trying to unify settings for both original and diffusers backend without introducing duplicates...
|
||||
|
||||
@@ -107,7 +118,7 @@ Trying to unify settings for both original and diffusers backend without introdu
|
||||
- reorganized settings -> samplers to show which section refers to which backend
|
||||
- added diffusers **lmsd** sampler
|
||||
|
||||
## Update for 07/13/2023
|
||||
## Update for 2023-07-13
|
||||
|
||||
Another big one, but now improvements to both **diffusers** and **original** backends as well plus ability to dynamically switch between them!
|
||||
|
||||
@@ -136,7 +147,7 @@ Another big one, but now improvements to both **diffusers** and **original** bac
|
||||
big thanks to @huggingface team for great communication, support and fixing all the reported issues asap!
|
||||
|
||||
|
||||
## Update for 07/10/2023
|
||||
## Update for 2023-07-10
|
||||
|
||||
Service release with some fixes and enhancements:
|
||||
|
||||
@@ -158,7 +169,7 @@ Service release with some fixes and enhancements:
|
||||
- fix startup issue with incorrect config
|
||||
- installer should always check requirements on upgrades
|
||||
|
||||
## Update for 07/08/2023
|
||||
## Update for 2023-07-08
|
||||
|
||||
This is a massive update which has been baking in a `dev` branch for a while now
|
||||
|
||||
@@ -179,7 +190,7 @@ Release also contains number of smaller updates:
|
||||
speeds up app start if you have a lot of extra networks and you want to build them manually when needed
|
||||
- extra network ui tweaks
|
||||
|
||||
## Update for 07/01/2023
|
||||
## Update for 2023-07-01
|
||||
|
||||
Small quality-of-life updates and bugfixes:
|
||||
|
||||
@@ -191,7 +202,7 @@ Small quality-of-life updates and bugfixes:
|
||||
- folder `Show` button is present only when working on localhost,
|
||||
otherwise its replaced with `Copy` that places image URLs on clipboard so they can be used in other apps
|
||||
|
||||
## Update for 06/30/2023
|
||||
## Update for 2023-06-30
|
||||
|
||||
A bit bigger update this time, but contained to specific areas...
|
||||
|
||||
@@ -213,7 +224,7 @@ A bit bigger update this time, but contained to specific areas...
|
||||
- **extensions sort** by trending
|
||||
- add requirements check for training
|
||||
|
||||
## Update for 06/26/2023
|
||||
## Update for 2023-06-26
|
||||
|
||||
- new training tab interface
|
||||
- redesigned preprocess, train embedding, train hypernetwork
|
||||
@@ -222,7 +233,7 @@ A bit bigger update this time, but contained to specific areas...
|
||||
- new model verify functionality
|
||||
- lot of ipex specific fixes/optimizations, thanks @disty0
|
||||
|
||||
## Update for 06/20/2023
|
||||
## Update for 2023-06-20
|
||||
|
||||
This one is less relevant for standard users, but pretty major if you're running an actual server
|
||||
But even if not, it still includes bunch of cumulative fixes since last release - and going by number of new issues, this is probably the most stable release so far...
|
||||
@@ -237,7 +248,7 @@ But even if not, it still includes bunch of cumulative fixes since last release
|
||||
- ring buffer with api endpoint `/sdapi/v1/log`
|
||||
- real-time status and load endpoint `/sdapi/v1/system-info/status`
|
||||
|
||||
## Update for 06/14/2023
|
||||
## Update for 2023-06-14
|
||||
|
||||
Second stage of a jumbo merge from upstream plus few minor changes...
|
||||
|
||||
@@ -252,7 +263,7 @@ Second stage of a jumbo merge from upstream plus few minor changes...
|
||||
- broken/reverted:
|
||||
sub-quadratic optimization changes
|
||||
|
||||
## Update for 06/13/2023
|
||||
## Update for 2023-06-13
|
||||
|
||||
Just a day later and one *bigger update*...
|
||||
Both some **new functionality** as well as **massive merges** from upstream
|
||||
@@ -270,7 +281,7 @@ Both some **new functionality** as well as **massive merges** from upstream
|
||||
this was a massive merge, hopefully this does not cause any regressions
|
||||
and still a bit more pending...
|
||||
|
||||
## Update for 06/12/2023
|
||||
## Update for 2023-06-12
|
||||
|
||||
- updated ui labels and hints to improve clarity and provide some extra info
|
||||
this is 1st stage of the process, more to come...
|
||||
@@ -291,7 +302,7 @@ Both some **new functionality** as well as **massive merges** from upstream
|
||||
results? who am i to judge :)
|
||||
|
||||
|
||||
## Update for 06/05/2023
|
||||
## Update for 2023-06-05
|
||||
|
||||
Few new features and extra handling for broken extensions
|
||||
that caused my phone to go crazy with notifications over the weekend...
|
||||
@@ -311,7 +322,7 @@ that caused my phone to go crazy with notifications over the weekend...
|
||||
- some work on bfloat16 which nobody really should be using, but why not 🙂
|
||||
|
||||
|
||||
## Update for 06/02/2023
|
||||
## Update for 2023-06-02
|
||||
|
||||
Some quality-of-life improvements while working on larger stuff in the background...
|
||||
|
||||
@@ -328,7 +339,7 @@ Some quality-of-life improvements while working on larger stuff in the backgroun
|
||||
if you do have `xformers` selected as your desired cross-optimization method, then they will be used
|
||||
reason is that a lot of libaries try to blindly import xformers even if they are not selected or not functional
|
||||
|
||||
## Update for 05/30/2023
|
||||
## Update for 2023-05-30
|
||||
|
||||
Another bigger one...And more to come in the next few days...
|
||||
|
||||
@@ -344,7 +355,7 @@ Another bigger one...And more to come in the next few days...
|
||||
- updated lora, swinir, scunet and ldsr code from upstream
|
||||
- start of merge from a1111 v1.3
|
||||
|
||||
## Update for 05/26/2023
|
||||
## Update for 2023-05-26
|
||||
|
||||
Some quality-of-life improvements...
|
||||
|
||||
@@ -372,7 +383,7 @@ other than that - first stage of [Diffusers](https://github.com/huggingface/diff
|
||||
i don't recommend anyone to try it (and dont even think reporting issues for it)
|
||||
but if anyone wants to contribute, take a look at [project page](https://github.com/users/vladmandic/projects/1/views/1)
|
||||
|
||||
## Update for 05/23/2023
|
||||
## Update for 2023-05-23
|
||||
|
||||
Major internal work with perhaps not that much user-facing to show for it ;)
|
||||
|
||||
@@ -398,7 +409,7 @@ Major internal work with perhaps not that much user-facing to show for it ;)
|
||||
- fixes...amazing how many issues were introduced by porting a1111 v1.20 code without adding almost no new functionality
|
||||
next one is v1.30 (still in dev) which does bring a lot of new features
|
||||
|
||||
## Update for 05/17/2023
|
||||
## Update for 2023-05-17
|
||||
|
||||
This is a massive one due to huge number of changes,
|
||||
but hopefully it will go ok...
|
||||
@@ -419,7 +430,7 @@ but hopefully it will go ok...
|
||||
- port *all* upstream changes from [A1111](https://github.com/AUTOMATIC1111/stable-diffusion-webui)
|
||||
up to today - commit hash `89f9faa`
|
||||
|
||||
## Update for 05/15/2023
|
||||
## Update for 2023-05-15
|
||||
|
||||
- major work on **prompt parsing**
|
||||
this can cause some differences in results compared to what you're used to, but its all about fixes & improvements
|
||||
@@ -431,7 +442,7 @@ but hopefully it will go ok...
|
||||
- add option in settings to force different **latent sampler** instead of using primary only
|
||||
- add **interrupt/skip** capabilities to process images
|
||||
|
||||
## Update for 05/13/2023
|
||||
## Update for 2023-05-13
|
||||
|
||||
This is mostly about optimizations...
|
||||
|
||||
@@ -448,7 +459,7 @@ This is mostly about optimizations...
|
||||
- allow per-extension updates in extension manager
|
||||
- option to reset configuration in settings
|
||||
|
||||
## Update for 05/11/2023
|
||||
## Update for 2023-05-11
|
||||
|
||||
- brand new **extension manager**
|
||||
this is pretty much a complete rewrite, so new issues are possible
|
||||
@@ -459,7 +470,7 @@ This is mostly about optimizations...
|
||||
- auto-recover & re-attempt when `--upgrade` is requested but fails
|
||||
- check for duplicate extensions
|
||||
|
||||
## Update for 05/08/2023
|
||||
## Update for 2023-05-08
|
||||
|
||||
Back online with few updates:
|
||||
|
||||
@@ -470,7 +481,7 @@ Back online with few updates:
|
||||
- configurable order of scripts in txt2img and img2img
|
||||
for both, see sections in ui-> settings -> user interface
|
||||
|
||||
## Update for 05/04/2023
|
||||
## Update for 2023-05-04
|
||||
|
||||
Again, few days later...
|
||||
|
||||
@@ -487,7 +498,7 @@ Again, few days later...
|
||||
- better logging
|
||||
this includes new `--debug` flag for more verbose logging when troubleshooting
|
||||
|
||||
## Update for 05/01/2023
|
||||
## Update for 2023-05-01
|
||||
|
||||
Been a bit quieter for last few days as changes were quite significant, but finally here we are...
|
||||
|
||||
@@ -506,7 +517,7 @@ Been a bit quieter for last few days as changes were quite significant, but fina
|
||||
|
||||
To take advantage of new out-of-the-box tunings, its recommended to delete your `config.json` so new defaults are applied. Its not necessary, but otherwise you may need to play with UI Settings to get the best of Intel ARC, TorchML, ROCm or Apple M1/M2.
|
||||
|
||||
## Update for 04/27/2023
|
||||
## Update for 2023-04-27
|
||||
|
||||
a bit shorter list as:
|
||||
|
||||
@@ -527,7 +538,7 @@ what's new:
|
||||
- set defaults for Apple M1/M2
|
||||
if you have issues, you may want to start with a fresh install so configuration can be created from scratch
|
||||
|
||||
## Update for 04/25/2023
|
||||
## Update for 2023-04-25
|
||||
|
||||
- update process image -> info
|
||||
- add VAE info to metadata
|
||||
@@ -540,7 +551,7 @@ what's new:
|
||||
- validate script args for always-on scripts
|
||||
fixes: deforum with controlnet
|
||||
|
||||
## Update for 04/24/2023
|
||||
## Update for 2023-04-24
|
||||
|
||||
- identify race condition where generate locks up while fetching preview
|
||||
- add pulldowns to x/y/z script
|
||||
@@ -552,7 +563,7 @@ what's new:
|
||||
- fix setup not installing `tensorflow` dependencies
|
||||
- update default git flags to reduce number of warnings
|
||||
|
||||
## Update for 04/23/2023
|
||||
## Update for 2023-04-23
|
||||
|
||||
- fix VAE dtype
|
||||
should fix most issues with NaN or black images
|
||||
@@ -567,7 +578,7 @@ what's new:
|
||||
- mark tensorflow as optional
|
||||
- add additional image name templates
|
||||
|
||||
## Update for 04/22/2023
|
||||
## Update for 2023-04-22
|
||||
|
||||
- autodetect which system libs should be installed
|
||||
this is a first pass of autoconfig for **nVidia** vs **AMD** environments
|
||||
@@ -579,7 +590,7 @@ what's new:
|
||||
|
||||
*expect shorter updates for the next few days as i'll be partially ooo*
|
||||
|
||||
## Update for 04/20/2023
|
||||
## Update for 2023-04-20
|
||||
|
||||
- full CUDA tuning section in UI Settings
|
||||
- improve exif/pnginfo metadata parsing
|
||||
@@ -593,7 +604,7 @@ what's new:
|
||||
|
||||
note: if you previously had command line optimizations such as --no-half, those are now ignored and moved to ui settings
|
||||
|
||||
## Update for 04/19/2023
|
||||
## Update for 2023-04-19
|
||||
|
||||
- fix live preview
|
||||
- fix model merge
|
||||
@@ -605,7 +616,7 @@ note: if you previously had command line optimizations such as --no-half, those
|
||||
- created initial merge backlog from pending prs on a1111 repo
|
||||
see #258 for details
|
||||
|
||||
## Update for 04/18/2023
|
||||
## Update for 2023-04-18
|
||||
|
||||
- reconnect ui to active session on browser restart
|
||||
this is one of most frequently asked for items, finally figured it out
|
||||
@@ -625,7 +636,7 @@ note: if you previously had command line optimizations such as --no-half, those
|
||||
- update README.md
|
||||
- update TODO.md
|
||||
|
||||
## Update for 04/17/2023
|
||||
## Update for 2023-04-17
|
||||
|
||||
- **themes** are now dynamic and discovered from list of available gradio themes on huggingface
|
||||
its quite a list of 30+ supported themes so far
|
||||
@@ -636,7 +647,7 @@ note: if you previously had command line optimizations such as --no-half, those
|
||||
- updated github integration
|
||||
- make model download as optional if no models found
|
||||
|
||||
## Update for 04/16/2023
|
||||
## Update for 2023-04-16
|
||||
|
||||
- support for ui themes! to to *settings* -> *user interface* -> "ui theme*
|
||||
includes 12 predefined themes
|
||||
@@ -648,7 +659,7 @@ note: if you previously had command line optimizations such as --no-half, those
|
||||
- install bugfixes, hopefully new installer is now ok \
|
||||
i really want to focus on features and not troubleshooting installer
|
||||
|
||||
## Update for 04/15/2023
|
||||
## Update for 2023-04-15
|
||||
|
||||
- update default values
|
||||
- remove `ui-config.json` from repo, its not fully under user control
|
||||
@@ -663,7 +674,7 @@ note: if you previously had command line optimizations such as --no-half, those
|
||||
- fix git update issues
|
||||
- update github templates
|
||||
|
||||
## Update for 04/14/2023
|
||||
## Update for 2023-04-14
|
||||
|
||||
- handle duplicate extensions
|
||||
- redo exception handler
|
||||
@@ -675,7 +686,7 @@ note: if you previously had command line optimizations such as --no-half, those
|
||||
- pin transformers version to last known good version
|
||||
- fix extension loader
|
||||
|
||||
## Update for 04/12/2023
|
||||
## Update for 2023-04-12
|
||||
|
||||
This has been pending for a while, but finally uploaded some massive changes
|
||||
|
||||
|
||||
Submodule extensions-builtin/sd-dynamic-thresholding updated: 27700fddf8...639e40970f
Submodule extensions-builtin/sd-webui-agent-scheduler updated: 1bb04d1fbe...1a5be3bf3a
Submodule extensions-builtin/stable-diffusion-webui-images-browser updated: b984cdd169...a3aeb93fd7
+4
-1
@@ -572,7 +572,10 @@
|
||||
{"id":"","label":"Enable model CPU offload","localized":"","hint":"Transferring of entire models to the GPU, negligible impact on inference time while still providing some memory savings. Use with Enable Attention slicing for additional memory savings"},
|
||||
{"id":"","label":"Enable VAE slicing","localized":"","hint":"Decodes batch latents one image at a time with limited VRAM. Small performance boost in VAE decode on multi-image batches. Use with Enable Attention slicing"},
|
||||
{"id":"","label":"Enable VAE tiling","localized":"","hint":"Divide large images into overlapping tiles with limited VRAM. Might result in a minor increase in processing time. Use with Enable Attention Slicing"},
|
||||
{"id":"","label":"Enable attention slicing","localized":"","hint":"Performs attention computation in steps instead of all at once. 10% slower inference times. Greatly reduces memory usage. Best used, period"}
|
||||
{"id":"","label":"Enable attention slicing","localized":"","hint":"Performs attention computation in steps instead of all at once. 10% slower inference times. Greatly reduces memory usage. Best used, period"},
|
||||
{"id":"","label":"Diffusers model loading variant","localized":"","hint":""},
|
||||
{"id":"","label":"Diffusers VAE loading variant","localized":"","hint":""}
|
||||
|
||||
],
|
||||
"scripts": [
|
||||
{"id":"","label":"Script","localized":"","hint":""},
|
||||
|
||||
+63
-61
@@ -16,9 +16,9 @@
|
||||
{"id":"","label":"Negative prompt","localized":"네거티브 프롬프트","hint":"생성되지 않았으면 하는 이미지의 설명"}
|
||||
],
|
||||
"common keywords": [
|
||||
{"id":"","label":"fp16","localized":"반정밀도(16비트)","hint":"수를 16비트 부동소수점으로 표현"},
|
||||
{"id":"","label":"fp32","localized":"단정밀도(32비트)","hint":"수를 32비트 부동소수점으로 표현"},
|
||||
{"id":"","label":"bf16","localized":"혼합 정밀도(16비트 bfloat)","hint":"수를 16비트 혼합 정밀도로 표현"},
|
||||
{"id":"","label":"fp16","localized":"반정밀도(16비트)","hint":"수를 16비트 부동소수점으로 표현한다."},
|
||||
{"id":"","label":"fp32","localized":"단정밀도(32비트)","hint":"수를 32비트 부동소수점으로 표현한다."},
|
||||
{"id":"","label":"bf16","localized":"혼합 정밀도(16비트 bfloat)","hint":"수를 16비트 혼합 정밀도로 표현한다."},
|
||||
{"id":"","label":"Run","localized":"실행","hint":""},
|
||||
{"id":"","label":"all","localized":"전체","hint":""},
|
||||
{"id":"","label":"none","localized":"없음","hint":""},
|
||||
@@ -55,18 +55,18 @@
|
||||
{"id":"","label":"UI card preview lazy loading","localized":"UI 카드 프리뷰를 늦게 로드","hint":""},
|
||||
{"id":"","label":"UI card size (px)","localized":"UI 카드 크기 (px, 픽셀)","hint":""},
|
||||
{"id":"","label":"UI disable variable aspect ratio","localized":"","hint":""},
|
||||
{"id":"","label":"UI image contain method","localized":"","hint":""},
|
||||
{"id":"","label":"UI image contain method","localized":"UI 이미지 표시 방식","hint":""},
|
||||
{"id":"","label":"Do not automatically build extra network pages","localized":"자동으로 엑스트라 네트워크 페이지를 만들지 않음","hint":""},
|
||||
{"id":"","label":"Use LyCoris handler for all Lora types","localized":"모든 Lora 종류에 LyCoris 핸들러 사용","hint":""},
|
||||
{"id":"","label":"Disable built-in Lora handler","localized":"내장 Lora 핸들러 비활성화","hint":""},
|
||||
{"id":"","label":"Use Kohya method for handling multiple Loras","localized":"","hint":""},
|
||||
{"id":"","label":"Multiplier for extra networks","localized":"엑스트라 네트워크 배율","hint":"하이퍼 네트워크 또는 Lora를 프롬프트에 추가할 때 사용할 배율."},
|
||||
{"id":"","label":"Use Kohya method for handling multiple Loras","localized":"여러 Lora를 다룰 때 Kohya의 방법 사용","hint":""},
|
||||
{"id":"","label":"Multiplier for extra networks","localized":"엑스트라 네트워크 배율","hint":"하이퍼 네트워크 또는 Lora를 프롬프트에 추가할 때 사용할 배율이다."},
|
||||
{"id":"","label":"Add hypernetwork to prompt","localized":"프롬프트에 하이퍼 네트워크 추가","hint":""},
|
||||
{"id":"","label":"Add Lora to prompt","localized":"프롬프트에 Lora 추가","hint":""},
|
||||
{"id":"","label":"shuffle tags by ',' when creating prompts.","localized":"프롬프트를 생성할 때 ','에 따라 태그 섞기","hint":""},
|
||||
{"id":"","label":"extra text to add before <...> when adding extra network to prompt","localized":"","hint":""},
|
||||
{"id":"","label":"extra text to add before <...> when adding extra network to prompt","localized":"엑스트라 네트워크를 프롬프트에 추가할 때 <...> 이전에 추가할 텍스트","hint":""},
|
||||
{"id":"","label":"When adding to prompt, refer to Lora by","localized":"","hint":""},
|
||||
{"id":"","label":"add lora hashes to infotext","localized":"","hint":""},
|
||||
{"id":"","label":"add lora hashes to infotext","localized":"infotext에 Lora 해시 정보 포함","hint":""},
|
||||
{"id":"","label":"Checkpoints","localized":"체크포인트","hint":""},
|
||||
{"id":"","label":"Lora","localized":"","hint":""},
|
||||
{"id":"","label":"LyCORIS","localized":"","hint":""},
|
||||
@@ -83,9 +83,9 @@
|
||||
{"id":"","label":"delete","localized":"삭제","hint":"이미지를 삭제한다."},
|
||||
{"id":"","label":"➠ text","localized":"➠ 텍스트","hint":"이미지를 이미지➠텍스트 탭으로 옮긴다."},
|
||||
{"id":"","label":"➠ image","localized":"➠ 이미지","hint":"이미지를 이미지➠이미지 탭으로 옮긴다."},
|
||||
{"id":"","label":"➠ inpaint","localized":"","hint":"Transfer image to inpaint interface"},
|
||||
{"id":"","label":"➠ sketch","localized":"","hint":"Transfer image to sketch interface"},
|
||||
{"id":"","label":"➠ inpaint sketch","localized":"","hint":"Transfer image to inpaint sketch interface"},
|
||||
{"id":"","label":"➠ inpaint","localized":"➠ 인페인트","hint":"이미지를 인페인트 화면으로 옮긴다."},
|
||||
{"id":"","label":"➠ sketch","localized":"➠ 스케치","hint":"이미지를 스케치 화면으로 옮긴다."},
|
||||
{"id":"","label":"➠ inpaint sketch","localized":"➠ 인페인트 스케치","hint":"이미지를 인페인트 스케치 탭으로 옮긴다."},
|
||||
{"id":"","label":"➠ process","localized":"➠ 이미지 정보","hint":"이미지를 이미지 정보 탭으로 옮긴다."}
|
||||
],
|
||||
"extensions": [
|
||||
@@ -102,24 +102,24 @@
|
||||
{"id":"","label":"Apply changes & restart server","localized":"변경 사항을 저장하고 서버를 재시작","hint":"모든 변경 사항을 적용하고 서버를 재시작한다."},
|
||||
{"id":"","label":"install","localized":"설치","hint":"이 확장을 설치한다."},
|
||||
{"id":"","label":"uninstall","localized":"제거","hint":"이 확장을 제거한다."},
|
||||
{"id":"","label":"User interface defaults","localized":"사용자 인터페이스 기본값","hint":"Review and set current values as default values for the user interface"},
|
||||
{"id":"","label":"View changes","localized":"변경 사항 확인","hint":"Review changes between default user interface values and and current values"},
|
||||
{"id":"","label":"Set new defaults","localized":"새 기본값 설정","hint":"Set current values as default values for the user interface"},
|
||||
{"id":"","label":"User interface defaults","localized":"유저 인터페이스 기본값","hint":"Review and set current values as default values for the user interface"},
|
||||
{"id":"","label":"View changes","localized":"변경 사항 확인","hint":"기본값과 현재 값 간의 변경 사항을 확인한다."},
|
||||
{"id":"","label":"Set new defaults","localized":"새 기본값 설정","hint":"현재 UI 설정을 기본값으로 저장한다."},
|
||||
{"id":"","label":"Restore system defaults","localized":"시스템 기본값 복원","hint":"유저 인터페이스 기본값을 복원한다."}
|
||||
],
|
||||
"txt2img tab": [
|
||||
{"id":"","label":"Sampling method","localized":"샘플링 방법(샘플러)","hint":"이미지 생성 시 사용할 알고리즘을 지정한다."},
|
||||
{"id":"","label":"Sampling steps","localized":"샘플링 스탭 수","hint":"이미지를 생성 과정을 얼마나 많이 반복할지 지정한다. 높을 수록 생성이 길어지고 낮을 수록 결과물 퀄리티가 낮아진다."},
|
||||
{"id":"","label":"Restore faces","localized":"얼굴 복원","hint":"Use a pre-trained model to correct the generated faces. See GFPGAN or Codeformer."},
|
||||
{"id":"","label":"Restore faces","localized":"얼굴 복원","hint":"생성된 이미지의 얼굴을 GFPGAN 또는 CodeFormer로 고친다."},
|
||||
{"id":"","label":"Tiling","localized":"타일링","hint":"Produce an image that can be tiled"},
|
||||
{"id":"","label":"Hires fix","localized":"생성 후 업스케일(Hires fix)","hint":"최종 이미지를 생성하기 전에 업스케일한다."},
|
||||
{"id":"","label":"Denoising strength","localized":"디노이즈 강도","hint":"Determines how little respect the algorithm should have for image's content. At 0, nothing will change, and at 1 you'll get an unrelated image. With values below 1.0, processing will take less steps than the Sampling Steps slider specifies"},
|
||||
{"id":"","label":"Denoising strength","localized":"디노이즈 강도","hint":"기존 이미지의 특징을 얼마나 남길지 정한다. 만약 0이라면 이전 이미지가 그대로 생성되고 1이라면 이전 이미지와 전혀 무관한 이미지가 생성된다. With values below 1.0, processing will take less steps than the Sampling Steps slider specifies"},
|
||||
{"id":"","label":"Denoise start","localized":"","hint":"Override denoise strength by stating how early base model should finish and when refiner should start. Only applicable to refiner usage. If set to 0 or 1, denoising strength will be used"},
|
||||
{"id":"","label":"Hires steps","localized":"업스케일 스탭 수","hint":"Number of sampling steps for upscaled picture. If 0, uses same as for original"},
|
||||
{"id":"","label":"Upscaler","localized":"업스케일러","hint":"Which pre-tarined model to use for the upscaling process."},
|
||||
{"id":"","label":"Upscale by","localized":"업스케일 배율","hint":"Adjusts the size of the image by multiplying the original width and height by the selected value. Ignored if either Resize width to or Resize height to are non-zero"},
|
||||
{"id":"","label":"Resize width to","localized":"너비","hint":"이 너비로 이미지를 리사이즈한다. If 0, width is inferred from either of two nearby sliders"},
|
||||
{"id":"","label":"Resize height to","localized":"높이","hint":"이 높이로 이미지를 리사이즈한다. If 0, height is inferred from either of two nearby sliders"},
|
||||
{"id":"","label":"Hires steps","localized":"업스케일 스탭 수","hint":"업스케일 시 샘플링 스탭 수이다. If 0, uses same as for original"},
|
||||
{"id":"","label":"Upscaler","localized":"업스케일러","hint":"업스케일 시 사용할 모델이다."},
|
||||
{"id":"","label":"Upscale by","localized":"업스케일 배율","hint":"기존 이미지의 너비와 높이에 이 값을 곱한다. 너비와 높이가 0이 아니라면 무시된다."},
|
||||
{"id":"","label":"Resize width to","localized":"너비","hint":"이 너비로 이미지를 리사이즈한다. 0이라면 높이에서 추론한다."},
|
||||
{"id":"","label":"Resize height to","localized":"높이","hint":"이 높이로 이미지를 리사이즈한다. 0이라면 너비에서 추론한다."},
|
||||
{"id":"","label":"Secondary sampler","localized":"2단계 샘플러","hint":"Use specific sampler as fallback sampler if primary is not supported for specific operation"},
|
||||
{"id":"","label":"Secondary steps","localized":"2단계 스탭 수","hint":"Number of steps to use for second pass"},
|
||||
{"id":"","label":"Secondary CFG Scale","localized":"2단계 CFG 스케일","hint":"CFG scale used for refiner pass"},
|
||||
@@ -132,24 +132,24 @@
|
||||
{"id":"","label":"Batch size","localized":"배치 사이즈","hint":"How many image to create in a single batch (생성 시 성능에 영향을 주고 VRAM을 더 사용함)"},
|
||||
{"id":"","label":"CFG Scale","localized":"CFG 스케일","hint":"Classifier Free Guidance scale: how strongly the image should conform to prompt. Lower values produce more creative results, higher values make it follow the prompt more strictly; recommended values between 5-10"},
|
||||
{"id":"","label":"CLIP skip","localized":"클립(CLIP) 스킵","hint":"Clip skip is a feature that allows users to control the level of specificity of the prompt, the higher the CLIP skip value, the less deep the prompt will be interpreted. CLIP Skip 1 is typical while some anime models produce better results at CLIP skip 2"},
|
||||
{"id":"","label":"Seed","localized":"시드","hint":"Random Number Generator의 결과를 결정하는 값. 같은 설정 값과 시드를 사용하면 같은 결과를 얻는다."},
|
||||
{"id":"","label":"Seed","localized":"시드","hint":"난수 생성기의 결과를 결정하는 값. 같은 설정 값과 시드를 사용하면 같은 결과를 얻는다."},
|
||||
{"id":"","label":"Extra","localized":"기타","hint":"추가 설정을 본다."},
|
||||
{"id":"","label":"Variation seed","localized":"","hint":"Seed of a different picture to be mixed into the generation"},
|
||||
{"id":"","label":"Variation strength","localized":"","hint":"How strong of a variation to produce. At 0, there will be no effect. At 1, you will get the complete picture with variation seed (except for ancestral samplers, where you will just get something)"},
|
||||
{"id":"","label":"Variation seed","localized":"다양성 시드","hint":"Seed of a different picture to be mixed into the generation"},
|
||||
{"id":"","label":"Variation strength","localized":"다양성 강도","hint":"How strong of a variation to produce. At 0, there will be no effect. At 1, you will get the complete picture with variation seed (except for ancestral samplers, where you will just get something)"},
|
||||
{"id":"","label":"Resize seed from width","localized":"","hint":"Make an attempt to produce a picture similar to what would have been produced with same seed at specified resolution"},
|
||||
{"id":"","label":"Resize seed from height","localized":"","hint":"Make an attempt to produce a picture similar to what would have been produced with same seed at specified resolution"},
|
||||
{"id":"","label":"Override settings","localized":"설정 덮어쓰기","hint":"If you read in generation parameters through 'Process Image tab' and individual generation parameters should deviate from your system settings, this box will be populated with those settings to override your system configuration for this workflow"}
|
||||
],
|
||||
"process tab": [
|
||||
{"id":"","label":"Single Image","localized":"단일 이미지","hint":"Process single image"},
|
||||
{"id":"","label":"Process Batch","localized":"배치 생성","hint":"Process batch of images"},
|
||||
{"id":"","label":"Process Folder","localized":"폴더 생성","hint":"Process all images in a folder"},
|
||||
{"id":"","label":"Scale by","localized":"리사이즈(배율)","hint":"Use this tab to resize the source image(s) by a chosen factor"},
|
||||
{"id":"","label":"Scale to","localized":"리사이즈","hint":"Use this tab to resize the source image(s) to a chosen target size"},
|
||||
{"id":"","label":"Single Image","localized":"단일 이미지","hint":"단일 이미지에 대해 작업을 수행한다."},
|
||||
{"id":"","label":"Process Batch","localized":"배치 생성","hint":"이미지 배치를 생성한다."},
|
||||
{"id":"","label":"Process Folder","localized":"폴더","hint":"폴더 내 모든 이미지를 대상으로 작업을 수행한다."},
|
||||
{"id":"","label":"Scale by","localized":"이미지 크기 변경(배율)","hint":"이 배율만큼 이미지 크기를 바꾼다."},
|
||||
{"id":"","label":"Scale to","localized":"이미지 크기 변경","hint":"특정 크기로 이미지 크기를 바꾼다."},
|
||||
{"id":"","label":"Input directory","localized":"입력 위치","hint":"Folder where the images are that you want to process"},
|
||||
{"id":"","label":"Output directory","localized":"출력 위치","hint":"Folder where the processed images should be saved to"},
|
||||
{"id":"","label":"Show result images","localized":"결과 이미지 보기","hint":"Enable to show the processed images in the image pane"},
|
||||
{"id":"","label":"Resize","localized":"리사이즈 배율","hint":"Factor for resizing 1x mean no upscale, 4x means 4 times upscale, high values might lead to memory issues on small graphics cards"},
|
||||
{"id":"","label":"Resize","localized":"이미지 크기 변경 배율","hint":"Factor for resizing 1x mean no upscale, 4x means 4 times upscale, high values might lead to memory issues on small graphics cards"},
|
||||
{"id":"","label":"Crop to fit","localized":"","hint":"If the dimensions of your source image (e.g. 512x510) deviate from your target dimensions (e.g. 1024x768) this function will fit your upscaled image into your target size image. Excess will be cropped"},
|
||||
{"id":"","label":"Secondary Upscaler","localized":"2단계 업스케일러","hint":"Select secondary upscaler to run after initial upscaler"},
|
||||
{"id":"","label":"Upscaler 2 visibility","localized":"","hint":"Strength of the secondary upscaler"},
|
||||
@@ -163,8 +163,8 @@
|
||||
{"id":"shutdown_submit","label":"Shutdown server","localized":"서버 종료","hint":"서버를 종료한다."},
|
||||
{"id":"settings_preview_theme","label":"Preview theme","localized":"테마 미리보기","hint":"테마 미리보기 탭을 연다."},
|
||||
{"id":"defaults_submit","label":"Restore defaults","localized":"기본값 복원","hint":"기본 설정을 불러온다."},
|
||||
{"id":"sett_unload_sd_model","label":"Unload checkpoint","localized":"체크포인트 언로드","hint":"현재 로드된 모델을 언로드한다."},
|
||||
{"id":"sett_reload_sd_model","label":"Reload checkpoint","localized":"체크포인트 다시 불러오기","hint":"현재 로드된 모델을 다시 불러온다."}
|
||||
{"id":"sett_unload_sd_model","label":"Unload checkpoint","localized":"체크포인트 언로드","hint":"현재 모델을 메모리에서 해제한다."},
|
||||
{"id":"sett_reload_sd_model","label":"Reload checkpoint","localized":"체크포인트 다시 불러오기","hint":"현재 모델을 다시 불러온다."}
|
||||
],
|
||||
"settings sections": [
|
||||
{"id":"","label":"Stable Diffusion","localized":"","hint":""},
|
||||
@@ -189,11 +189,11 @@
|
||||
],
|
||||
"img2img tabs": [
|
||||
{"id":"","label":"Image","localized":"이미지","hint":""},
|
||||
{"id":"","label":"Sketch","localized":"","hint":""},
|
||||
{"id":"","label":"Inpaint","localized":"","hint":""},
|
||||
{"id":"","label":"Inpaint sketch","localized":"","hint":""},
|
||||
{"id":"","label":"Inpaint upload","localized":"","hint":""},
|
||||
{"id":"","label":"Batch","localized":"","hint":""}
|
||||
{"id":"","label":"Sketch","localized":"스케치","hint":""},
|
||||
{"id":"","label":"Inpaint","localized":"인페인트","hint":""},
|
||||
{"id":"","label":"Inpaint sketch","localized":"인페인트 스케치","hint":""},
|
||||
{"id":"","label":"Inpaint upload","localized":"인페인트 업로드","hint":""},
|
||||
{"id":"","label":"Batch","localized":"배치","hint":""}
|
||||
],
|
||||
"img2img tab": [
|
||||
{"id":"","label":"Inpaint batch input directory","localized":"","hint":""},
|
||||
@@ -259,7 +259,7 @@
|
||||
{"id":"","label":"Name","localized":"이름","hint":""},
|
||||
{"id":"","label":"Initialization text","localized":"","hint":"If the number of tokens is more than the number of vectors, some may be skipped.\nLeave the textbox empty to start with zeroed out vectors"},
|
||||
{"id":"","label":"Number of vectors per token","localized":"","hint":""},
|
||||
{"id":"","label":"Overwrite Old Embedding","localized":"","hint":""},
|
||||
{"id":"","label":"Overwrite Old Embedding","localized":"기존 임베딩 덮어쓰기","hint":""},
|
||||
{"id":"","label":"Enter hypernetwork layer structure","localized":"","hint":""},
|
||||
{"id":"","label":"Select activation function of hypernetwork","localized":"","hint":"Recommended : Swish / Linear(none)"},
|
||||
{"id":"","label":"Select Layer weights initialization","localized":"","hint":"Recommended: Kaiming for relu-like, Xavier for sigmoid-like, Normal otherwise"},
|
||||
@@ -342,8 +342,8 @@
|
||||
{"id":"","label":"InvokeAI's","localized":"","hint":""},
|
||||
{"id":"","label":"Sub-quadratic","localized":"","hint":""},
|
||||
{"id":"","label":"Split attention","localized":"","hint":""},
|
||||
{"id":"","label":"xFormers enable flash Attention","localized":"","hint":""},
|
||||
{"id":"","label":"SDP disable memory attention","localized":"","hint":""},
|
||||
{"id":"","label":"xFormers enable flash Attention","localized":"xFormers Flash Attention 활성화","hint":""},
|
||||
{"id":"","label":"SDP disable memory attention","localized":"SDP Memory Attention 비활성화","hint":""},
|
||||
{"id":"","label":"Sub-quadratic cross-attention query chunk size","localized":"Sub-quadratic 크로스 어텐션 쿼리 청크 크기","hint":""},
|
||||
{"id":"","label":"Sub-quadratic cross-attention kv chunk size","localized":"Sub-quadratic 크로스 어텐션 kv 청크 크기","hint":""},
|
||||
{"id":"","label":"Sub-quadratic cross-attention chunking threshold","localized":"Sub-quadratic 크로스 어텐션 청크 분할 임계값","hint":""},
|
||||
@@ -363,16 +363,16 @@
|
||||
{"id":"","label":"FP32","localized":"","hint":""},
|
||||
{"id":"","label":"FP16","localized":"","hint":""},
|
||||
{"id":"","label":"BF16","localized":"","hint":""},
|
||||
{"id":"","label":"Use full precision for model (--no-half)","localized":"모델에 단정밀도 사용 (--no-half)","hint":"Uses FP32 for the model. May produce better results while using more VRAM and slower generation"},
|
||||
{"id":"","label":"Use full precision for VAE (--no-half-vae)","localized":"VAE에 단정밀도 사용 (--no-half-vae)","hint":"Uses FP32 for the VAE. May produce better results while using more VRAM and slower generation"},
|
||||
{"id":"","label":"Enable upcast sampling","localized":"","hint":"Usually produces similar results to --no-half with better performance while using less memory"},
|
||||
{"id":"","label":"Enable upcast cross attention layer","localized":"","hint":""},
|
||||
{"id":"","label":"Disable NaN check in produced images/latent spaces","localized":"","hint":""},
|
||||
{"id":"","label":"Attempt VAE roll back when produced NaN values (experimental)","localized":"","hint":"Requires Torch 2.1 and NaN check enabled"},
|
||||
{"id":"","label":"Use channels last as torch memory format","localized":"","hint":""},
|
||||
{"id":"","label":"Enable full-depth cuDNN benchmark feature","localized":"","hint":""},
|
||||
{"id":"","label":"Allow TF32 math ops","localized":"TF32 단정밀도 연산 허용","hint":""},
|
||||
{"id":"","label":"Allow TF16 reduced precision math ops","localized":"TF16 반정밀도 연산 허용","hint":""},
|
||||
{"id":"","label":"Use full precision for model (--no-half)","localized":"모델에 단정밀도 사용 (--no-half)","hint":"모델을 단정밀도 부동소수점(FP32)으로 불러온다. VRAM을 많이 사용하고 생성 속도가 느려지지만 더 좋은 결과물을 얻을 수도 있다."},
|
||||
{"id":"","label":"Use full precision for VAE (--no-half-vae)","localized":"VAE에 단정밀도 사용 (--no-half-vae)","hint":"VAE를 단정밀도 부동소수점(FP32)으로 불러온다. VRAM을 많이 사용하고 생성 속도가 느려지지만 더 좋은 결과물을 얻을 수도 있다."},
|
||||
{"id":"","label":"Enable upcast sampling","localized":"Upcast sampling 활성화","hint":"메모리를 덜 사용하고 좋은 성능을 내면서도 --no-half를 사용할 때와 비슷한 결과물을 얻을 수 있다."},
|
||||
{"id":"","label":"Enable upcast cross attention layer","localized":"Upcast cross attention layer 활성화","hint":""},
|
||||
{"id":"","label":"Disable NaN check in produced images/latent spaces","localized":"생성된 이미지와 잠재 공간(latent space)에 대해 NaN 검사를 하지 않음","hint":""},
|
||||
{"id":"","label":"Attempt VAE roll back when produced NaN values (experimental)","localized":"NaN 값이 발견되었을 때 VAE 롤백 시도 (실험적)","hint":"Torch 2.1을 사용 중이고 NaN 검사가 활성화되어 있어야 한다."},
|
||||
{"id":"","label":"Use channels last as torch memory format","localized":"Channels last 메모리 형식 사용","hint":""},
|
||||
{"id":"","label":"Enable full-depth cuDNN benchmark feature","localized":"Full-depth cuDNN benchmark 기능 활성화","hint":""},
|
||||
{"id":"","label":"Allow TF32 math ops","localized":"TF32 연산 허용","hint":""},
|
||||
{"id":"","label":"Allow TF16 reduced precision math ops","localized":"TF16 연산 허용","hint":""},
|
||||
{"id":"","label":"Enable model compile (experimental)","localized":"모델 컴파일 활성화 (실험적)","hint":""},
|
||||
{"id":"","label":"inductor","localized":"","hint":""},
|
||||
{"id":"","label":"cudagraphs","localized":"","hint":""},
|
||||
@@ -381,7 +381,7 @@
|
||||
{"id":"","label":"ipex","localized":"","hint":""},
|
||||
{"id":"","label":"Model compile verbose mode","localized":"","hint":""},
|
||||
{"id":"","label":"Model compile suppress errors","localized":"모델 컴파일 시 오류 억제","hint":""},
|
||||
{"id":"","label":"Disable Torch memory garbage collection","localized":"Torch 메모리 정리 비활성화","hint":"Disable Torch memory garbage collection on each generation. CG will still run before & after model load as well when low GPU memory threshold is reached."},
|
||||
{"id":"","label":"Disable Torch memory garbage collection","localized":"Torch 메모리 정리 비활성화","hint":"이미지 생성 시 메모리 정리를 하지 않는다. CG will still run before & after model load as well when low GPU memory threshold is reached."},
|
||||
{"id":"","label":"Directory for temporary images; leave empty for default","localized":"임시 이미지 저장 위치 (비워 놓으면 기본값)","hint":""},
|
||||
{"id":"","label":"Cleanup non-default temporary directory when starting webui","localized":"임시 위치가 기본값이 아닌 경우 WebUI 시작 시 비우기","hint":""},
|
||||
{"id":"","label":"Path to directory with stable diffusion checkpoints","localized":"체크포인트 위치","hint":""},
|
||||
@@ -402,8 +402,8 @@
|
||||
{"id":"","label":"Path to directory with LyCORIS network(s)","localized":"LyCORIS 위치","hint":""},
|
||||
{"id":"","label":"Path to user-defined styles file","localized":"프롬프트 스타일 위치","hint":""},
|
||||
{"id":"","label":"Always save all generated images","localized":"항상 생성된 모든 이미지 저장","hint":""},
|
||||
{"id":"","label":"File format for generated images","localized":"생성된 이미지의 파일 포맷","hint":"Select file format for images"},
|
||||
{"id":"","label":"Include metadata in saved images","localized":"저장된 이미지에 메타데이터 포함","hint":"Save image create parameters as metadata tags inside image file"},
|
||||
{"id":"","label":"File format for generated images","localized":"생성된 이미지의 파일 형식","hint":"이미지 파일 형식을 선택한다."},
|
||||
{"id":"","label":"Include metadata in saved images","localized":"저장된 이미지에 메타데이터 포함","hint":"이미지 파일에 이미지 생성 파라미터를 메타데이터로 저장한다."},
|
||||
{"id":"","label":"Images filename pattern","localized":"이미지 파일명 패턴","hint":"Use following tags to define how filenames for images are chosen:<br><pre>seq, uuid<br>date, datetime, job_timestamp<br>generation_number, batch_number<br>model, model_shortname<br>model_hash, model_name<br>sampler, seed, steps, cfg<br>clip_skip, denoising<br>hasprompt, prompt, styles<br>prompt_hash, prompt_no_styles<br>prompt_spaces, prompt_words<br>height, width, image_hash<br></pre>"},
|
||||
{"id":"","label":"Add number to filename when saving","localized":"저장 시 파일명에 숫자 추가","hint":""},
|
||||
{"id":"","label":"Always save all generated image grids","localized":"항상 생성된 모든 그리드 이미지 저장","hint":""},
|
||||
@@ -457,8 +457,8 @@
|
||||
{"id":"","label":"Send seed when sending prompt or image to other interface","localized":"","hint":""},
|
||||
{"id":"","label":"Send size when sending prompt or image to another interface","localized":"","hint":""},
|
||||
{"id":"","label":"Font for image grids that have text","localized":"","hint":""},
|
||||
{"id":"","label":"Ctrl+up/down precision when editing (attention:1.1)","localized":"","hint":""},
|
||||
{"id":"","label":"Ctrl+up/down precision when editing <extra networks:0.9>","localized":"","hint":""},
|
||||
{"id":"","label":"Ctrl+up/down precision when editing (attention:1.1)","localized":"(attention:1.1) 수정 시 컨트롤+상/하 조절 정밀도","hint":""},
|
||||
{"id":"","label":"Ctrl+up/down precision when editing <extra networks:0.9>","localized":"<extra networks:0.9> 수정 시 컨트롤+상/하 조절 정밀도","hint":""},
|
||||
{"id":"","label":"Ctrl+up/down word delimiters","localized":"","hint":""},
|
||||
{"id":"","label":"Quicksettings list","localized":"빠른 설정 목록","hint":"List of setting names, separated by commas, for settings that should go to the quick access bar at the top instead the setting tab"},
|
||||
{"id":"","label":"Hidden UI tabs","localized":"숨긴 UI 탭","hint":""},
|
||||
@@ -517,10 +517,10 @@
|
||||
{"id":"","label":"logSNR","localized":"","hint":""},
|
||||
{"id":"","label":"UniPC order (must be < sampling steps)","localized":"","hint":""},
|
||||
{"id":"","label":"UniPC lower order final","localized":"","hint":""},
|
||||
{"id":"","label":"Enable addtional postprocessing operations","localized":"","hint":""},
|
||||
{"id":"","label":"Postprocessing operation order","localized":"","hint":""},
|
||||
{"id":"","label":"Enable addtional postprocessing operations","localized":"추가 후처리 작업","hint":""},
|
||||
{"id":"","label":"Postprocessing operation order","localized":"후처리 작업 순서","hint":""},
|
||||
{"id":"","label":"Maximum number of images in upscaling cache","localized":"","hint":""},
|
||||
{"id":"","label":"Move VAE and CLIP to RAM when training if possible","localized":"","hint":""},
|
||||
{"id":"","label":"Move VAE and CLIP to RAM when training if possible","localized":"가능하다면 학습 시 VAE와 CLIP 모델을 램으로 이동","hint":""},
|
||||
{"id":"","label":"Pin training dataset to memory","localized":"","hint":""},
|
||||
{"id":"","label":"Save resumable optimizer state when training","localized":"","hint":""},
|
||||
{"id":"","label":"Save training settings to a text file on training start","localized":"","hint":""},
|
||||
@@ -565,14 +565,16 @@
|
||||
{"id":"","label":"Select diffuser pipeline when loading from safetensors","localized":"safetensors 파일에서 로드할 때 사용할 파이프라인 선택","hint":""},
|
||||
{"id":"","label":"Move base model to CPU when using refiner","localized":"리파이너를 사용 중일 때 base 모델을 CPU로 이동","hint":""},
|
||||
{"id":"","label":"Move refiner model to CPU when not in use","localized":"사용 중이지 않을 때 리파이너 모델을 CPU로 이동","hint":""},
|
||||
{"id":"","label":"Move UNet to CPU while VAE decoding","localized":"","hint":""},
|
||||
{"id":"","label":"Move UNet to CPU while VAE decoding","localized":"VAE 디코딩 시 UNet을 CPU로 이동","hint":""},
|
||||
{"id":"","label":"Use model EMA weights when possible","localized":"가능하다면 모델의 EMA 가중치 사용","hint":""},
|
||||
{"id":"","label":"Generator device","localized":"Generator 디바이스","hint":""},
|
||||
{"id":"","label":"Generator device","localized":"난수 생성 장치","hint":""},
|
||||
{"id":"","label":"Enable sequential CPU offload","localized":"순차 CPU 오프로드 활성화","hint":"가중치를 CPU로 옮겨 GPU 메모리 사용률을 낮춘다. 속도가 약 10% 느려진다. Use with 어텐션 슬라이싱 활성화 for minimal memory consumption"},
|
||||
{"id":"","label":"Enable model CPU offload","localized":"모델 CPU 오프로드 활성화","hint":"전체 모델을 GPU로 옮긴다. 여전히 GPU 메모리 사용률을 약간 낮춰주지만 생성 속도에는 무시할 수 있는 정도의 영향을 준다. 추가적인 메모리 절약을 위해서는 어텐션 슬라이싱과 함께 사용한다."},
|
||||
{"id":"","label":"Enable VAE slicing","localized":"VAE 슬라이싱 활성화","hint":"Decodes batch latents one image at a time with limited VRAM. 여러 이미지를 다룰 때 VAE 해독 시 작은 성능 향상이 있다. 어텐션 슬라이싱과 함께 사용한다."},
|
||||
{"id":"","label":"Enable VAE tiling","localized":"VAE 타일링 활성화","hint":"Divide large images into overlapping tiles with limited VRAM. 생성 시간이 약간 늘어날 수 있다. 어텐션 슬라이싱과 함께 사용한다."},
|
||||
{"id":"","label":"Enable attention slicing","localized":"어텐션 슬라이싱 활성화","hint":"Performs attention computation in steps instead of all at once. 생성이 10% 느려지지만 메모리 사용률을 매우 크게 줄여준다."}
|
||||
{"id":"","label":"Enable attention slicing","localized":"어텐션 슬라이싱 활성화","hint":"Performs attention computation in steps instead of all at once. 생성이 10% 느려지지만 메모리 사용률을 매우 크게 줄여준다."},
|
||||
{"id":"","label":"Diffusers model loading variant","localized":"","hint":""},
|
||||
{"id":"","label":"Diffusers VAE loading variant","localized":"","hint":""}
|
||||
],
|
||||
"scripts": [
|
||||
{"id":"","label":"Script","localized":"스크립트","hint":""},
|
||||
|
||||
+1
-1
@@ -323,7 +323,7 @@ def check_torch():
|
||||
os.environ.setdefault('NEOReadDebugKeys', '1')
|
||||
os.environ.setdefault('ClDeviceGlobalMemSizeAvailablePercent', '100')
|
||||
os.environ.setdefault('TENSORFLOW_PACKAGE', 'tensorflow==2.12.0 intel-extension-for-tensorflow[gpu]')
|
||||
torch_command = os.environ.get('TORCH_COMMAND', 'torch==1.13.0a0+git6c9b55e torchvision==0.14.1a0 intel_extension_for_pytorch==1.13.120+xpu -f https://developer.intel.com/ipex-whl-stable-xpu')
|
||||
torch_command = os.environ.get('TORCH_COMMAND', 'torch==2.0.1a0 torchvision==0.15.2a0 intel_extension_for_pytorch==2.0.110+xpu -f https://developer.intel.com/ipex-whl-stable-xpu')
|
||||
else:
|
||||
machine = platform.machine()
|
||||
if sys.platform == 'darwin':
|
||||
|
||||
+35
-6
@@ -1,11 +1,40 @@
|
||||
import os
|
||||
from platform import system
|
||||
import torch
|
||||
from typing import NamedTuple, Callable, Optional
|
||||
|
||||
from modules.sd_hijack_utils import CondFunc
|
||||
|
||||
memory_providers = ["None", "atiadlxx (AMD only)"]
|
||||
default_memory_provider = "None"
|
||||
if system() == "Windows":
|
||||
memory_providers.append("Performance Counter")
|
||||
default_memory_provider = "Performance Counter"
|
||||
do_nothing = lambda: None
|
||||
|
||||
def _set_memory_provider():
|
||||
from modules.shared import opts, cmd_opts, log
|
||||
|
||||
if opts.directml_memory_provider == "Performance Counter":
|
||||
from .backend import pdh_mem_get_info
|
||||
from .memory import MemoryProvider
|
||||
torch.dml.mem_get_info = pdh_mem_get_info
|
||||
if torch.dml.memory_provider is not None:
|
||||
del torch.dml.memory_provider
|
||||
torch.dml.memory_provider = MemoryProvider()
|
||||
elif opts.directml_memory_provider == "atiadlxx (AMD only)":
|
||||
device_name = torch.dml.get_device_name(cmd_opts.device_id)
|
||||
if "AMD" not in device_name and "Radeon" not in device_name:
|
||||
log.warning(f"Memory stats provider is changed to None because the current device is not AMDGPU. Current Device: {device_name}")
|
||||
opts.directml_memory_provider = "None"
|
||||
_set_memory_provider()
|
||||
return
|
||||
from .backend import amd_mem_get_info
|
||||
torch.dml.mem_get_info = amd_mem_get_info
|
||||
else:
|
||||
from .backend import mem_get_info
|
||||
torch.dml.mem_get_info = mem_get_info
|
||||
torch.cuda.mem_get_info = torch.dml.mem_get_info
|
||||
|
||||
def directml_init():
|
||||
from modules.dml.backend import DirectML # pylint: disable=ungrouped-imports
|
||||
# Alternative of torch.cuda for DirectML.
|
||||
@@ -29,10 +58,6 @@ def directml_init():
|
||||
|
||||
torch.Tensor.directml = lambda self: self.to(torch.dml.current_device())
|
||||
|
||||
mem_bound = os.environ.get("DML_GPU_MEMORY_BOUND", None)
|
||||
if mem_bound is not None:
|
||||
torch.dml.set_gpu_memory_bound(int(mem_bound))
|
||||
|
||||
def directml_do_hijack():
|
||||
import modules.dml.hijack
|
||||
from modules.devices import device
|
||||
@@ -42,6 +67,8 @@ def directml_do_hijack():
|
||||
lambda orig_func, *args, **kwargs: orig_func(args[0].astype('float32')),
|
||||
lambda *args, **kwargs: args[1].dtype == float)
|
||||
|
||||
_set_memory_provider()
|
||||
|
||||
class OverrideItem(NamedTuple):
|
||||
value: str
|
||||
condition: Optional[Callable]
|
||||
@@ -61,9 +88,9 @@ def directml_override_opts():
|
||||
|
||||
count = 0
|
||||
for key in opts_override_table:
|
||||
count += 1
|
||||
item = opts_override_table[key]
|
||||
if getattr(shared.opts, key) != item.value and (item.condition is None or item.condition(shared.opts)):
|
||||
count += 1
|
||||
setattr(shared.opts, key, item.value)
|
||||
if item.message is not None:
|
||||
shared.log.warning(item.message)
|
||||
@@ -71,3 +98,5 @@ def directml_override_opts():
|
||||
|
||||
if count > 0:
|
||||
shared.log.info(f'{count} options are automatically overriden. If you want to keep them from overriding, run with --experimental argument.')
|
||||
|
||||
_set_memory_provider()
|
||||
|
||||
+15
-31
@@ -1,13 +1,24 @@
|
||||
# pylint: disable=no-member,no-self-argument,no-method-argument
|
||||
from typing import Optional
|
||||
from typing import Optional, Callable
|
||||
import torch
|
||||
import torch_directml # pylint: disable=import-error
|
||||
import modules.dml.amp as amp
|
||||
|
||||
from .memctl.unknown import UnknownMemoryControl
|
||||
from .utils import rDevice, get_device
|
||||
from .device import device
|
||||
from .device_properties import DeviceProperties
|
||||
from .memory import MemoryProvider
|
||||
|
||||
def amd_mem_get_info(device: Optional[rDevice]=None) -> tuple[int, int]:
|
||||
from .memory_amd import AMDMemoryProvider
|
||||
return AMDMemoryProvider.mem_get_info(get_device(device).index)
|
||||
|
||||
def pdh_mem_get_info(device: Optional[rDevice]=None) -> tuple[int, int]:
|
||||
mem_info = DirectML.memory_provider.get_memory(get_device(device).index)
|
||||
return (mem_info["total_committed"] - mem_info["dedicated_usage"], mem_info["total_committed"])
|
||||
|
||||
def mem_get_info(device: Optional[rDevice]=None) -> tuple[int, int]:
|
||||
return (8589934592, 8589934592)
|
||||
|
||||
class DirectML:
|
||||
amp = amp
|
||||
@@ -15,29 +26,10 @@ class DirectML:
|
||||
|
||||
context_device: Optional[torch.device] = None
|
||||
|
||||
__gpu_memory_bound: Optional[int] = None
|
||||
|
||||
is_autocast_enabled = False
|
||||
autocast_gpu_dtype = torch.float16
|
||||
|
||||
def __get_memory_control(device: torch.device):
|
||||
assert device.type == 'privateuseone'
|
||||
try:
|
||||
device_name = torch_directml.device_name(device.index)
|
||||
if 'NVIDIA' in device_name or 'GeForce' in device_name:
|
||||
from .memctl.nvidia import nVidiaMemoryControl as memory_control
|
||||
elif 'AMD' in device_name or 'Radeon' in device_name:
|
||||
from .memctl.amd import AMDMemoryControl as memory_control
|
||||
elif 'Intel' in device_name:
|
||||
from .memctl.intel import IntelMemoryControl as memory_control
|
||||
else:
|
||||
return UnknownMemoryControl
|
||||
return memory_control
|
||||
except Exception:
|
||||
return UnknownMemoryControl
|
||||
|
||||
def set_gpu_memory_bound(bound: Optional[int]):
|
||||
DirectML.__gpu_memory_bound = bound
|
||||
memory_provider: Optional[MemoryProvider] = None
|
||||
|
||||
def is_available() -> bool:
|
||||
return torch_directml.is_available()
|
||||
@@ -73,15 +65,7 @@ class DirectML:
|
||||
"num_alloc_retries": mem_stat_fill,
|
||||
}
|
||||
|
||||
def mem_get_info(device: Optional[rDevice]=None) -> tuple[int, int]:
|
||||
device = get_device(device)
|
||||
memory_control = DirectML.__get_memory_control(device)
|
||||
mem_info = memory_control.mem_get_info(device.index)
|
||||
if DirectML.__gpu_memory_bound is None:
|
||||
return mem_info
|
||||
used = mem_info[1] - mem_info[0]
|
||||
available = DirectML.__gpu_memory_bound - used
|
||||
return (0 if available < 0 else available, DirectML.__gpu_memory_bound)
|
||||
mem_get_info: Callable = mem_get_info
|
||||
|
||||
def memory_allocated(device: Optional[rDevice]=None) -> int:
|
||||
return sum(torch_directml.gpu_memory(get_device(device).index)) * (1 << 20)
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
from modules.dml.memctl.memctl import MemoryControl
|
||||
from .driver.atiadlxx import ATIADLxx
|
||||
|
||||
class AMDMemoryControl(MemoryControl):
|
||||
driver: ATIADLxx = ATIADLxx()
|
||||
def mem_get_info(index):
|
||||
usage = AMDMemoryControl.driver.get_dedicated_vram_usage(index) * (1 << 20)
|
||||
return (AMDMemoryControl.driver.iHyperMemorySize - usage, AMDMemoryControl.driver.iHyperMemorySize)
|
||||
@@ -1,6 +0,0 @@
|
||||
from modules.dml.memctl.memctl import MemoryControl
|
||||
|
||||
class IntelMemoryControl(MemoryControl):
|
||||
def mem_get_info(index: int):
|
||||
# DML TODO: Implement or find a general (and also lightweight) way.
|
||||
return (1073741824, 1073741824)
|
||||
@@ -1,8 +0,0 @@
|
||||
from abc import *
|
||||
from typing import *
|
||||
|
||||
class MemoryControl(metaclass=ABCMeta):
|
||||
driver: Any = None
|
||||
@abstractmethod
|
||||
def mem_get_info(index: int) -> Tuple[int, int]:
|
||||
pass
|
||||
@@ -1,6 +0,0 @@
|
||||
from modules.dml.memctl.memctl import MemoryControl
|
||||
|
||||
class nVidiaMemoryControl(MemoryControl):
|
||||
def mem_get_info(index: int):
|
||||
# DML TODO: Implement or find a general (and also lightweight) way.
|
||||
return (1073741824, 1073741824)
|
||||
@@ -1,5 +0,0 @@
|
||||
from modules.dml.memctl.memctl import MemoryControl
|
||||
|
||||
class UnknownMemoryControl(MemoryControl):
|
||||
def mem_get_info(index: int):
|
||||
return (1073741824, 1073741824)
|
||||
@@ -0,0 +1,31 @@
|
||||
from os import getpid
|
||||
from collections import defaultdict
|
||||
|
||||
from modules.dml.pdh import HQuery, HCounter, expand_wildcard_path
|
||||
|
||||
class MemoryProvider:
|
||||
hQuery: HQuery
|
||||
hCounters: defaultdict[str, list[HCounter]]
|
||||
|
||||
def __init__(self):
|
||||
self.hQuery = HQuery()
|
||||
self.hCounters = defaultdict(list)
|
||||
|
||||
def get_memory(self, device_id: int) -> dict[str, int]:
|
||||
if len(self.hCounters) == 0:
|
||||
pid = getpid()
|
||||
paths_dedicated = expand_wildcard_path(f"\\GPU Process Memory(pid_{pid}_*_phys_{device_id})\\Dedicated Usage")
|
||||
paths_committed = expand_wildcard_path(f"\\GPU Process Memory(pid_{pid}_*_phys_{device_id})\\Total Committed")
|
||||
for path in paths_dedicated:
|
||||
self.hCounters["dedicated_usage"].append(self.hQuery.add_counter(path))
|
||||
for path in paths_committed:
|
||||
self.hCounters["total_committed"].append(self.hQuery.add_counter(path))
|
||||
self.hQuery.collect_data()
|
||||
result = defaultdict(int)
|
||||
for key in self.hCounters:
|
||||
for hCounter in self.hCounters[key]:
|
||||
result[key] += hCounter.get_formatted_value(int)
|
||||
return dict(result)
|
||||
|
||||
def __del__(self):
|
||||
self.hQuery.close()
|
||||
@@ -0,0 +1,7 @@
|
||||
from .driver.atiadlxx import ATIADLxx
|
||||
|
||||
class AMDMemoryProvider:
|
||||
driver: ATIADLxx = ATIADLxx()
|
||||
def mem_get_info(index):
|
||||
usage = AMDMemoryProvider.driver.get_dedicated_vram_usage(index) * (1 << 20)
|
||||
return (AMDMemoryProvider.driver.iHyperMemorySize - usage, AMDMemoryProvider.driver.iHyperMemorySize)
|
||||
@@ -0,0 +1,85 @@
|
||||
from ctypes import *
|
||||
from ctypes.wintypes import *
|
||||
from typing import NamedTuple, TypeVar
|
||||
|
||||
from .apis import PdhExpandWildCardPathW, PdhOpenQueryW, PdhAddEnglishCounterW, PdhCollectQueryData, PdhGetFormattedCounterValue, PdhGetFormattedCounterArrayW, PdhCloseQuery
|
||||
from .structures import PDH_HQUERY, PDH_HCOUNTER, PDH_FMT_COUNTERVALUE, PPDH_FMT_COUNTERVALUE_ITEM_W
|
||||
from .defines import *
|
||||
from .msvcrt import malloc
|
||||
from .errors import PDHError
|
||||
|
||||
class __InternalAbstraction(NamedTuple):
|
||||
flag: int
|
||||
attr_name: str
|
||||
|
||||
_type_map = {
|
||||
int: __InternalAbstraction(PDH_FMT_LARGE, "largeValue"),
|
||||
float: __InternalAbstraction(PDH_FMT_DOUBLE, "doubleValue"),
|
||||
}
|
||||
|
||||
def expand_wildcard_path(path: str) -> list[str]:
|
||||
listLength = DWORD(0)
|
||||
if PdhExpandWildCardPathW(None, LPCWSTR(path), None, byref(listLength), PDH_NOEXPANDCOUNTERS) != PDH_MORE_DATA:
|
||||
raise PDHError("Something went wrong.")
|
||||
expanded = (WCHAR * listLength.value)()
|
||||
if PdhExpandWildCardPathW(None, LPCWSTR(path), expanded, byref(listLength), PDH_NOEXPANDCOUNTERS) != PDH_OK:
|
||||
raise PDHError(f"Couldn't expand wildcard path '{path}'")
|
||||
result = list()
|
||||
cur = str()
|
||||
for chr in expanded:
|
||||
if chr == '\0':
|
||||
result.append(cur)
|
||||
cur = str()
|
||||
else:
|
||||
cur += chr
|
||||
result.pop()
|
||||
return result
|
||||
|
||||
T = TypeVar("T", *_type_map.keys())
|
||||
|
||||
class HCounter(PDH_HCOUNTER):
|
||||
def get_formatted_value(self, type: T) -> T:
|
||||
if type not in _type_map:
|
||||
raise PDHError(f"Invalid value type: {type}")
|
||||
flag, attr_name = _type_map[type]
|
||||
value = PDH_FMT_COUNTERVALUE()
|
||||
if PdhGetFormattedCounterValue(self, DWORD(flag | PDH_FMT_NOSCALE), None, byref(value)) != PDH_OK:
|
||||
raise PDHError("Couldn't get formatted counter value.")
|
||||
return getattr(value.u, attr_name)
|
||||
|
||||
def get_formatted_dict(self, type: T) -> dict[str, T]:
|
||||
if type not in _type_map:
|
||||
raise PDHError(f"Invalid value type: {type}")
|
||||
flag, attr_name = _type_map[type]
|
||||
bufferSize = DWORD(0)
|
||||
itemCount = DWORD(0)
|
||||
if PdhGetFormattedCounterArrayW(self, DWORD(flag | PDH_FMT_NOSCALE), byref(bufferSize), byref(itemCount), None) != PDH_MORE_DATA:
|
||||
raise PDHError("Something went wrong.")
|
||||
itemBuffer = cast(malloc(c_size_t(bufferSize.value)), PPDH_FMT_COUNTERVALUE_ITEM_W)
|
||||
if PdhGetFormattedCounterArrayW(self, DWORD(flag | PDH_FMT_NOSCALE), byref(bufferSize), byref(itemCount), itemBuffer) != PDH_OK:
|
||||
raise PDHError("Couldn't get formatted counter array.")
|
||||
result: dict[str, T] = dict()
|
||||
for i in range(0, itemCount.value):
|
||||
item = itemBuffer[i]
|
||||
result[item.szName] = getattr(item.FmtValue.u, attr_name)
|
||||
return result
|
||||
|
||||
class HQuery(PDH_HQUERY):
|
||||
def __init__(self):
|
||||
super(HQuery, self).__init__()
|
||||
if PdhOpenQueryW(None, None, byref(self)) != PDH_OK:
|
||||
raise PDHError("Couldn't open PDH query.")
|
||||
|
||||
def add_counter(self, path: str) -> HCounter:
|
||||
hCounter = HCounter()
|
||||
if PdhAddEnglishCounterW(self, LPCWSTR(path), None, byref(hCounter)) != PDH_OK:
|
||||
raise PDHError("Couldn't add counter query.")
|
||||
return hCounter
|
||||
|
||||
def collect_data(self):
|
||||
if PdhCollectQueryData(self) != PDH_OK:
|
||||
raise PDHError("Couldn't collect query data.")
|
||||
|
||||
def close(self):
|
||||
if PdhCloseQuery(self) != PDH_OK:
|
||||
raise PDHError("Couldn't close PDH query.")
|
||||
@@ -0,0 +1,36 @@
|
||||
from ctypes import *
|
||||
from ctypes.wintypes import *
|
||||
from typing import Callable
|
||||
|
||||
from .structures import *
|
||||
from .defines import *
|
||||
|
||||
pdh = CDLL("pdh.dll")
|
||||
|
||||
PdhExpandWildCardPathW: Callable = pdh.PdhExpandWildCardPathW
|
||||
PdhExpandWildCardPathW.restype = PDH_FUNCTION
|
||||
PdhExpandWildCardPathW.argtypes = [LPCWSTR, LPCWSTR, PZZWSTR, LPDWORD, DWORD]
|
||||
|
||||
PdhOpenQueryW: Callable = pdh.PdhOpenQueryW
|
||||
PdhOpenQueryW.restype = PDH_FUNCTION
|
||||
PdhOpenQueryW.argtypes = [LPCWSTR, DWORD_PTR, POINTER(PDH_HQUERY)]
|
||||
|
||||
PdhAddEnglishCounterW: Callable = pdh.PdhAddEnglishCounterW
|
||||
PdhAddEnglishCounterW.restype = PDH_FUNCTION
|
||||
PdhAddEnglishCounterW.argtypes = [PDH_HQUERY, LPCWSTR, DWORD_PTR, POINTER(PDH_HCOUNTER)]
|
||||
|
||||
PdhCollectQueryData: Callable = pdh.PdhCollectQueryData
|
||||
PdhCollectQueryData.restype = PDH_FUNCTION
|
||||
PdhCollectQueryData.argtypes = [PDH_HQUERY]
|
||||
|
||||
PdhGetFormattedCounterValue: Callable = pdh.PdhGetFormattedCounterValue
|
||||
PdhGetFormattedCounterValue.restype = PDH_FUNCTION
|
||||
PdhGetFormattedCounterValue.argtypes = [PDH_HCOUNTER, DWORD, LPDWORD, PPDH_FMT_COUNTERVALUE]
|
||||
|
||||
PdhGetFormattedCounterArrayW: Callable = pdh.PdhGetFormattedCounterArrayW
|
||||
PdhGetFormattedCounterArrayW.restype = PDH_FUNCTION
|
||||
PdhGetFormattedCounterArrayW.argtypes = [PDH_HCOUNTER, DWORD, LPDWORD, LPDWORD, PPDH_FMT_COUNTERVALUE_ITEM_W]
|
||||
|
||||
PdhCloseQuery: Callable = pdh.PdhCloseQuery
|
||||
PdhCloseQuery.restype = PDH_FUNCTION
|
||||
PdhCloseQuery.argtypes = [PDH_HQUERY]
|
||||
@@ -0,0 +1,22 @@
|
||||
from ctypes import *
|
||||
from ctypes.wintypes import *
|
||||
|
||||
PDH_FUNCTION = c_int
|
||||
PDH_OK = 0x00000000
|
||||
PDH_MORE_DATA = -2147481646#0x800007D2
|
||||
|
||||
DWORD_PTR = POINTER(DWORD)
|
||||
PWSTR = POINTER(WCHAR)
|
||||
PZZWSTR = POINTER(WCHAR)
|
||||
|
||||
PDH_NOEXPANDCOUNTERS = 1
|
||||
PDH_NOEXPANDINSTANCES = 2
|
||||
PDH_REFRESHCOUNTERS = 4
|
||||
|
||||
PDH_FMT_LONG = 0x00000100
|
||||
PDH_FMT_DOUBLE = 0x00000200
|
||||
PDH_FMT_LARGE = 0x00000400
|
||||
|
||||
PDH_FMT_NOSCALE = 0x00001000
|
||||
PDH_FMT_1000 = 0x00002000
|
||||
PDH_FMT_NOCAP100 = 0x00008000
|
||||
@@ -0,0 +1,3 @@
|
||||
class PDHError(Exception):
|
||||
def __init__(self, message: str):
|
||||
super(PDHError, self).__init__(message)
|
||||
@@ -0,0 +1,11 @@
|
||||
from ctypes import *
|
||||
|
||||
msvcrt = CDLL("msvcrt")
|
||||
|
||||
malloc = msvcrt.malloc
|
||||
malloc.restype = c_void_p
|
||||
malloc.argtypes = [c_size_t]
|
||||
|
||||
free = msvcrt.free
|
||||
free.restype = None
|
||||
free.argtypes = [c_void_p]
|
||||
@@ -0,0 +1,41 @@
|
||||
from ctypes import *
|
||||
from ctypes.wintypes import *
|
||||
|
||||
PDH_HQUERY = HANDLE
|
||||
PDH_HCOUNTER = HANDLE
|
||||
|
||||
class PDH_FMT_COUNTERVALUE_U(Union):
|
||||
_fields_ = [
|
||||
("longValue", LONG),
|
||||
("doubleValue", c_double),
|
||||
("largeValue", c_longlong),
|
||||
("AnsiStringValue", LPCSTR),
|
||||
("WideStringValue", LPCWSTR),
|
||||
]
|
||||
|
||||
longValue: int
|
||||
doubleValue: float
|
||||
largeValue: int
|
||||
AnsiStringValue: LPCSTR
|
||||
WideStringValue: LPCWSTR
|
||||
|
||||
class PDH_FMT_COUNTERVALUE(Structure):
|
||||
_anonymous_ = ("u",)
|
||||
_fields_ = [
|
||||
("CStatus", DWORD),
|
||||
("u", PDH_FMT_COUNTERVALUE_U),
|
||||
]
|
||||
|
||||
CStatus: DWORD
|
||||
u: PDH_FMT_COUNTERVALUE_U
|
||||
PPDH_FMT_COUNTERVALUE = POINTER(PDH_FMT_COUNTERVALUE)
|
||||
|
||||
class PDH_FMT_COUNTERVALUE_ITEM_W(Structure):
|
||||
_fields_ = [
|
||||
("szName", LPWSTR),
|
||||
("FmtValue", PDH_FMT_COUNTERVALUE),
|
||||
]
|
||||
|
||||
szName: str
|
||||
FmtValue: PDH_FMT_COUNTERVALUE
|
||||
PPDH_FMT_COUNTERVALUE_ITEM_W = POINTER(PDH_FMT_COUNTERVALUE_ITEM_W)
|
||||
@@ -1,4 +1,5 @@
|
||||
import os
|
||||
import contextlib
|
||||
import torch
|
||||
import intel_extension_for_pytorch as ipex
|
||||
from modules import shared
|
||||
@@ -16,6 +17,9 @@ def ipex_no_cuda(orig_func, *args, **kwargs): # pylint: disable=redefined-outer-
|
||||
orig_func(*args, **kwargs)
|
||||
torch.cuda.is_available = torch.xpu.is_available
|
||||
|
||||
def return_null_context(*args, **kwargs):
|
||||
return contextlib.nullcontext()
|
||||
|
||||
def ipex_init():
|
||||
#Fix functions with ipex
|
||||
torch.cuda.is_available = torch.xpu.is_available
|
||||
@@ -27,6 +31,7 @@ def ipex_init():
|
||||
torch._utils._get_available_device_type = lambda: "xpu" # pylint: disable=protected-access
|
||||
torch.cuda.set_device = torch.xpu.set_device
|
||||
torch.cuda.synchronize = torch.xpu.synchronize
|
||||
torch.backends.cuda.sdp_kernel = return_null_context
|
||||
torch.Tensor.cuda = torch.Tensor.xpu
|
||||
torch.nn.DataParallel = DummyDataParallel
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ lora_state = { # TODO Lora state for Diffusers
|
||||
def unload_diffusers_lora():
|
||||
try:
|
||||
pipe = shared.sd_model
|
||||
pipe.unload_lora_weights()
|
||||
lora_state['active'] = False
|
||||
lora_state['loaded'] = 0
|
||||
pipe._remove_text_encoder_monkey_patch() # pylint: disable=W0212
|
||||
@@ -24,7 +25,7 @@ def unload_diffusers_lora():
|
||||
def load_diffusers_lora(name, lora, strength = 1.0):
|
||||
try:
|
||||
pipe = shared.sd_model
|
||||
pipe.load_lora_weights(lora.filename, cache_dir=shared.opts.diffusers_dir, local_files_only=True)
|
||||
pipe.load_lora_weights(lora.filename, cache_dir=shared.opts.diffusers_dir, local_files_only=True, lora_scale=strength)
|
||||
lora_state['active'] = True
|
||||
lora_state['loaded'] += 1
|
||||
lora_state['multiplier'] = strength
|
||||
|
||||
+1
-1
Submodule modules/lycoris updated: 6dc0dbf477...3549fdef8f
@@ -159,18 +159,19 @@ def process_diffusers(p: StableDiffusionProcessing, seeds, prompts, negative_pro
|
||||
if shared.sd_refiner is None or not p.enable_hr:
|
||||
output.images = vae_decode(output.images, shared.sd_model)
|
||||
|
||||
if lora_state['active']:
|
||||
unload_diffusers_lora()
|
||||
|
||||
if refiner_enabled:
|
||||
for i in range(len(output.images)):
|
||||
#shared.cmd_opts.medvram or shared.opts.diffusers_model_cpu_offload:
|
||||
#Model CPU Offload doesn't unload the base model without this.
|
||||
if ((shared.opts.save and not p.do_not_save_samples and shared.opts.save_images_before_refiner) or shared.cmd_opts.medvram or shared.opts.diffusers_model_cpu_offload) and hasattr(shared.sd_model, 'vae'):
|
||||
if shared.opts.save and not p.do_not_save_samples and shared.opts.save_images_before_refiner and hasattr(shared.sd_model, 'vae'):
|
||||
from modules.processing import create_infotext
|
||||
info=create_infotext(p, p.all_prompts, p.all_seeds, p.all_subseeds, [], iteration=p.iteration, position_in_batch=i)
|
||||
decoded = vae_decode(output.images, shared.sd_model, output_type='pil')
|
||||
for i in range(len(decoded)):
|
||||
images.save_image(decoded[i], path=p.outpath_samples, basename="", seed=seeds[i], prompt=prompts[i], extension=shared.opts.samples_format, info=info, p=p, suffix="-before-refiner")
|
||||
|
||||
if shared.opts.diffusers_move_base and not shared.sd_model.has_accelerate:
|
||||
if (shared.opts.diffusers_move_base or shared.cmd_opts.medvram or shared.opts.diffusers_model_cpu_offload) and not (shared.cmd_opts.lowvram or shared.opts.diffusers_seq_cpu_offload):
|
||||
shared.log.debug('Diffusers: Moving base model to CPU')
|
||||
shared.sd_model.to(devices.cpu)
|
||||
devices.torch_gc()
|
||||
@@ -210,13 +211,13 @@ def process_diffusers(p: StableDiffusionProcessing, seeds, prompts, negative_pro
|
||||
if shared.opts.diffusers_move_refiner and not shared.sd_refiner.has_accelerate:
|
||||
shared.log.debug('Diffusers: Moving refiner model to CPU')
|
||||
shared.sd_refiner.to(devices.cpu)
|
||||
devices.torch_gc()
|
||||
else:
|
||||
results = output.images
|
||||
|
||||
if p.is_hr_pass:
|
||||
shared.log.warning('Diffusers not implemented: hires fix')
|
||||
|
||||
if lora_state['active']:
|
||||
unload_diffusers_lora()
|
||||
|
||||
|
||||
return results
|
||||
|
||||
+13
-2
@@ -548,8 +548,13 @@ def load_diffuser(checkpoint_info=None, already_loaded_state_dict=None, timer=No
|
||||
"load_connected_pipeline": True # always load end-to-end / connected pipelines
|
||||
# "use_safetensors": True, # TODO(PVP) - we can't enable this for all checkpoints just yet
|
||||
}
|
||||
if devices.dtype == torch.float16:
|
||||
diffusers_load_config['variant'] = 'fp16'
|
||||
if shared.opts.diffusers_model_load_variant == 'default':
|
||||
if devices.dtype == torch.float16:
|
||||
diffusers_load_config['variant'] = 'fp16'
|
||||
elif shared.opts.diffusers_model_load_variant == 'fp32':
|
||||
pass
|
||||
else:
|
||||
diffusers_load_config['variant'] = shared.opts.diffusers_model_load_variant
|
||||
|
||||
if shared.opts.data.get('sd_model_checkpoint', '') == 'model.ckpt' or shared.opts.data.get('sd_model_checkpoint', '') == '':
|
||||
shared.opts.data['sd_model_checkpoint'] = "runwayml/stable-diffusion-v1-5"
|
||||
@@ -650,6 +655,12 @@ def load_diffuser(checkpoint_info=None, already_loaded_state_dict=None, timer=No
|
||||
elif "Kandinsky" in sd_model.__class__.__name__:
|
||||
sd_model.scheduler.name = 'DDIM'
|
||||
|
||||
if (shared.opts.diffusers_model_cpu_offload or shared.cmd_opts.medvram) and (shared.opts.diffusers_seq_cpu_offload or shared.cmd_opts.lowvram):
|
||||
shared.log.warning(f'Diffusers {op}: Model CPU offload (--medvram) and Sequential CPU offload (--lowvram) are not compatible')
|
||||
shared.log.debug(f'Diffusers {op}: disable model CPU offload and --medvram')
|
||||
shared.opts.diffusers_model_cpu_offload=False
|
||||
shared.cmd_opts.medvram=False
|
||||
|
||||
if hasattr(sd_model, "watermark"):
|
||||
sd_model.watermark = NoWatermark()
|
||||
sd_model.has_accelerate = False
|
||||
|
||||
+7
-2
@@ -181,8 +181,13 @@ def load_vae_diffusers(_model, vae_file=None, vae_source="from unknown source"):
|
||||
"torch_dtype": devices.dtype_vae,
|
||||
"use_safetensors": True,
|
||||
}
|
||||
if devices.dtype_vae == torch.float16:
|
||||
diffusers_load_config['variant'] = 'fp16'
|
||||
if shared.opts.diffusers_vae_load_variant == 'default':
|
||||
if devices.dtype_vae == torch.float16:
|
||||
diffusers_load_config['variant'] = 'fp16'
|
||||
elif shared.opts.diffusers_vae_load_variant == 'fp32':
|
||||
pass
|
||||
else:
|
||||
diffusers_load_config['variant'] = shared.opts.diffusers_vae_load_variant
|
||||
|
||||
if shared.opts.diffusers_vae_upcast != 'default':
|
||||
diffusers_load_config['force_upcast'] = True if shared.opts.diffusers_vae_upcast == 'true' else False
|
||||
|
||||
+6
-3
@@ -12,7 +12,7 @@ import requests
|
||||
import fasteners
|
||||
from modules import errors, ui_components, shared_items, cmd_args
|
||||
from modules.paths_internal import models_path, script_path, data_path, sd_configs_path, sd_default_config, sd_model_file, default_sd_model_file, extensions_dir, extensions_builtin_dir # pylint: disable=W0611
|
||||
from modules.dml import directml_do_hijack
|
||||
from modules.dml import memory_providers, default_memory_provider, directml_do_hijack
|
||||
import modules.interrogate
|
||||
import modules.memmon
|
||||
import modules.styles
|
||||
@@ -384,12 +384,13 @@ options_templates.update(options_section(('cuda', "Compute Settings"), {
|
||||
"cudnn_benchmark": OptionInfo(False, "Enable full-depth cuDNN benchmark feature"),
|
||||
"cuda_allow_tf32": OptionInfo(True, "Allow TF32 math ops"),
|
||||
"cuda_allow_tf16_reduced": OptionInfo(True, "Allow TF16 reduced precision math ops"),
|
||||
"cuda_compile": OptionInfo(False, "Enable model compile (experimental)"),
|
||||
"cuda_compile_mode": OptionInfo("none", "Model compile mode (experimental)", gr.Radio, lambda: {"choices": ['none', 'inductor', 'reduce-overhead', 'cudagraphs', 'aot_ts_nvfuser', 'hidet', 'ipex']}),
|
||||
"cuda_compile": OptionInfo(True if devices.backend == "ipex" else False, "Enable model compile (experimental)"),
|
||||
"cuda_compile_mode": OptionInfo("ipex" if devices.backend == "ipex" else "none", "Model compile mode (experimental)", gr.Radio, lambda: {"choices": ['none', 'inductor', 'reduce-overhead', 'cudagraphs', 'aot_ts_nvfuser', 'hidet', 'ipex']}),
|
||||
"cuda_compile_fullgraph": OptionInfo(False, "Model compile fullgraph"),
|
||||
"cuda_compile_verbose": OptionInfo(False, "Model compile verbose mode"),
|
||||
"cuda_compile_errors": OptionInfo(True, "Model compile suppress errors"),
|
||||
"disable_gc": OptionInfo(True, "Disable Torch memory garbage collection"),
|
||||
"directml_memory_provider": OptionInfo(default_memory_provider, '[DirectML] Memory stats provider', gr.Dropdown, lambda: {"choices": memory_providers}),
|
||||
}))
|
||||
|
||||
options_templates.update(options_section(('diffusers', "Diffusers Settings"), {
|
||||
@@ -407,6 +408,8 @@ options_templates.update(options_section(('diffusers', "Diffusers Settings"), {
|
||||
"diffusers_vae_slicing": OptionInfo(True, "Enable VAE slicing"),
|
||||
"diffusers_vae_tiling": OptionInfo(False, "Enable VAE tiling"),
|
||||
"diffusers_attention_slicing": OptionInfo(False, "Enable attention slicing"),
|
||||
"diffusers_model_load_variant": OptionInfo("default", "Diffusers model loading variant", gr.Radio, lambda: {"choices": ['default', 'fp32', 'fp16']}),
|
||||
"diffusers_vae_load_variant": OptionInfo("default", "Diffusers VAE loading variant", gr.Radio, lambda: {"choices": ['default', 'fp32', 'fp16']}),
|
||||
# "diffusers_force_zeros": OptionInfo(False, "Force zeros for prompts when empty"),
|
||||
# "diffusers_aesthetics_score": OptionInfo(6.0, "Require aesthetic score", gr.Slider, {"minimum": 0, "maximum": 10, "step": 0.1}),
|
||||
}))
|
||||
|
||||
+12
-8
@@ -32,6 +32,7 @@ import modules.sd_samplers
|
||||
modules.errors.install()
|
||||
mimetypes.init()
|
||||
mimetypes.add_type('application/javascript', '.js')
|
||||
log = modules.shared.log
|
||||
|
||||
if not cmd_opts.share and not cmd_opts.listen:
|
||||
# fix gradio phoning home
|
||||
@@ -126,7 +127,7 @@ def process_interrogate(interrogation_function, mode, ii_input_files, ii_input_d
|
||||
images = [f.name for f in ii_input_files]
|
||||
else:
|
||||
if not os.path.isdir(ii_input_dir):
|
||||
modules.shared.log.error(f"Input directory not found: {ii_input_dir}")
|
||||
log.error(f"Input directory not found: {ii_input_dir}")
|
||||
return
|
||||
images = modules.shared.listfiles(ii_input_dir)
|
||||
if ii_output_dir != "":
|
||||
@@ -195,7 +196,7 @@ def connect_reuse_seed(seed: gr.Number, reuse_seed: gr.Button, generation_info:
|
||||
res = all_seeds[index if 0 <= index < len(all_seeds) else 0]
|
||||
except json.decoder.JSONDecodeError:
|
||||
if gen_info_string != '':
|
||||
modules.shared.log.error(f"Error parsing JSON generation info: {gen_info_string}")
|
||||
log.error(f"Error parsing JSON generation info: {gen_info_string}")
|
||||
return [res, gr_show(False)]
|
||||
|
||||
reuse_seed.click(fn=copy_seed, _js="(x, y) => [x, selected_gallery_index()]", show_progress=False, inputs=[generation_info, dummy_component], outputs=[seed, dummy_component])
|
||||
@@ -503,6 +504,7 @@ def create_ui(startup_timer = None):
|
||||
negative_token_button.click(fn=wrap_queued_call(update_token_counter), inputs=[txt2img_negative_prompt, steps], outputs=[negative_token_counter])
|
||||
|
||||
ui_extra_networks.setup_ui(extra_networks_ui, txt2img_gallery)
|
||||
log.debug(f'UI interface: tab=txt2img batch={show_batch.value} seed={show_seed.value} advanced={show_advanced.value} second_pass={show_second_pass.value}')
|
||||
|
||||
startup_timer.record("ui-txt2img")
|
||||
|
||||
@@ -854,6 +856,8 @@ def create_ui(startup_timer = None):
|
||||
paste_button=img2img_paste, tabname="img2img", source_text_component=img2img_prompt, source_image_component=None,
|
||||
))
|
||||
|
||||
log.debug(f'UI interface: tab=img2img seed={show_seed.value} resize={show_resize.value} batch={show_batch.value} denoise={show_denoise.value} advanced={show_advanced.value}')
|
||||
|
||||
startup_timer.record("ui-img2img")
|
||||
|
||||
modules.scripts.scripts_current = None
|
||||
@@ -910,7 +914,7 @@ def create_ui(startup_timer = None):
|
||||
try:
|
||||
res = comp(label=info.label, value=fun(), elem_id=elem_id, **(args or {}))
|
||||
except Exception as e:
|
||||
modules.shared.log.error(f'Error creating setting: {key} {e}')
|
||||
log.error(f'Error creating setting: {key} {e}')
|
||||
res = None
|
||||
|
||||
if res is not None and not is_quicksettings:
|
||||
@@ -955,9 +959,9 @@ def create_ui(startup_timer = None):
|
||||
directml_override_opts()
|
||||
try:
|
||||
opts.save(modules.shared.config_filename)
|
||||
modules.shared.log.info(f'Settings changed: {len(changed)} {changed}')
|
||||
log.info(f'Settings changed: {len(changed)} {changed}')
|
||||
except RuntimeError:
|
||||
modules.shared.log.error(f'Settings change failed: {len(changed)} {changed}')
|
||||
log.error(f'Settings change failed: {len(changed)} {changed}')
|
||||
return opts.dumpjson(), f'{len(changed)} Settings changed without save: {", ".join(changed)}'
|
||||
return opts.dumpjson(), f'{len(changed)} Settings changed{": " if len(changed) > 0 else ""}{", ".join(changed)}'
|
||||
|
||||
@@ -969,7 +973,7 @@ def create_ui(startup_timer = None):
|
||||
if cmd_opts.use_directml:
|
||||
directml_override_opts()
|
||||
opts.save(modules.shared.config_filename)
|
||||
modules.shared.log.debug(f'Setting changed: key={key}, value={value}')
|
||||
log.debug(f'Setting changed: key={key}, value={value}')
|
||||
return get_value_for_setting(key), opts.dumpjson()
|
||||
|
||||
with gr.Blocks(analytics_enabled=False) as settings_interface:
|
||||
@@ -1179,7 +1183,7 @@ def html_head():
|
||||
head += f'<script type="module" src="{webpath(script.path)}"></script>\n'
|
||||
added.append(script.path)
|
||||
added = [a.replace(script_path, '').replace('\\', '/') for a in added]
|
||||
# modules.shared.log.debug(f'Adding JS scripts: {added}')
|
||||
# log.debug(f'Adding JS scripts: {added}')
|
||||
return head
|
||||
|
||||
|
||||
@@ -1209,7 +1213,7 @@ def html_css():
|
||||
if os.path.exists(os.path.join(data_path, "user.css")):
|
||||
head += stylesheet(os.path.join(data_path, "user.css"))
|
||||
added = [a.replace(script_path, '').replace('\\', '/') for a in added]
|
||||
# modules.shared.log.debug(f'Adding CSS stylesheets: {added}')
|
||||
# log.debug(f'Adding CSS stylesheets: {added}')
|
||||
return head
|
||||
|
||||
|
||||
|
||||
+12
-2
@@ -141,12 +141,22 @@ def create_ui():
|
||||
model_checkhash_btn = gr.Button(value="Calculate hash for all models (may take a long time)", variant='primary')
|
||||
model_checkhash_btn.click(fn=sd_models.update_model_hashes, inputs=[], outputs=[models_outcome])
|
||||
with gr.Row():
|
||||
model_table = gr.DataFrame(model_data, label = 'Model data', show_label = True, interactive = False, wrap = True, overflow_row_behaviour = 'paginate', max_rows = 10, headers = model_headers)
|
||||
model_table = gr.DataFrame(
|
||||
value = model_data,
|
||||
headers = model_headers,
|
||||
label = 'Model data',
|
||||
show_label = True,
|
||||
interactive = False,
|
||||
wrap = True,
|
||||
overflow_row_behaviour = 'paginate',
|
||||
max_rows = 50,
|
||||
)
|
||||
|
||||
def list_models():
|
||||
total_size = 0
|
||||
model_data.clear()
|
||||
txt = ''
|
||||
for m in sd_models.checkpoints_list.values():
|
||||
txt = ''
|
||||
try:
|
||||
stat = os.stat(m.filename)
|
||||
m_name = m.name.replace('.ckpt', '').replace('.safetensors', '')
|
||||
|
||||
+1
-1
@@ -49,7 +49,7 @@ requests==2.31.0
|
||||
tqdm==4.65.0
|
||||
accelerate==0.20.3
|
||||
opencv-python==4.7.0.72
|
||||
diffusers==0.19.0
|
||||
diffusers==0.19.3
|
||||
einops==0.4.1
|
||||
gradio==3.32.0
|
||||
numexpr==2.8.4
|
||||
|
||||
+1
-1
Submodule wiki updated: fd99f38e1b...f76cc3a9ac
Reference in New Issue
Block a user