아이폰에서는 Stable Diffusion 실행이 어렵나요? 오늘 소개할 글에서 저자는 '어렵지 않고, 아이폰은 아직 성능이 50% 남았다'고 답하고 있다.
우리 모두 알고 있듯이, Apple은 매년 새로운 시각적 모델과 이미지 센서의 급속한 발전으로 인해 모든 면에서 더 빠르고 우수하다고 주장하는 새로운 iPhone을 출시합니다. 사진을 예로 들면, 10년 전으로 돌아가면 아이폰으로 고화질 사진을 찍을 수 있을까? 대답은 '아니요'다. 휴대폰 사진 기술은 10년이면 충분히 발전할 수 있기 때문이다.
이러한 (진보적인) 기술 개발 패턴으로 인해 일부 프로그램은 최고의 컴퓨팅 장치에서 실행하더라도 거의 사용할 수 없게 되는 때가 올 것입니다. 그러나 새로 활성화된 시나리오를 갖춘 이러한 새 프로그램은 일부 사용자의 관심을 끌었고 사람들은 기꺼이 연구했습니다.
이 글의 작성자도 그 중 한 명입니다. 지난 3주 동안 작성자는 Stable Diffusion을 통해 이미지를 생성(소환)한 후 원하는 방식으로 편집할 수 있는 애플리케이션을 개발했습니다. 이 앱은 최신 iPhone 14 Pro에서 이미지를 생성하는 데 단 1분밖에 걸리지 않으며, 약 2GiB의 앱 메모리를 사용하고 시작하려면 약 2GiB의 초기 데이터를 다운로드해야 합니다.
앱스토어 링크: https://apps.apple.com/us/app/draw-things-ai- Generation/id6444050820
이 결과는 많은 네티즌들의 관심을 끌었고 일부 사람들은 이를 논의하기 시작했습니다. 휴대전화 배터리 소모 문제를 걱정하며 농담으로 '이거 좋은데 휴대전화 배터리를 소모하는 좋은 방법인 것 같아요'라고 말했습니다.
"지금처럼 iPhone의 열기를 느껴본 적이 없습니다."
"이 추운 겨울에는 휴대폰을 손난로로 사용할 수 있습니다."
하지만 모두가 휴대폰의 열기를 비웃고 있는 동시에 이 작품에 대해서도 매우 높은 평가를 내렸습니다."정말 놀랍습니다. iPhone SE3에서 완전한 이미지를 생성하는 데 약 45초가 걸립니다. 이는 M1 Pro Macbook의 원본 버전과 거의 같은 속도입니다!"
메모리 및 하드웨어 최적화 같은 시간
이건 어떻게 하는 걸까요? 다음으로 작성자의 구현 과정을 살펴보겠습니다.iPhone에서 Stable Diffusion 실행을 완료하고 여전히 성능의 50%를 절약하려면 주요 과제는 6GiB가 있는 iPhone 장치에서 프로그램을 실행하는 것입니다. 램. . 6GiB는 많은 것 같지만 6GiB 기기에서 2.8GiB 이상을 사용하거나 4GiB 기기에서 2GiB를 사용하면 iOS에서 앱이 종료됩니다.
그렇다면 Stable Diffusion 모델이 추론을 위해 얼마나 많은 메모리가 필요한가요?
이것도 모델의 구조에서 시작됩니다. 일반적으로 안정 확산 모델은 4개 부분으로 구성됩니다. 1. 이미지 생성을 안내하기 위해 텍스트 특징 벡터를 생성하는 텍스트 인코더 2. 이미지를 잠재 공간으로 인코딩하는 선택적 이미지 인코더(이미지 간 생성용) 4. 이미지의 잠재 표현에서 노이즈를 천천히 제거합니다. 4. 잠재 표현에서 이미지를 디코딩하는 이미지 디코더.
첫 번째, 두 번째, 네 번째 모듈은 추론 중에 한 번 실행되며 최대 약 1GiB가 필요합니다. 디노이저 모델은 약 3.2GiB(전체 부동 소수점)를 차지하고 여러 번 실행해야 하므로 작성자는 모듈을 RAM에 더 오래 유지하려고 합니다.
원래 Stable Diffusion 모델에서는 단일 이미지 추론을 수행하는 데 거의 10GiB가 필요했습니다. 단일 입력(2x4x64x64)과 출력(2x4x64x64) 사이에는 많은 출력 레이어가 산재되어 있습니다. 모든 레이어 출력을 즉시 재사용할 수 있는 것은 아니며, 일부는 후속 사용을 위해 일부 매개변수를 유지해야 합니다(잔여 네트워크).
연구원들은 한동안 PyTorch Stable Diffusion을 최적화해 왔습니다. 그들은 PyTorch에서 사용하는 NVIDIA CUDNN 및 CUBLAS 라이브러리를 위한 임시 저장 공간을 예약해 두었습니다. 이러한 최적화는 모두 메모리 사용량을 줄이기 위한 것이므로 Stable Diffusion 모델은 다음과 같이 카드를 사용하여 실행할 수 있습니다. 4GiB만큼 낮습니다. 하지만 그래도 작가의 기대를 뛰어넘었습니다. 따라서 저자는 Apple 하드웨어 및 최적화에 집중하기 시작했습니다. 처음에 저자는 Apple의 OOM(Out of Memory, 앱이 차지하는 메모리가 상한에 도달하는 것을 말합니다. iOS 시스템의 단일 앱으로 인해 시스템 강제 종료가 됩니다) 작성자는 약 500MiB의 공간을 사용할 수 있습니다. 첫 번째 질문, 각 중간 출력의 크기는 얼마입니까? 대부분은 각각 6MiB(2x320x64x64) 미만으로 비교적 작은 것으로 나타났습니다. 작성자가 사용하는 프레임워크(s4nc)는 재사용을 위해 50MiB 미만으로 합리적으로 패키징할 수 있습니다. 노이저에는 이미지의 자체 잠재 표현을 입력으로 사용하는 self-attention 메커니즘이 있다는 점은 언급할 가치가 있습니다. self-attention 계산 중에는 16x4096x4096 크기의 배치 행렬이 있는데, 이는 소프트맥스를 적용한 후 FP16에서 약 500MiB이며 "인플레이스"로 수행할 수 있습니다. 즉, 손상되지 않고 입력을 안전하게 다시 쓸 수 있음을 의미합니다. 다행스럽게도 Apple과 NVIDIA 하위 수준 라이브러리는 모두 내부 소프트맥스 구현을 제공하는 반면 PyTorch와 같은 상위 수준 라이브러리는 제공하지 않습니다. 그렇다면 정말 550MiB + 1.6GiB 정도의 메모리를 사용해서 할 수 있을까요? Apple 하드웨어에서 신경망 백엔드를 구현하는 일반적인 옵션은 MPSGraph 프레임워크를 사용하는 것입니다. 그래서 저자는 먼저 MPSGraph를 사용하여 모든 신경망 연산을 구현해 보았습니다. FP16 정밀도의 최대 메모리 사용량은 약 6GiB입니다. 이는 분명히 예상되는 메모리 사용량보다 훨씬 많은 것입니다. 저자는 그 이유를 자세히 분석했습니다. 우선 MPSGraph를 일반적인 TensorFlow 방식으로 사용하지 않았습니다. MPSGraph에서는 전체 계산 그래프를 인코딩한 다음 입력/출력 텐서를 사용하고 내부 할당을 처리하고 사용자가 실행을 위해 전체 그래프를 제출할 수 있도록 해야 합니다. 저자가 MPSGraph를 사용하는 방식은 작업 실행 엔진인 PyTorch와 매우 유사합니다. 추론 작업을 수행하기 위해 컴파일된 많은 MPSGraphExecutable이 Metal 명령 대기열에서 실행되며, 각각은 중간 할당 메모리를 보유할 수 있습니다. 한 번에 제출하면 이러한 모든 명령은 실행이 완료될 때까지 할당된 메모리를 보유합니다. 이 문제를 해결하는 간단한 방법은 제출 속도를 조정하는 것입니다. 모든 명령을 한 번에 제출할 필요는 없습니다. 실제로 Metal의 대기열당 동시 제출 제한은 64개입니다. 작성자는 한 번에 8개의 작업을 제출하도록 변경하려고 시도했으며 최대 메모리가 4GiB로 줄었습니다. 그러나 여전히 iPhone이 처리할 수 있는 것보다 2GiB 더 많습니다. CUDA를 사용하여 self-attention을 계산하려면 원래 Stable Diffusion 코드 구현에 일반적인 트릭이 있습니다. 즉, 전치 대신 변위를 사용하는 것입니다. 이 트릭은 CUBLAS가 순열된 스트라이드 텐서를 직접 처리할 수 있어 텐서를 전치하기 위해 전용 메모리를 사용할 필요가 없기 때문에 효과적입니다. 하지만 MPSGraph는 스트라이드 텐서를 지원하지 않습니다. 순열 텐서는 어쨌든 내부적으로 전치되므로 중간 메모리 할당이 필요합니다. 명시적으로 전치를 통해 할당은 더 높은 수준의 레이어에서 처리되므로 MPSGraph 내부 비효율성이 방지됩니다. 이 트릭을 사용하면 메모리 사용량이 3GiB에 가까워집니다. iOS 16.0부터 MPSGraph는 더 이상 소프트맥스에 대한 최적의 할당 결정을 내릴 수 없는 것으로 나타났습니다. 입력 텐서와 출력 텐서가 모두 동일한 데이터를 가리키더라도 MPSGraph는 추가 출력 텐서를 할당한 다음 결과를 가리키는 위치에 복사합니다. 저자는 Metal Performance Shaders 대안을 사용하는 것이 완벽하게 적합하고 성능 저하 없이 메모리 사용량을 2.5GiB로 줄인다는 사실을 발견했습니다. 반면에 MPSGraph의 GEMM 커널은 내부 전치가 필요합니다. 명시적 전치도 여기서는 도움이 되지 않습니다. 이러한 전치는 상위 수준 레이어의 "내부" 작업이 아니며 특정 500MiB 크기 텐서의 경우 이러한 추가 할당이 불가피하기 때문입니다. Metal Performance Shader로 전환함으로써 프로젝트 작성자는 약 1%의 성능 저하로 추가로 500MiB를 회수하여 궁극적으로 메모리 사용량을 이상적인 2GiB로 줄였습니다.
위 내용은 Stable Diffusion 모델을 iPhone에 삽입하고 APP으로 만들어 1분만에 사진제작의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!