StreamDiffusion: Giải pháp ở cấp độ pipeline cho tạo sinh tương tác thời gian thực
(github.com/cumulo-autumn)- StreamDiffusion là một pipeline cải tiến việc tạo ảnh dựa trên mô hình khuếch tán để phù hợp với tạo sinh tương tác thời gian thực, với mục tiêu nâng cao hiệu năng của các kỹ thuật tạo ảnh khuếch tán hiện có
- Các tính năng cốt lõi gồm Stream Batch, Residual Classifier-Free Guidance, Stochastic Similarity Filter, IO Queues, tiền tính toán KV-cache và các công cụ tăng tốc mô hình
- Trong môi trường RTX 4090, Core i9-13900K, Ubuntu 22.04.3 LTS, SD-turbo đạt Txt2Img 106.16fps và Img2Img 93.897fps với 1 denoising step
- Bản demo thời gian thực có trong
demo/realtime-txt2imgvàdemo/realtime-img2img; demo Img2Img sử dụng nguồn webcam trực tiếp hoặc chụp màn hình từ trình duyệt web - Cách dùng là bọc
StableDiffusionPipelinecủa Diffusers, đồng thời có thể cấu hình chạy nhanh hơn bằng gộp LCM-LoRA, Tiny VAE, xformers và tăng tốc TensorRT
Mục đích và hiệu năng của StreamDiffusion
- StreamDiffusion là một pipeline khuếch tán dành cho tạo sinh tương tác thời gian thực
- Mục tiêu là cải thiện hiệu năng cho các kỹ thuật tạo ảnh dựa trên khuếch tán hiện nay
- Bài báo được liên kết tại arXiv 2312.12491 và Hugging Face Papers
- Môi trường đo hiệu năng tạo ảnh bằng pipeline được đề xuất như sau
- GPU: RTX 4090
- CPU: Core i9-13900K
- OS: Ubuntu 22.04.3 LTS
- Bảng hiệu năng
- SD-turbo: denoising step 1, Txt2Img 106.16fps, Img2Img 93.897fps
- LCM-LoRA + KohakuV2: denoising step 4, Txt2Img 38.023fps, Img2Img 37.133fps
Các tính năng cốt lõi
-
Stream Batch
- Đơn giản hóa xử lý dữ liệu thông qua tác vụ batch hiệu quả
-
Residual Classifier-Free Guidance
- Cơ chế guidance cải tiến giúp giảm trùng lặp tính toán
-
Stochastic Similarity Filter
- Kỹ thuật lọc nâng cao giúp cải thiện hiệu quả sử dụng GPU
-
IO Queues
- Tính năng hỗ trợ chạy mượt hơn bằng cách quản lý hiệu quả tác vụ đầu vào và đầu ra
-
Pre-Computation for KV-Caches
- Tăng tốc độ xử lý bằng cách tối ưu chiến lược caching
-
Model Acceleration Tools
- Sử dụng nhiều công cụ để tối ưu mô hình và nâng cao hiệu năng
Cách cài đặt và chạy
- StreamDiffusion có thể được cài bằng pip, conda hoặc Docker
- Ví dụ môi trường Python được khuyến nghị là môi trường conda dựa trên
python=3.10hoặcvenv - Ví dụ cài đặt PyTorch phân biệt giữa CUDA 11.8 và CUDA 12.1
- CUDA 11.8:
torch==2.1.0,torchvision==0.16.0,xformers - CUDA 12.1:
torch==2.1.0,torchvision==0.16.0,xformers
- CUDA 11.8:
- Cách cài đặt cho người dùng
- Khuyến nghị bản mới nhất:
pip install git+https://github.com/cumulo-autumn/StreamDiffusion.git@main/…] - Bản ổn định:
pip install streamdiffusion[tensorrt] - Phần mở rộng TensorRT được cài bằng
python -m streamdiffusion.tools.install-tensorrt
- Khuyến nghị bản mới nhất:
- Trên Windows, nếu cài bản ổn định thì có thể cần cài thêm
pywin32 - Cài đặt Docker hướng đến môi trường đã chuẩn bị TensorRT và được chạy với tùy chọn
--gpus allsaudocker build
Demo và ví dụ sử dụng
- Có thể chạy các ví dụ trong thư mục
examples - Demo Txt2Img thời gian thực nằm trong thư mục
demo/realtime-txt2img - Demo Img2Img thời gian thực nằm trong thư mục
demo/realtime-img2img- Có thể dùng nguồn webcam trực tiếp hoặc chụp màn hình trong trình duyệt web
- Luồng sử dụng cơ bản là tải
StableDiffusionPipelinecủa Diffusers rồi bọc bằngStreamDiffusion - Ví dụ Img2Img tải mô hình
KBlueLeaf/kohaku-v2.1và cấu hình stream vớit_index_list=[32, 45]- Nếu mô hình không phải LCM thì dùng
load_lcm_lora()vàfuse_lora() - Để tăng tốc thêm, dùng Tiny VAE của
madebyollin/taesd - Kích hoạt attention tiết kiệm bộ nhớ của xformers bằng
enable_xformers_memory_efficient_attention()
- Nếu mô hình không phải LCM thì dùng
- Ví dụ Txt2Img dùng
t_index_list=[0, 16, 32, 45]và khuyến nghị dùngcfg_type="none"cho text-to-image - Số lần warmup phải lớn hơn hoặc bằng
len(t_index_list) x frame_buffer_size
Tăng tốc TensorRT
- Để tạo sinh nhanh hơn, có thể thay đoạn mã bật xformers bằng mã tăng tốc TensorRT
- Sử dụng
accelerate_with_tensorrttrongstreamdiffusion.acceleration.tensorrt - Cấu hình ví dụ truyền vào
stream,"engines",max_batch_size=2 - Cần có phần mở rộng TensorRT và việc build engine sẽ mất thời gian
- Sau khi build engine, tốc độ chạy sẽ nhanh hơn các ví dụ trước đó
Stochastic Similarity Filter
- Stochastic Similarity Filter giảm số lần biến đổi khi đầu vào video có ít thay đổi so với frame trước
- Việc giảm tác vụ biến đổi giúp giảm tải xử lý cho GPU
- Cách dùng là gọi
stream.enable_similar_image_filter() - Các tham số có thể cấu hình
similar_image_filter_threshold: ngưỡng độ tương đồng giữa frame trước và frame hiện tại trước khi tạm dừng xử lýsimilar_image_filter_max_skip_frame: khoảng dừng tối đa được phép trước khi tiếp tục biến đổi
Residual CFG
- RCFG là phương pháp xấp xỉ triển khai CFG với độ phức tạp tính toán có thể cạnh tranh với trường hợp không dùng CFG
- Có thể chỉ định bằng đối số
cfg_typecủaStreamDiffusion - RCFG có hai loại
- RCFG Self-Negative: cách không chỉ định mục negative prompt
- RCFG Onetime-Negative: cách có thể chỉ định negative prompt
- So sánh độ phức tạp tính toán
- Không có CFG: N
- CFG thông thường: 2N
- RCFG Self-Negative: N
- RCFG Onetime-Negative: N+1
- Các giá trị của
cfg_typenhư sau- Không có CFG:
"none" - CFG thông thường:
"full" - RCFG Self-Negative:
"self" - RCFG Onetime-Negative:
"initialize"
- Không có CFG:
deltacó tác dụng làm dịu để điều chỉnh hiệu ứng RCFG
Các mô hình và tài nguyên được sử dụng
- Các demo video và hình ảnh trong kho được tạo bằng LCM-LoRA + KohakuV2, SD-Turbo
- Có thể tải mô hình KohakuV2 từ Civitai và Hugging Face
- SD-Turbo cũng có thể dùng trên Hugging Face Space
1 bình luận
Ý kiến trên Hacker News
Bài báo Arxiv ở đây: https://arxiv.org/abs/2312.12491
Có vẻ có thể làm nhanh hơn cả mức đo mặc định trên 4090. Với SDXL Turbo, đã đạt tới 10fps chỉ với 1 lần lặp ngay cả khi chưa tối ưu
Tuy vậy, các cải tiến như bộ lọc tương đồng xác suất để ngăn sinh ảnh không cần thiết có vẻ rất hữu ích để cho ra kết quả nhanh mà không phải giữ GPU luôn ở mức 100%
Mọi thứ phi thực tế đến khó tin. Cảm giác như 10 năm đã trôi qua chỉ trong 1 năm
apt-get installchúngTôi vừa thử demo
realtime-text2img, và việc dùng npm ở frontend có vẻ hơi quá tay cho mục đích này. Tôi đã đổi để nó chỉ tạo 1 ảnh thay vì 16 ảnh, và nó chạy tốt ngay cả trên laptop RTX-3080. Chắc khoảng 2 ảnh mỗi giâySửa: demo
examples\screencho cảm giác gần như thời gian thực. Cửa sổ hiển thị 4fps nhưng tôi không rõ chính xác nó có nghĩa là gìSửa: tuy nhiên cường độ khử nhiễu của img2img rất thấp, nên ảnh trả về chỉ khác ảnh gốc rất ít
Với các bài báo về mô hình sinh, lúc nào cũng khó đánh giá trước khi tự chạy thử. Vì phải cho reviewer xem nên họ khó tránh khỏi việc đưa vào các kết quả đã được chọn lọc. Tôi không cho đó là tốt, nhưng có lẽ đó là thực tế hiện nay
Ở đây họ có dùng autoencoder nhỏ không? Artspew cũng làm vậy và đạt FPS cao hơn, nhưng không dùng TensorRT mà dùng Triton, còn chất lượng thì tệ hại. Dù vậy vẫn khá ấn tượng
Dù sao thì kể cả khi chất lượng thực tế kém xa những gì được trình bày, nó vẫn rất ấn tượng, nhưng thực sự khó mà biết được
Tôi thắc mắc 100fps có nghĩa là có thể đưa đầu vào mới mỗi 10ms và nhận đầu ra mới mỗi 10ms hay không. Hay là để đạt thông lượng trung bình đó thì phải gom đầu vào thành batch?
Phần chậm của mô hình là bước nạp mô hình. Một khi mô hình đã được nạp xong thì có thể gửi bất kỳ đầu vào nào mình muốn
Theo trực giác của tôi, việc parse và gửi dữ liệu hình ảnh có lẽ không phải nút thắt ở đây
Nó gần như chạy ngay đúng như tài liệu ghi. Phần lớn mấy demo kiểu này thường hay hỏng và ném ra các lỗi sâu khó hiểu, nhưng cái này thì ổn
Làm rất tốt. Đáng để thử. Nếu muốn tạo thứ gì đó không theo phong cách hoạt hình, bạn có thể đổi model trong
server.pycủarealtime-txt2img. Ví dụ chỉ định https://huggingface.co/runwayml/stable-diffusion-v1-5 cũng chạy tốtKết quả thực sự rất nhanh. Không phải xuất sắc, nhưng rất nhanh. Nếu chuyển sang SDXL thông qua LCM-LoRA https://huggingface.co/latent-consistency thì có thể cho kết quả tốt hơn, nhưng từ lúc đó mọi thứ bắt đầu khó hơn và bạn sẽ gặp những vụ crash bí ẩn đã nói ở trên. Đó là điểm mà công việc thực sự bắt đầu xuất hiện
Môi trường của tôi là 4090/3990x/CUDA 12.2/debian sid, và có thể sẽ khác tùy môi trường
Demo nhân vật nữ di chuyển vào ra trong khung hình hoạt động như thế nào? Là ControlNet à?
Trên Apple Silicon thì fps khoảng bao nhiêu?
Tuy vậy, với mức giá hàng refurb hiện tại khoảng 1.800 USD, Studio M1 Max 64GB chậm hơn khoảng 13 lần so với RTX 4090 24GB trong tác vụ AI tạo sinh với SD1.5 và SDXL
Ảnh 512x512, 5 bước được tạo trong 5 giây. Không dùng refiner, upscaler hay phục hồi khuôn mặt
Theo tôi biết thì DrawThings vẫn chưa được tối ưu cho SDXL Turbo hoặc sinh ảnh theo pipeline
Tham khảo thêm: nếu dùng SDXL Base+Refiner, bật phục hồi khuôn mặt và tạo ảnh 2k x 2k với 50 bước thì mất khoảng 120 giây
Đặc biệt nếu là phong cách hoạt hình thì vốn dĩ thường chỉ vẽ 1 khung trên mỗi 2 frame, nên có lẽ 12fps cũng chịu được
Có video nào xem được ở đâu đó không?