Tất cả tài liệu

Managed – FPT Kubernetes Engine

    Tính năng GPU Sharing
    Tính năng GPU Sharing
    Updated on 16 Feb 2024

    Một trong những ưu điểm lớn nhất khi sử dụng GPU trên K8s là khả năng chia sẻ GPU. Hầu hết các khối lượng công việc không yêu cầu bộ nhớ đầy đủ và tài nguyên máy tính của từng GPU. Do đó, việc chia sẻ GPU giữa nhiều quy trình là điều cần thiết để tăng mức sử dụng GPU và giảm chi phí cơ sở hạ tầng.  

    GPU Sharing hiện đang có 3 cơ chế: 

    1. Time slicing

    2. Multi-instance GPU (MIG)

    3. Multi-Process Service (MPS)

     

    Time slicing là một cơ chế cho phép các workloads GPU được đăng ký sử dụng xen kẽ với nhau. Sử dụng GPU time-slicing scheduler để thực thi đồng thời nhiều CUDA processes thông qua việc chia sẻ thời gian. 

    Khi kích hoạt Time slicing, GPU sẽ chia sẻ tài nguyên của nó cho nhiều tiến trình khác nhau theo fair-sharing manner bằng cách chuyển đổi giữa các tiến trình theo khoảng thời gian đều đặn. Cơ chế này tạo ta khoảng thời gian GPU bị overhead do chuyển đổi tiến trình liên tục, dẫn đến hiện tượng giật hình và độ trễ cao hơn. Ngoài ra, Time slicing không có cơ chế cách ly bộ nhớ giữa các tiến trình chia sẻ GPU hay bất kỳ giới hạn phân bổ bộ nhớ nào, điều này có thể dẫn đến lỗi hết bộ nhớ (OOM) thường xuyên. 

     

    Multi-Instance GPU (MIG) là cơ chế có sẵn trên kiến trúc NVIDIA cho phép chia nhỏ GPU thành các phân vùng GPU riêng biệt, các phân vùng này tách biệt với nhau về bộ nhớ băng thông, bộ nhớ đệm và lõi vi xử lý riêng. 

    Với MIG, mỗi bộ xử lý đồ họa của instance là độc lập và có hệ thống bộ nhớ riêng. Port crossbar trên chip, L2 cache, memory controllers và địa chỉ DRAM bus đều được gán duy nhất cho một instance. Điều này đảm bảo khả năng chịu lỗi và workload của ứng dụng có thể tính toán được với throughput và latency trên từng instance riêng.

     

    A picture containing table
Description automatically generated

     

    Các phân vùng GPU độc lập này (MIG) được đặt tên theo định dạng cho biết tài nguyên bộ nhớ và điện toán của thiết bị, ví dụ: 1g.gb tương ứng với lát cắt GPU có bộ nhớ 6 GB. 

    MIG không cho phép tạo phân vùng GPU có kích thước và số lượng tùy chỉnh, vì mỗi dòng GPU chỉ hỗ trợ một số cấu hình MIG nhất định, phụ thuộc vào cấu hình phần cứng thiết bị. Điều này làm giảm mức độ tối ưu tài nguyên khi sử dụng GPU. Ngoài ra, các thiết bị MIG phải được tạo theo các quy tắc sắp xếp nhất định, điều này càng hạn chế tính linh hoạt của việc sử dụng. 

    MIG là phương pháp chia sẻ GPU mang lại mức độ cô lập cao nhất giữa các tiến trình. Tuy nhiên, cơ chế này thiếu tính linh hoạt và chỉ tương thích với một số kiến trúc GPU (Ampere và Hopper). 

    Trên K8s, NVIDIA phát triển GPU Operator cung cấp giải pháp sử dụng MIG dễ dàng, mặc dù vẫn còn những hạn chế. Người dùng sử dụng ConfigMap định nghĩa một tập hợp các cấu hình MIG được phép áp dụng cho từng node bằng cách gắn label cho node đó. 

    Để sử dụng hiệu quả tài nguyên GPU trên cụm K8s, người dùng sẽ phải liên tục sửa đổi ConfigMap để điều chỉnh kích thước MIG cho phù hợp với yêu cầu tài nguyên của workload luôn thay đổi. Điều này là rất bất tiện , mặc dù cấu hình MIG đã tốt hơn việc truy cập trực tiếp vào các node và tạo/xóa thủ công các thiết bị MIG, nhưng nó vấn mất công sức và thời gian. Do đó, thường xảy ra trường hợp cấu hình của các thiết bị MIG hiếm khi được thay đổi theo thời gian hoặc hoàn toàn không được áp dụng, và trong cả hai trường hợp đều dẫn đến sự thiếu hiệu quả lớn trong việc sử dụng GPU, khiến chi phí sử dụng GPU không tối ưu. Vấn đề này được khắc phục bằng cơ chế sử dụng phân vùng GPU tự động (MPS). 

     

     

     

    Multi-Process Service (MPS): sử dụng mô hình client-server của CUDA (API) cho phép chạy đồng thời nhiều tiến trình trên cùng một GPU. 

    Server quản lý quyền truy cập GPU cung cấp đồng thời giữa các client. Client kết nối với server thông qua client runtime, được tích hợp trong thư viện CUDA Driver và trong suốt với ứng dụng. 

    Về cơ bản, MPS tương thích với mọi GPU hiện tại, cung cấp tính linh hoạt cao nhất, cho phép tạo phân vùng GPU với tùy chọn về cả dung lượng bộ nhớ và khả năng tính toán. Tuy nhiên, cơ chế MPS không thực sự cách ly toàn bộ bộ nhớ giữa các tiến trình. Trong hầu hết các trường hợp, MPS thể hiện sự dung hòa tốt giữa MIG và Time-slicing.

     

    Diagram
Description automatically generated

     

    So với Time-slicing, MPS loại khoảng thời gian overhead để chuyển đổi ngữ cảnh bằng cách chạy song song các tiến trình thông qua spatial sharing, dẫn đến hiệu suất tính toán tốt hơn. Hơn nữa, MPS cung cấp cho mỗi tiến trình một không gian địa chỉ bộ nhớ GPU riêng. Điều này cho phép khắc phục các hạn chế của Time-slicing. 

    Tuy nhiên, trong MPS, các tiến trình không được cách ly hoàn toàn với nhau, mặc dù MPS cho phép giới hạn tài nguyên bộ nhớ và tính toán của client, nhưng nó không cung cấp khả năng cách ly lỗi và bảo vệ bộ nhớ. Điều này có nghĩa là một tiến trình có thể gặp sự cố và khiến toàn bộ GPU phải đặt lại, ảnh hưởng đến tất cả các tiến trình khác đang chạy trên GPU. NVIDIA Kubernetes chưa hỗ trợ cho phân vùng MPS, nên việc sử dụng MPS trên Kubernetes phải thông qua phần mềm thứ 3.