DEV Community

Review Laptop
Review Laptop

Posted on Originally published at reviewlaptop.vn

Tối ưu thời gian build Docker image chạy LLM cho máy 16GB RAM

Nhiều lập trình viên khi đóng gói môi trường chạy Local LLM (như llama.cpp hay server API Python) thường dồn tất cả công cụ biên dịch C++, CUDA toolkit và thư viện vào một Dockerfile duy nhất. Hậu quả là dung lượng image phình to hơn 10GB và mỗi lần đổi một dòng mã nguồn lại ngồi chờ hàng chục phút để đóng gói lại.

Multi-stage build và BuildKit: Tận dụng layer cache thực tế

Classic builder của Docker xử lý tuần tự và cache kém hiệu quả khi gặp các bước cài đặt thư viện nặng. Chuyển sang BuildKit (DOCKER_BUILDKIT=1) cho phép thực thi song song các stage độc lập và mount cache trực tiếp cho pip hoặc apt.

# syntax=docker/dockerfile:1
FROM python:3.11-slim AS builder
WORKDIR /app
RUN apt-get update && apt-get install -y --no-install-recommends build-essential
COPY requirements.txt .
RUN --mount=type=cache,target=/root/.cache/pip \
    pip wheel --no-cache-dir --no-deps --wheel-dir /app/wheels -r requirements.txt

FROM python:3.11-slim
WORKDIR /app
COPY --from=builder /app/wheels /wheels
RUN pip install --no-cache /wheels/*
COPY ./app .
CMD ["python", "server.py"]
Enter fullscreen mode Exit fullscreen mode

Khác biệt thời gian giữa các kịch bản build:

  • Cold build (không cache): Classic builder mất khoảng 8–12 phút để tải layer và compile wheel; BuildKit rút ngắn còn khoảng 4–6 phút nhờ song song hóa.
  • Cached build (chỉ sửa file mã nguồn): Classic builder mất 1–2 phút do quét lại layer; BuildKit chỉ mất 3–8 giây do cache hit 100% các layer dependency.

3 đánh đổi khi build container cho Local LLM

  • Đánh đổi 1: Dung lượng image và tốc độ build. Multi-stage build giảm kích thước image runtime xuống dưới 500MB (loại bỏ toàn bộ gcc/g++), nhưng lượt cold build đầu tiên tốn thêm CPU do phải tạo wheel trung gian.
  • Đánh đổi 2: Build cross-platform ARM64 và AMD64. Khi build image x86_64 trên chip ARM (hoặc ngược lại) qua QEMU emulation, thời gian build có thể lâu gấp 4–8 lần so với build native. Trừ khi cần đẩy image lên registry cho server khác, bạn nên ưu tiên build native cho kiến trúc máy hiện tại.
  • Đánh đổi 3: Phân bổ RAM cho Docker daemon. Các tác vụ biên dịch C++ hay nạp thư viện AI dễ làm Docker daemon ngốn sạch RAM hệ thống. Khi cấu hình container chạy mô hình, mức RAM 16GB chỉ vừa vặn cho các model nhỏ dưới 7B; bạn cần tính toán kỹ giới hạn bộ nhớ theo phân tích từ ReviewLaptop để tránh bị kernel OOM-killer tắt ngang container.

Mẹo thực tế khi tối ưu:

  • Luôn đặt file requirements.txt và lệnh build wheel ở layer phía trên COPY . . để tránh vỡ cache.
  • Thêm file .dockerignore loại bỏ thư mục checkpoint model, log và .git trước khi build.

Top comments (0)