sơ khai Tăng tốc suy luận mô hình ngôn ngữ lớn: Kỹ thuật triển khai hiệu quả - Unite.AI
Kết nối với chúng tôi

Kỹ thuật nhanh chóng

Tăng tốc suy luận mô hình ngôn ngữ lớn: Kỹ thuật triển khai hiệu quả

mm

Được phát hành

 on

Tăng tốc độ suy luận LLM

Các mô hình ngôn ngữ lớn (LLM) như GPT-4, cuộc gọivà PaLM đang vượt qua ranh giới của những gì có thể làm được với quá trình xử lý ngôn ngữ tự nhiên. Tuy nhiên, việc triển khai các mô hình lớn này vào môi trường sản xuất đặt ra những thách thức đáng kể về yêu cầu tính toán, mức sử dụng bộ nhớ, độ trễ và chi phí. Khi LLM tiếp tục phát triển lớn hơn và có nhiều khả năng hơn, việc tối ưu hóa hiệu suất suy luận của chúng là rất quan trọng đối với các ứng dụng trong thế giới thực.

Trong phần tìm hiểu chuyên sâu về kỹ thuật này, chúng ta sẽ khám phá các kỹ thuật tiên tiến để tăng tốc suy luận LLM, cho phép thời gian phản hồi nhanh hơn, thông lượng cao hơn và sử dụng tài nguyên phần cứng hiệu quả hơn. Chúng tôi sẽ đề cập đến các phương pháp khác nhau, từ kỹ thuật số chính xác và cơ chế chú ý mới đến những đổi mới về kiến ​​trúc được thiết kế rõ ràng để tạo văn bản hiệu quả.

Hãy bắt đầu bằng cách hiểu tại sao suy luận LLM lại khó khăn như vậy so với các mô hình NLP truyền thống.

Thử thách suy luận với các mô hình ngôn ngữ lớn

Trước sự ra đời của LLM, xử lý ngôn ngữ tự nhiên dựa trên các mô hình nhỏ hơn tập trung vào các nhiệm vụ cụ thể như phân loại văn bản, nhận dạng thực thể được đặt tên và phân tích cảm xúc. Mặc dù vẫn cần tính toán chuyên sâu nhưng các mô hình này có thể được triển khai trên phần cứng khiêm tốn và tuân theo các quy trình suy luận tương đối đơn giản.

Mặt khác, LLM đại diện cho một sự thay đổi mô hình. Những mô hình này được đào tạo trên các bộ dữ liệu khổng lồ sử dụng hàng tỷ tham số, cho phép chúng thực hiện nhiều nhiệm vụ ngôn ngữ với mức độ thành thạo vượt trội. Tuy nhiên, sức mạnh này phải trả giá – nhu cầu tính toán tăng lên đáng kể trong cả quá trình đào tạo và suy luận.

Một thách thức chính là tính chất tự hồi quy của việc tạo văn bản với LLM. Để tạo ra văn bản giống con người, các mô hình này dự đoán mỗi lần một mã thông báo (từ hoặc từ phụ), với mỗi mã thông báo mới tùy thuộc vào đầu ra được tạo trước đó. Sự phụ thuộc tuần tự này cản trở quá trình song song hiệu quả và dẫn đến các yêu cầu tính toán có quy mô đa thức theo độ dài chuỗi.

Ngoài ra, LLM thường yêu cầu chuỗi đầu vào dài (lời nhắc) để thiết lập bối cảnh cần thiết để tạo văn bản chất lượng cao. Độ dài đầu vào dài hơn đòi hỏi nhiều bộ nhớ hơn để lưu trữ các trạng thái trung gian và ma trận chú ý, khiến tài nguyên phần cứng càng căng thẳng hơn.

Với những thách thức đặc biệt này, các kỹ thuật tối ưu hóa truyền thống như biểu đồ lượng tử hóa và tính toán tĩnh có thể gặp khó khăn, gặp khó khăn trong việc duy trì hiệu suất LLM trong khi vẫn mang lại tốc độ tăng tốc đáng kể. Hãy cùng đi sâu vào một số chiến lược chính được thiết kế rõ ràng để tăng tốc suy luận LLM.

Kỹ thuật số chính xác

Độ chính xác từ 32-bit đến 16-bit

Độ chính xác từ 32-bit đến 16-bit

Một con đường để tăng tốc LLM suy luận là tận dụng độ chính xác số đã giảm đối với trọng số và kích hoạt mô hình. Các khung học sâu hiện đại như PyTorch và TensorFlow thường sử dụng độ chính xác dấu phẩy động 32 bit (FP32) theo mặc định. Tuy nhiên, nghiên cứu đã chỉ ra rằng LLM thường có thể duy trì độ chính xác cao ngay cả khi hoạt động ở độ chính xác thấp hơn, chẳng hạn như số nguyên 16 bit (FP16), số nguyên 8 bit (INT8) hoặc thậm chí số nguyên 4 bit (INT4).

Việc giảm độ chính xác về số mang lại một số lợi ích:

  • Giảm dấu chân bộ nhớ: Các biểu diễn có độ chính xác thấp hơn yêu cầu ít bộ nhớ hơn, cho phép các mô hình hoặc kích thước lô lớn hơn phù hợp với cùng các ràng buộc phần cứng.
  • Tính toán nhanh hơn: Nhiều CPU và GPU hiện đại cung cấp các hướng dẫn chuyên dụng và khả năng tăng tốc phần cứng cho số học có độ chính xác thấp hơn, cho phép tăng tốc đáng kể.
  • Cải thiện hiệu suất năng lượng: Với yêu cầu bộ nhớ nhỏ hơn và khả năng tính toán nhanh hơn, suy luận có độ chính xác thấp hơn có thể dẫn đến giảm mức tiêu thụ năng lượng – một lợi thế quan trọng cho việc triển khai biên và di động.

Mặc dù các kỹ thuật số chính xác, mạnh mẽ có thể gây ra một số tổn thất về độ chính xác so với hoạt động của FP32. Điều quan trọng là đánh giá cẩn thận sự cân bằng giữa lợi ích tính toán và khả năng suy giảm hiệu suất cho trường hợp sử dụng cụ thể của bạn.

Có hai cách tiếp cận chính để lượng tử hóa với LLM:

Lượng tử hóa sau đào tạo (PTQ): Trong phương pháp này, LLM lần đầu tiên được đào tạo bằng cách sử dụng độ chính xác tiêu chuẩn FP32. Sau khi huấn luyện, các trọng số của mô hình được lượng tử hóa (chuyển đổi) sang định dạng có độ chính xác thấp hơn như INT8 hoặc INT4. PTQ dễ thực hiện nhưng có thể dẫn đến giảm độ chính xác cao hơn.

Đào tạo nhận thức lượng tử hóa (QAT): Với QAT, quá trình lượng tử hóa được mô phỏng trong chính giai đoạn huấn luyện. Điều này cho phép mô hình học cách bù đắp các lỗi lượng tử hóa, giảm thiểu sự suy giảm độ chính xác khi triển khai mô hình lượng tử hóa cuối cùng. QAT có liên quan nhiều hơn nhưng thường mang lại kết quả tốt hơn so với PTQ.

Đối với ứng dụng thực tế, người ta có thể tận dụng các mô hình lượng tử hóa trước có sẵn trên các nền tảng như Ôm mặt, nơi lưu trữ nhiều mô hình được tối ưu hóa thông qua các phương pháp lượng tử hóa khác nhau. Ví dụ: nếu muốn một mô hình được lượng tử hóa bằng Auto-GPTQ, người dùng có thể dễ dàng tải mô hình đó bằng thư viện máy biến áp của Hugging Face. Ngoài ra, để lượng tử hóa một mô hình, có thể sử dụng các công cụ như AutoGPTQ, tích hợp hoàn hảo với các thư viện hiện có để nén mô hình một cách hiệu quả.

Dưới đây là ví dụ về tải mô hình Llama-2-7b được lượng tử hóa trước bằng thư viện máy biến áp Ôm Mặt:

from transformers import AutoModelForCausalLM, AutoTokenizer
model_id = "TheBloke/Llama-2-7b-Chat-GPTQ"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id)
And for custom quantization, one might follow these steps using the AutoGPTQ toolkit:
from transformers import AutoModelForCausalLM, AutoTokenizer, GPTQConfig
model_id = "llama-2-7b-original"
tokenizer = AutoTokenizer.from_pretrained(model_id)
quantization_config = GPTQConfig(bits=4, dataset="your-dataset", tokenizer=tokenizer)
model = AutoModelForCausalLM.from_pretrained(model_id, quantization_config=quantization_config)

Hãy nhớ rằng lượng tử hóa có thể cần phải tinh chỉnh sau lượng tử hóa hoặc kỹ thuật nhanh chóng để duy trì chất lượng mô hình. Đối với lượng tử hóa mới, bạn có thể đóng góp lại cho cộng đồng bằng cách đẩy các mô hình lượng tử hóa của mình lên các nền tảng như Ôm mặt.

Luôn đảm bảo cân bằng giữa kích thước mô hình, yêu cầu tính toán và hiệu suất khi chọn chiến lược lượng tử hóa cho trường hợp sử dụng cụ thể của bạn.

 

Thuật toán chú ý Flash

Cơ chế chú ý nhiều đầu là thành phần cốt lõi của LLM dựa trên máy biến áp, cho phép mô hình nắm bắt được các phần phụ thuộc tầm xa và các biểu diễn theo ngữ cảnh. Tuy nhiên, thao tác chú ý này không hiệu quả về mặt tính toán đối với việc tạo văn bản tự hồi quy vì nó yêu cầu tính toán lại nhiều giá trị giống nhau cho mỗi mã thông báo mới.

Sản phẩm Thuật toán Chú ý Flash, được giới thiệu trong bài báo FlashAttention, cung cấp cách tiếp cận hiệu quả hơn về bộ nhớ và thân thiện với hoạt động song song hóa đối với hoạt động chú ý. Thay vì tính toán lại các giá trị chú ý cho từng mã thông báo, Flash Chú ý sẽ lưu vào bộ nhớ đệm và sử dụng lại các ma trận khóa/giá trị trung gian, tránh các phép tính dư thừa.

Sự tối ưu hóa này không chỉ làm giảm chi phí tính toán mà còn cải thiện các kiểu truy cập bộ nhớ, dẫn đến việc sử dụng tốt hơn băng thông bộ nhớ GPU và tính song song.

Mặc dù các chi tiết của Flash Chú ý khá phức tạp nhưng ý tưởng cấp cao là chia hoạt động chú ý thành hai giai đoạn:

  1. Nhúng tổng tiền tố: Giai đoạn này tính toán và lưu trữ các phần nhúng khóa/giá trị cho tất cả mã thông báo đầu vào, cho phép tái sử dụng hiệu quả trong quá trình tạo.
  2. Sự chú ý nhân quả: Hoạt động chú ý thực tế, hiện đã được tối ưu hóa để tận dụng các phần nhúng khóa/giá trị được lưu trong bộ nhớ đệm từ giai đoạn đầu tiên.

Bằng cách tách các giai đoạn này, Flash Chú ý có thể tận dụng các hoạt động GPU song song cao, tăng tốc đáng kể tình trạng tắc nghẽn chú ý trong suy luận LLM.

Dưới đây là minh họa ngắn gọn, mang tính khái niệm về việc triển khai Flash Chú ý bằng LLM:

from transformers import AutoModelForCausalLM
import torch
from flash_attention import flash_attention
# Load an LLM like OctoCoder
model = AutoModelForCausalLM.from_pretrained("bigcode/octocoder")
# Sample system prompt that guides the model towards being a better coding assistant
system_prompt = """... (system prompt details) ..."""
# Preparing a longer input with the system prompt
long_prompt = system_prompt + "Question: Please write a function in Python that transforms bytes to Gigabytes."
# Converting the model for Flash Attention optimization
model.to_bettertransformer()
# Running the model with Flash Attention
start_time = time.time()
with torch.backends.cuda.sdp_kernel(enable_flash=True):
result = model.generate(long_prompt, max_new_tokens=60)
print(f"Generated in {time.time() - start_time} seconds.")

Mặc dù Flash Chú ý mang lại hiệu suất ấn tượng nhưng nó vẫn hoạt động trong kiến ​​trúc máy biến áp hiện có. Để phát huy hết tiềm năng của suy luận LLM tăng tốc, chúng ta cần khám phá những đổi mới về kiến ​​trúc được thiết kế riêng cho nhiệm vụ này.

Cắt tỉa LLM

Cắt bớt LLM là một kỹ thuật để giảm kích thước mô hình trong khi vẫn duy trì chức năng. Nó sử dụng công cụ ước tính phụ thuộc vào dữ liệu về tầm quan trọng của trọng số dựa trên phép tính gần đúng ma trận Hessian. Trong quá trình cắt tỉa, các nhóm trọng lượng ít quan trọng hơn sẽ bị loại bỏ, sau đó mô hình được tinh chỉnh để khôi phục độ chính xác. Gói LLM-Pruner cung cấp các tập lệnh để cắt tỉa với nhiều chiến lược khác nhau được hỗ trợ. Việc cắt tỉa bao gồm việc khám phá các yếu tố phụ thuộc, đánh giá sự đóng góp của nhóm và giai đoạn phục hồi liên quan đến quá trình đào tạo ngắn gọn sau.

Đây là một ví dụ mã Python đơn giản thể hiện việc sử dụng LLM-Tỉa đối với mô hình LLaMa:

from transformers import AutoModelForSequenceClassification
from pruning import LLMPruner
# Load pre-trained LLaMa model
model = AutoModelForSequenceClassification.from_pretrained("llama-base")
# Initialize the pruner with desired configuration
pruner = LLMPruner(
model,
pruning_ratio=0.25,
block_mlp_layers=(4, 30),
block_attention_layers=(4, 30),
pruner_type='taylor'
)
# Execute pruning
pruned_model = pruner.prune()
# Fine-tune the pruned model
pruned_model.fine_tune(training_data)

Bản phác thảo mã này thể hiện việc tải mô hình LLaMa đã được huấn luyện trước, thiết lập bộ cắt tỉa với các cấu hình cụ thể (như lớp nào cần cắt tỉa và loại bộ cắt tỉa), thực hiện quy trình cắt tỉa và cuối cùng là tinh chỉnh mô hình đã cắt tỉa.

Lưu ý rằng để triển khai thực tế, bạn cần phải điền các chi tiết như tên mô hình cụ thể, đường dẫn đến dữ liệu và các tham số bổ sung cho quy trình tinh chỉnh. Ngoài ra, hãy lưu ý rằng mã này là biểu diễn khái niệm và cú pháp thực tế có thể khác nhau tùy thuộc vào thư viện và phiên bản được sử dụng.

Những đổi mới về kiến ​​trúc để tạo văn bản hiệu quả

Kiến trúc máy biến áp, mặc dù có hiệu quả cao đối với các nhiệm vụ mô hình hóa ngôn ngữ, nhưng được thiết kế như một mô hình tuần tự có mục đích chung. Khi triển khai LLM cho các tác vụ tạo văn bản với ngữ cảnh đầu vào dài, các nhà nghiên cứu đã phát hiện ra rằng các kiến ​​trúc chuyên biệt hơn có thể cải thiện đáng kể hiệu quả suy luận mà không làm giảm chất lượng.

Dưới đây là một số cải tiến kiến ​​trúc quan trọng cho phép suy luận LLM nhanh hơn:

Chứng tỏ việc xảy ra không có mặt: Kiến trúc Alibi, được giới thiệu trong bài viết Hướng dẫn PAL, tách biệt việc mô hình hóa bối cảnh đầu vào dài khỏi chính quá trình tạo văn bản. Nó sử dụng biểu diễn nén của bối cảnh đầu vào (“bằng chứng ngoại phạm”) để khởi tạo quá trình tạo, tránh phải xử lý lặp đi lặp lại toàn bộ chuỗi đầu vào trong quá trình tạo tự hồi quy.

Nhúng quay: Thay vì sử dụng cách nhúng vị trí tiêu chuẩn, kỹ thuật nhúng quay sử dụng ma trận xoay để mã hóa thông tin vị trí hiệu quả hơn. Cách tiếp cận này đã được chứng minh là cải thiện hiệu suất và cho phép xử lý các chuỗi đầu vào dài hơn.

Chú ý nhiều truy vấn (MQA): Trong sự chú ý truyền thống, mỗi mã thông báo đầu ra sẽ tham gia vào toàn bộ chuỗi đầu vào, dẫn đến tính toán dư thừa. MQA định dạng lại hoạt động chú ý để chia sẻ tính toán trên nhiều mã thông báo đầu ra, giảm độ phức tạp tổng thể.

Đa truy vấn chú ý

Đa truy vấn chú ý

Nhóm-Truy vấn-Chú ý (GQA): Dựa trên MQA, GQA nhóm xuất mã thông báo thành các cụm và cùng nhau tính toán sự chú ý cho từng cụm. Cách tiếp cận này tiếp tục giảm các yêu cầu tính toán trong khi vẫn duy trì việc tạo văn bản chất lượng cao.

Mặc dù vẫn đang trong quá trình nghiên cứu và phát triển tích cực, những cải tiến kiến ​​trúc này đã cho thấy tốc độ tăng tốc ấn tượng cho các tác vụ suy luận LLM, đặc biệt khi kết hợp với các kỹ thuật như Chú ý nhanh và tối ưu hóa độ chính xác bằng số.

Cân nhắc triển khai trong thế giới thực

Ngoài các thuật toán và kiến ​​trúc cốt lõi, còn có một số cân nhắc và cân nhắc thực tế cần cân nhắc khi triển khai LLM vào môi trường sản xuất:

Tăng tốc phần cứng: Mặc dù CPU có thể xử lý suy luận LLM nhưng GPU và các bộ tăng tốc khác như TPU của Google rất cần thiết để đạt được thông lượng cao và độ trễ thấp. Việc lựa chọn phần cứng phù hợp và tối ưu hóa việc sử dụng bộ nhớ là rất quan trọng.

Batching và song song: Để tận dụng triệt để tính song song của phần cứng, các chiến lược như suy luận theo đợt (xử lý đồng thời nhiều đầu vào) và song song mô hình (phân phối LLM trên nhiều thiết bị) có thể tăng đáng kể thông lượng.

Lượng tử hóa và đánh đổi chất lượng: Mức độ lượng tử hóa (8 bit, 4 bit, v.v.) sẽ ảnh hưởng trực tiếp đến tốc độ suy luận và mức sử dụng bộ nhớ, nhưng cũng ảnh hưởng đến chất lượng đầu ra. Sự đánh đổi này phải được đánh giá cẩn thận cho từng trường hợp sử dụng.

Mô hình chưng cất: Một giải pháp thay thế cho lượng tử hóa, kỹ thuật chắt lọc mô hình có thể nén các LLM lớn thành các mô hình sinh viên nhỏ hơn, hiệu quả hơn trong khi vẫn giữ được độ chính xác cao.

Bộ nhớ đệm và thời gian chạy được tối ưu hóa: Thời gian chạy deep learning được tối ưu hóa như TensorRT của NVIDIA và các khung được thiết kế để phân phối LLM (ví dụ: Bộ suy luận tổng hợp của KhảmML) có thể tăng hiệu suất đáng kể thông qua các kỹ thuật như tổng hợp toán tử, tối ưu hóa hạt nhân và chiến lược bộ nhớ đệm thông minh.

Con đường dẫn đến triển khai LLM tối ưu thường bao gồm việc kết hợp nhiều kỹ thuật đồng thời xem xét cẩn thận các yêu cầu cụ thể của ứng dụng, các hạn chế về cơ sở hạ tầng và mục tiêu hiệu suất của bạn.

Kết luận

Khi các mô hình ngôn ngữ lớn tiếp tục phát triển nhanh chóng, việc tăng tốc hiệu suất suy luận của chúng ngày càng trở nên quan trọng để hỗ trợ các ứng dụng trong thế giới thực và dân chủ hóa quyền truy cập vào các khả năng AI mạnh mẽ này.

Trong hướng dẫn kỹ thuật này, chúng tôi đã khám phá các kỹ thuật tiên tiến bao gồm tối ưu hóa độ chính xác bằng số, các thuật toán chú ý mới như Chú ý nhanh và các cải tiến kiến ​​trúc được thiết kế để tạo văn bản hiệu quả. Mặc dù mỗi cách tiếp cận đều có những ưu điểm riêng nhưng sức mạnh thực sự thường nằm ở việc kết hợp nhiều chiến lược trong khi điều hướng sự cân bằng phức tạp giữa tốc độ, mức sử dụng bộ nhớ và chất lượng đầu ra.

Nhìn về phía trước, chúng ta có thể mong đợi việc tiếp tục nghiên cứu và phát triển trong lĩnh vực này, được thúc đẩy bởi nhu cầu vô độ về các LLM có khả năng và dễ tiếp cận hơn. Từ tăng tốc phần cứng và nén mô hình đến các kiến ​​trúc hoàn toàn mới, nhiệm vụ suy luận LLM hiệu quả vẫn là một lĩnh vực thú vị trong thế giới xử lý ngôn ngữ tự nhiên và trí tuệ nhân tạo.

Tôi đã dành 50 năm qua để đắm mình trong thế giới hấp dẫn của Học máy và Học sâu. Niềm đam mê và chuyên môn của tôi đã giúp tôi đóng góp cho hơn XNUMX dự án kỹ thuật phần mềm đa dạng, đặc biệt tập trung vào AI/ML. Sự tò mò không ngừng của tôi cũng đã lôi kéo tôi đến với Xử lý ngôn ngữ tự nhiên, một lĩnh vực mà tôi háo hức khám phá thêm.