Định nghĩa Floating Point Precision – FP64, FP32, FP16 là gì?

FP hoặc Floating Point Precision là gì?

Floating Point Precision (Độ chính xác dấu phẩy động) là biểu diễn của một số thông qua hệ nhị phân. Để truyền các số đến máy tính của chúng ta, các giá trị phải được dịch sang các số nhị phân 1 và 0, trong đó thứ tự và chuỗi các chữ số rất quan trọng. Các định dạng FP phổ biến nhất là Độ chính xác một nửa (FP16), Độ chính xác đơn (FP32) và Độ chính xác kép (FP64), mỗi định dạng đều có ưu điểm, nhược điểm và tính hữu dụng riêng trong các ứng dụng cụ thể.

FPP được cấu trúc theo cách có thể xác định một phạm vi giá trị rộng. Chữ số nhị phân đầu tiên biểu thị dấu (sign) cho số đó là dương hoặc âm. Tập hợp các chữ số nhị phân tiếp theo là số mũ (exponent) có cơ số 2 biểu thị giá trị nguyên của số đó. Tập hợp các chữ số nhị phân cuối cùng biểu thị phần định trị (significand hay mantissa) đại diện cho giá trị đằng sau dấu thập phân. Một số thậm chí còn gọi đây là phân số (fraction).

Việc biểu diễn số bằng chuỗi phân số dài có thể khó khăn khi sử dụng các phép toán như số mũ và số nhị phân. Vì vậy, sẽ có một số sai sót do lỗi làm tròn số. Ví dụ, trong FP32, biểu thị một số với độ chính xác trong khoảng +/- 0.5, giá trị tối đa được biểu thị bằng FP32 phải nhỏ hơn 2^23.

Bất kỳ giá trị nào lớn hơn và khoảng cách giữa các giá trị được biểu thị bằng FP32 sẽ lớn hơn 0.5. Ngược lại, biểu thị một số có độ chính xác trong khoảng +/- 0.5, giá trị tối đa được biểu thị bằng FP64 có thể lớn tới 2^52. Bất kỳ giá trị nào lớn hơn và khoảng cách giữa các giá trị được biểu thị bằng FP64 sẽ lớn hơn 0.5. Càng chính xác thì phạm vi càng nhỏ. Những điểm không chính xác này có thể gây ra lỗi trong các ứng dụng cần phải độ chính xác cao.

Sự khác biệt giữa FP64, FP32 và FP16

FP64, FP32 và FP16 là các loại FPP phổ biến hơn. FP32 được sử dụng rộng rãi nhất vì độ chính xác tốt và kích thước được giảm. Số dấu phẩy động càng lớn thì thời gian chạy các giá trị rất cụ thể đó thông qua các phép tính càng lâu. Một số workload không được hưởng lợi từ độ chính xác cao hơn, trong khi một số khác chỉ khả thi khi sử dụng các định dạng có độ chính xác thấp hơn. Chúng ta hãy xem xét kiến ​​trúc của từng định dạng FPP, mô tả ưu và nhược điểm của chúng, cũng như liệt kê một số ứng dụng mà các định dạng này phù hợp nhất.

FP64 là gì?

FP64 hay Double Precision 64-bit sử dụng 64 bit nhị phân để biểu thị các số trong các phép tính được thực hiện trên hệ thống của bạn. Định dạng này cung cấp độ chính xác cao nhất trong số các tùy chọn phổ biến, khiến nó trở nên lý tưởng cho các ứng dụng yêu cầu độ chính xác cao.

FP64 Double Precision sử dụng:

  • 1 bit cho dấu dương/âm.
  • 11 bit để biểu diễn số mũ với cơ số 2.
  • 52 bit cho fraction/significand/mantissa, tức là giá trị sau dấu thập phân.

Độ chính xác của FP64 hiếm khi được sử dụng trong các workload Deep Learning và AI vì phép nhân ma trận liên tục để cập nhật các trọng số có thể làm tăng đáng kể thời gian đào tạo. FP64 chủ yếu được sử dụng cho điện toán khoa học với các yêu cầu chính xác cao như thiết kế sản phẩm sản xuất, mô phỏng cơ học và động lực học chất lỏng có trong các ứng dụng Ansys.

Chỉ một số ít GPU có thể tính toán đầy đủ bằng cách sử dụng FP64 nguyên bản như NVIDIA GV100 (đã ngừng sản xuất), NVIDIA A100, NVIDIA H100 và NVIDIA A800, cùng với các GPU NVIDIA khác có hiệu suất FP64 bị hạn chế. Các bộ tăng tốc GPU khác vốn hỗ trợ FP64 bao gồm dòng AMD Instinct như MI300A và MI300X.

FP32 là gì?

FP32 hay Single Precision 32-bit sử dụng 32 bit nhị phân để biểu diễn số. Định dạng này là định dạng FPP được sử dụng rộng rãi nhất, đánh đổi một số độ chính xác một cách thỏa đáng để có giá trị trọng số nhẹ hơn được biểu thị bằng ít chữ số hơn. Ít chữ số hơn chiếm ít bộ nhớ hơn, từ đó tăng tốc độ.

FP32 Single Precision sử dụng:

  • 1 bit cho dấu dương/âm
  • 8 bit để biểu diễn số mũ với cơ số 2.
  • 23 bit cho fraction/significand/mantissa, tức là giá trị sau dấu thập phân.

FP32 là mặc định cho tất cả các ứng dụng không cần độ chính xác cao cũng như không cần tốc độ cực nhanh. FP32 chính xác đến mức bạn có thể nhận được mà không cần sử dụng quá mức cần thiết. Nó đã là tiêu chuẩn cho tính toán mạng nơ-ron trong một thời gian khá lâu và hầu hết các framework cũng như code đều sử dụng và chạy trên FP32 theo mặc định. Tuy nhiên, đối với những người chạy các phép tính và mô phỏng khoa học, sự thiếu chính xác nhỏ đó trong FP32 có thể dẫn đến các phép tính không chính xác do tích tụ nhiều lỗi làm tròn nhỏ.

FP32 được sử dụng trong tất cả các workload bao gồm Học máy, kết xuất, mô phỏng phân tử,… Đây là định dạng FP cân bằng nhất trong đó tốc độ và độ chính xác là cần thiết.

FP16 là gì?

FP16 hay Half Precision 16-bit chỉ sử dụng 16 bit nhị phân. Định dạng này đang có xu hướng tăng lên trong các workload Deep Learning thay vì FP32 truyền thống. Do trọng số có độ chính xác thấp hơn trong mạng nơ-ron dường như không quan trọng cũng như không ảnh hưởng đến hiệu suất của mô hình nên độ chính xác bổ sung của FP32 có thể được đánh đổi để lấy tốc độ.

FP16 Half Precision sử dụng:

  • 1 bit cho dấu dương/âm
  • 5 bit để biểu diễn số mũ với cơ số 2.
  • 10 bit cho fraction/significand/mantissa, tức là giá trị sau dấu thập phân.

FP16 được sử dụng chủ yếu để đào tạo mô hình Học sâu và suy luận để tính toán nhanh, thực hiện nhiều phép tính hơn trên mỗi đơn vị thời gian. Các mô hình AI phổ biến có thể sử dụng ít độ chính xác hơn – là các mô hình 3D được đào tạo bằng AI trong đó các chuyển động không cần phải hoàn hảo và cho phép một số sai lệch.

Việc đào tạo các mô hình này có thể giúp các nhà làm phim hoạt hình yêu cầu mô hình thực hiện một hành động để có thể tạo hoạt ảnh cho trò chơi của họ hoặc giúp robot học cách đi lên cầu thang hoặc nhảy khỏi bệ. Tuy nhiên, robot chính xác để lắp ráp máy móc sẽ được hưởng lợi từ việc sử dụng đào tạo bằng cách sử dụng các định dạng dấu phẩy động có độ chính xác cao hơn.

Một số FPP khác mà bạn có thể đã gặp

FP64, FP32 và FP16 là những định dạng phổ biến nhưng cũng có thêm các định dạng FPP khác.

BF16 là gì?

BF16 hay BFloat16 là một định dạng được Google phát triển với tên gọi “Brain Float Point Format” có nguồn gốc từ Google Brain, một nhóm nghiên cứu AI tại Google. Tại Google, họ nhận thấy rằng FP16 không có ý định ứng dụng Deep Learning vì phạm vi hoạt động của nó quá hạn chế. Trong khi vẫn sử dụng 16 bit nhị phân, họ đã điều chỉnh lại các bit được phân bổ để có phạm vi gần giống với FP32 hơn.

BF16 hoặc BFloat16 sử dụng:

  • 1 bit cho dấu dương/âm.
  • 8 bit để biểu diễn số mũ có cơ số 2.
  • 7 bit cho fraction/significand/mantissa, tức là giá trị sau dấu thập phân.

Bằng cách sử dụng cùng số bit cho số mũ như FP32, việc chuyển đổi FP32 thành BF16 nhanh hơn và ít phức tạp hơn bằng cách bỏ qua phần phân số theo một số chữ số. Và mặc dù định dạng BF16 được thiết kế bởi Google nhưng nó đang trở thành tiêu chuẩn để thay thế FP16 khi chạy và đào tạo các mạng thần kinh sâu vốn sử dụng FP32.

BF16 cũng là ứng cử viên hoàn hảo cho độ chính xác hỗn hợp giữa FP32 và BF16. Vì BF16 tương tự theo cấp số nhân với FP32, nên nó hoạt động như một sự thay thế tùy ý với độ chính xác chữ số thập phân ít hơn trong khi sử dụng một nửa độ dài bit. Bộ nhớ cần thiết để lưu trữ BF16 thấp hơn cùng với khả năng dịch dễ dàng, việc sử dụng BF16 có thể tăng tốc độ xử lý các workload bằng các tính toán nguyên bản của FP32.

TF32 là gì?

TF32 hay Tensor-Float32 là chế độ toán học do NVIDIA tạo ra, biểu thị các giá trị từ 32 bit đến 19 bit của FP32. Tương tự như chức năng của BF16, TF32 sử dụng cùng 8 bit để xác định số mũ nhằm duy trì cùng một phạm vi và dễ dịch khi làm việc với các phép tính FP32 trong khi sử dụng phần định trị/phân số 10 bit từ FP16. Vì sử dụng cùng 8 bit như FP32 nên TF32 là một cách khác để GPU NVIDIA có thể thực hiện các phép tính FP32 một cách dễ dàng với giá trị phân số ngắn hơn được làm tròn từ 23 bit của FP32 thành 10 bit của TF32.

TF32 hoặc Tensor-Float32 sử dụng:

  • 1 bit cho dấu dương/âm.
  • 8 bit để biểu diễn số mũ có cơ số 2.
  • 10 bit cho fraction/significand/mantissa, tức là giá trị sau dấu thập phân.

Về mặt kỹ thuật, TF32 là nhị phân 19 bit và là FP32 kém chính xác hơn trong phần phân số của giá trị được biểu thị. NVIDIA Ampere và Tensor Core sau này vận hành phép nhân ma trận bằng cách sử dụng đầu vào FP32 được dịch sang TF32 và đưa ra kết quả nhân ma trận trở lại trong FP32 để tính toán thêm và nó hoạt động như sau:

Khi tính toán các phép toán ma trận, FP32 được chuyển đổi thành TF32 bằng cách làm tròn phần định trị/phân số 23 bit thành 10 bit hoặc vị trí thập phân thứ 10. Tiếp theo, các phép tính ma trận FP32 được thực thi và sau đó giá trị TF32 đầu ra được xác định là giá trị FP32. Các phép nhân không ma trận tiếp theo sử dụng FP32.

Độ chính xác giảm và ít bit hơn để xử lý trong các hoạt động ma trận giúp giảm băng thông bộ nhớ cần thiết và tăng tốc độ cho các hoạt động ma trận này có trong Deep LearningHPC.

Kết luận

Tóm lại, Độ chính xác dấu phẩy động là một chủ đề khó mà chỉ một số ít người có thể nắm bắt được đầy đủ. Tuy nhiên, đối với những người đang thiết kế một mô hình AI phức tạp, việc hiểu được độ chính xác phù hợp để huấn luyện mô hình của bạn – có thể tăng tốc độ và giảm tổng thời gian hoàn thành hoặc yêu cầu độ chính xác tối đa ngay cả khi phải trả bằng thời gian.

FP64, hay độ chính xác kép, là chính xác nhất nhưng có cường độ tính toán cao nhất. FP32, hay độ chính xác đơn, là tiêu chuẩn có sự cân bằng giữa tốc độ và độ chính xác. FP16, hay độ chính xác một nửa, là độ chính xác giảm được sử dụng để đào tạo mạng lưới thần kinh. Các định dạng khác bao gồm BF16 và TF32 bổ sung cho việc sử dụng FP32 để tăng tốc độ trong các phép tính chọn lọc.

Theo exxactcorp

____
Bài viết liên quan
    Góp ý / Liên hệ tác giả