Tới nội dung
Cloudj

Hướng dẫn GPU

Dùng Docker image riêng trên GPU cloud: quy tắc, CUDA và dung lượng image

Cách dùng Docker image riêng trên GPU cloud: chỉ registry công khai, yêu cầu cấp tài khoản, chọn bản CUDA hợp với driver của host, giảm dung lượng image và image bị chặn.

Cập nhật · 4 phút đọc

Ba template có sẵn đủ cho những bước đầu, nhưng sớm muộn các đội cũng muốn môi trường của riêng mình: cố định phiên bản thư viện, một bộ phần mềm phục vụ model, công cụ CI, hay một dự án cũ chỉ build được trong đúng một cấu hình. Dùng Docker image riêng trên GPU cloud của Cloudj cho phép bạn mang môi trường đó lên dưới dạng một image công khai. Bài viết giải thích các quy tắc, cách chọn base image CUDA chạy được với driver của host, vì sao dung lượng image quan trọng hơn bạn nghĩ, và làm gì khi image bị từ chối.

Quy tắc với custom image trên Cloudj

Console có ba template: Ubuntu 22.04 + CUDA (SSH), PyTorch + JupyterLab, và Custom image. Với template cuối:

  • Chỉ image công khai. Bạn nhập tham chiếu image công khai, ví dụ pytorch/pytorch:2.4.0-cuda12.4-cudnn9-runtime. Registry riêng tư hay image trên máy cục bộ không được hỗ trợ, nên cũng không có chỗ nhập thông tin đăng nhập registry.
  • Cần cấp tài khoản cao hơn. Custom image đòi hỏi cấp tài khoản cao hơn tài khoản mới. Nếu tùy chọn này chưa mở cho bạn, hãy liên hệ hỗ trợ Cloudj từ console.
  • Một số image bị chặn. Console từ chối một số image nhất định. Nếu image của bạn bị từ chối, hãy chọn image khác hoặc tự build trên một base phổ biến.
  • Tính tiền và giới hạn như cũ. Tính theo phút, dung lượng đĩa cố định lúc triển khai, mỗi máy có ngày hết hạn và không có SLA phần cứng.

Đừng để thông tin bí mật trong image công khai. API key, token và dữ liệu riêng phải nằm trong file môi trường hoặc tải về lúc chạy, tuyệt đối không nằm trong layer image mà ai cũng kéo về được. Đây là lỗi hay gặp khi đội nhỏ vội đẩy image lên Docker Hub.

Chọn base CUDA mà driver của host hỗ trợ

Container mang theo thư viện CUDA runtime riêng, nhưng dùng driver NVIDIA của máy host. Mỗi driver hỗ trợ CUDA runtime tới một phiên bản nhất định. Nếu image cần CUDA mới hơn mức driver hỗ trợ, code GPU sẽ lỗi ngay lúc khởi động dù container vẫn chạy.

Quy tắc thực tế:

  • Đừng chạy theo CUDA mới nhất. Chọn phiên bản CUDA mà framework của bạn thật sự cần. Một base CUDA 12.x hơi cũ hơn nhưng phổ biến sẽ chạy được trên nhiều host hơn bản phát hành mới nhất.
  • Kiểm tra driver sau khi triển khai. Chạy nvidia-smi; phần đầu hiển thị phiên bản CUDA cao nhất mà driver hỗ trợ. CUDA trong image nên bằng hoặc thấp hơn con số đó.
  • Mỗi host một khác. Mỗi máy trong danh sách là một máy độc lập, nên driver khác nhau. Triển khai lại ở máy khác thì kiểm tra lại.
  • Ưu tiên image runtime thay vì devel, trừ khi bạn biên dịch code CUDA trong container.

Tài liệu tương thích CUDA của NVIDIA giải thích mối quan hệ giữa phiên bản driver và runtime.

Dung lượng image và thời gian khởi động

Trước khi container khởi động, host phải kéo image của bạn về. Image càng nặng càng lâu khởi động, trong khi instance vẫn đang tính tiền. Mỗi kết quả trong danh sách triển khai hiển thị tốc độ tải của máy theo Mbps, gợi ý khá tốt cho thời gian kéo image.

Cách giữ image gọn nhẹ:

Cách làmVì sao có ích
Bắt đầu từ tag runtime, không phải develImage devel kèm trình biên dịch và header có thể bạn không cần
Dùng multi-stage buildCông cụ build nằm lại ở stage build
Không nhét trọng số model vào imageTải trọng số vào ổ đĩa của instance lúc khởi động
Dọn cache trong cùng một layerapt-get clean và pip install --no-cache-dir
Cố định phiên bảnBuild tái lập được, ít phải build lại bất ngờ

Trọng số model cần đặc biệt chú ý: một model vài chục GB nằm trong image nghĩa là mỗi lần triển khai lại phải kéo lại từ đầu. Hãy tính riêng dung lượng ổ đĩa cho trọng số, vì không tăng được sau này.

Ví dụ tối giản

Một image nhỏ với base PyTorch cố định phiên bản và code của bạn:

FROM pytorch/pytorch:2.4.0-cuda12.4-cudnn9-runtime
RUN apt-get update && apt-get install -y --no-install-recommends tmux git \
    && apt-get clean && rm -rf /var/lib/apt/lists/*
COPY requirements.txt /app/requirements.txt
RUN pip install --no-cache-dir -r /app/requirements.txt
COPY . /app
WORKDIR /app

Build và đẩy lên một repository công khai:

docker build -t yourname/gpu-app:1.0 .
docker run --rm --gpus all yourname/gpu-app:1.0 python -c "import torch; print(torch.cuda.is_available())"
docker push yourname/gpu-app:1.0

Chạy thử với --gpus all trên máy có GPU NVIDIA sẽ bắt được phần lớn lỗi trước khi bạn trả tiền cho instance trên cloud. Nếu mới làm quen Docker, bài cài Docker trên VPS là chỗ tốt để tập build image, còn tài liệu Docker nói kỹ về multi-stage build. Từ Việt Nam, đẩy image nặng lên Docker Hub có thể mất khá lâu với tốc độ upload mạng gia đình, thêm một lý do để giữ image gọn.

Sau đó, trên trang triển khai GPU, chọn máy, chọn template Custom image, nhập yourname/gpu-app:1.0, chọn dung lượng ổ đĩa và SSH key, rồi triển khai. Trang instance hiển thị trạng thái và những dòng log cuối của container, là nơi đầu tiên cần xem nếu image không khởi động.

Khi nào custom image đáng công sức

  • Bộ phần mềm phục vụ model. Một image vLLM hay phần mềm khác cố định phiên bản giúp khỏi cài lại mỗi lần triển khai; bài dựng vLLM inference server tại Mỹ bàn cả cách cài bằng pip lẫn dùng image.
  • CI cho code ML. Một image cố định giúp các lượt test trên GPU tái lập được; bài GPU CI runner cho kiểm thử ML xây dựng trên ý này.
  • Dự án cũ cần đúng bộ công cụ đời cũ.

Khi nào không đáng: để khám phá, thử nghiệm, template PyTorch + JupyterLab nhanh hơn. Bài chạy PyTorch với template Jupyter hướng dẫn cách này.

Xử lý sự cố

Hiện tượngNguyên nhân có thểCách xử lý
Console từ chối imageImage riêng tư, gõ sai, hoặc image bị chặnChuyển sang công khai, kiểm tra tham chiếu, hoặc dùng base khác
Chờ rất lâu mới khởi độngImage nặng, host tải chậmLàm gọn image; chọn host có tốc độ tải cao hơn
CUDA driver version is insufficientCUDA trong image mới hơn driver của hostDùng base CUDA cũ hơn
Container thoát ngayLệnh của image kết thúc lập tứcXem log trên trang instance và chạy thử trên máy cục bộ

Câu hỏi thường gặp

Có dùng registry riêng tư được không?

Không. Chỉ hỗ trợ image công khai.

Vì sao tôi không chọn được Custom image?

Tùy chọn này cần cấp tài khoản cao hơn. Liên hệ hỗ trợ Cloudj từ console.

Image nên dùng CUDA phiên bản nào?

Phiên bản framework của bạn cần, và không vượt quá mức driver của host hỗ trợ. Kiểm tra bằng nvidia-smi.

Có nên để trọng số model trong image không?

Thường là không. Hãy tải về ổ đĩa của instance, dung lượng đã tính từ lúc triển khai.

Bước tiếp theo

Build và chạy thử image trên máy của bạn, đẩy lên repository công khai, rồi mở trang triển khai GPU và triển khai bằng template Custom image. Tiền thuê trừ theo phút từ số dư tài khoản nạp bằng chuyển khoản VND. Giá "từ" theo thời gian thực của mọi mẫu có trên GPU cloud.

Triển khai máy chủ hoặc mua proxy

Chọn vị trí trong console, xem giá trực tiếp và thanh toán từ số dư tài khoản.