Nền tảng AI

Bộ nhớ đệm KV của bạn không có vấn đề về bit. Nó có vấn đề về hình học.

mm
Thêm Unite.AI vào các nguồn ưu tiên của bạn trên Google

Tại cùng một độ chính xác 2 bit, một quyết định về trục quantize ảnh hưởng đến điểm số benchmark từ 2,88 đến 63,53. Keys và values cần được xử lý ngược lại — và lý do nằm trong phương trình chú ý, không phải phần cứng.

Hãy lấy Llama-2-13B. Nhóm bộ nhớ đệm key-value của nó theo kích thước nhóm quantization là 32 thành hai bit, trong khi để mọi thứ khác không đổi — cùng mô hình, cùng ngân sách bit, cùng kích thước nhóm, cùng benchmark.

Tùy thuộc vào một yếu tố duy nhất của quyết định thực hiện, kết quả độ chính xác CoQA nằm trong khoảng 2,88 hoặc 63,53. Điểm số sử dụng độ chính xác đầy đủ là 66,37.

Quyết định không phải là về số bit tổng thể được sử dụng. Câu hỏi đơn giản là trục nào bạn chọn để nhóm khi tính toán mỗi yếu tố quy mô? Khi bạn quyết định sử dụng kênh làm chiều nhóm (keys) và token làm chiều nhóm (values), bạn sẽ nằm trong khoảng bốn điểm của hiệu suất độ chính xác đầy đủ. Nếu bạn đảo ngược bất kỳ một trong những lựa chọn này, bạn sẽ gặp phải sự mất mát chất lượng. Nếu bạn đảo ngược cả hai lựa chọn này, mô hình sẽ không còn hoạt động.

Bốn cách chi tiêu 2 bit giống nhau trên cùng một bộ nhớ đệm. Kết quả từ việc phân tích KIVI trên Llama-2-13B với kích thước nhóm 32.

Quantization thường được coi là một nút chỉnh đơn giản: 8 bit, 4 bit, 2 bit, với chi phí độ chính xác mịn. Trong bộ nhớ đệm KV, điều đó không đúng. Đó là việc chọn hệ tọa độ, và các hệ khác nhau áp dụng cho keys và values. Bài viết này giải thích tại sao. Tóm lại: lỗi quantization phụ thuộc vào phạm vi giá trị trong nhóm; keys và values có cấu trúc rất khác nhau; và mọi người thường gặp khó khăn vì bạn không thể suy dẫn trục đúng từ phân phối giá trị. Bạn phải xem xét cách lỗi thay đổi sau khi chú ý tiêu thụ nó. Điều đó cung cấp một nguyên tắc chung cho việc nén các hoạt động trung gian và một lý do tốt để nghi ngờ lỗi tái tạo như một đại diện cho chất lượng.

Tại sao bộ nhớ đệm KV là nơi này cắn

Trong giai đoạn tạo, một transformer lưu tất cả dữ liệu dự án key và value (KV) của các token mà nó đã xử lý trước đó vào một bộ nhớ đệm để không phải tính toán lại dữ liệu này. Bộ nhớ đệm đó tăng tuyến tính với độ dài ngữ cảnh và kích thước batch. Cuối cùng, điều này sẽ dẫn đến việc bộ nhớ đệm lớn hơn mô hình chính nó.

Sự tăng trưởng này có thể dễ dàng xác định khi xem xét việc tiêu thụ bộ nhớ của các phần khác nhau của mô hình. Trong phân tích KVQuant của LLaMA-7B, trọng lượng chiếm khoảng 98 phần trăm bộ nhớ tại độ dài chuỗi 512, với hoạt động tại 2 phần trăm. Tại 128K ngữ cảnh, tỷ lệ đảo ngược thành khoảng 16 phần trăm trọng lượng và 84 phần trăm bộ nhớ đệm KV. Khi chúng tôi xem xét một phân tích của OPT-175B được trích dẫn bởi các tác giả KIVI, họ tìm thấy kết quả tương tự. Cụ thể, tại kích thước batch 512 với lời nhắc 512-token, bộ nhớ đệm KV đạt 1,2TB — nhiều lần so với kích thước trọng lượng mô hình.

Tuy nhiên, khả năng là chỉ một nửa vấn đề ở đây. Bộ xử lý phải đọc toàn bộ bộ nhớ đệm KV từ bộ nhớ thiết bị cho mỗi token được tạo. Điều này có nghĩa là trong khi bộ xử lý đọc bộ nhớ đệm KV, các lõi tính toán sẽ không hoạt động. Do đó, giảm kích thước tổng thể của bộ nhớ đệm sẽ tăng khả năng xử lý và giảm thời gian chờ chuyển dữ liệu.

Quantization Error thực sự là gì

Quantization số nguyên thống nhất về mặt toán học. Đối với một nhóm số, bạn ghi lại số nhỏ nhất làm điểm zero và sau đó chia phạm vi của nhóm đó theo số mức có thể được đại diện để có được kích thước bước. Bạn sau đó làm tròn mỗi yếu tố thành bước gần nhất. Hai kết quả trực tiếp tiếp theo. Đầu tiên, lỗi mỗi yếu tố bị giới hạn bởi nửa bước. Thứ hai, kích thước bước là phạm vi của nhóm chia cho 2 − 1. Tại 2 bit, bạn chỉ có 4 mức để bao phủ bất kỳ phạm vi nào tồn tại trong nhóm đó. Vì vậy, một yếu tố lớn hơn 100 lần so với các láng giềng của nó không chỉ hoạt động kém. Nó làm tăng kích thước bước cho tất cả các yếu tố khác chia sẻ cùng một nhóm, và tất cả chúng trở nên thô hơn cùng nhau. Nhóm là đơn vị thiệt hại. Việc chọn trục có nghĩa là quyết định những yếu tố nào sẽ chia sẻ số phận của chúng. Đặt câu hỏi theo cách khác, nó không còn là “tôi có thể chi bao nhiêu bit?” mà là “các giá trị cực đoan ở đâu và tôi có thể cô lập chúng không?”

Keys: Những điểm ngoại lệ sống trong kênh cố định

Các mô hình ngôn ngữ lớn chứa các hoạt động bất thường so với hầu hết các hoạt động. Sun và các đồng nghiệp đã lập danh mục các hoạt động rất lớn này trên các họ mô hình khác nhau: trong Mixtral 8x7B, độ lớn lớn nhất nằm gần 7000 trong khi độ lớn tính năng trung vị là khoảng 0,3 — khoảng bốn bậc lớn khác nhau. Những hoạt động này rất hiếm; chúng ở trong các chiều không thay đổi với đầu vào và chúng không phải là tai nạn. Chúng hoạt động như các thiên vị ngầm và chúng là những gì tập trung sự chú ý vào một vài token: hành vi của các điểm chú ý. Trong bộ nhớ đệm key, cấu trúc này rất rõ ràng: các kênh cụ thể mang các độ lớn rất lớn một cách nhất quán trên mọi token trong một chuỗi. Nhóm theo token, và mỗi nhóm chứa các kênh ngoại lệ, vì vậy mỗi nhóm bước được đặt bởi các kênh ngoại lệ, và tất cả các kênh thông thường phải trả tiền cho nó. Nhóm theo kênh, và các kênh ngoại lệ tạo thành các nhóm riêng của chúng. Phạm vi nội bộ của chúng lớn nhưng tự chứa; các kênh thông thường được để lại một mình. Kết quả phù hợp. Trung bình trên các lớp và đầu trên Llama-2-13B, KIVI báo cáo lỗi tái tạo key là 13,67 theo nhóm theo token so với 4,55 theo kênh, và — quan trọng hơn — lỗi điểm số chú ý là 47,00 so với 9,60. Quantizing keys theo token tạo ra khoảng năm lần lỗi điểm số. Các điểm số sau đó đồng ý với các số liệu có ý nghĩa cho keys; quantization kênh vượt trội trên cả hai mặt.

Values: Ở đâu trực giác bị phá vỡ

Bộ nhớ đệm giá trị không hiển thị mẫu kênh ngoại lệ. Nó dường như khá phẳng. Trên riêng nó, bằng cách lập luận phạm vi, chúng ta có thể mong đợi rằng bất kỳ một trong những trục này sẽ tạo ra chất lượng nén tương tự.

Họ không. Bất kể cách quản lý key được thực hiện (kết quả 2,80 và 2,88), nén theo kênh giá trị làm sụp đổ mô hình.

Và đây là điều bắt: nếu bạn đo lường sự mất mát này bằng cách sử dụng lỗi tái tạo thô trên tensor ban đầu mà mỗi giá trị được nén, quantization giá trị theo kênh thực sự trông hơi tốt hơn, ở 3,73 so với 4,57. Nếu bạn xác thực nén của mình theo cách rõ ràng, bạn sẽ chọn cấu hình phá hủy mô hình.

Lỗi quantization bộ nhớ đệm giá trị trên Llama-2-13B, đo lường theo hai cách. Các chỉ số tensor được lưu trữ và đầu ra tiêu thụ không đồng ý hơn một bậc lớn.

Giải pháp là bộ nhớ đệm giá trị không bao giờ được đọc trực tiếp. Nó được tiêu thụ bởi một sản phẩm ma trận: đầu ra chú ý là tổng có trọng số của các vector giá trị trên các token, với các điểm số chú ý softmax làm trọng số. Do đó, lỗi liên quan là lỗi được giới thiệu trong quá trình này và không trong các tensor chính nó. Được đo lường theo đầu ra chú ý, thứ tự được đảo ngược hoàn toàn. Lỗi tương đối được báo cáo bởi KIVI cho đầu ra chú ý do quantization vector giá trị theo token là 3,55 so với 49,89 cho quantization theo kênh — hơn mười bốn lần cao hơn cho những gì dường như là lựa chọn tốt hơn dựa trên cách nó được nén.

Giải thích là độ thưa của chú ý, mà họ đo lường là 84,3 phần trăm. Phần lớn thông tin chứa trong đầu ra có thể được quy cho một số token rất quan trọng. Quantization theo token giới hạn lỗi của mỗi token trong token đó, vì vậy lỗi trên các token không quan trọng bị nhân với các trọng số chú ý gần bằng không và thực sự biến mất. Quantization theo kênh lan tỏa lỗi của mỗi token trên một thang kênh chia sẻ, vì vậy các token bị đại diện kém làm ô nhiễm đại diện của những token quan trọng. Độ thưa mà làm cho chú ý hiệu quả là thuộc tính làm cho quantization theo token an toàn.

Bài học chuyển giao rộng hơn bộ nhớ đệm KV: đo lường lỗi nén ở nơi tensor được tiêu thụ, không nơi nó được lưu trữ. Một giả định ngầm được thực hiện bởi lỗi tái tạo là mỗi thành phần của tensor có trọng số bằng nhau khi đóng góp vào đầu ra cuối cùng. Chú ý rõ ràng không. Bất kỳ hoạt động hạ游 nào trọng số, cổng hoặc làm thưa đầu vào của nó phá vỡ giả định đó. Những người đọc quen thuộc với bài viết trước của tôi về điểm mù trong các chỉ số đánh giá trong các hệ thống thu hồi sẽ nhận ra rằng những kết quả này tương tự như những kết quả thất bại trước đó được mô tả: các chỉ số dễ tính toán báo cáo về điều gì khác mà chúng tôi muốn.

Rotary Embeddings Complicate the Keys

Có một số vấn đề khi sử dụng Rotary Position Embeddings (RoPE). RoPE xoay các cặp kênh dựa trên vị trí tương đối của mỗi token. Sự pha trộn này một phần làm tan biến cấu trúc kênh cố định mà làm cho quantization key theo kênh hoạt động. Một kênh ngoại lệ bị xoay vào các láng giềng của nó, và các láng giềng thừa hưởng phạm vi. Câu trả lời của KVQuant là thứ tự: quantize keys trước khi áp dụng xoay, và áp dụng RoPE sau khi giải quantization. Cùng với quantization key theo kênh, các kiểu dữ liệu không đồng đều và cô lập một phần nhỏ các ngoại lệ, điều này nhận được dưới 0,1 sự suy giảm độ bối rối tại 3 bit, và cho phép phục vụ LLaMA-7B lên đến 1 triệu token ngữ cảnh trên một A100-80GB.

Điều quan trọng là phải hiểu mức độ tác động từ RoPE. Các tác giả của bài báo “RotateKV” báo cáo sự tăng 145% trong lỗi quantization khi RoPE được thêm vào, và lưu ý rằng các kênh ngoại lệ khác nhau trên các đầu chú ý — đó là lý do tại sao việc áp dụng một ma trận xoay chia sẻ ở mọi nơi là không đủ, và các xoay thích ứng với đầu làm tốt hơn.

Thuế Hệ thống và Tại sao Nó Không phải là Chi tiết

Quantization theo token phù hợp với giải mã. Mỗi token đến; bạn quantize nó, thêm nó vào chuỗi (theo chiều token), không có gì khác di chuyển.

Tuy nhiên, quantization theo kênh không phù hợp. Vì thống kê của một kênh bao trùm các token chưa được tạo ra, bạn không thể tính toán một yếu tố quy mô khi một token đến. Giải pháp của KIVI là giữ các token gần đây nhất — lên đến 128 — ở độ chính xác đầy đủ trong một bộ đệm dư, và quantize theo nhóm khi đủ đã tích lũy.

Khi nó xảy ra, bộ đệm dư trở nên quan trọng, chứ không chỉ là một thứ附属. Trên GSM8K với Llama-2-7B, điểm số độ chính xác đầy đủ là 13,50. Hoàn toàn được quantized đến 2 bit với các trục chính xác, nó ghi được 5,76. Cùng các trục và cùng số bit, cộng với bộ đệm dư của các token gần đây được tạo ra ở độ chính xác đầy đủ, ghi được 12,74. Một cửa sổ trượt của các token gần đây được tạo ra ở độ chính xác đầy đủ sẽ phục hồi nhiều những gì đã bị mất do quantization hung hăng trên các vấn đề đa bước khó — điều này sẽ có ý nghĩa nếu chúng ta xem xét những token nào đang được chú ý bởi một chuỗi các hoạt động số học.

Có một lợi ích đáng kể khi làm tất cả những điều này một cách chính xác — như KIVI báo cáo, 2,6 lần sử dụng bộ nhớ đỉnh ít hơn cho Llama-2-7B, cho phép kích thước batch lên đến 4 lần lớn hơn, cũng như 2,35 đến 3,47 lần hiệu suất tốt hơn trên một nhiệm vụ dịch vụ thực tế.

Điều gì cần làm với Điều này

  1. Không bao giờ sử dụng một quantizer cho cả hai. Sử dụng các quantizer khác nhau cho keys (theo kênh) và cho values (theo token). Một pipeline áp dụng một quantizer duy nhất cho “bộ nhớ đệm KV” có thể đã hy sinh hầu hết chất lượng có thể khi sử dụng một số lượng bit nhỏ để đại diện cho mỗi giá trị.
  2. Quantize keys trước RoPE. Điều này là một vấn đề về tính chính xác so với một vấn đề về sở thích.
  3. Lưu trữ một cửa sổ độ chính xác đầy đủ của các token gần đây được tạo ra. Mặc dù việc lưu trữ một cửa sổ như vậy chỉ chiếm rất ít bộ nhớ so với bộ nhớ đệm có thể lớn, nhưng chính khu vực này tạo ra nhiều độ chính xác cho các nhiệm vụ khó.
  4. Không xác thực trên lỗi tái tạo. Luôn xác thực dựa trên đầu ra chú ý hoặc dựa trên hiệu suất nhiệm vụ cuối cùng. Chỉ số lưu trữ không chỉ là tiếng ồn — đối với values, nó trỏ theo hướng sai.
  5. Không xác thực trên các benchmark lựa chọn nhiều với ngữ cảnh ngắn. Các tác giả KIVI cố ý tránh các nhiệm vụ đóng như MMLU cho đánh giá này, vì một bước giải mã duy nhất đọc đầu ra logits hầu như không thực hiện bộ nhớ đệm tại tất cả. Bất kỳ đánh giá nào không xây dựng bộ nhớ đệm theo thời gian và sau đó thực hiện tạo từ nó sẽ không bao giờ có thể quan sát các thất bại vốn có trong thiết kế hệ thống của bạn.

Đâu là Hướng của Công việc

Mặc dù vẫn còn một số việc phải làm về bản chất hình học của vấn đề, nhiều nhà nghiên cứu tiếp tục nghiên cứu cách các kênh ngoại lệ được phân phối giữa các đầu transformer khác nhau, và cách các hạn chế phần cứng ảnh hưởng đến việc nhóm nào là rẻ nhất: InnerQ gấp chuẩn hóa kênh-wise key vào trọng lượng key và query trong quá trình tiền điền. Do đó, không có chi phí bổ sung nào được phát sinh tại thời gian chạy. Hơn nữa, InnerQ lưu trữ các cửa sổ độ chính xác cao cho cả các token gần đây được tạo ra và các token chú ý. Bằng cách này, InnerQ loại bỏ cơ hội cho các kênh ngoại lệ làm ô nhiễm các kênh lân cận.

Những người khác đề xuất rằng thay vì lưu trữ toàn bộ bộ nhớ đệm, chúng ta nên lưu trữ chỉ đủ thông tin để có thể tái tạo key và / hoặc value (s) theo yêu cầu từ một đại diện bộ nhớ đệm nhỏ hơn.

Cuối cùng, điều quan trọng là phải nhớ rằng độ chính xác không phải là tham số duy nhất mà quantization ảnh hưởng. Nghiên cứu gần đây được công bố cho thấy sự suy giảm căn chỉnh kết quả từ việc quantizing bộ nhớ đệm KV. Hơn nữa, nghiên cứu này ghi lại sự suy giảm căn chỉnh thậm chí trong các môi trường phục vụ vLLM sản xuất sử dụng bộ nhớ đệm FP8 cùng với một giao thức phục hồi không cần huấn luyện đã khôi phục lại tới 97% những gì đã bị mất về căn chỉnh. Do đó, trong khi một cấu hình có thể giữ được kết quả benchmark của nó, điều đó không có nghĩa là nó giữ lại tất cả các tham số khác mà bạn quan tâm.

Nguyên tắc Tổng quát

Ý tưởng về quantization đã được định hình như một “ngân sách độ chính xác”: tôi có thể hy sinh bao nhiêu bit? Bộ nhớ đệm KV cho thấy rằng câu hỏi hữu ích hơn là cấu trúc. Độ chính xác được phân bổ trong các nhóm; nhóm là đơn vị thiệt hại, và trục bạn nhóm theo quyết định những yếu tố nào sẽ chia sẻ số phận của chúng. Trục chính xác là trục mà tensor của bạn đang được tiêu thụ, tức là cách bạn đang sử dụng tensor của mình và KHÔNG phải cách tensor của bạn xuất hiện khi được lưu trữ trong bộ nhớ. Keys được sử dụng thông qua một tính toán dot-product chống lại query. Một kênh bị hỏng sẽ làm hỏng tất cả các điểm số. Values được tiêu thụ thông qua một tính toán trung bình có trọng số trên các token. Do đó, một token bị hỏng đơn giản chỉ được trọng số ra.

Hai tensor có cùng kích thước và được tạo ra bởi hai lớp liên tiếp được xử lý khác nhau. Điều đáng hỏi về bất kỳ hoạt động nào bạn định nén là: hoạt động nào thu hẹp điều này, và việc nhóm của tôi có tôn trọng nó không?

Himanshu Goel là một nhà nghiên cứu AI/ML chuyên về tạo sinh tăng cường cho các lĩnh vực quan trọng, bao gồm các quy trình làm việc tài liệu sinh học, tài chính và quy định.