Chọn kỹ thuật theo nút thắt
Chọn kỹ thuật theo nút thắt
Bảy chương vừa rồi, mỗi chương một phép kế toán riêng. Bài này gom lại: cho một cấu hình cụ thể, kỹ thuật nào cắt được bao nhiêu, và cái gì thì phép đếm không trả lời được.
Bạn đã đi hết bảy chương. Mỗi chương dạy một cách làm mô hình rẻ đi, và mỗi chương có phép tính riêng của nó: bộ đệm KV đếm byte theo số lớp và số đầu, trộn chuyên gia đếm tham số hoạt động, lượng tử hoá đếm bit. Học riêng từng cái thì rõ. Đặt cạnh nhau thì câu hỏi thật mới hiện ra: với đúng cấu hình của tôi, cái nào đáng làm trước?
Sim dưới đây trả lời phần trả lời được. Nó lấy một cấu hình, dựng ra một bản gốc không dùng kỹ thuật nào, rồi áp từng kỹ thuật lên đúng bản gốc đó và đếm chênh lệch. Kết quả là byte và phép tính, chính xác tới từng đơn vị, và bạn sửa tham số nào thì nó tính lại tham số đó.
Nhưng phải nói ngay ranh giới, vì đây là chỗ dễ đọc sai nhất của cả cuốn sách. Sim này không chấm điểm kỹ thuật nào tốt hơn kỹ thuật nào. Nó không thể. Thứ nó đo là dung lượng và số phép tính. Thứ quyết định trong thực tế thường là mô hình còn làm được gì sau khi áp dụng, và điều đó chỉ huấn luyện rồi đo mới biết. Hai kỹ thuật cắt cùng một lượng byte có thể huỷ hoại mô hình ở hai mức khác hẳn nhau, và trong bảng dưới đây chúng trông giống hệt nhau.
1 · Cấu hình chung ✎ sửa được
Bộ đệm KV của bản gốc dựng lại đúng công thức của bài bộ đệm KV: 2 × 32 × 32 × 128 × 2 × 131.072 × 1 = 68.719.476.736 byte. Số 2 là giữ cả K lẫn V, không có gì khác nấp trong đó. Mỗi token tốn 512,0 KiB qua 32 lớp.
2 · Tham số riêng của từng kỹ thuật ✎ sửa được
3 · Sáu kỹ thuật trên đúng cấu hình này
| kỹ thuật | đại lượng nó chạm vào | bản gốc | sau khi áp dụng | chênh lệch | phần trăm | hệ số |
|---|---|---|---|---|---|---|
| chú ý theo nhóm | byte bộ đệm KV | 64,0 GiB | 16,0 GiB | ↓ cắt được 48,0 GiB | 75,00% | 4,00× |
| nén tiềm ẩn | byte bộ đệm KV | 64,0 GiB | 4,0 GiB | ↓ cắt được 60,0 GiB | 93,75% | 16,00× |
| cửa sổ trượt | byte bộ đệm KV | 64,0 GiB | 2,0 GiB | ↓ cắt được 62,0 GiB | 96,88% | 32,00× |
| cặp chú ý khi nạp cả ngữ cảnh | 8,80 nghìn tỉ | 541,17 tỉ | ↓ cắt được 8,25 nghìn tỉ | 93,85% | 16,25× | |
| lượng tử hoá bộ đệm KV | byte bộ đệm KV | 64,0 GiB | 32,0 GiB | ↓ cắt được 32,0 GiB | 50,00% | 2,00× |
| lượng tử hoá trọng số | byte trọng số phải nạp | 14,9 GiB | 3,7 GiB | ↓ cắt được 11,2 GiB | 75,00% | 4,00× |
| trộn chuyên gia | phép tính nhân ma trận mỗi bước sinh | 16,00 tỉ | 4,00 tỉ | ↓ cắt được 12,00 tỉ | 75,00% | 4,00× |
| byte trọng số phải nạp | 14,9 GiB | 14,9 GiB | = không đổi 0 byte | 0,00% | 1,00× |
- Cái giá đo được: tham số phép chiếu, so với hai ma trận K và V của bản gốc = -872,42 triệu. Xuống 2.097.152 cộng lên 4.194.304 mỗi lớp, đổi lấy 33.554.432 của bản gốc. Số dương là trả thêm, số âm là bớt được.
- Cái giá đo được: phép tính dựng lại K và V mỗi bước sinh = 268,44 triệu. Bản gốc đọc thẳng K và V từ bộ đệm, còn nén tiềm ẩn phải nhân ngược lên. Đây là bản chưa gộp phép chiếu vào truy vấn: cài đặt thật gộp được và khi đó con số này khác đi.
- Cái giá đo được: token nằm ngoài tầm với của một lớp = 126.976. Ở một lớp, token mới nhất chỉ đọc được 4.096 token gần nhất. Xếp 32 lớp thì đường truyền hình học với tới 131.041 token.
- Cái giá đo được: byte trọng số vẫn phải nạp, không bớt đi chút nào = 14,9 GiB. Bộ định tuyến chỉ chọn chuyên gia nào chạy. Chuyên gia không được chọn vẫn phải nằm trong bộ nhớ, vì token sau có thể cần tới.
4 · Nút thắt: bộ nhớ khi ngữ cảnh dài
Nút thắt này được tính bằng byte bộ đệm KV. Dưới đây là những kỹ thuật thật sự chạm vào đúng những đại lượng đó, xếp theo số byte hoặc số phép tính cắt được ở cấu hình bạn đang gõ. Đây không phải lời khuyên chung: sửa một núm là thứ tự có thể đổi.
- Nó không chấm điểm và không xếp hạng kỹ thuật nào tốt hơn. Nó đếm byte và phép tính. Chất lượng mô hình sau khi áp dụng là thứ chỉ huấn luyện rồi đo mới biết, và đó thường mới là thứ quyết định.
- Mỗi kỹ thuật được áp một mình lên cùng một bản gốc. Phần tiết kiệm của hai kỹ thuật không cộng lại được: chú ý theo nhóm và lượng tử hoá bộ đệm cùng nhân vào một con số. Sim cố tình không cộng chúng.
- Bản gốc ở đây là mô hình dày, chú ý nhiều đầu, mặt nạ nhân quả đầy đủ. Đổi định nghĩa bản gốc thì mọi phần trăm đổi theo, nên đừng mang con số phần trăm này đi so với một bài viết dùng bản gốc khác.
- Phần nén tiềm ẩn đặt phần mang vị trí không nén bằng 0, tức là bản đơn giản hoá. Bài nén bộ đệm KV có bản đầy đủ, và ở đó bộ đệm mỗi token nhỉnh hơn con số tại đây.
- Byte thật trên máy luôn nhiều hơn: còn phân trang, còn đệm thừa, còn vùng làm việc của nhân tính toán. Bài chạy được trên máy nào cộng cả phần đó.
Bản gốc là gì, và vì sao phải nói ra
Mọi phần trăm chỉ có nghĩa khi biết nó chia cho cái gì. Bản gốc ở đây được định nghĩa dứt khoát: mô hình dày (mọi tham số chạy cho mọi token), chú ý nhiều đầu (số đầu KV bằng đúng số đầu truy vấn), mặt nạ nhân quả đầy đủ (không cửa sổ), trọng số và bộ đệm cùng lưu ở số byte mỗi phần tử bạn chọn.
Ở trạng thái mở bài, cấu hình là 8 tỉ tham số, 32 lớp, chiều ẩn 4096, 32 đầu chú ý, 8 đầu KV, 128 chiều mỗi đầu, ngữ cảnh 131.072 token, lô 1, hai byte mỗi phần tử. Bản gốc của cấu hình đó tốn:
- 14,9 GiB trọng số, tức 8 tỉ tham số nhân 2 byte.
- 512,0 KiB bộ đệm KV cho mỗi token, tức
2 × 32 đầu × 128 chiều × 2 byte = 16.384byte ở mỗi lớp, nhân 32 lớp. Đây đúng là công thức của bài bộ đệm KV, không phải một biến thể gần giống: cổng kiểm số của bài này biên dịch cả engine của bài kia rồi so từng con số trên một lưới cấu hình, và nếu hai bài lệch nhau thì cổng đỏ. - 64,0 GiB bộ đệm KV cho trọn ngữ cảnh 131.072 token.
- 8,80 nghìn tỉ cặp chú ý khi nạp cả ngữ cảnh, tính trên mọi lớp và mọi đầu.
- 16,00 tỉ phép tính nhân ma trận cho mỗi bước sinh một token.
Con số 64,0 GiB đứng cạnh 14,9 GiB là điều đáng dừng lại. Bộ đệm lớn gấp hơn bốn lần trọng số. Đó không phải chuyện lạ, đó là chuyện bình thường khi ngữ cảnh dài, và nó giải thích vì sao bốn trong sáu kỹ thuật của cuốn sách này đều nhắm vào cùng một chỗ.
Bốn kỹ thuật cùng cắt vào bộ đệm KV
Đặt nút thắt ở bộ nhớ khi ngữ cảnh dài, sim chỉ giữ lại bốn kỹ thuật chạm vào byte bộ đệm. Ở cấu hình mở bài, chúng cắt như sau.
Chú ý theo nhóm hạ số đầu KV từ 32 xuống 8, nên bộ đệm còn đúng một phần tư: 16,0 GiB, cắt 48,0 GiB, tức 75,00%. Tỉ lệ này không phải con số ma thuật, nó đúng bằng 8 chia 32.
Nén tiềm ẩn thay cả K lẫn V bằng một véc tơ 512 số, đứng cạnh 8192 số mà bản gốc phải giữ mỗi lớp. Bộ đệm còn 4,0 GiB, cắt 60,0 GiB, tức 93,75%. Nó cũng là kỹ thuật duy nhất ở đây có cái giá đo được: sim tính luôn số phép chiếu phải thêm và số phép tính phải bỏ ra để dựng lại K và V mỗi bước sinh. Ở cấu hình này phần tham số phép chiếu ra số âm, nghĩa là nó còn bớt đi so với hai ma trận K và V của bản gốc, và sim ghi đúng dấu chứ không gọi mọi thứ là chi phí.
Cửa sổ trượt là kỹ thuật duy nhất cắt vào hai đại lượng cùng lúc. Bộ đệm thôi lớn theo ngữ cảnh và dừng ở 4096 token, còn 2,0 GiB, cắt 62,0 GiB, tức 96,88%. Đồng thời số cặp chú ý tụt từ bậc hai về gần tuyến tính: cắt 8,25 nghìn tỉ cặp, tức 93,85%.
Lượng tử hoá bộ đệm không đổi kiến trúc gì cả, chỉ lưu mỗi số bằng 1 byte thay vì 2. Bộ đệm còn 32,0 GiB, cắt đúng 50,00%. Đây là kỹ thuật rẻ nhất về mặt công sức triển khai và cũng là kỹ thuật cắt ít nhất ở cấu hình này.
Bốn con số 96,88%, 93,75%, 75,00% và 50,00% xếp thành một thứ tự rõ ràng. Nhưng đó là thứ tự của bốn con số, không phải thứ tự nên làm. Cửa sổ trượt đứng đầu vì nó vứt đi 126.976 token khỏi tầm với của một lớp. Nén tiềm ẩn đứng thứ hai vì nó ép 8192 số xuống 512. Cả hai đánh đổi thứ mà bảng này không có cột nào để ghi.
Hai kỹ thuật không chạm vào bộ đệm
Đổi nút thắt sang bộ nhớ khi nạp mô hình thì bốn kỹ thuật vừa rồi biến mất khỏi danh sách, và hai kỹ thuật khác hiện ra.
Lượng tử hoá trọng số hạ mỗi trọng số từ 16 bit xuống 4 bit. Trọng số còn 3,7 GiB, cắt 11,2 GiB, tức 75,00%. Nó không cắt một byte bộ đệm KV nào, và đó chính là lý do nó không xuất hiện ở nút thắt ngữ cảnh dài.
Trộn chuyên gia thì phải đọc kỹ hơn, và mục sau dành riêng cho nó.
Chuyện bốn kỹ thuật kia biến mất không phải vì chúng kém. Chúng cắt rất nhiều, chỉ là cắt vào chỗ khác. Một người đang không nạp nổi mô hình lên thẻ mà đi triển khai cửa sổ trượt thì đã bỏ công vào đúng chỗ không thiếu.
Điểm dạy học quan trọng nhất của bài này
Trộn chuyên gia là kỹ thuật duy nhất trong sáu cái có hai hiệu ứng ngược chiều nhau, và sim cố tình in cả hai cạnh nhau thay vì chỉ khoe cái đẹp.
Với 2 tỉ tham số hoạt động trên tổng 8 tỉ, phép tính nhân ma trận mỗi bước sinh tụt từ 16,00 tỉ xuống 4,00 tỉ, tức cắt 12,00 tỉ phép tính, 75,00%. Đó là con số thật và nó rất lớn.
Còn byte trọng số phải nạp: 14,9 GiB trước, 14,9 GiB sau. Cắt được 0,00%.
Không phải "gần như không giảm". Đúng bằng không, ở mọi cấu hình, luôn luôn. Cổng kiểm số của bài này quét cả một lưới cấu hình để khẳng định điều đó chứ không kiểm ở một điểm. Lý do thì đơn giản tới mức dễ quên: bộ định tuyến chỉ chọn chuyên gia nào chạy cho token này. Những chuyên gia không được chọn vẫn phải nằm trong bộ nhớ, vì token sau có thể cần tới chúng. Bạn tiết kiệm phép tính, bạn không tiết kiệm chỗ chứa.
Đây là chỗ người ta đọc thẻ mô hình sai nhiều nhất. Một mô hình ghi "671 tỉ tham số, 37 tỉ hoạt động" thì con số 37 tỉ nói về công tính toán mỗi token, còn thứ bạn phải nạp lên thẻ vẫn là 671 tỉ. Bài chạy được trên máy nào cộng đủ cả ba khoản trọng số, bộ đệm và phần dôi ra của thời gian chạy, và ở đó con số phải nạp mới là con số quyết định.
Hai mốc biên đáng nhớ
Có hai chỗ mà kỹ thuật tiết kiệm đúng 0, và biết trước hai chỗ đó thì đỡ mất công.
Số đầu KV bằng số đầu truy vấn thì chú ý theo nhóm tiết kiệm 0,00%. Không phải "rất ít", mà đúng bằng không, vì lúc đó nó chính là chú ý nhiều đầu. Chú ý theo nhóm không phải một cơ chế đặt cạnh chú ý nhiều đầu, nó là cùng một cơ chế với một con số bị hạ xuống, và ở mốc trên cùng thì hai thứ trùng khít. Kéo số đầu KV xuống 31 thì phần tiết kiệm hiện ra ngay, đúng bằng một phần ba mươi hai của bộ đệm.
Cửa sổ rộng bằng hoặc hơn ngữ cảnh thì cửa sổ trượt tiết kiệm 0,00%, ở cả hai đại lượng. Vì lúc đó mặt nạ quay về nhân quả đầy đủ, từng ô một. Hạ cửa sổ xuống đúng một token thì bộ đệm bớt đúng một token và số cặp chú ý bớt đúng một cặp cho mỗi đầu ở mỗi lớp. Cả hai mốc này đều được cổng kiểm số khẳng định tại đúng mốc, một bước dưới và một bước trên, vì một mốc chỉ được kiểm ở gần nó thì không phân biệt được dấu lớn hơn với dấu lớn hơn hoặc bằng.
Phần trăm không phải hằng số của kỹ thuật
Bấm preset Llama 3.1 70B. Cùng kỹ thuật chú ý theo nhóm, cùng 8 đầu KV, nhưng mô hình này có 64 đầu truy vấn thay vì 32, nên phần tiết kiệm nhảy từ 75,00% lên 87,50%.
Không có gì thay đổi ở kỹ thuật. Chỉ hình dáng mô hình đổi. Nên khi ai đó nói "kỹ thuật này tiết kiệm 75% bộ nhớ", câu đúng phải là "tiết kiệm 75% trên hình dáng nào, so với bản gốc nào". Thiếu hai vế sau thì con số không kiểm lại được. Đây cũng là lý do sim này bắt bạn gõ cấu hình vào trước rồi mới tính, thay vì phát cho bạn một bảng phần trăm dựng sẵn.
Sắp theo con số, không phải theo lời khuyên
Phần cuối của sim sắp các kỹ thuật theo thứ tự, và cần nói rõ nó sắp theo cái gì.
Nó sắp theo số byte hoặc số phép tính cắt được ở đúng cấu hình bạn đang gõ, giảm dần. Không có trọng số nào, không có điểm tổng hợp nào, không có ý kiến nào. Sửa một núm là thứ tự có thể đổi, và đổi thật: hạ chiều tiềm ẩn xuống 8 thì nén tiềm ẩn vượt lên đầu, kéo ngữ cảnh về 1024 thì cửa sổ trượt tụt hẳn xuống.
Sim cũng không cộng phần tiết kiệm của nhiều kỹ thuật lại. Chú ý theo nhóm và lượng tử hoá bộ đệm cùng nhân vào một con số, nên 75% cộng 50% không ra 125% và cũng không ra bất cứ thứ gì có nghĩa. Mỗi kỹ thuật ở đây được áp một mình lên cùng một bản gốc, và bảng nói đúng chừng đó.
Còn một cột mà bảng này vĩnh viễn không có: mô hình sau khi áp dụng còn đúng tới đâu. Sim ghi rõ với từng kỹ thuật rằng nó không đo được gì. Chú ý theo nhóm ép nhiều đầu truy vấn dùng chung một cặp khoá và giá trị. Nén tiềm ẩn làm mất thông tin khi dựng lại. Lượng tử hoá hạ độ chính xác từng con số. Cửa sổ trượt cắt hẳn đường nhìn trực tiếp tới phần xa. Bốn chuyện đó có thể vô hại, có thể chí mạng, và chỉ có một cách biết là chạy thử.
Vài chú ý nhỏ để đọc bảng cho đúng:
- Phần nén tiềm ẩn ở đây đặt phần mang vị trí không nén bằng 0, tức bản đơn giản hoá. Bài nén bộ đệm KV có bản đầy đủ và ở đó bộ đệm mỗi token nhỉnh hơn con số tại đây một chút.
- Số phép tính mỗi bước sinh tính theo quy ước một phép nhân cộng dồn bằng hai phép tính dấu phẩy động. Đó là quy ước phổ biến, không phải chân lý, và nếu bạn đọc một bài dùng quy ước khác thì mọi con số của họ lệch đúng hai lần.
- Byte thật trên máy luôn nhiều hơn bảng này: còn phân trang bộ đệm, còn đệm thừa, còn vùng làm việc của nhân tính toán. Bài bộ đệm KV phân trang nói về khoản đầu, và bài chạy được trên máy nào cộng đủ.
- Muốn lấy cấu hình thật của một mô hình để gõ vào đây thì đọc bài đọc tệp config.json. Mọi trường bạn cần đều nằm trong đó.
Chọn kỹ thuật không bắt đầu bằng câu hỏi cái nào mạnh nhất, mà bằng câu hỏi đại lượng nào của tôi đang thiếu. Ở cấu hình mở bài, bộ đệm KV tốn 64,0 GiB còn trọng số chỉ 14,9 GiB, nên bốn kỹ thuật cắt bộ đệm mới đáng bàn và lượng tử hoá trọng số dù cắt tới 75,00% byte trọng số vẫn không giải quyết được gì. Nhớ hai mốc biên: số đầu KV bằng số đầu truy vấn thì chú ý theo nhóm tiết kiệm 0,00%, cửa sổ rộng bằng ngữ cảnh thì cửa sổ trượt tiết kiệm 0,00%. Và nhớ điểm dễ nhầm nhất: trộn chuyên gia cắt 75,00% phép tính mỗi token nhưng cắt đúng 0,00% byte phải nạp. Cuối cùng, mọi phần trăm ở đây là phần trăm của một hình dáng cụ thể so với một bản gốc cụ thể: cùng kỹ thuật chú ý theo nhóm cho 75,00% trên hình 8B và 87,50% trên hình 70B. Phép đếm này không nói được mô hình còn tốt tới đâu, và đó thường mới là thứ quyết định.
- 1Một mô hình trộn chuyên gia có 8 tỉ tham số tổng và 2 tỉ tham số hoạt động mỗi token. So với một mô hình dày 8 tỉ tham số cùng kích thước, nó tiết kiệm được gì?
- 2Bạn đặt số đầu KV bằng đúng số đầu truy vấn, cả hai đều là 32. Sim báo chú ý theo nhóm tiết kiệm 0,00%. Vì sao?
- 3Ở cấu hình mở bài, sim xếp cửa sổ trượt trên cùng với 96,88% và lượng tử hoá bộ đệm cuối cùng với 50,00%. Kết luận đúng là gì?