Hiểu rõ Stable Diffusion Samplers: Hướng dẫn từng bước chi tiết

Stable Diffusion Samplers có nhiều phương pháp thu thập mẫu có sẵn trong AUTOMATIC1111. Euler a, Heun, DDIM, … Những bộ thu thập mẫu này là gì? Làm thế nào để chúng hoạt động? Sự khác biệt giữa chúng là gì? Bạn sẽ tìm thấy câu trả lời trong bài viết này.

Chúng ta sẽ thảo luận về các bộ thu thập mẫu có sẵn trong giao diện người dùng AUTOMATIC1111 Stable Diffusion. Bạn có thể sử dụng giao diện này trên Windows, Mac hoặc Google Colab.

Khái niệm về Sampling là gì?

Stable Diffusion Samplers

The sampler is responsible for carrying out the denoising steps

Để tạo ra một hình ảnh, Stable Diffusion trước tiên tạo ra một hình ảnh hoàn toàn ngẫu nhiên trong không gian tiềm ẩn. Sau đó, bộ dự đoán nhiễu ước tính nhiễu của hình ảnh. Nhiễu dự đoán được trừ đi khỏi hình ảnh. Quá trình này được lặp lại một tá lần. Cuối cùng, bạn sẽ có được một hình ảnh sạch.

Quá trình làm sạch nhiễu này được gọi là thu thập mẫu vì Stable Diffusion tạo ra một hình ảnh mẫu mới ở mỗi bước. Phương pháp được sử dụng trong quá trình này được gọi là bộ thu thập mẫu (the sampler) hoặc phương pháp thu thập mẫu (sampling method).

Thu thập mẫu chỉ là một phần của mô hình Stable Diffusion. Nếu bạn muốn hiểu toàn bộ mô hình, hãy đọc bài viết “Stable Diffusion hoạt động như thế nào?”.

Dưới đây là quá trình thu thập mẫu trong hoạt động. Bộ thu thập mẫu dần dần tạo ra những hình ảnh sạch hơn và sạch hơn.

Stable Diffusion Samplers

Images after each denoising step

Mặc dù khung nhìn là giống nhau, nhưng có nhiều cách khác nhau để thực hiện quá trình làm sạch nhiễu này. Điều này thường là sự cân đối giữa tốc độ và độ chính xác.

Noise schedule (Lịch trình nhiễu)

Bạn nhất định đã nhận thấy rằng hình ảnh có nhiễu dần dần biến thành một hình ảnh rõ ràng. Lịch trình nhiễu điều khiển mức độ nhiễu tại mỗi bước thu thập mẫu. Mức độ nhiễu cao nhất ở bước đầu tiên và dần giảm về không ở bước cuối cùng.

Tại mỗi bước, nhiệm vụ của bộ thu thập mẫu là tạo ra một hình ảnh với mức độ nhiễu phù hợp với lịch trình nhiễu.

Stable Diffusion Samplers

Noise schedule for 15 sampling steps

Hiệu ứng của việc tăng số bước thu thập mẫu là gì? Mức giảm nhiễu nhỏ hơn giữa mỗi bước. Điều này giúp giảm thiểu lỗi cắt bỏ trong quá trình thu thập mẫu.

So sánh lịch trình nhiễu của 15 bước và 30 bước dưới đây.

Stable Diffusion Samplers

Noise schedule for 30 sampling steps

Samplers overview (Tổng quan về các bộ thu thập mẫu)

Vào thời điểm viết bài, có 19 samplers có sẵn trong AUTOMATIC1111. Số lượng này dường như đang tăng theo thời gian. Những samplers có khác biệt gì?

Stable Diffusion Samplers

Samplers in AUTOMATIC1111

Bạn sẽ tìm hiểu chúng là gì trong phần sau của bài viết này. Các chi tiết kỹ thuật có thể khiến bạn bị áp đảo. Vì vậy, tôi sẽ cung cấp một cái nhìn tổng quan để giúp bạn có được ý tưởng chung về chúng.

Old-School ODE solvers (Các giải pháp phương trình vi phân cổ điển)

Hãy bắt đầu với những bộ thu thập mẫu dễ dàng trước. Một số bộ thu thập mẫu trong danh sách này được phát minh hơn một trăm năm trước. Chúng là các giải pháp cổ điển cho phương trình vi phân thường (ODE).

  • Euler – Giải pháp đơn giản nhất có thể.
  • Heun – Một phiên bản chính xác hơn nhưng chậm hơn của Euler.
  • LMS (Phương pháp đa bước tuyến tính) – Tốc độ giống như Euler nhưng (có thể) chính xác hơn.

Ancestral samplers (Các bộ thu thập mẫu tổ tiên)

Bạn có thấy một số tên bộ thu thập mẫu có một chữ cái “a”?

  • Euler a
  • DPM2 a
  • DPM++ 2S a
  • DPM++ 2S a Karras

Chúng là ancestral samplers. Bộ thu thập mẫu tổ tiên thêm nhiễu vào hình ảnh tại mỗi bước thu thập mẫu. Chúng là bộ thu thập mẫu ngẫu nhiên vì kết quả thu thập mẫu có một số sự ngẫu nhiên.

Hãy nhớ rằng nhiều bộ thu thập mẫu khác cũng là bộ thu thập mẫu ngẫu nhiên, mặc dù tên của chúng không có chữ “a”.

Nhược điểm của việc sử dụng bộ thu thập mẫu tổ tiên là hình ảnh sẽ không hội tụ. So sánh các hình ảnh được tạo ra bằng cách sử dụng Euler a và Euler dưới đây.

Stable Diffusion Samplers

Euler a does not converge. (sample steps 2 – 40)

Stable Diffusion Samplers

Euler converges. (sampling steps 2-40)

Hình ảnh được tạo ra bằng Euler a không hội tụ ở các bước thu thập mẫu cao. Ngược lại, hình ảnh từ Euler hội tụ tốt.

Đối với tính nhất quán có thể tái tạo, việc hình ảnh hội tụ là mong muốn. Nếu bạn muốn tạo ra các biến thể nhỏ, bạn nên sử dụng “variational seed”.

Karras noise schedule (Lịch trình nhiễu Karras)

Các bộ thu thập mẫu có nhãn “Karras” sử dụng lịch trình nhiễu được khuyến nghị trong bài viết của Karras. Nếu nhìn kỹ, bạn sẽ thấy kích thước bước nhiễu nhỏ hơn gần cuối. Họ đã phát hiện ra rằng điều này cải thiện chất lượng của hình ảnh.

Stable Diffusion Samplers

Comparison between the default and Karras noise schedule

DDIM và PLMS

DDIM (Mô hình ngẫu nhiên làm sạch định rõ) và PLMS (Phương pháp đa bước giả định tuyến tính) là những bộ thu thập mẫu được tích hợp trong phiên bản ban đầu của Stable Diffusion v1. DDIM là một trong những bộ thu thập mẫu đầu tiên được thiết kế cho các mô hình truyền tải. PLMS là một lựa chọn mới hơn và nhanh hơn thay thế cho DDIM.

Những bộ thu thập mẫu này thường được xem là lỗi thời và không còn phổ biến sử dụng nữa.

DPM và DPM++

DPM (Giải pháp mô hình xác suất truyền tải) và DPM++ là các bộ thu thập mẫu mới được thiết kế cho các mô hình truyền tải được phát hành vào năm 2022. Chúng đại diện cho một loạt các giải pháp có kiến trúc tương tự.

DPMDPM2 tương tự nhau, chỉ khác nhau ở chỗ DPM2 là bậc hai (chính xác hơn nhưng chậm hơn).

DPM++ cải tiến hơn so với DPM.

DPM có điều chỉnh kích thước bước một cách linh hoạt. Tuy nhiên, nó có thể chậm vì không đảm bảo hoàn thành trong số bước thu thập mẫu.

UniPC

UniPC (Tổng hợp Dự đoán-Chỉnh sửa) là một bộ thu thập mẫu mới được ra mắt vào năm 2023. Lấy cảm hứng từ phương pháp dự đoán-chỉnh sửa trong các giải pháp giải phương trình vi phân, UniPC có thể tạo ra hình ảnh chất lượng cao trong 5-10 bước.

k-diffusion

Cuối cùng, bạn có thể đã nghe đến thuật ngữ k-diffusion và tự hỏi điều đó có ý nghĩa gì. Nó chỉ đề cập đến kho lưu trữ GitHub k-diffusion của Katherine Crowson và các bộ thu thập mẫu liên quan.

Kho lưu trữ này thực hiện các samplers được nghiên cứu trong bài viết Karras năm 2022.

Tất cả các bộ thu thập mẫu trong AUTOMATIC1111, ngoại trừ DDIM, PLMS và UniPC, đều được mượn từ k-diffusion.

Xem thêm: Đột phá công nghệ AI: Tạo hình ảnh con người thực tế với Stable Diffusion

Evaluating samplers (Đánh giá bộ thu thập mẫu)

Làm thế nào để chọn một bộ thu thập mẫu? Bạn sẽ thấy một số so sánh khách quan trong phần này để giúp bạn quyết định.

Hội tụ hình ảnh

Trong phần này, tôi sẽ tạo ra cùng một hình ảnh bằng cách sử dụng các bộ thu thập mẫu khác nhau với tối đa 40 bước thu thập mẫu. Hình ảnh cuối cùng ở bước thứ 40 được sử dụng như một tham chiếu để đánh giá tốc độ hội tụ của việc thu thập mẫu. Phương pháp Euler sẽ được sử dụng làm tham chiếu.

Euler, DDIM, PLMS, LMS Karras và Heun

Đầu tiên, hãy xem xét nhóm Euler, DDIM, PLMS, LMS Karras và Heun vì chúng đại diện cho các giải pháp giải phương trình vi phân cổ điển hoặc giải pháp truyền tải gốc. DDIM hội tụ vào khoảng số bước như Euler nhưng với nhiều biến thể hơn. Điều này là do nó tiêm nhiễu ngẫu nhiên trong các bước thu thập mẫu của mình.

Image convergence of Euler, DDIM, PLMS, LMS Karras and Heun (Lower is better)

PLMS không đạt kết quả tốt trong bài kiểm tra này.

LMS Karras có vẻ gặp khó khăn trong việc hội tụ và đã ổn định ở một ngưỡng cao hơn.

Heun hội tụ nhanh hơn nhưng chậm hơn gấp đôi vì nó là một phương pháp bậc hai. Vì vậy, chúng ta nên so sánh Heun ở 30 bước với Euler ở 15 bước, ví dụ.

Ancestral samplers (các bộ thu thập mẫu tổ tiên)

Nếu mục tiêu của bạn là tạo ra hình ảnh ổn định, có thể tái tạo, bạn không nên sử dụng các bộ thu thập mẫu tổ tiên. Tất cả các bộ thu thập mẫu tổ tiên không hội tụ.

Stable Diffusion Samplers

Ancestral samplers do not converge well (Lower is better)

DPM và DPM2

DPM fast không hội tụ tốt. DPM2DPM2 Karras hoạt động tốt hơn Euler nhưng lại chậm hơn gấp đôi.

DPM adaptive thích ứng tốt vì nó sử dụng các bước thu thập mẫu thích ứng riêng của nó. Nó có thể rất chậm.

Convergence of DPM samplers (Lower the better)

Các bộ giải DPM++

DPM++ SDE DPM++ SDE Karras gặp các nhược điểm tương tự như các bộ thu thập mẫu tổ tiên. Họ không chỉ không hội tụ, mà hình ảnh cũng dao động đáng kể khi số bước thay đổi.

DPM++ 2MDPM++ 2M Karras hoạt động tốt. Biến thể Karras hội tụ nhanh hơn khi số bước đủ lớn.

Convergence of DPM++ samplers (Lower the better)

UniPC

UniPC hội tụ chậm hơn Euler một chút, nhưng không quá tệ.

Tốc độ

Mặc dù DPM adaptive thích ứng hoạt động tốt trong việc hội tụ, nó cũng là bộ thu thập mẫu chậm nhất.

Bạn có thể đã nhận thấy rằng thời gian xuất phát còn lại chia thành hai nhóm, với nhóm đầu tiên mất khoảng cùng một thời gian (khoảng 1x), và nhóm thứ hai mất khoảng gấp đôi thời gian (khoảng 2x). Điều này phản ánh thứ tự của các bộ giải. Các bộ giải bậc hai, mặc dù chính xác hơn, cần phải đánh giá mạng U-Net làm sạch nhiễu hai lần. Vì vậy, chúng chậm hơn gấp đôi.

Chất lượng

Tất nhiên, tốc độ và hội tụ không có nghĩa gì nếu hình ảnh nhìn rất kém.

Hình ảnh cuối cùng

Hãy trước tiên xem các mẫu của hình ảnh.

Stable Diffusion Samplers

Euler

Stable Diffusion Samplers

Heun

Stable Diffusion Samplers

DDIM

Stable Diffusion Samplers

PLMS

Stable Diffusion Samplers

LMS Karras

Stable Diffusion Samplers

Euler a

Stable Diffusion Samplers

DPM2

Stable Diffusion Samplers

DPM2 a

Stable Diffusion Samplers

DPM2 a Karras

Stable Diffusion Samplers

DPM2 Karras

Stable Diffusion Samplers

DPM ++2M Karras

Stable Diffusion Samplers

DPM++ 2S a Karras

Stable Diffusion Samplers

DPM++ 2S a

Stable Diffusion Samplers

DPM++ adaptive

Stable Diffusion Samplers

DPM++ fast

Stable Diffusion Samplers

DPM++ SDE Karras

Stable Diffusion Samplers

DPM++ SDE

Stable Diffusion Samplers

UniPC

DPM++ nhanh không thành công. Ancestral samples không hội tụ đến hình ảnh mà các bộ thu thập mẫu khác đã hội tụ.

Các bộ thu thập mẫu tổ tiên thường hội tụ đến một hình ảnh con mèo, trong khi các bộ giải quyết định hội tụ đến một con mèo. Không có câu trả lời chính xác nào nếu chúng trông tốt đối với bạn.

Chất lượng hình ảnh

Một hình ảnh vẫn có thể trông tốt ngay cả khi nó chưa hội tụ. Hãy xem xét cách nhanh chóng mỗi bộ thu thập mẫu có thể tạo ra một hình ảnh chất lượng cao.

Bạn sẽ thấy chất lượng thị giác được đo lường bằng BRISQUE (Bộ đo chất lượng hình ảnh không tham chiếu/điều chỉnh không gian). Nó đo lường chất lượng của các hình ảnh tự nhiên.

DDIM thực sự hoạt động rất tốt ở đây, có thể tạo ra hình ảnh chất lượng cao nhất trong nhóm chỉ trong 8 bước.

The image quality of DDIM, PLMS, Heun and LMS Karras (Lower the better)

Ngoại trừ một hoặc hai ngoại lệ, tất cả các bộ thu thập mẫu tổ tiên hoạt động tương tự như Euler trong việc tạo ra hình ảnh chất lượng.

The image quality of ancestral samplers (Lower the better)

Các bộ thu thập mẫu DPM2 hơi vượt trội so với Euler.

The image quality of DPM samplers (Lower the better)

Các bộ giải DPM++ SDEDPM++ SDE Karras hoạt động tốt nhất trong bài kiểm tra chất lượng này.

The image quality of DPM++ samplers (Lower the better)

UniPC hơi tồi hơn Euler ở các bước thấp, nhưng tương đương với nó ở các bước cao.

The image quality of the UniPC sampler (Lower the better)

Vậy… bộ thu thập mẫu nào là tốt nhất?

Dưới đây là những đề xuất:

1. Nếu bạn muốn sử dụng một cái gì đó nhanh, hội tụ, mới và có chất lượng tốt, những lựa chọn xuất sắc là:

  • DPM++ 2M Karras với 20 – 30 bước
  • UniPC với 20-30 bước.

2. Nếu bạn muốn có hình ảnh chất lượng tốt và không quan tâm đến hội tụ, những lựa chọn tốt là:

  • DPM++ SDE Karras với 10-15 bước (Lưu ý: Đây là một bộ thu thập mẫu chậm hơn)
  • DDIM với 10-15 bước.

3. Tránh sử dụng bất kỳ bộ thu thập mẫu tổ tiên nào nếu bạn ưa thích hình ảnh ổn định, có thể tái tạo.

4. Euler Heun là những lựa chọn tốt nếu bạn thích một cái gì đó đơn giản. Giảm số bước cho Heun để tiết kiệm thời gian.

Giải thích về các bộ thu thập mẫu (Samplers)

Bạn sẽ tìm thấy thông tin về các bộ thu thập mẫu (samplers) có sẵn trong AUTOMATIC1111. Các bộ thu thập mẫu này hoạt động bên trong đều có tính chất toán học. Tôi chỉ sẽ giải thích chi tiết về Euler (bộ thu thập mẫu đơn giản nhất). Nhiều bộ thu thập mẫu khác chia sẻ các yếu tố của Euler.

Euler

Euler là bộ thu thập mẫu đơn giản nhất có thể. Toán học của nó hoàn toàn giống với phương pháp Euler để giải các phương trình vi phân thường. Nó hoàn toàn xác định, có nghĩa là không thêm nhiễu ngẫu nhiên vào quá trình thu thập mẫu.

Dưới đây là các bước của quá trình thu thập mẫu từng bước.

Bước 1: Dự đoán nhiễu ước tính hình ảnh từ hình ảnh ẩn.

Bước 2: Tính toán lượng nhiễu cần được trừ đi theo lịch trình nhiễu. Đó là sự khác biệt về nhiễu giữa bước hiện tại và bước tiếp theo.

Bước 3: Trừ đi hình ảnh ẩn bằng hình ảnh nhiễu chuẩn hóa (từ bước 1) nhân với lượng nhiễu cần giảm (từ bước 2).

Lặp lại các bước 1 đến 3 cho đến cuối lịch trình nhiễu.

Noise schedule (Lịch trình nhiễu)

Nhưng làm thế nào để bạn biết lượng nhiễu ở mỗi bước? Trên thực tế, đây là điều bạn thông báo cho bộ thu thập mẫu.

Lịch trình nhiễu thông báo cho bộ thu thập mẫu có bao nhiêu nhiễu cần có ở mỗi bước. Tại sao mô hình cần thông tin này? Dự đoán nhiễu ước tính nhiễu trong hình ảnh ẩn dựa vào tổng lượng nhiễu cần có. (Đây là cách nó được huấn luyện.)

Stable Diffusion Samplers

A noise schedule for 15 sampling steps

Có lượng nhiễu cao nhất ở bước đầu tiên. Nhiễu dần giảm và giảm xuống không ở bước cuối cùng.

Thay đổi số bước thu thập mẫu sẽ thay đổi lịch trình nhiễu. Hiệu quả, lịch trình nhiễu trở nên mượt hơn. Số bước thu thập mẫu cao hơn có sự giảm nhiễu nhỏ hơn giữa hai bước bất kỳ. Điều này giúp giảm thiểu lỗi cắt bỏ.

Từ thu thập mẫu ngẫu nhiên đến xác định

Bạn có tự hỏi tại sao bạn có thể giải một vấn đề thu thập mẫu ngẫu nhiên với một bộ giải phương trình vi phân xác định? Điều này được gọi là hình thức luồng xác suất. Thay vì giải quyết cách một mẫu tiến triển, bạn giải quyết sự tiến triển của phân phối xác suất của nó. Điều này giống như giải quyết phân phối xác suất thay vì quỹ đạo mẫu trong một quá trình ngẫu nhiên.

So với quá trình trôi, các bộ giải phương trình vi phân này sử dụng các ánh xạ sau đây.

  • Thời gian → nhiễu
  • Định lượng thời gian → lịch trình nhiễu
  • Vị trí → hình ảnh ẩn
  • Vận tốc → Nhiễu dự đoán
  • Vị trí ban đầu → Ảnh ẩn ngẫu nhiên ban đầu
  • Vị trí cuối cùng → Ảnh ẩn cuối cùng trong sáng

Ví dụ về quá trình thu thập mẫu

Dưới đây là ví dụ về quá trình chuyển đổi từ văn bản thành hình ảnh sử dụng phương pháp Euler. Lịch trình nhiễu xác định mức độ nhiễu ở mỗi bước. Nhiệm vụ của bộ thu thập mẫu là giảm nhiễu đúng lượng trong mỗi bước để phù hợp với lịch trình nhiễu cho đến khi nhiễu giảm xuống không ở bước cuối cùng.

Stable Diffusion Samplers

Denoising with Euler’s method and 15 sampling steps

Euler a

Euler ancestral (Euler a) sampler tương tự bộ thu thập mẫu của Euler. Nhưng ở mỗi bước, nó trừ đi nhiễu nhiều hơn nên lại thêm một số nhiễu ngẫu nhiên để phù hợp với lịch trình nhiễu. Hình ảnh đã được loại nhiễu phụ thuộc vào nhiễu cụ thể được thêm vào trong các bước trước. Vì vậy, đây là bộ thu thập mẫu tổ tiên, nghĩa là quá trình hình ảnh loại nhiễu phụ thuộc vào các nhiễu ngẫu nhiên cụ thể được thêm vào trong mỗi bước. Kết quả sẽ khác nhau nếu bạn thực hiện lại quá trình này.

DDIM

Denoising Diffusion Implicit Models (DDIM) là một trong những bộ thu thập mẫu đầu tiên được sử dụng để giải các mô hình truyền tải. Nó dựa trên ý tưởng rằng hình ảnh ở mỗi bước có thể được xấp xỉ bằng cách thêm ba thành phần sau đây.

  • Hình ảnh cuối cùng
  • Hướng hình ảnh chỉ đến hình ảnh ở bước hiện tại
  • Nhiễu ngẫu nhiên

Làm thế nào chúng ta biết hình ảnh cuối cùng trước khi đến bước cuối cùng? Bộ thu thập mẫu DDIM xấp xỉ nó bằng hình ảnh đã được loại nhiễu. Tương tự, hướng hình ảnh được xấp xỉ bằng nhiễu được ước tính bởi bộ dự đoán nhiễu.

LMS và LMS Karras

Giống như phương pháp Euler, phương pháp linear multistep (LMS) là một phương pháp tiêu chuẩn để giải các phương trình vi phân thường. Nó nhằm mục tiêu cải thiện độ chính xác bằng cách sử dụng thông minh các giá trị của các bước thời gian trước đó. AUTOMATIC1111 mặc định sử dụng tới 4 giá trị cuối cùng.

LMS Karras sử dụng lịch trình nhiễu của Karras.

Heun

Phương pháp Heun là một cải tiến chính xác hơn của phương pháp Euler. Nhưng nó cần dự đoán nhiễu hai lần trong mỗi bước, nên chậm gấp đôi so với Euler.

Bộ thu thập mẫu DPM

Các giải pháp Mô hình xác suất truyền tải (DPM-Solvers) thuộc về một họ các giải pháp mới được phát triển cho các mô hình truyền tải. Dưới đây là các giải pháp trong AUTOMATIC1111.

  • DPM2
  • DPM2 Karras
  • DPM2 a
  • DPM2 a Karras
  • DPM Fast
  • DPM adaptive
  • DPM Karras

DPM2 là DPM-Solver-2 (Algorithm 1) của bài viết DPM-Solver. Giải pháp này chính xác đến bậc hai.

DPM2 Karras giống DPM2 ngoại trừ việc sử dụng lịch trình nhiễu của Karras.

DPM2 a gần như giống DPM2, trừ việc thêm nhiễu vào mỗi bước thu thập mẫu. Điều này làm cho nó trở thành bộ thu thập mẫu tổ tiên.

DPM2 a Karras gần như giống DPM2 a, trừ việc sử dụng lịch trình nhiễu của Karras.

DPM Fast là một biến thể của giải pháp DPM với lịch trình nhiễu đồng nhất. Nó chính xác đến bậc một. Vì vậy, nó nhanh gấp đôi DPM2.

DPM adaptive là một giải pháp DPM bậc một với lịch trình nhiễu điều chỉnh. Nó bỏ qua số bước bạn đặt và tự định kỳ xác định số bước của riêng nó.

Bộ thu thập mẫu DPM++ là phiên bản cải tiến của DPM.

UniPC

UniPC (Unified Predictor Corrector method) là một sampler truyền tải được phát triển mới vào năm 2023. Nó bao gồm hai phần:

  • Unified predictor (UniP) – dự đoán thống nhất
  • Unified corrector (UniC) – sửa chữa thống nhất

Nó hỗ trợ bất kỳ giải pháp nào và bộ dự đoán nhiễu.

Để biết thêm thông tin chi tiết về Stable Diffusion có thể tìm hiểu thêm tại khóa học Stable Diffusion – Midjourney tại Arcline Academy hoặc có thể tham khảo thêm thông tin các khóa học khác tại đây       

Trụ sở chính: 32/19 Nghĩa Hòa, Phường 06, Q. Tân Bình, TPHCM (Nhà Thờ Nghĩa Hòa – Khu Bắc Hải)

Trụ sở miền Tây: L30-09, Đường số 43, Khu Dân cư Stella Megacity, P. Bình Thủy, Q. Bình Thủy, Tp. Cần Thơ

Hotline: 0988 363 967

Comments are closed.