Cài đặt ComfyUI trên Docker: Quy trình làm việc trực quan cho Stable Diffusion

AI tutorial - IT technology blog
AI tutorial - IT technology blog

Thực trạng hỗn loạn của môi trường AI cục bộ

Chạy Stable Diffusion cục bộ thường bắt đầu như một dự án thú vị nhưng nhanh chóng trở thành một cơn ác mộng DevOps. Hầu hết các hướng dẫn đều gợi ý cài đặt trực tiếp: sao chép một repo, tạo môi trường ảo và chạy script shell. Dù cách này hiệu quả trong 20 phút đầu, nhưng cuối cùng nó sẽ phát sinh lỗi. Bạn cài đặt một Custom Node mới cho ComfyUI, và đột nhiên các phụ thuộc Python bị xung đột, phiên bản CUDA không khớp, hoặc một bản cập nhật thư viện hệ thống xóa sạch cấu hình torch của bạn.

Tôi đã dành nhiều tuần để xử lý lỗi môi trường mỗi khi muốn thử một mô hình hoặc quy trình làm việc (workflow) mới. Việc chia sẻ workflow với đồng nghiệp gần như là không thể vì cấu hình máy cục bộ của họ không bao giờ khớp với máy của tôi. Sự phiền hà khi phải duy trì một môi trường Python riêng cho AI tạo hình trở thành một rào cản lớn khi bạn muốn tập trung vào sự sáng tạo hoặc tự động hóa cấp độ sản xuất.

Nguyên nhân gốc rễ: “Địa ngục” phụ thuộc và cầu nối GPU

Vấn đề cốt lõi không nằm ở bản thân ComfyUI mà là ở nền tảng bên dưới. Stable Diffusion dựa trên sự giao thoa cụ thể của driver NVIDIA, bộ công cụ CUDA, phiên bản PyTorch và hàng tá gói Python. Điểm mạnh lớn nhất của ComfyUI — tính mô-đun thông qua các node tùy chỉnh — cũng chính là điểm yếu về mặt kiến trúc khi cài đặt cục bộ. Mỗi node có thể yêu cầu các phiên bản thư viện khác nhau như insightface hoặc opencv.

Khi bạn chạy trực tiếp trên hệ điều hành, bạn đang buộc các công cụ AI vào trạng thái chung của hệ thống. Nếu bạn cập nhật driver hệ thống hoặc phiên bản Python, bạn có nguy cơ làm hỏng toàn bộ quy trình tạo ảnh. Hơn nữa, việc ánh xạ một GPU vật lý sang lớp phần mềm yêu cầu cấu hình chính xác mà các môi trường ảo tiêu chuẩn không thể cô lập hoàn toàn.

Giải pháp: Container hóa ComfyUI

Để giải quyết vấn đề này, chúng ta chuyển toàn bộ hạ tầng vào Docker. Bằng cách sử dụng NVIDIA Container Toolkit, chúng ta có thể truyền sức mạnh của GPU vào một container biệt lập trong khi vẫn giữ cho hệ thống máy chủ sạch sẽ. Cách tiếp cận này đảm bảo rằng môi trường bên trong container luôn giống nhau mỗi khi khởi động, bất kể điều gì xảy ra trên hệ điều hành chính của bạn.

Tôi đã áp dụng phương pháp này trong thực tế sản xuất và kết quả luôn ổn định. Nó cho phép sao lưu dễ dàng, di chuyển nhanh chóng giữa các máy chủ và cung cấp nút “reset” nếu việc cài đặt node tùy chỉnh gặp lỗi.

Bước 1: Chuẩn bị hệ thống máy chủ

Trước khi đụng đến Docker, máy chủ của bạn cần có driver NVIDIA chính xác. Bạn không cần cài đặt đầy đủ bộ công cụ CUDA trên máy chủ (container sẽ xử lý việc đó), nhưng driver phải có sẵn. Trên hệ thống Linux (Ubuntu/Debian), hãy đảm bảo driver của bạn đã được cập nhật:

nvidia-smi

Nếu lệnh đó trả về chi tiết GPU của bạn, bạn đã sẵn sàng. Tiếp theo, hãy cài đặt NVIDIA Container Toolkit. Đây là cầu nối cho phép Docker “nhìn thấy” phần cứng của bạn:

curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
  && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
    sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
    sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker

Bước 2: Thiết kế cấu hình Docker Compose

Thay vì chạy một lệnh docker run dài dòng và lộn xộn, chúng ta sử dụng Docker Compose. Điều này cho phép chúng ta xác định các volume (nơi lưu trữ mô hình và kết quả đầu ra) và các biến môi trường trong một tệp YAML gọn gàng. Hãy tạo một thư mục tên là comfyui-docker và thêm tệp docker-compose.yml:

services:
  comfyui:
    image: yanagiwara/comfyui-docker:latest-cuda12.1 # Hoặc một image uy tín tương tự
    container_name: comfyui
    runtime: nvidia
    environment:
      - NVIDIA_VISIBLE_DEVICES=all
    ports:
      - "8188:8188"
    volumes:
      - ./storage/models:/home/user/ComfyUI/models
      - ./storage/output:/home/user/ComfyUI/output
      - ./storage/input:/home/user/ComfyUI/input
      - ./storage/custom_nodes:/home/user/ComfyUI/custom_nodes
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]
    restart: unless-stopped

Cấu hình này ánh xạ các thư mục cục bộ trên ổ cứng của bạn vào các thư mục bên trong ComfyUI. Điều này rất quan trọng: bạn không muốn các mô hình nặng 5GB được lưu trữ bên trong bộ nhớ tạm thời của container. Nếu container bị xóa, các mô hình và hình ảnh đã tạo của bạn vẫn an toàn trong thư mục ./storage.

Bước 3: Khởi chạy và thiết lập ban đầu

Chạy hệ thống bằng một lệnh duy nhất:

docker compose up -d

Sau khi image được tải xuống và khởi động, hãy mở trình duyệt và truy cập http://localhost:8188. Bạn sẽ thấy biểu đồ mặc định của ComfyUI. Tuy nhiên, nó sẽ chưa hoạt động ngay vì bạn chưa thêm mô hình checkpoint.

Di chuyển các tệp .safetensors của bạn (như SDXL hoặc SD1.5) vào thư mục ./storage/models/checkpoints. Tải lại giao diện, và mô hình sẽ xuất hiện trong node “Load Checkpoint”. Bằng cách giữ thư mục custom_nodes dưới dạng volume được ánh xạ, bạn vẫn có thể sử dụng ComfyUI Manager để cài đặt các node, và chúng sẽ tồn tại ngay cả khi bạn cập nhật Docker image sau này.

Quản lý trạng thái và các Node tùy chỉnh

Một trở ngại phổ biến với Docker là xử lý các yêu cầu (requirements) Python cho các node mới. Hầu hết các Docker image ComfyUI hiện đại đều được thiết lập để tự động cài đặt các phụ thuộc tìm thấy trong tệp requirements.txt của node khi khởi động. Nếu bạn cài đặt một node phức tạp và nó không tải được, chỉ cần khởi động lại container:

docker compose restart comfyui

Nhật ký (logs) sẽ cho bạn biết chính xác thư viện nào còn thiếu, cho phép bạn gỡ lỗi mà không làm ảnh hưởng đến hệ điều hành của máy chủ. Sự cô lập này là phần tôi thích nhất trong quy trình làm việc. Nếu một phiên bản node cụ thể làm hỏng mọi thứ, tôi chỉ cần xóa thư mục đó trong custom_nodes và tôi sẽ quay lại trạng thái sạch sẽ.

Lời kết

Chuyển ComfyUI sang Docker biến nó từ một đoạn script dễ lỗi thành một phần hạ tầng đáng tin cậy. Bạn có khả năng di chuyển toàn bộ không gian làm việc AI giữa máy trạm cục bộ và một máy chủ GPU đám mây chỉ bằng cách đồng bộ hóa thư mục storage và tệp docker-compose.yml. Nó loại bỏ cái cớ “chạy tốt trên máy tôi” và cho phép bạn tập trung vào việc xây dựng các quy trình dựa trên node phức tạp cho Stable Diffusion mà không lo lắng về việc lệnh pip install tiếp theo sẽ làm hỏng ngày làm việc của mình.

Share: