25 điểm bởi xguru 2024-07-31 | Chưa có bình luận nào. | Chia sẻ qua WhatsApp
  • Các mô hình ngôn ngữ lớn (LLM) quá lớn để chạy trên phần cứng thông thường, thường có hàng tỷ tham số nên cần các GPU có lượng VRAM lớn
  • Vì vậy, ngày càng có nhiều nghiên cứu tập trung vào việc làm cho các mô hình này nhỏ hơn thông qua huấn luyện cải tiến, adapter, v.v., và một trong những kỹ thuật chủ chốt trong lĩnh vực này là lượng tử hóa (Quantization)

Part 1: “Vấn đề” của mô hình ngôn ngữ lớn

  • LLM (Large Language Model) được đặt tên theo số lượng tham số mà chúng chứa
  • Các mô hình như vậy thường chứa hàng tỷ tham số (chủ yếu là trọng số), nên chi phí lưu trữ có thể rất lớn
  • Trong quá trình suy luận, các activation được tạo ra từ tích của đầu vào và trọng số, và tương tự, chúng cũng có thể rất lớn
  • Vì vậy, người ta cố gắng biểu diễn hàng tỷ giá trị này một cách hiệu quả nhất có thể, đồng thời giảm thiểu không gian cần thiết để lưu trữ một giá trị nhất định

Cách biểu diễn giá trị số

  • Một giá trị cho trước thường được biểu diễn dưới dạng số dấu phẩy động (số thực)
  • Những giá trị này được biểu diễn bằng “bit”, và tiêu chuẩn IEEE-754 mô tả cách các bit thể hiện chức năng của một trong ba thành phần: dấu, số mũ và phần trị (fraction) để biểu diễn giá trị
  • Càng có nhiều bit để biểu diễn một giá trị thì nhìn chung độ chính xác càng cao
  • Càng có nhiều bit khả dụng thì phạm vi giá trị có thể biểu diễn càng lớn

Hạn chế bộ nhớ

  • Giả sử một mô hình có 70 tỷ tham số, nếu dùng FP32 (full-precision) thì chỉ riêng việc nạp mô hình cũng cần 280GB bộ nhớ
  • Vì vậy, việc giảm thiểu số bit dùng để biểu diễn các tham số của mô hình là rất quan trọng, nhưng khi độ chính xác giảm thì độ chính xác của mô hình cũng thường giảm theo
  • Mục tiêu là giảm số bit dùng để biểu diễn giá trị trong khi vẫn giữ được độ chính xác, và đó chính là lúc lượng tử hóa xuất hiện

Part 2: Giới thiệu về lượng tử hóa

  • Lượng tử hóa nhằm mục tiêu giảm độ chính xác của tham số mô hình từ độ rộng bit cao hơn (ví dụ: số dấu phẩy động 32 bit) xuống độ rộng bit thấp hơn (ví dụ: số nguyên 8 bit)
  • Mỗi khi giảm số bit, sẽ có một phép ánh xạ được thực hiện để “nén” các tham số gốc sang biểu diễn ít bit hơn

Các kiểu dữ liệu phổ biến

FP16

  • Khi chuyển từ FP32 sang FP16 (half precision), phạm vi giá trị mà FP16 có thể biểu diễn nhỏ hơn đáng kể so với FP32

BF16

  • Để đạt được phạm vi giá trị tương tự FP32, bfloat16 được giới thiệu như một dạng “FP32 bị cắt bớt”
  • BF16 dùng số lượng bit tương đương FP16 nhưng có thể biểu diễn phạm vi giá trị rộng hơn và thường được dùng trong các ứng dụng deep learning

INT8

  • Khi tiếp tục giảm số bit, biểu diễn sẽ tiến gần hơn đến dạng dựa trên số nguyên thay vì số dấu phẩy động

Lượng tử hóa đối xứng

  • Phạm vi giá trị dấu phẩy động ban đầu được ánh xạ vào một phạm vi đối xứng quanh 0 trong không gian lượng tử hóa
  • Giá trị lượng tử hóa của 0 trong không gian dấu phẩy động chính xác là 0 trong không gian lượng tử hóa

Lượng tử hóa bất đối xứng

  • Khác với lượng tử hóa đối xứng, nó không đối xứng quanh 0
  • Giá trị nhỏ nhất (β) và lớn nhất (α) được ánh xạ từ phạm vi dấu phẩy động sang giá trị nhỏ nhất và lớn nhất của phạm vi lượng tử hóa
  • Đây là một phương pháp còn được gọi là lượng tử hóa zero-point

Ánh xạ phạm vi và clipping

  • Nếu ánh xạ toàn bộ phạm vi của một vector, các giá trị ngoại lai có thể khiến mọi giá trị nhỏ bị ánh xạ vào cùng một biểu diễn ít bit, làm mất khả năng phân biệt
  • Thay vào đó, có thể chọn clipping một số giá trị nhất định
  • Clipping là việc thiết lập một dải động khác cho các giá trị gốc sao cho mọi ngoại lai đều có cùng một giá trị
  • Sai số lượng tử hóa của các giá trị không phải ngoại lai sẽ giảm đáng kể, nhưng sai số lượng tử hóa của ngoại lai lại tăng lên

Hiệu chuẩn (Calibration)

Trọng số (và bias)

  • Trọng số và bias có thể được xem là các giá trị tĩnh đã biết trước khi chạy mô hình
  • Vì số lượng bias ít hơn rất nhiều so với trọng số, chúng thường được giữ ở độ chính xác cao hơn (ví dụ: INT16), và nỗ lực lượng tử hóa chủ yếu tập trung vào trọng số
  • Các kỹ thuật hiệu chuẩn cho trọng số tĩnh đã biết bao gồm chọn thủ công percentile của phạm vi đầu vào, tối ưu hóa sai số bình phương trung bình (MSE) giữa trọng số gốc và trọng số lượng tử hóa, hoặc tối thiểu hóa entropy (độ phân kỳ KL) giữa giá trị gốc và giá trị lượng tử hóa

Activation

  • Đầu vào liên tục được cập nhật xuyên suốt LLM và thường được gọi là “activation”
  • Các giá trị này thay đổi mỗi khi từng dữ liệu đầu vào được đưa vào mô hình trong quá trình suy luận, nên rất khó lượng tử hóa chính xác
  • Các giá trị này được cập nhật sau mỗi hidden layer, nên chỉ khi dữ liệu đầu vào đi qua mô hình trong lúc suy luận mới biết chúng sẽ trở thành gì

Part 3: Lượng tử hóa sau huấn luyện (PTQ - Post-Training Quantization)

Lượng tử hóa động

  • Activation được thu thập sau khi dữ liệu đi qua một hidden layer
  • Phân phối activation này được dùng để tính toán các giá trị zero-point (z) và scale factor (s) cần thiết để lượng tử hóa đầu ra
  • Mỗi khi dữ liệu đi qua một lớp mới, quy trình lại được lặp lại. Vì vậy, mỗi lớp có các giá trị z và s riêng, cùng một sơ đồ lượng tử hóa khác nhau

Lượng tử hóa tĩnh

  • Zero-point (z) và scale factor (s) được tính trước thay vì trong quá trình suy luận
  • Để tìm các giá trị này, một bộ dữ liệu hiệu chuẩn được đưa vào mô hình nhằm thu thập các phân phối tiềm năng đó
  • Khi thực hiện suy luận thực tế, các giá trị s và z không được tính lại mà được dùng toàn cục để lượng tử hóa mọi activation
  • Nói chung, lượng tử hóa động chính xác hơn một chút vì nó cố tính các giá trị s và z cho từng hidden layer, nhưng có thể làm tăng thời gian tính toán
  • Ngược lại, lượng tử hóa tĩnh kém chính xác hơn nhưng nhanh hơn vì đã biết trước các giá trị s và z

Lĩnh vực của lượng tử hóa 4 bit

  • Việc xuống dưới 8 bit tỏ ra khó khăn vì sai số lượng tử hóa tăng lên sau mỗi lần mất thêm bit
  • Khám phá hai phương pháp thường được chia sẻ trên HuggingFace là GPTQ và GGUF

GPTQ

  • Đây thực sự là một trong những phương pháp nổi tiếng nhất để lượng tử hóa xuống 4 bit
  • Nó dùng lượng tử hóa bất đối xứng và được thực hiện theo từng lớp, trong đó mỗi lớp được xử lý độc lập rồi mới chuyển sang lớp tiếp theo
  • Trong quá trình lượng tử hóa theo lớp, trước tiên trọng số của lớp được biến đổi bằng nghịch đảo Hessian, đây là đạo hàm bậc hai của hàm mất mát của mô hình và cho biết đầu ra của mô hình nhạy đến mức nào với sự thay đổi của từng trọng số
  • Nói đơn giản, nó cho thấy mức độ quan trọng (nghịch đảo) của từng trọng số trong lớp
  • Các trọng số có giá trị nhỏ trong ma trận Hessian quan trọng hơn vì những thay đổi nhỏ ở các trọng số này có thể dẫn đến thay đổi lớn trong hiệu năng mô hình

GGUF

  • GPTQ là một phương pháp lượng tử hóa tốt để chạy toàn bộ LLM trên GPU, nhưng không phải lúc nào cũng có đủ năng lực như vậy
  • Thay vào đó, có thể dùng GGUF để offload toàn bộ các lớp của LLM sang CPU
  • Điều này cho phép sử dụng cả CPU và GPU khi không có đủ VRAM

Part 4: Huấn luyện nhận biết lượng tử hóa (QAT - Quantization Aware Training)

  • Ở phần 3, chúng ta đã xem cách lượng tử hóa mô hình sau khi huấn luyện, nhưng nhược điểm là cách lượng tử hóa này không tính đến chính quá trình huấn luyện thực tế
  • Đây chính là lúc huấn luyện nhận biết lượng tử hóa (QAT) xuất hiện. Không giống PTQ, QAT nhằm học quy trình lượng tử hóa ngay trong quá trình huấn luyện
  • QAT có xu hướng chính xác hơn PTQ vì lượng tử hóa đã được tính đến trong khi huấn luyện

Kỷ nguyên của LLM 1 bit: BitNet

  • BitNet biểu diễn trọng số của mô hình bằng đúng 1 bit, tức là -1 hoặc 1
  • Điều này được thực hiện bằng cách đưa trực tiếp quy trình lượng tử hóa vào kiến trúc transformer
  • Kiến trúc transformer là nền tảng của hầu hết các LLM và bao gồm các phép tính có chứa linear layer
  • BitNet thay thế các linear layer này bằng thứ được gọi là BitLlinear

Lượng tử hóa trọng số

  • Trong quá trình huấn luyện, trọng số được lưu dưới dạng INT8 rồi sau đó được lượng tử hóa xuống 1 bit bằng chiến lược cơ bản là hàm dấu
  • Về bản chất, phân phối trọng số được dịch chuyển quanh 0, sau đó mọi thứ ở bên trái 0 được gán là -1 và mọi thứ ở bên phải được gán là 1

Lượng tử hóa activation

  • Để lượng tử hóa activation, BitLinear dùng lượng tử hóa absmax để chuyển activation từ FP16 sang INT8 vì phép nhân ma trận (×) cần độ chính xác cao hơn

Giải lượng tử

  • α (giá trị tuyệt đối lớn nhất của activation) và β (giá trị tuyệt đối trung bình của trọng số) được theo dõi, và những giá trị này sau đó sẽ giúp giải lượng tử activation trở lại FP16
  • Activation đầu ra được rescale bằng {α, γ} để giải lượng tử về độ chính xác ban đầu

Mọi mô hình ngôn ngữ lớn đều là 1.58 bit

  • BitNet 1.58b được giới thiệu để cải thiện các vấn đề về scaling đã đề cập trước đó
  • Trong phương pháp mới này, mỗi trọng số đơn lẻ của mô hình không chỉ có thể nhận giá trị -1 hoặc 1 mà giờ đây còn có thể nhận 0, tức trở thành ternary
    • Điều thú vị là chỉ cần thêm 0 thôi cũng giúp BitNet cải thiện đáng kể và tốc độ tính toán nhanh hơn nhiều

Sức mạnh của số 0

  • Tại sao việc thêm 0 lại là một cải tiến lớn đến vậy? Điều này liên quan hoàn toàn đến phép nhân ma trận
  • Khi có các trọng số được lượng tử hóa 1.58 bit, không chỉ tốc độ tính toán có thể tăng mạnh vì chỉ cần thực hiện các phép nhân, mà còn có thể lọc đặc trưng

Lượng tử hóa

  • Để thực hiện lượng tử hóa trọng số, BitNet 1.58b sử dụng lượng tử hóa absmean, một biến thể của lượng tử hóa absmax đã thấy trước đó
  • Nó đơn giản nén phân phối trọng số và dùng trị tuyệt đối trung bình (α) để lượng tử hóa giá trị, sau đó chúng được làm tròn thành -1, 0 hoặc 1
  • So với BitNet, lượng tử hóa activation giống hệt ngoại trừ một điểm. Thay vì scale activation về phạm vi [0, 2ᵇ⁻¹], giờ đây nó dùng lượng tử hóa absmax để scale về [-2ᵇ⁻¹, 2ᵇ⁻¹]
  • Lượng tử hóa 1.58 bit cần (chủ yếu) hai mẹo sau:
    • thêm 0 để tạo biểu diễn ternary [-1, 0, 1]
    • lượng tử hóa absmean cho trọng số
  • "13B BitNet b1.58 hiệu quả hơn 3B FP16 LLM về độ trễ, mức sử dụng bộ nhớ và mức tiêu thụ năng lượng"

  • Vì vậy có thể thu được mô hình nhẹ hơn nhờ chỉ dùng lượng tử hóa 1.58 bit có hiệu quả tính toán

Chưa có bình luận nào.

Chưa có bình luận nào.