소라 AI가 나오구 스테이블 디퓨전 3.0이 나왔다는데
캐스캐이드 모델이라는게 있어서 돌려보려고 했는데 빡세네요
그나마 최근에 좀더 간단한 방식이 공개되어서 해보는데
python 이 필요하고 ,git 도 설치하고 pytorch도 GPU 지원하는 모델을 깔아야 하고 해야 할게 있습니다.
특히 diffusers 모듈을 설치 해야 하는데 이건 허깅페이스 의 케스캐이드 모델에 URL이 있긴한데
그걸로 설치해도 실행하면 xxxUnit이 없다고 에러를 뱉어서 구글링을 해서 다운로드할 URL을 찾아서 재설치를 해야 합니다.
그리고 필요한 하드웨어 스펙
디스크 공간이 많이 필요합니다. 모델 자체도 10가 넘어가고, 실행할 때 필요한 것도 10가 넘어가니 최소 30G정도는 남겨놓아야 합니다.
그리고 제일 중요한 비디오 카드 메모리, RX계열의 것으로 12G이상이 필요합니다.
CPU로 돌리면 half 모듈 미지원이라고 에러 뱉어냅니다.
디퓨전 웹 UI에서는 --no-half라는게 있어 통과가 가능한데, 이걸 어떻게 적용하는지 몰라서 못씁니다.
CUDA없는 시스템에서 CPU로 돌려보다가 실패했고
RX4060에 16G메모리 달린 시스템에서 어찌 어찌 돌려서 돌리는데 성공했는데, 그래픽카드 갈고 파이썬 높은 버전에 파이토치 GPU버전으로 설치하고 해서 돌렸다가, WEB-UI가 안돌아가는 상태로 빠져서, 겨우 겨우 버전 체크하는 로직을 수정해가며 회피해서 일단 돌리긴 했습니다.
이번 글에서는 3050의 6G에서 돌려본 것입니다
허깅페이스 소스 나온 예제를 돌리는데 gpu out of memory가 나와서 어떻게 해야 할지 모르겠더군요
파이선 썰치, 파이토치 설치, diffusers 설치, 그리고 diffusers 업데이트등 쇼하고 해도 실패
몬가 되는 방법이 있겠지 했는데
--------------------------------파이썬 소스
import os
os.environ["PYTORCH_CUDA_ALLOC_CONF"] = "garbage_collection_threshold:0.3,max_split_size_mb:128,expandable_segments:True"
import torch
import gc
for i in range(torch.cuda.device_count()):
print(torch.cuda.get_device_properties(i).name)
from diffusers import StableCascadeDecoderPipeline, StableCascadePriorPipeline
device = "cuda"
num_images_per_prompt = 2
print("step-1")
prior = StableCascadePriorPipeline.from_pretrained("stabilityai/stable-cascade-prior", low_cpu_mem_usage=True,torch_dtype=torch.bfloat16).to(device)
print("step-2")
prompt = "Anthropomorphic cat dressed as a pilot"
negative_prompt = ""
prior_output = prior(
prompt=prompt,
height=1024,
width=1024,
negative_prompt=negative_prompt,
guidance_scale=4.0,
num_images_per_prompt=num_images_per_prompt,
num_inference_steps=20
)
del prior
gc.collect()
with torch.no_grad():
torch.cuda.empty_cache()
decoder = StableCascadeDecoderPipeline.from_pretrained("stabilityai/stable-cascade", low_cpu_mem_usage=True,torch_dtype=torch.float16).to(device)
print("step-3")
decoder_output = decoder(
image_embeddings=prior_output.image_embeddings.half(),
prompt=prompt,
negative_prompt=negative_prompt,
guidance_scale=0.0,
output_type="pil",
num_inference_steps=10
).images
for idx,img in enumerate(decoder_output ):
img.save(f"{idx}.jpg")
-------------------------
이렇게 수정을 했습니다.
StableCascadePriorPipeline.from_pretrained 평션을 연속으로 호출해서 메모리가 꽉 차는 것을
처리 순서를 분리하고
사용이 끝난 것은 메모리 해제를 시도했습니다.
del prior
gc.collect()
with torch.no_grad():
torch.cuda.empty_cache()
모가 효과적인간지 모르지만
이렇게 시도해서 한참 기다리니 우주인 야옹이가 저장되네여
6G메모리가 윈도우 작업 관리자 GPU 쪽에서 보면 꽉차서 느리게 동작하는 듯 하네요
CPU only로 동작할 때 Float16을 Float32로 바꾸고, half()를 제거해서 노이즈 가득한 이미지를 얻어서 실패했었는ㄷ데
6G로도 느리긴 해도 만들어줍니다.
애초 메모리를 20G나 그 이상의 것을 샀으면 좋았을껄
팰월드 게임에서도 버벅되는데, AI테스트는 더 버벅이네여
혹시 누군가 스테이블을 케스케이드로 테스트한다면 참고 되시라고 남겨봅니다.