(안내 2024.02.18)

이 프로젝트는 개발이 중단되었습니다.

조금 더 불안정하지만 훨씬 메모리를 덜 사용하면서도 빠른 속도를 가진 ZLUDA로 넘어가시는 것을 권장합니다. https://arca.live/b/aiart/99039181

ZLUDA는 SD.Next, stable-diffusion-webui, ComfyUI (테스트해보지 않음)에서 모두 사용할 수 있습니다.

DirectML 또는 ONNX, Olive를 원하시는 분들께서는 더 많은 기능과 선택지를 가진 SD.Next로 넘어가시기 바랍니다.


txt2img 작동 확인

img2img 작동 확인

(여러 번의 시도와 실패의 흔적들)


(안내 2024.02.18)

이 프로젝트는 개발이 중단되었습니다.

조금 더 불안정하지만 훨씬 메모리를 덜 사용하면서도 빠른 속도를 가진 ZLUDA로 넘어가시는 것을 권장합니다. https://arca.live/b/aiart/99039181

ZLUDA는 SD.Next, stable-diffusion-webui, ComfyUI (테스트해보지 않음)에서 모두 사용할 수 있습니다.

DirectML 또는 ONNX, Olive를 원하시는 분들께서는 더 많은 기능과 선택지를 가진 SD.Next로 넘어가시기 바랍니다.


※ webui-directml 프로젝트와 글은 계속 업데이트됩니다. 제목 맨 앞에 프로젝트 마지막 업데이트 날짜를 기록하겠습니다.

(webui-directml 업데이트 방법은 아래 참고 / 단순히 webui 원본 레포의 변경 사항들을 가져오기만 한 경우 따로 패치노트에는 기록하지 않음)


[다른 프로젝트]

ComfyUI with DirectML (End of Life)

ZLUDA: CUDA on AMD GPUs


(내용 추가) webui-directml은 AMD 그래픽카드에서 Stable diffusion을 돌리는 여러가지 방법 중 하나입니다. (webui-directml은 다른 그래픽카드에서도 돌아가지만 이 글을 보고 계신다면 보통 AMD 그래픽카드 사용자분들이시겠죠)

다른 방법들도 한번씩 알아보시기 바랍니다.

1. OnnxDiffusersUI (윈도우. WebUI 하위 호환 느낌)

2. 리눅스 + ROCm (리눅스. 윈도우 쓰려면 듀얼부팅 환경 필요)

난이도: 리눅스+ROCm >> OnnxDiffusersUI >= webui-directml

기능: 리눅스+ROCm = webui-directml >> OnnxDiffusersUI

속도: 리눅스+ROCm > webui-directml > OnnxDiffusersUI

webui-directml은 리눅스+ROCm의 높은 난이도와 리눅스 운영체제를 써야한다는 단점을 보완하고, OnnxDiffusersUI의 낮은 기능성과 느린 속도를 보완합니다.


DirectML은 DirectX12를 지원하는 모든 그래픽카드에서 PyTorch, TensorFlow 등을 돌릴 수 있게 해주는 라이브러리입니다.

DirectML을 사용하면 AMD Radeon, Intel ARC 그래픽카드에서도 PyTorch를 사용해 Stable Diffusion을 돌릴 수 있게 됩니다.

(Intel ARC 그래픽카드는 제가 갖고 있는게 없어서 테스트해보지 못했습니다. 이론 상 가능)


(내용 추가 2023.10.28)

WebUI 포크인 SD.Next에서 DirectML과 Olive (실험적)를 지원하고 있습니다. #

이쪽을 사용하시는 것을 더 권장합니다.


(내용 추가 2023.06.04)

Microsoft의 Olive 최적화 기술이 적용되었습니다.


Olive로 모델 최적화하기

실행 인자에 --olive를 추가하면 WebUI에 Olive 탭이 생기고 Olive 탭에서 할 수 있는 것은 아래와 같습니다.

- Huggingface에서 모델 다운로드하고 Olive로 최적화

- 로컬의 ONNX 모델(pretrained)을 Olive로 최적화

- 로컬의 .ckpt 또는 .safetensors를 ONNX 모델로 변환하고 Olive로 최적화 (샘플러가 지맘대로 선택되기 때문에 퀄리티는 보장할 수 없음)

모델 최적화 시 생성 가능한 이미지 크기를 정해야 합니다.

Sample Height와 Sample Width로 이미지 크기를 정할 수 있고 Sample Height/Width Dimension은 각각 8로 나눈 값을 넣어주면 됩니다.

최적화 시 경고 메시지는 무시하면 됩니다.

만약 safety_checker가 없다고 오류가 난다면 아래 체크박스에서 Safety Checker의 체크를 풀어주면 됩니다.

최적화 후에는 상단의 모델 리프레시 버튼을 눌러주면 최적화된 모델이 드롭다운 메뉴에 표시됩니다.


최적화된 모델 사용하기

상단의 체크포인트 드롭다운 메뉴에서는 Olive로 최적화한 모델들만 선택할 수 있습니다.

txt2img 탭에서는 선택한 모델을 사용해 이미지를 생성할 수 있습니다. 유효한 옵션은 Width, Height, Sampling steps, Prompt, Negative prompt입니다. (그 외 모든 옵션은 생성에 반영되지 않음)

실행 인자에 --olive가 있으면 img2img, hires fix, LoRA, embedding 등 각종 기능들은 사용할 수 없습니다.

최적화 시 정한 이미지 크기를 입력하고 Generate 버튼을 누르면 이미지 생성이 시작됩니다. 경고 메시지는 무시하면 됩니다.


성능

사용 그래픽카드: RX 5700 XT

512x512

기존 1.5it/s => 2.03it/s

512x768

기존 1.0it/s => 1.25it/s ~ 1.3it/s


(내용 추가 2023.01.23)

최근 구현되어있지 않았던 GroupNorm 등이 업데이트되면서 추가되어 처리 속도는 이전보다 더욱 빨라졌습니다.

하지만 (--no-half를 뺄 경우) float16 연산에 문제가 있는 것으로 보여 임시 방편으로 float32로 우회해 처리하도록 했습니다.

RX 5700 XT 정도 수준까지는 --no-half 옵션이 처리 속도에는 거의 영향을 주지 않는 것으로 보이고, 더 상위 모델에서는 --no-half 옵션을 빼면 아주 조금의 처리 속도 개선이 있는 것 같습니다.

AUTOMATIC1111/stable-diffusion-webui에 DirectML이 도입될지는 미지수입니다.

stable-diffusion-webui는 PyTorch 1.8 호환성을 유지하고 싶어하는 것 같고 torch-directml은 PyTorch 1.13.1을 요구합니다.

따라서 당분간은 도입되지 않을 가능성이 높고 그 전까지 이 프로젝트는 유지할 계획입니다.


(내용 추가 2023.03.16)

PyTorch 2.0의 Stable 릴리즈가 나왔습니다.

DirectML에도 적용하면 속도, 메모리 측면에서 눈에 띄는 개선을 보일 것 같지만 아직 DirectML이 PyTorch 2.0을 지원하지 않아서 추후 업데이트를 기다려봐야 합니다.

그리고 무엇보다 ROCm 공식 페이지에 윈도우 릴리즈 탭이 생겼고 Coming Soon!이라는 내용이 추가된 것으로 보아 조만간 ROCm이 윈도우 환경도 지원하게 될 것으로 보입니다.

내용 추가 2023.04.30

DirectML이 PyTorch 2.0을 지원하기 시작했으나 성능적인 측면에서 개선은 없었습니다.


(내용 추가) 추가된 실행 옵션

--onnx

LDM 대신 diffusers의 OnnxStableDiffusionPipeline을 사용합니다.

이론상 LDM보다 성능이 좋으나 각종 최적화가 적용되지 않아 더 느립니다.

--olive

diffusers의 OnnxStableDiffusionPipeline을 사용하지만 Olive로 최적화한 모델을 사용합니다. 자세한 사항은 위의 별도 설명 참고.

--backend {cuda, rocm, directml, auto}

CUDA, ROCm, DirectML 중 어느 것을 사용할 지 선택합니다. auto로 놓거나 지정하지 않으면 자동으로 정합니다.

(CUDA를 찾지 못하면 ROCm, ROCm을 찾지 못하면 DirectML 사용)


(내용 추가) 패치 노트

2023.01.17

1. --medvram 또는 --lowvram 없이 실행했을 때 발생하는 RuntimeError를 고쳤습니다.

2. 불필요한 연산을 줄여 성능을 소폭 개선했습니다.

3. 파워쉘 스크립트 중 webui-directml-update.ps1의 인코딩을 바꿨습니다. (한글 깨짐 해결)


2023.01.18-1

1. DDIM Sampler 사용 시 멈춤 현상을 해결했습니다.

(해결을 하긴 했는데 왜 해결된지 모르겠습니다. 별로 수정한 것도 없는데 돌아감. 만약 멈추거나 오류가 난다면 댓글로 알려주세요)

2. DPM++ SDE Karras Sampler 사용 시 발생하는 RuntimeError를 고쳤습니다.


2023.01.18-2

1. DPM fast/adaptive Sampler 사용 시 발생하는 오류를 고쳤습니다.

2. PLMS Sampler 사용 시 멈춤 현상을 해결했습니다.

(DDIM과 동일하게 멈추거나 오류가 난다면 댓글로 알려주세요)


2023.01.19

GroupNorm의 메모리 과점유 문제를 일부 해결했습니다.

(다회차 테스트 시 메모리 오류 빈도 감소)


2023.01.20

FP16 지원을 추가했습니다. --no-half 옵션은 이제 선택적입니다.

(대신 --no-half 옵션을 뺄 때는 --medvram 등 최적화 옵션을 추가해야 합니다(RX 5700 XT 기준))

다만, DirectML에서 FP16을 완전히 지원하는 것이 아니고 미구현된 부분만 제가 오류만 나지 않도록 처리한 것이므로 FP16의 제 성능이 나오지는 않습니다.

D3DDeviceCapabilities.zip (압축 해제 후 D3DDeviceCapabilities.exe를 Powershell/명령 프롬프트에서 실행) 에서

IsNativeFloat16Supported 값이 1인 경우에만 정상 작동을 보장합니다.

(제 그래픽카드의 vram이 부족해서 --medvram을 뺐을 때는 테스트를 제대로 하지 못했습니다. --medvram 없이 오류가 발생한다면 제보해주시면 감사하겠습니다)


2023.01.21-1

1. 구현체 위치를 devices.py로 옮겼습니다.

2. AUTOMATIC1111/stable-diffusion-webui의 변경 사항들을 일부 반영했습니다. (2985b317d719f0f0580d2ff93f3008ccabb9c251)

3. torch-directml 0.1.13.1.dev230119가 배포되었습니다. native_group_norm 구현 등 Stable Diffusion에도 영향을 주는 변경 사항들이 있습니다. 이에 맞춰 불필요한 오버로딩을 제거했습니다.

그러나 float16 연산에 오류가 있는건지 결과물에 문제가 있어 관련 오버로딩들을 제거했습니다. 다시 --no-half 없이는 오류가 발생합니다.

4. webui-directml-run.ps1에서 torch-directml 패키지를 업데이트하도록 변경했습니다.


2023.01.21-2

float16 연산에 오류가 발생하는 일부 클래스들에 대해 float32로 우회하는 오버로딩을 추가했습니다. 이제 --no-half는 선택 사항입니다.

 (연산 중 소숫점 아래 4자리 수보다 더 밑으로 오차가 발생하면 나오는 화사한?결과물)


2023.01.22

1. R-ESRGAN 업스케일러가 cpu 대신 그래픽카드를 사용하도록 했습니다.

(제 그래픽카드 vram이 부족해 업스케일이 되는지는 테스트해보지 못했습니다. --lowvram을 넣어도 메모리 오류..)

2. AUTOMATIC1111/stable-diffusion-webui의 변경 사항들을 일부 반영했습니다. (e0b6092bc99efe311261a51289dec67cbf4845bc)


2023.01.24

1. 실험적으로 메모리 최적화를 개선했습니다. 새로운 실행 인자 --vram이 추가되었습니다. DirectML은 개발자에게 그래픽카드 메모리에 대한 정보를 별로 알려주지 않기 때문에 사용 중인 그래픽카드의 메모리 용량을 직접 입력해야 합니다. (--vram 옵션이 없다면 기존 최적화 공식을 따라 최적화합니다)

예) python launch.py --precision full --vram 8 # 8GB vram이 탑재된 그래픽카드

※ 주의! 앞서 언급했듯이 DirectML은 개발자에게 그래픽카드 메모리에 대한 정보를 별로 알려주지 않아 최적화 시 현재 PyTorch가 사용할 수 있는 메모리 용량을 추정합니다. 따라서 경우에 따라 --vram 옵션을 빼는 것이 더 나을 수도 있습니다. 메모리 용량을 잘 추정한다면 메모리 부족 RuntimeError 발생 빈도가 줄어들 것입니다.

2. R-ESRGAN 4x+ Anime6B 업스케일러 사용 시 출력물의 4, 7, 10번 타일이 검게 변하는 문제를 해결했습니다.


2023.01.25

1. --vram 실행 옵션을 제거했습니다. 더 이상 직접 그래픽카드 메모리 용량을 입력해주지 않아도 되고 기본적으로 실험적인 메모리 최적화가 적용됩니다.

2. --disable-experimental-memopt 실행 옵션이 추가되었습니다. 그래픽카드 메모리 사용량이 제대로 올라가지 않거나 오류가 발생하는 등 이상 현상이 나타나거나 기본 메모리 최적화 공식을 사용하고 싶다면 추가해주세요.


2023.01.26

1. 남은 가용 메모리 용량을 좀 더 정확하게 추정합니다. 하지만 여전히 PyTorch에게 주어진 가용 메모리 중 여유 공간 크기를 정확히 알아내지 못합니다.

2. AUTOMATIC1111/stable-diffusion-webui의 가장 최신 커밋까지 반영했습니다.

(6cff4401824299a983c8e13424018efc347b4a2b)

--upcast-sampling 옵션이 추가되었으나 별 차이는 없어 보입니다.


2023.01.27

총 vram 크기를 구할 수 없으면 실험적인 메모리 최적화를 끕니다. (관련 이슈)


2023.01.30

특정 상황에서 발생하던 ZeroDivisionError를 고쳤습니다.


2023.01.31

AUTOMATIC1111/stable-diffusion-webui의 변경 사항들을 반영하던 중 발생한 아래 오류를 고쳤습니다.

RuntimeError: Device type PRIVATEUSEONE is not supported for torch.Generator() api.


2023.02.09

--no-half 옵션 없이 임베딩 적용 시 발생하는 오류를 고쳤습니다. (관련 이슈)


2023.02.18

실시간 미리보기 기본 값을 Approx NN에서 Approx cheap로 변경했습니다.


2023.02.20

--no-half 없이 인페인팅 전용 모델을 사용해 i2i 시 발생하는 RuntimeError를 고쳤습니다.

하지만 NansException이 자주 발생할 수 있고 불필요하고 비효율적이게 텐서 list를 순회하므로 --no-half --precision full을 사용하는 것을 권장합니다.


2023.04.13

몇가지 자잘한 수정 사항이 있었습니다. 이제 RX 5xx 아래 그래픽카드와 내장 그래픽카드에도 실험적 메모리 최적화가 적용됩니다.


2023.04.17

1. ScuNET 업스케일러 사용 시 발생하는 RuntimeError를 고쳤습니다.

2. SwinIR 업스케일러 사용 시 일부 타일이 검게 나오는 문제를 고쳤습니다.


2023.05.29

1. --opt-sub-quad-attention을 넣으면 이미지 상단부만 정상이고 나머지 부분에 회색 필터가 끼는 문제를 해결했습니다.

2. RESRGAN 업스케일러 사용 시 속도가 매우 매우 조금 빨라졌습니다.


2023.06.04

이제 Microsoft의 Olive Stable diffusion 모델 최적화 기능을 사용할 수 있습니다.

별도 설명 참고.


2023.07.17

1. --onnx를 추가했습니다. 실사용 용도는 아님.

2. 이제 ONNX와 Olive에서 모델을 변경하면 이전 모델이 차지하던 메모리를 반환합니다.


(내용 추가) 현재까지 발견된 문제

1. 실시간 미리보기로 Approx NN 사용 시 미리보기가 이상하게 나옴. (결과물은 이상 없음)

2. xformers 사용 시 오류 발생. (빌드 시 cuda toolkit을 요구해서 사용 불가능한 것으로 확인)

3. --opt-sub-quad-attention 사용 시 또는 --no-half 미사용 시 간헐적으로 modules.devices.NansException 오류 발생.

(계속 돌리다보면 없어집니다 왜 그런진 모름..)


(내용 추가) 벤치마크 



테스트 환경

Sapphire RX 5700 XT 8GB Nitro+ SE

txt2img

Sampling steps 20

Width 512

Height 768

Batch count 1

Batch size 1

CFG Scale 12

Sampling method Euler


2023.01.20-1 이전

--no-half
38초 1.92s/it
--no-half --medvram
40초 약 2s/it
--no-half --precision full
38초 1.92s/it
--no-half --precision full --medvram
41초 2.08s/it
--no-half --precision full --opt-split-attention
메모리 부족 오류
--no-half --precision full --opt-split-attention --medvram
메모리 부족 오류
--no-half --precision full --opt-split-attention --lowvram
메모리 부족 오류
--no-half --precision full --opt-sub-quad-attention
32초 1.63s/it
--no-half --precision full --medvram --always-batch-cond-uncond
40초 2.03s/it
--no-half --precision full --opt-sub-quad-attention --medvram --always-batch-cond-uncond
35초 1.75s/it


2023.01.20-1

--precision full --opt-sub-quad-attention --medvram
32초 1.61s/it
--no-half --precision full --opt-sub-quad-attention --medvram
31초 1.59s/it


2023.01.22

--precision full --opt-sub-quad-attention --medvram
24초 1.24s/it
--no-half --precision full --opt-sub-quad-attention --medvram26초 1.31s/it
--precision full --opt-sub-quad-attention
메모리 부족 오류
--no-half --precision full --opt-sub-quad-attention
23초 1.18s/it
--no-half --precision full
메모리 부족 오류
--no-half --precision full --opt-sub-quad-attention --always-batch-cond-uncond
23초 1.15s/it
--precision full --opt-sub-quad-attention --always-batch-cond-uncond
메모리 부족 오류


(내용 추가) 생성 팁

일반 업스케일러를 사용하면 메모리 제약이 심하지만 Ultimate Upscale 확장과 4xUltraSharp를 사용하면 매우 큰 이미지도 생성할 수 있었습니다.

RX 5700 XT 8GB 모델에서 512x512 -> 2048x2048 업스케일.

--no-half --precision full --opt-sub-quad-attention

512x512 이미지 생성 12초 1.64it/s.

2048x2048로 16타일 업스케일 2분 1.4it/s.


(내용 추가) 설치 방법이 어렵다고 느끼실 것 같아 파워쉘 스크립트로 만들어 봤습니다.
다운로드


파워쉘 스크립트로 간단 설치 & 실행하기
다운로드

Git과 Miniconda3를 설치해줍니다.
Git으로 commit, push를 할 것이 아니므로 Git 설치 시 전부 기본 설정으로 두고 Next를 누르셔도 됩니다.


Miniconda3 설치 시 경로를 지정하라고 하는데 이 때 경로를 복사해 둡니다.
설치 경로를 바꾸실 경우 바꾼 경로를 복사하셔야 합니다.

여기서 스크린샷처럼 설정해주시는게 좋습니다.
(바꾸면 어떻게 되는지 안해봐서 모름. 꼬일 수도 있어서 그대로 두는 걸 추천)

webui-directml-setup.ps1 파일을 우클릭하고 "PowerShell에서 실행" 해줍니다.
(스크린샷은 윈도우11이지만 윈도우10도 있음)

진행 중 Miniconda3 설치 경로를 입력하라고 하는데 아까 복사한 설치 경로를 붙여넣기하고 엔터 키를 눌러 계속 진행합니다.

(기본 경로로 두고 설치했다면 그냥 바로 엔터 키를 누르셔도 됩니다)

아래 스크린샷들처럼 진행이 된다면 문제 없는 겁니다.

(중간에 빨간 글씨가 섞여있으면 뭔가 잘못된 것)


webui-directml-run.ps1 파일을 우클릭하고 "PowerShell에서 실행" 해주면 끝입니다.
초기 실행 시 패키지들을 설치하느라 시간이 좀 걸릴 수 있습니다. (3~5분 내외)
--medvram 같은 옵션을 주고 실행하고 싶으시면 webui-directml-run.ps1 파일을 메모장 같은 걸로 열어서 수정해주시면 됩니다.


webui-directml-update.ps1 파일은 GitHub에서 변경 사항을 받아옵니다.

직접 설치 & 실행하기


컴맹분들에게는 좀 어려울 수도 있습니다.
파워쉘이나 cmd에서 cd 명령어로 경로 이동을 할 줄 안다면 할만할  것 같습니다.


이미 이전에 Stable Diffusion을 시도해보신 분이라면 설치되어 있겠지만 Git이 컴퓨터에 설치되어 있어야합니다.
Git 설치 파일 다운로드

1. Miniconda를 설치합니다. Miniconda Windows x64 다운로드

Miniconda 설치 시 설치되는 파이썬은 기존 파이썬과는 별개입니다.


설치 시 이 두 가지 옵션을 체크해주셔야 합니다.


2. 시작 메뉴에서 Anaconda Powershell Prompt를 실행합니다.




윈도우 11 기준 방금 설치했으면 윈도우 키 누르면 바로 있음.
우클릭 > 파일 위치 열기 > 파일 탐색기 열리는데 선택된 바로가기 파일 복사해서 바탕화면에 붙여넣기 추천


3. 아래 명령어를 입력해 Python Environment를 만듭니다.


conda create --name pydml -y


pydml 부분은 다른 이름으로 바꾸어도 상관 없습니다.

(나중에 activate 할 때 pydml 대신 그 이름을 써야함)


4. 만든 Environment를 activate하고 아래 명령어를 차례대로 입력해 필요한 패키지들을 설치합니다.


conda activate pydml

conda install numpy pandas tensorboard matplotlib tqdm pyyaml -y

pip install opencv-python

pip install wget

pip install torchvision

conda install pytorch cpuonly -c pytorch

pip install torch-directml


5. cd 명령어로 원하는 위치로 이동한 후 깃허브에서 hgrsikghrd/stable-diffusion-webui-directml 레포지토리를 clone하고 레포지토리 안으로 이동합니다.

아래 명령어를 입력합니다.


git clone https://github.com/hgrsikghrd/stable-diffusion-webui-directml.git

cd stable-diffusion-webui-directml


6. Git의 submodule 기능을 사용하고 있기 때문에 아래 명령어를 입력해 submodule을 초기화해줍니다.


git submodule init

git submodule update


7. 아래 명령어를 입력해 webui를 실행해줍니다.


python launch.py --no-half (필요한 옵션이 있다면 추가)


8. 별 문제 없이 잘 따라했다면 끝.


처음 설정 후 다시 실행하기


1. 시작 메뉴에서 Anaconda Powershell Prompt를 실행합니다.

(찾기 힘들다면 윈도우 작업 표시줄의 검색 기능 활용)


2. cd 명령어로 레포지토리 폴더까지 이동한 후 아래 명령어를 입력합니다.


conda activate pydml

python launch.py --no-half (필요한 옵션이 있다면 추가)


레포지토리에서 변경 사항 가져오기


레포지토리 폴더에서 아래 명령어를 입력합니다.

(Anaconda Powershell Prompt 아니어도 됨)


git pull

git submodule update

혹시 문제가 있다면 댓글로 알려주세요.