✔ MPS là một tính năng trong GPU của NVIDIA, cho phép nhiều container chia sẻ cùng một GPU vật lý.
✔ MPS dựa trên tính năng NVIDIA's Multi-Process Service của CUDA, cho phép nhiều ứng dụng CUDA chạy đồng thời trên một GPU.
✔ Với MPS, người dùng có thể xác định trước số lượng replicas của một GPU. Giá trị này cho chúng ta biết số lượng container tối đa có thể truy cập để sử dụng một GPU.
✔ Ngoài ra, chúng ta có thể giới hạn tài nguyên GPU cho từng container, bằng việc tạo các biến môi trường sau trong container:
CUDA_MPS_ACTIVE_THREAD_PERCENTAGE
CUDA_MPS_PINNED_DEVICE_MEM_LIMIT
Để hiểu rõ hơn về cách thức MPS hoạt động, vui lòng truy cập :
1. Các bước kiểm tra trước khi cài đặt
Số lượng GPU của bạn không vượt giới hạn.
Loại GPU: từ kiến trúc Ampere (A30, A100,...).
Kiểm tra kỹ các giới hạn của tính năng MPS trước khi quyết định sử dụng.
2. Cài đặt cụm GPU sử dụng chế độ chia sẻ MPS
Bước 1: Truy cập FPT Kubernetes engine với phiên bản Manage
Bước 2: Bấm "Create a Kubernetes Engine" sau đó nhập Name, Version, Purpose, LB Size
Bước 3: Tại giao diện cấu hình các worker group GPU:
Chọn sharing mode MPS.
Cài đặt số replicas mong muốn (số replicas này cũng là số container tối đa sử dụng GPU).
Chọn cách thức cài đặt GPU driver.
Bước 4: Thực hiện cấu hình các thông số còn lại để khởi tạo cụm.
3. Kiểm tra tài nguyên GPU trong cụm Kubernetes
Chúng ta có thể xác minh tài nguyên GPU có khớp với cấu hình khi khởi tạo cụm/worker group hay không. Kiểm tra tài nguyên GPU đã sẵn sàng để sử dụng.
Để kiểm tra số lượng tài nguyên nvidia.com/gpu, chạy lệnh sau:
kubectl describe nodes $NODE_NAME
Thay NODE_NAME bằng tên của node worker GPU bạn muốn kiểm tra.
Kết quả của lệnh trên:
Capacity:
...
nvidia.com/gpu: 3
Allocatable:
...
nvidia.com/gpu: 3
Giải thích :
Có 3 tài nguyên nvidia.com/gpu và cả 3 đều sẵn sàng để được sử dụng.
Số lượng tài nguyên nvidia.com/gpu là 3 do số replicas khi khởi tạo worker group là 3.
Số lượng GPU gắn với 1 node là 1, nếu số lượng GPU là 2, các giá trị nvidia.com/gpu sẽ là 6.
4. Triển khai workload sử dụng MPS
Trong ví dụ sau, chúng ta sẽ triển khai một pod sử dụng GPU với chế độ chia sẻ MPS để kiểm tra giới hạn tài nguyên mà container trong pod đó có thể sử dụng. Chú ý: chỉ có thể yêu cầu 1 tài nguyên nvidia.com/gpu cho 1 container.
Bước 1: Lưu file sau dưới tên: cuda-mem-and-sm-count.yaml:
apiVersion: v1
kind: Pod
metadata:
name: cuda-mem-and-sm-count
spec:
hostIPC: true
containers:
- name: mps-example
image: registry.fke.fptcloud.com/xplat-fke/mps-example:0.1.1
securityContext:
privileged: true
resources:
limits:
nvidia.com/gpu: 1
command: ["/bin/sh", "-c"]
args:
- while true; do /tmp/cuda_mem_and_sm_count; sleep 30; done
Chú ý: hostIPC: true cấp quyền để pod giao tiếp với MPS control daemon, là yêu cầu cần thiết để worker group GPU MPS hoạt động bình thường.
Bước 2:
Apply file manifest trên:
kubectl apply -f cuda-mem-and-sm-count.yaml
Bước 3: Kiểm tra pod trên đã running hay chưa:
kubectl get pods
Bước 4: Kiểm tra log của pod trên, output sẽ có dạng:
For device 0: Free memory: 8014 M, Total memory: 2409M For device 0: multiProcessorCount: 18
Bước 5: Clean up:
kubectl delete -f cuda-mem-and-sm-count.yaml
5. Giới hạn tài nguyên
Mặc định, mỗi đơn vị nvidia.com/gpu được truy cập 100%/replicas bộ nhớ và tài nguyên tính toán của GPU.
CUDA_MPS_ACTIVE_THREAD_PERCENTAGE: Biến này chỉ ra tỷ lệ phần trăm số threads mỗi tài nguyên nvidia.com/gpu khi GPU được chia sẻ ở chế độ MPS.
CUDA_MPS_PINNED_DEVICE_MEM_LIMIT: Biến này giới hạn lượng bộ nhớ mỗi đơn vị chia sẻ nvidia.com/gpu khi GPU được chia sẻ ở chế độ MPS.
Chú ý: Hiện tại, các biến CUDA_MPS_ACTIVE_THREAD_PERCENTAGE và CUDA_MPS_PINNED_DEVICE_MEM_LIMIT không thể cài giá trị vượt giá trị mặc định.
Trong ví dụ này, chúng ta sẽ sử dụng hai biến môi trường nói trên để cài giới hạn sử dụng tài nguyên GPU cho từng workload.
Bước 1: Lưu file sau dưới tên cuda-mem-and-sm-count.yaml:
apiVersion: v1
kind: Pod
metadata:
name: cuda-mem-and-sm-count-10
spec:
hostIPC: true
containers:
- name: mps-example
image: registry.fke.fptcloud.com/xplat-fke/mps-example:0.1.1
securityContext:
Privileged: true
resources:
limits:
nvidia.com/gpu: 1
env:
- name: CUDA_MPS_ACTIVE_THREAD_PERCENTAGE
value: "10"
- name: CUDA_MPS_PINNED_DEVICE_MEM_LIMIT
value: "0=4000M"
command: ["/bin/sh", "-c"]
args:
- while true; do /tmp/cuda_mem_and_sm_count; sleep 30; done
Bước 2: Apply file manifest trên:
kubectl apply -f cuda-mem-and-sm-count.yaml
Bước 3:Kiểm tra pod có đang chạy hay không:
kubectl get pods
Bước 4: Kiểm tra log của pod:
Log của pod sẽ có dạng
For device 0: Free memory: 3989M, Total memory: 2409M For device 0: multiProcessorCount: 5
Trong ví dụ trên, bằng 2 biến môi trường CUDA_MPS_ACTIVE_THREAD_PERCENTAGE và CUDA_MPS_PINNED_DEVICE_MEM_LIMIT, chúng ta đã giới hạn hơn nữa tài nguyên GPU mà một workload có thể dùng.
Clean up:
kubectl delete -f cuda-mem-and-sm-count.yaml
6. Một vài lưu ý
Tài nguyên nvidia.com/gpu một container yêu cầu phải bằng 1.
Số replicas tối đa là 48, ít nhất là 2.
Một container chạy một process để đảm bảo sharing mode MPS không phát sinh lỗi.
Yêu cầu phần "hostIPC:true" tại file manifest triển khai workload.
MPS có những giới hạn về error containment và workload isolation, hãy tìm hiểu và cân nhắc trước khi sử dụng.