Bốn phép nhân cho biết chi phí của một cuộc hội thoại về bộ nhớ GPU: 4,5 GiB ở 128K trên gpt-oss-120b, 40 GiB trên cấu trúc dày đặc mà hầu hết mọi người vẫn hình dung.
Ngăn xếp phục vụ với lớp bộ nhớ và độ chính xác được bật sáng. Đây là Phần hai trong số bảy. Lớp nơi việc lập kế hoạch năng lực thực sự diễn ra.
Phần 1: Bắt đầu từ đây: Những từ mọi người dùng về suy luận LLM
Phần một kết thúc với một vấn đề mà nó không thể giải quyết. Xử lý theo lô (batching) cho phép nhiều người dùng chia sẻ một lần đọc trọng số của mô hình, điều này giúp việc phục vụ trở nên hợp lý, nhưng phần mô hình ghi nhớ cuộc hội thoại của bạn là của riêng bạn, và không có số lượng nào
Bốn phép nhân cho biết chi phí bộ nhớ GPU của một cuộc hội thoại: 4,5 GiB ở 128K trên gpt-oss-120b, 40 GiB trên hình dạng dày đặc mà hầu hết mọi người vẫn hình dung.
Ngăn xếp phục vụ với lớp bộ nhớ và độ chính xác được chiếu sáng. Đây là Phần hai trong số bảy. Lớp mà việc lập kế hoạch năng lực thực sự diễn ra.
Phần 1: Bắt đầu từ đây: Những từ mọi người dùng về suy luận LLM
Phần một kết thúc với một vấn đề mà nó không thể giải quyết. Xử lý theo lô (batching) cho phép nhiều người dùng chia sẻ một lần đọc trọng số của mô hình, điều này giúp việc phục vụ trở nên phải chăng, nhưng phần mô hình ghi nhớ cuộc trò chuyện của bạn là của riêng bạn, và không có lượng xử lý theo lô nào có thể phân tán chi phí đó.
Phần này nói về kích thước thực tế của bộ nhớ riêng tư đó. Các kế hoạch năng lực thường đổ vỡ ở đây nhiều hơn bất kỳ nơi nào khác trong ngăn xếp, và chúng thất bại theo cùng một cách mỗi lần: mô hình phù hợp, bản demo nhanh, và sau đó sự đồng thời thực tế xuất hiện.
**KV cache là gì**
Khi một mô hình đọc văn bản, mỗi token tạo ra hai vector mà cơ chế chú ý (attention) cần sau này: một khóa (key) và một giá trị (value). Thay vì tính toán lại chúng cho mọi token trước đó mỗi khi nó viết một token mới, mô hình sẽ lưu trữ chúng. Kho lưu trữ đó chính là KV cache.
Đây là một sự đánh đổi trực tiếp giữa bộ nhớ và thời gian. Nếu không có nó, mỗi bước sẽ phải tính toán lại khóa và giá trị cho mọi token đã xuất hiện trước đó; với nó, mỗi bước chỉ tính toán chính xác một. Đó là sự tiết kiệm, và đó là sự tiết kiệm theo từng bước: công việc lẽ ra sẽ tăng lên theo cuộc trò chuyện ở mỗi bước thay vào đó lại giữ nguyên. Đây cũng là lý do tại sao một cuộc trò chuyện dài tốn kém hơn một cuộc trò chuyện ngắn ngay cả khi câu trả lời giống hệt nhau.
Nó không lưu trữ văn bản của bạn. Cái tên gợi ý một bản ghi, và mô hình tư duy theo sau đó là sai lầm theo cách gây tốn kém. Những gì được lưu trữ là hai vector cho mỗi token trên mỗi lớp: các con số, không phải ký tự. Và chúng không thể hoán đổi cho nhau giữa hai cách diễn đạt có cùng ý nghĩa.
Lấy ví dụ hai khách hàng hỏi cùng một câu hỏi với một trợ lý hỗ trợ:
Hai cách diễn đạt cùng một câu hỏi được chia thành các token, với một quy tắc đánh dấu nơi chúng phân kỳ ngay từ token đầu tiên. Năm token so với sáu. Bốn trong số chúng giống hệt nhau và không có cái nào có thể tái sử dụng, bởi vì việc khớp bắt đầu từ token đầu tiên và dừng lại ở sự khác biệt đầu tiên.
"What's" là một token duy nhất; "What is" là hai. Các chuỗi phân kỳ ở token đầu tiên, vì vậy tiền tố chung là không, mặc dù có bốn token giống hệt nhau nằm ngay giữa. Khóa và giá trị của một token phụ thuộc vào vị trí của nó và vào mọi token trước đó, vì vậy "your" ở vị trí 1 là một mục nhập khác với "your" ở vị trí 2.
Tái sử dụng là khớp chính xác trên một chuỗi token, được tính từ token đầu tiên. Không phải trên ý nghĩa, và không phải trên bất cứ điều gì mà con người sẽ gọi là cùng một câu hỏi.
Và sự phân tách trên thuộc về bộ mã hóa (tokenizer) này. Chạy hai chuỗi tương tự qua mã hóa của GPT-4 và "What's" trở thành hai token thay vì một, điều này di chuyển sự phân kỳ từ vị trí không sang vị trí một và mang lại cho bạn một token chung mà bạn không có. Llama, Qwen, Mistral và Gemma mỗi loại lại phân tách khác nhau. Bất cứ thứ gì bạn dùng để đo lường điều này phải là bộ mã hóa mà mô hình bạn phục vụ thực sự sử dụng, nếu không bạn đã đo lường việc triển khai của người khác.
Hoạt ảnh: bộ nhớ đệm (cache) điền một mục nhập cho mỗi token, với một dấu ngoặc bên dưới cho thấy cơ chế chú ý đọc lại toàn bộ mọi bước, và các bộ đếm cho kích thước bộ nhớ đệm và công việc được thực hiện có và không có nó. Hai điều cùng một lúc, và điều thứ hai là điều mọi người bỏ qua. Với bộ nhớ đệm, bạn tính toán một cặp khóa-giá trị mỗi bước thay vì tất cả chúng. Nhưng bộ nhớ đệm vẫn được đọc toàn bộ trên mỗi lần thực hiện.
chi phí ngừng tăng theo đường cong và bắt đầu tăng theo đường thẳng, điều này không đồng nghĩa với việc trở nên nhỏ.
Bốn phép nhân
Một khóa và một giá trị, nhân với số lớp, nhân với số đầu khóa-giá trị, nhân với kích thước đầu, nhân với số byte trên mỗi số.
Năm con số với bốn dấu nhân ở giữa, đây là nguồn gốc của tiêu đề. Ba trong số năm con số này được đọc trực tiếp từ tệp cấu hình của mô hình. Một là hằng số 2, vì mỗi token lưu trữ một khóa và một giá trị. Cuối cùng là lựa chọn độ chính xác của bạn.
Lấy gpt-oss-120b, có trọng số mở, vì vậy mọi con số dưới đây đều có thể được đọc từ tệp config.json của nó mà không cần tài khoản hay cổng truy cập. Nó có 36 lớp, 8 đầu khóa-giá trị và kích thước đầu là 64. Ở định dạng 16-bit, điều này tương đương 72 KiB cho mỗi token.
Sau đó, kiến trúc trả lại một nửa, và đây là phần đáng đọc cấu hình. Cùng một tệp có "sliding_window": 128 và một danh sách layer_types xen kẽ. Một nửa số lớp xử lý toàn bộ cuộc hội thoại. Nửa còn lại chỉ xem xét 128 token cuối cùng.
Năm yếu tố được thể hiện dưới dạng các thẻ được dán nhãn, sau đó cùng một phép nhân được thực hiện hai lần: 36 lớp cho 72 KiB mỗi token, và 18 lớp cho 36 KiB. Yếu tố thứ năm là yếu tố gây khó khăn. num_hidden_layers ghi 36 và layer_types ghi chỉ 18 trong số đó tăng lên, vì vậy cùng một cấu hình hỗ trợ hai câu trả lời khác nhau chính xác gấp đôi.
Mười tám lớp chú ý đầy đủ tăng theo cuộc hội thoại, với 36 KiB mỗi token. Mười tám lớp cửa sổ trượt giữ 128 token giữa chúng và dừng lại: 4,5 MiB, cố định, bất kể thời gian chạy.
Mô hình được vẽ từ cấu hình của nó: 36 thanh lớp xen kẽ chú ý đầy đủ và trượt, 64 đầu truy vấn được nhóm trên 8 đầu khóa-giá trị, và 128 ô chuyên gia với bốn ô được chiếu sáng. Mỗi đơn vị được vẽ thay vì tóm tắt: 36 thanh lớp, 64 dấu truy vấn trên 8 hộp khóa-giá trị, 128 ô chuyên gia với bốn ô sáng. Đếm bất cứ thứ gì trong đó và bạn sẽ nhận lại cấu hình.
Vì vậy, con số trung thực là 36 KiB mỗi token, với điều kiện công cụ của bạn phân bổ các lớp trượt dưới dạng lớp trượt. Nếu không, bạn sẽ trở lại 72 KiB và một nửa dung lượng, điều này đáng để kiểm tra trước khi bạn lên kế hoạch dựa trên điều này. Nhân ra:
Ba mươi hai lần ngữ cảnh, ba mươi hai lần bộ nhớ. Các thanh là tuyến tính, vì vậy 4K là phần nhỏ thực sự của nó. Cộng thêm 4,5 MiB cố định từ nửa trượt, trên mỗi hàng. Nó là 3% ở 4K và lỗi làm tròn ở 128K, đó là lý do tại sao phần còn lại của bài viết này chỉ làm việc với phần đang tăng lên.
Đó là
Nguồn tin: Medium Towards AI — Tác giả: Satsawat Natakarnkitkul (Net). Bản dịch tiếng Việt do AI thực hiện, có thể có sai sót.