1 điểm bởi GN⁺ 2023-12-25 | 1 bình luận | Chia sẻ qua WhatsApp
  • 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-txt2imgdemo/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 StableDiffusionPipeline củ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.12491Hugging 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.10 hoặc venv
  • 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
  • Cách cài đặt cho người dùng
  • 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 all sau docker 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 StableDiffusionPipeline của Diffusers rồi bọc bằng StreamDiffusion
  • Ví dụ Img2Img tải mô hình KBlueLeaf/kohaku-v2.1 và cấu hình stream với t_index_list=[32, 45]
    • Nếu mô hình không phải LCM thì dùng load_lcm_lora()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()
  • Ví dụ Txt2Img dùng t_index_list=[0, 16, 32, 45] và khuyến nghị dùng cfg_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_tensorrt trong streamdiffusion.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_type của StreamDiffusion
  • 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_type như sau
    • Không có CFG: "none"
    • CFG thông thường: "full"
    • RCFG Self-Negative: "self"
    • RCFG Onetime-Negative: "initialize"
  • delta có 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

1 bình luận

 
GN⁺ 2023-12-25
Ý 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

    • Nếu thứ này có thể làm thay công việc của tôi, tôi chỉ đang chờ đến lúc có thể chạy nó trên PC và nối với Slack. Khi đó chủ lao động vẫn nhận được kết quả gần giống như tôi tự làm bằng tay, còn tôi thì vẫn lĩnh lương mà không cần thật sự dành thời gian làm việc, cuối cùng có thể tập trung vào sở thích của mình. Rốt cuộc mọi thứ đều đang đi theo hướng đó đúng không?
    • Toàn bộ hệ sinh thái AI mã nguồn mở lúc này đều mang lại cảm giác như vậy. Gần như ngày nào cũng có một bước tiến mới biến điều từng bị xem là bất khả thi thành khả thi, và thực sự rất khó để theo kịp các thay đổi
    • Là một lập trình viên frontend, giờ tôi đã hiểu những người từng than phiền rằng thế giới frontend thay đổi quá nhanh nên không thể theo kịp
    • Những phần mềm này phát triển còn nhanh hơn cả tốc độ tôi apt-get install chúng
    • Nó làm tôi nhớ đến game tăng trưởng dần (https://www.reddit.com/r/incremental_games/). Nhưng tốt nhất là đừng bắt đầu mấy game đó. Kỳ nghỉ của bạn có thể bị phá hỏng
  • Tô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ây
    Sửa: demo examples\screen cho 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

    • Tôi tò mò về chất lượng thực tế, độ đa dạng và mức độ bám prompt. Mấy ngày nay tôi không dùng được GPU nên chưa thể tự kiểm tra
      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?

    • Tôi chưa tự thử, nhưng đoán là có lẽ không cần xử lý theo 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.py của realtime-txt2img. Ví dụ chỉ định https://huggingface.co/runwayml/stable-diffusion-v1-5 cũng chạy tốt
    Kế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 à?

    • Đó là đầu vào video. Theo bài viết, bộ lọc tương đồng xác suất làm giảm số lần chuyển đổi khi các khung hình video đầu vào ít thay đổi so với khung hình trước, nhờ đó giảm tải xử lý GPU. Các khung màu đỏ trong GIF phía trên là ví dụ cho việc đó
    • Hiện đang có một issue trên GitHub để bổ sung hỗ trợ ControlNet, nên có vẻ đây không phải ControlNet. Có vẻ chỉ là img2img dùng prompt và thang rcfg
    • Vậy có nghĩa là bên trái là ảnh gốc còn bên phải là ảnh kết quả đúng không?
  • Trên Apple Silicon thì fps khoảng bao nhiêu?

    • Vì không có hỗ trợ MPS nên là 0
      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
    • Tôi đang chạy SDXL Turbo bằng DrawThings trên M1 Pro với 32GB RAM
      Ả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
    • Ít nhất chắc cũng đạt khoảng 1/8, nhưng nếu Apple chạy được tối thiểu 24fps thì sẽ cực kỳ lớn. Có thể với một chút nội suy thì làm được
      Đặ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?