- Cần chạy bản demo Stable Diffusion WebGPU trên phiên bản Chrome mới nhất với các cờ "Experimental WebAssembly" và "Experimental WebAssembly JavaScript Promise Integration (JSPI)" được bật.
- Mỗi bước suy luận của bản demo mất khoảng 1 phút, và cần thêm khoảng 10 giây để chạy bộ giải mã VAE nhằm tạo hình ảnh.
- Nếu mở DevTools, tốc độ của bản demo sẽ chậm đi khoảng 2 lần.
- Mô hình UNET được dùng trong bản demo chỉ chạy trên CPU, và tab trình duyệt có thể bị treo, nhưng nhanh hơn khoảng 10% so với chạy trên GPU.
- Số bước tối thiểu để có kết quả chấp nhận được trong bản demo là 20. Tuy nhiên, cho mục đích trình diễn thì 3 bước là đủ.
- Các tệp mô hình được lưu vào bộ nhớ đệm nên không cần tải lại mỗi lần chạy bản demo.
- Nếu gặp lỗi "protobuf parsing failed", bạn có thể vào Application -> Storage trong DevTools để xóa dữ liệu trang web.
- Nếu gặp lỗi "sbox_fatal_memory_exceeded", nghĩa là không có đủ RAM để chạy bản demo. Bạn có thể thử tải lại tab hoặc trình duyệt.
- Bản demo trở nên khả thi nhờ việc chuyển StableDiffusionPipeline từ Python sang JS, đồng thời vá onnxruntime và emscripten+binaryen để hỗ trợ cấp phát và sử dụng hơn 4GB bộ nhớ.
- Hiện tại bản demo chậm vì không hỗ trợ đa luồng và chỉ sử dụng một lõi CPU. Việc thiếu hỗ trợ cho bộ nhớ 64-bit thông qua constructor
WebAssembly.Memory cũng là một hạn chế.
- Bản demo chạy trên GPU, nhưng webgpu và onnxruntime vẫn đang ở giai đoạn đầu nên còn nhiều phần chưa được triển khai. Dữ liệu liên tục được truyền giữa GPU và CPU thông qua JS, khiến tốc độ xử lý chậm. Khi nhiều tác vụ hơn có JS kernel, bản demo sẽ nhanh hơn.
- Có thể chạy bản demo cục bộ bằng mã có sẵn trên GitHub.
- Có thể dùng onnxruntime đã được vá để chạy các LLM lớn với transformers.js, nhưng bị giới hạn ở 8GB bộ nhớ. Với gói đó, có thể tải tối đa khoảng 4GB trọng số.
- Tác giả trước đây đã có kinh nghiệm thêm tăng tốc GPU vào binding của node.js, nên dự định sẽ gửi pull request lên kho lưu trữ onnxruntime.
1 bình luận
Ý kiến trên Hacker News