Mã lỗi: 0100

Danh mục: Thời gian chạy: Lỗi phân bổ vùng đệm

Lỗi này cho biết trình phân bổ bộ nhớ của thời gian chạy XLA:TPU không tìm thấy một khối bộ nhớ phù hợp trên HBM của trình tăng tốc cho việc phân bổ được yêu cầu.

Thông báo lỗi mẫu:

ValueError: RESOURCE_EXHAUSTED: Error allocating device buffer: Attempting to allocate 8.00M. That was not possible. There are 6.43M free.; (0x0x1_HBM0)

Các chương trình phụ trợ XLA: TPU

Tổng quan

Lỗi này xảy ra khi

  • lỗi phân bổ vùng đệm do người dùng khởi tạo thông qua jax.device_put hoặc
  • phân bổ đầu ra của chương trình do người dùng lên lịch không thành công.

Những lỗi này thường xảy ra do một số nguyên nhân:

  • Hết bộ nhớ (OOM): Người dùng đang cố gắng phân bổ một khối bộ nhớ lớn hơn tổng lượng bộ nhớ trống có trên HBM của TPU.
  • Phân mảnh bộ nhớ: Quá trình phân bổ không thành công vì không có một khối trống liền kề nào trong không gian bộ nhớ đủ lớn để đáp ứng kích thước được yêu cầu. Tổng dung lượng bộ nhớ trống đủ để phân bổ, nhưng được phân tán trên không gian bộ nhớ thành các khối nhỏ, không liên tục.

Thời gian chạy TPU có một số cơ chế để thử lại các lỗi phân bổ, bao gồm:

  • Nếu có các hoạt động huỷ phân bổ được đưa vào hàng đợi, thì thời gian chạy sẽ thử lại các hoạt động phân bổ không thành công,
  • Khi xảy ra lỗi hết bộ nhớ do phân mảnh, thời gian chạy có thể tự động kích hoạt quá trình chống phân mảnh và thử lại.
  • Thời gian chạy TPU ưu tiên việc phân bổ vùng đệm hơn là giữ cho các chương trình được tải. Nếu quá trình phân bổ vùng đệm không thành công do không đủ HBM, hệ thống sẽ loại bỏ các chương trình TPU đã tải cho đến khi có đủ bộ nhớ cho vùng đệm.

Vì vậy, lỗi gặp phải sau các biện pháp giảm thiểu nêu trên thường yêu cầu người dùng hành động.

Gỡ lỗi

  • Giảm mức sử dụng bộ nhớ của mô hình:
    • Giảm kích thước lô: Việc giảm kích thước lô sẽ trực tiếp làm giảm mức sử dụng bộ nhớ.
    • Phân đoạn tham số: Đối với các mô hình rất lớn, hãy sử dụng các kỹ thuật như tính song song của mô hình hoặc phân đoạn để phân phối các tham số trên HBM của nhiều lõi hoặc máy chủ TPU.
    • Rút ngắn độ dài chuỗi/bối cảnh: Đối với các mô hình hoạt động trên các chuỗi (chẳng hạn như mô hình ngôn ngữ), việc giảm độ dài chuỗi đầu vào có thể giảm đáng kể mức sử dụng bộ nhớ.
    • Đóng góp vùng đệm: Sử dụng các tính năng của khung (chẳng hạn như: jax.jit(..., donate_argnums=...)) để báo hiệu cho XLA rằng một số vùng đệm đầu vào nhất định có thể bị ghi đè và dùng lại cho đầu ra.
    • Tối ưu hoá chiến lược điểm kiểm tra: Thay vì lưu trạng thái toàn bộ mô hình cùng một lúc, hãy cân nhắc chỉ lưu trọng số mô hình hoặc sử dụng chiến lược kiểm tra phân đoạn.
  • Bố cục bộ nhớ địa chỉ và khoảng đệm:
    • Bộ nhớ TPU được phân bổ theo khối và khoảng đệm có thể làm tăng kích thước thực tế của các tensor.
  • Đảm bảo không rò rỉ bộ nhớ:
    • Đảm bảo các tham chiếu đến các đối tượng jax.Array không được giữ lâu hơn dự kiến. Việc giữ lại các đối tượng jax.Array có thể ngăn việc huỷ cấp phát tự động ngay cả sau khi quá trình biên dịch chương trình hoàn tất.

Công cụ

Bật cờ tpu_log_allocations_on_oom để trình phân bổ sẽ kết xuất một báo cáo chi tiết về tất cả các hoạt động phân bổ hiện tại khi xảy ra lỗi hết bộ nhớ. Điều này có thể rất hữu ích cho việc gỡ lỗi.