본문 바로가기

AI

Stable Diffusion 속도 높이는법과 safetensors 개념설명 / 확장 업데이트 방법.

Stable Diffusion 속도 높이는법과 safetensors 개념설명 / 확장 업데이트 방법.

Stable Diffusion 속도 높이는법

모델 파일을 ckpt에서 safetensors로 변환하여 생성 속도를 향상시키는 방법과 효과 소프트웨어

Stable Diffusion Webui(AUTOMATIC1111)의 확장 기능 "Merge Block Weighte"에서 ckpt의 모델 파일을 safetensors로 변환하는 방법을 설명합니다.

또한 safetensors화로 인해 얼마나 생성 속도가 단축되는지 조사했습니다.

결론부터 말하자면, 변환하는 것만으로도 RTX3060 Ti를 RTX3080으로 교체했을 때 이상의 속도단축효과가 있었습니다!

아래에서는 Stable Diffusion 속도높이는법, safetensors의 개념설명과 장점들을 알아보겠습니다.

ckpt를 safetensors로 변환하다

확장 기능 설치

확장 기능 추가 방법을 참고하여 "Merge Block Weighted"라고 하는 확장 기능을 추가합니다.

설치된 탭을 보고 이렇게 이름이 있으면 됩니다.

만약 없다면 아래 확장 기능 설치하는법을 따라합니다.

확장 기능을 찾는다

이용 가능한 확장 기능을 일람 표시한다

  • 「webui-user.bat」를 더블 클릭.WebUI(1111판)를 실행
  • Extensions 탭 선택
  • Available 메뉴 열기
  • Extension index URL 란에 아래 URL 입력
https://raw.githubusercontent.com/wiki/AUTOMATIC1111/stable-diffusion-webui/Extensions-index.md

마지막으로 "Load from:"이라고 적힌 주황색 버튼을 클릭하면 현재 설치 가능한 확장 기능 목록을 얻을 수 있습니다.

만약 이 메뉴가 없을 경우 stable diffusion webui(AUTOMATIC11) 버전이 너무 오래되었기 때문에 다른 절차대로 업데이트를 해줘야 합니다.

그것은 가장 아래 ' Stable Diffusion 업데이트 방법' 에서 설명합니다. 지금 업데이트가 필요하신 분들은 Ctrl+ F키를 눌러 '업데이트 방법'이라고 쓰고 검색해 봅시다. 

업데이트가 되어있는 분들은 바로 아래로 계속 진행해 나갑니다.

목표 확장 기능을 좁히다

"Load from:" 아래의 "Hide extensions with tags"에 체크하면 특정 종류의 확장 기능을 제외하고 검색할 수 있습니다.

제 버전에는 다음 네 가지가 있습니다.

  • script: 이른바 확장 기능. (Deep Danbooru 등이 유명합니다.)
  • localization: 번역용 언어팩
  • tab: WebUI의 메뉴 탭에 추가되는 유형의 확장 기능
  • ads : 광고가 포함된 확장 기능

찾고 싶은 확장 기능에 어떤 태그가 붙어 있는지 파악해 두면 검색 결과 건수가 줄어들기 때문에 찾기 쉬워집니다.

목표 확장 기능을 인스톨

설치하고자 하는 확장 기능을 결정하면 "Install"을 클릭하기만 하면 됩니다.

다양한 확장 기능이 나오므로 목적의 "Install" 버튼을 클릭합니다.

1분 정도 기다리면 대부분 설치가 완료됩니다.
(확장기능의 볼륨이나 회선속도 등에 따라 개인차가 큽니다.)

이렇게 'Installed'이 되면 성공입니다.

목록에 설치하고 싶은 확장 기능이 없을 때는?

설치하고자 하는 확장 기능 저장소의 URL을 여기 란에 입력하고 원하는 이름을 붙여 Install을 합시다.

이런 느낌의 URL입니다.

설치 성공 후 이렇게 메시지가 뜨니 웹 UI 재부팅을 잊지 맙시다!

설치 완료된 확장 기능을 업데이트하는 방법

'Extensions' 탭의 'Installed'를 선택한 후 'Check for updates'를 클릭합니다.

'behind'라고 뜨면 업데이트가 있으니 적용합니다.

업데이트에 성공하면 이렇게 'latest'라고 표기가 됩니다.

WebUI(1111)의 확장 기능의 「검색」·「설치」·「업데이트」순서는 이상입니다.

이제부터 본론인 Stable Diffusion 속도를 높여보겠습니다.

ckpt에서 safetensors로 변환하는 방법

먼저 'Save as safetensors'에 체크를 합니다.

그리고 'Model A'와 'Model B'에 동일한 모델을 지정합니다.

마지막으로 중앙 하단의 "M00"에 값을 0으로 해주세요.

이제 'Model B' 옆에 있는 'Output Model Name' 에 적당한 이름을 넣고 오렌지 버튼 'Run Marge'를 클릭하여 실행합니다.

모델 폴더 내에 새로운 모델이 저장되어 있을 것입니다.

모델을 변환해도 같은 이미지가 될까?

생성해본 결과는 생성 차이는 없는 것으로 보입니다.

적어도 육안 범위 내에서는 ckpt를 safetensors로 변환해도 동일한 이미지가 출력되는 것을 확인할 수 있었습니다.

덧붙여 Safetensors 형식이 구체적으로 어떤 것인지 자세히 알아보겠습니다.

AI모델의 safetensors은 뭘까?

Hugging Face가 주도하는 safetensors 형식의 파일은 기존 ckpt 형식의 파일과 비교하여 어떤 이점이 있는지, 왜 안전한지 알기 쉽게 설명드리겠습니다.

또한 ckpt 파일의 위험성에 대해서도 자세히 설명하고 있습니다.

원래 ckpt형식의 모델 파일은 어떻게 데이터를 보존하고 있었는가?

safetensors 형식은 ckpt 형식의 여러 단점 개선을 목적으로 만들어진 데이터 저장 방법으로 Hugging Face가 주도하고 있습니다.

그렇기 때문에 safetensors이점을 설명하기 위해서는 먼저 기존의 ckpt에서 무엇이 안되는것이였는지 ckpt의 데이터 저장 방법부터 알아야 합니다.

.ckpt확장자와 pickle의 관계

이미지 생성 AI 관련 모델에서 흔히 볼 수 있는 .ckpt라고 하는 확장자는 "pickle"이라고 하는 Python 모듈을 사용하여 직렬화하여 저장된 데이터에 사용되는 확장자입니다.

데이터를 직렬화(바이트열로 변환한다)를 「pickle화」·「피클화」라고 부릅니다.
반대로 바이트 열에서 데이터를 복원하는 것을 '비pickle화', '비피클화'라고 합니다.

이 부분은 「그렇구나」정도로 알아두면 됩니다.

아래에서 피클화의 결점을 설명하기 위한 서론입니다.

pickle 모듈을 사용하여 예를 들어 아래와 같은 Python 객체를 pickle화할 수 있습니다.

  • 부울값(True/False), None값, 수치(정수, 부동소수점수 등)
  • 문자열,bytes객체,bytearray객체
  • 모듈의 상위 레벨에 정의되어 있는 함수 클래스
  • 클래스 인스턴스
  • pickle화 할 수 있는 것만 포함한 목록, 태플, 집합, 사전

pickle모듈의 문서(https://docs.python.org/ja/3/library/pickle.html#what-can-be-pickled-and-unpickled)

함수도 피클화 할 수 있습니다.

pickle로 직렬화한 데이터의 단점

피클화되어 저장되어 있는 데이터를 사용하기 위해서는 비피클화를 실시할 필요가 있습니다만,
만약 ckpt 파일이 악의적으로 작성되었을 경우 사용 시 비피클화됨과 동시에 임의 코드가 실행될 우려가 있습니다.

공식 문서에도 아래와 같이 경고가 적혀 있습니다.

비pickle화 과정에서 임의의 코드를 실행하는 악의적인 pickle 객체를 생성할 수 있습니다.

신뢰할 수 없는 제공처로부터의 데이터나, 변경되었을 가능성이 있는 데이터의 비pickle화는 절대로 실시하지 말아 주세요.

https://docs.python.org/ja/3/library/pickle.html

즉, 악의적인 ckpt 파일을 사용하면 PC가 공격받을 수 있다는 것입니다.

safetensors 형식과 ckpt(pickle 형식의 비교)

Format Safe Zero-copy Lazy loading No file size limit Layout control Flexiblility Bflot16
picke (pyTorch) X X X O X O O
H5 (Tensorflow) O X O O - - X
SavedModel(Tensorflow) O X X O O X O
MsgPack (flax) O O X O X X O
Protobuf (ONNX) O X X X X X O
Cap'n Proto O O - O O - X
Arrow ? ? ? ? ? ? X
Numpy (npy,npz) O ? ? X O X X
SafeTensors O O O O O X O

https://github.com/huggingface/safetensors

이 표는 다양한 데이터의 저장 형식을 비교한 것입니다.

여러 관점에서 비교하고 있는 표인데 주목해야 할 것은 'Safe'O마크와 'Safe Tensors'의 유일한 X마크인 'Flexibility'입니다.

이 표의 'Safe'란 'Can Iuse a file randommy downloaded and expect not to run arbitrary code?'라는 관점입니다.
즉, 다운로드한 파일을 사용해도 임의 코드가 실행되지 않을 것으로 기대되는가?입니다.

또,「Flexibility」는、「Can I save custom code in the format and be able to use it later with zero extra code ? (~ means we can store more than pure tensors, but no custom code)」입니다.
대충 번역하면 '순수 텐서 이상의 것을 저장할 수 있지만 커스텀 코드는 저장할 수 없다'는 뜻입니다.

이를 바탕으로 표를 의역하면
'safetensors 형식이라면 인터넷에서 주운 잘 모르는 파일을 사용해도 위협이 되지 않는다.'
는 것입니다.

같은 모델 파일을 ckpt 형식에서 safetensors 형식으로 변환하면 같은 모델을 안전하게 사용할 수 있게 된다는 것도 장점이 있습니다.

'그리고 변환하는 것만으로도 이미지 생성 시간이 상당히 단축된다'점도 장점입니다.

반대로 safetensors 형식의 단점은 딱히 없습니다.

애초에 pickle의 위험을 어떻게든 하기 위한 대체 수단이 safetensors이기 때문에 pickle화 파일(ckpt 확장자 파일)에 비해 safetensors 형식의 파일이 떨어지는 점은 일절 없는것입니다.

safetensors 형식이란? ckpt 파일보다 뛰어난 점은

위에서 safetensors도 ckpt도 데이터 저장 형식 중 하나라는 것을 알게 되었습니다.

그리고 safetensors 형식ckpt 파일(피클화 파일)과 달리 임의 코드 실행의 우려가 없다는 이점이 있다고 할 수 있습니다.

저장 형식 SafeTensors Pickle
임의 코드가 실행될 우려가 있는가? 없다 있다
함수나 커스텀 코드를 저장할 수 있는가? 할 수 없다 할 수 있다
확장자(모델 파일의 예) .safetensors .ckpt
보안적으로는? 안전 위험
이미지 생성 속도는? (상대적으로) 빠르다 늦다

그렇기 때문에 출처 불명의 Anything v3 시리즈 등은 특별히 ckpt가 아닌 safetensors 형식 쪽을 선택했다는 것입니다.

safetensors의 설명은 이것으로 마치고 다시 생성속도로 넘어갑니다.

생성 속도가 어느 정도 고속화하는가

검증 조건

벤치마크를 사용합니다.

그래픽카드 선정 링크

어떤 512×512 사이즈의 이미지 10장(batch count 10, batch size 1) 생성할 때 걸린 시간(Time taken 값)을 비교하는 것입니다.

여기서는 각각 3회 계측해 그 평균치를 비교했습니다.

덧붙여 xformers는 유효하고, 라이브 프리뷰 기능을 오프, 그리드 이미지 작성은 온으로 하고 있습니다.

VAE 파일과 모델 파일 캐시는 하지 않은 상태입니다.

Stable Diffusion 속도 높이는법 검증 결과와 고찰

ckpt시의 스코어는 파워 리미트 9단계별 생성속도 검증의 전력제한 없음(PL100%) 시점의 것을 사용하고 있습니다.

  1차 2차 3차 평균치 ckpt를 1로 했을 경우
ckpt 19.15 18.44 19.00 18.86 1.0000
safetensors 13.16 13.25 13.21 13.21 0.7001

굉장하게도 3090인데 30% 가속화가 되면서 안좋은 4090정도의 조금 믿을 수 없는 결과가 나옵니다!

그래픽 보드로 말한다면 RTX3080이 RTX3060 Ti보다 28% 빠르기 때문ckpt→safetensors 변환만으로 몇 십만원 이상의 투자에 필적하는 효과가 있다고 할 수 있습니다.

작업 순간에 두 모델의 합계만큼 RAM을 소비하므로 10GB는 비워 둡니다.

만약 16GB 정도밖에 RAM을 탑재하지 않은 분은 16GB 1개를 추가해서 총 32GB 정도가 되도록 증설하는 것이 좋을것 같습니다.

Git를 이용하여 설치한 Stable Diffusion WebUI(AUTOMATIC1111)업데이트 방법

AUTOMATIC1111의 GitHub 때 BAN에 대응하는 방법

GitHub 때 BAN에 대응하는 방법

혹시 AUTOMATIC1111의 GitHub 계정이 BAN되고 저장소도 404가 되었다고 나온다면

https://github.com/automatic1111/stable-diffusion-webui

AUTOMATIC1111의 공식 링크는
https://gitgud.io/AUTOMATIC1111/stable-diffusion-webui
입니다. (접근이 집중되어 무거울 수 있습니다)

GitHub에서 파일을 가져오도록 되어 있는 설정을 상기 GitGud 저장소의 파일을 사용하도록 설정을 변경합니다.

한 번만 아래 명령을 실행하여 GitGud에서 파일을 가져오도록 설정을 변경하면 됩니다.

git remote set-url origin https://gitgud.io/AUTOMATIC1111/stable-diffusion-webui

그 후의 Git관련 등의 명령은 GitHub에서도 GitGud에서도 마찬가지입니다.

만약 정상적으로 GitHub에 접속된다면 아래를 진행합니다.

현재 열려 있는 WebUI(AUTOMATIC1111) 닫기

업데이트를 하기 전에 현재 webui-user.bat 등이 열려 있는 경우 닫읍시다.

오른쪽 상단의 x 버튼을 누르시면 됩니다.

업데이트를 실행하다

WebUI(AUTOMATIC1111)설치폴더열기

익스플로러에서 Stable Diffusion WebUI(AUTOMATIC1111)가 설치되어 있는 폴더를 엽니다.

PowerShell에서 열기

설치된 폴더 내에서
Shift 키를 누르면서 오른쪽 버튼을 클릭합니다.

그러면 이러한 선택 화면이 나오기 때문에 'Power Shell 창 여기서 열기(Open the PowerShell window here(S)'를 선택합니다.

Git에서 업데이트할 명령어를 복사하여 입력

그러면 이렇게 검은 화면이 뜨기 때문에 'git pull' 이라는 명령어를 입력합니다.

커맨드 카피페용↓

git pull


이 명령어를 입력한 후 엔터키를 누르면 업데이트가 시작됩니다.

또한 업데이트 전에 기존 파일을 다른 곳으로 옮길 필요는 없습니다.

모델이나 생성 이미지 폴더등이 마음대로 덮어쓰는 일은 없기 때문입니다.

업데이트가 완료되면 이렇게 변경사항이 열거됩니다.

딱히 읽을 필요는 없습니다.

이렇게 표시되면 우측 상단의 x 버튼을 클릭하여 Power Shell을 닫습니다.

뭐가 떠서 앱대가 안 됐을 때는

remote: Enumerating objects: 396, done.
remote: Counting objects: 100% (279/279), done.
Receiving objects: 100% (396/396), 149.33 KiB | 24.89 MiB/s, done. 117Receiving objects: 99% (393/396)
Resolving deltas: 100% (288/288), completed with 92 local objects.
From https://github.com/AUTOMATIC1111/stable-diffusion-webui
44c46f0..685f963 master -> origin/master
You are not currently on a branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.
git pull <remote> <branch>


이런 메세지가 떠서 업데이트를 못하는 경우가 있습니다.

그 때는 이하의 커맨드 2개를 차례로 입력해 봅니다.

git checkout master
git pull

제대로 업데이트가 진행되었습니다.

다시 Stable Diffusion WebUI(AUTOMATIC1111)를 기동

다시 업데이트 전과 마찬가지로 "webui-user.bat"를 더블 클릭하여 WebUI(AUTOMATIC1111)를 기동합니다.

별 문제 없이 실행되면 성공입니다.

혹시라도 잘 안되는 부분이 있다면 하루만 기다려서 다시 업데이트하면 대부분의 오류가 수정되어 잘 될 것입니다.

아니면 과거의 안정 버전으로 다운그레이드 하는 것도 좋습니다. 

추가로 신규로 Stable Diffusion WebUI(AUTOMATIC11)를 Git로 설치하는 방법

Stable Diffusion WebUI(AUTOMATIC1111)의 클린 인스톨은 매우 간단합니다.

기존 데이터를 덮어쓰지 않도록 하다

익스플로러에서 Stable Diffusion WebUI(AUTOMATIC1111)가 있는 폴더를 엽니다.

기존의 Stable Diffusion WebUI(AUTOMATIC1111) 폴더명을 끝에 다른 문자를 추가하여 변경합니다.

위에는 for SDv1과 추가했는데 OLD 등 아무거나 상관없습니다.

PowerShell에서 열기

↑의 폴더 내에서
Shif 키를 누르면서 오른쪽 버튼을 클릭합니다.

그러면 이러한 선택 화면이 나오기 때문에 'Power Shell 창 여기서 열기(Open the PowerShell window here(S)'를 선택합니다.

Git에서 업데이트할 명령어를 복사하여 입력

그리고 이렇게 검은 화면이 뜨기 때문에 아래 명령어를 입력합니다.

명령어↓

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

이 명령어를 입력한 후 엔터키를 누르면 신규 설치가 시작됩니다.

나머지는 적당히 models 폴더내의 모델을 카피페 해 이행하거나 Extensions 폴더를 덮어써 확장 기능을 계승해 줍니다.

그런 다음 "webui-user.bat"을 더블 클릭하여 시작하면 완료됩니다.

첫 부팅 시에는 시간이 걸리니까 뒤죽박죽 기다립시다.

정리 Git에서 설치한 WebUI(AUTOMATIC1111) 업데이트 절차

1. WebUI(AUTOMATIC1111) 닫기
2. 설치 폴더에서 "PowerShell 열기" 선택
3. 업데이트할 명령어 'git pull' 입력
4. 잠시 기다렸다가 변경사항 목록이 나타나면 PowerShell 닫기
5. 다시 WebUI(AUTOMATIC1111) 실행
6. 완료!

작업이 익숙해지면 업데이트는 30초로 가능해질 것입니다. 위의 업데이트 방법설명이 길어졌지만 만약 업데이트가 진행된 버전이라면 아래 내용을 진행해 나갑니다. 이상 Stable Diffusion 속도 높이는법과 safetensors 개념설명 확장 업데이트 방법이었습니다.

 

교차형 무한