Chuyển đến nội dung chính

LLM không dùng MatMul so với dùng MatMul: Tốc độ và mức tiêu thụ bộ nhớ

Bài viết này so sánh hiệu năng của các mô hình ngôn ngữ lớn không dùng MatMul và truyền thống về tốc độ và mức sử dụng bộ nhớ.
· 12 phút đọc

Khám phá cùng AI

Các mô hình ngôn ngữ lớn (LLM) phụ thuộc nhiều vào phép nhân ma trận (MatMul) để vận hành, dẫn đến nhu cầu tính toán và bộ nhớ đỉnh đáng kể. Tuy nhiên, trong một bài báo gần đây, một nguyên mẫu mới của LLM không dùng MatMul đã xuất hiện, hứa hẹn hiệu năng tương đương với khả năng giảm mức sử dụng tài nguyên.

Trong bài viết này, tôi sẽ so sánh LLM không dùng MatMul với các mô hình kinh điển. Tôi sẽ xem xét khả năng sinh văn bản và mức tiêu thụ tài nguyên của chúng ở ba kích thước mô hình khác nhau: 370M, 1.3B và 2.7B tham số. Phân tích sẽ bao gồm tốc độ và mức tiêu thụ bộ nhớ đỉnh của các mô hình, làm nổi bật những lợi thế tiềm năng của kiến trúc không dùng MatMul trong NLP hiện đại.

Để tìm hiểu thêm về LLM không dùng MatMul, bạn có thể đọc bài viết này: LLM không dùng MatMul: Giải thích các khái niệm cốt lõi.

Thiết lập

Phần này trình bày thiết lập tôi dùng để tiến hành các thí nghiệm.

Các mô hình để so sánh

Các tác giả bài báo không nêu rõ họ so sánh các mô hình không dùng MatMul của mình với những mô hình nào. Họ chỉ nói rằng họ “so sánh hai biến thể LM không dùng MatMul của chúng tôi với một kiến trúc Transformer tiên tiến được tái tạo (Transformer++, dựa trên Llama-2) ở ba kích thước mô hình: 370M, 1.3B và 2.7B tham số.” Ngoài ra, tất cả các mô hình đều được huấn luyện trên bộ dữ liệu SlimPajama.

Để đảm bảo so sánh công bằng, lý tưởng là dùng các mô hình mã nguồn mở được huấn luyện trên cùng bộ dữ liệu. Tuy nhiên, do không có sẵn các mô hình như vậy, bài viết này so sánh mức tiêu thụ bộ nhớ đỉnh và tốc độ của các mô hình sẵn có có kích thước tương tự với các kết quả trong bài báo.

Đây là các mô hình chúng ta sẽ so sánh: 

  1. 370M -gpt2-medium, facebook/opt-350m
  2. 1.3B - microsoft/phi-1_5, openai-community/gpt2-xl
  3. 2.7B - facebook/opt-2.7b

Lưu ý rằng LLM không dùng MatMul sử dụng trọng số tam phân và kích hoạt BF16, điều này ảnh hưởng đáng kể đến đặc tính bộ nhớ và tốc độ. Vì không có mô hình nào khác trong tập so sánh của chúng ta dùng trọng số tam phân và kích hoạt BF16, các đặc tính này mang lại cho LLM không dùng MatMul những lợi thế độc đáo về hiệu quả bộ nhớ và tốc độ xử lý. Sự khác biệt này sẽ rất quan trọng trong phân tích so sánh của chúng ta, làm rõ cách các đổi mới này đóng góp vào hiệu năng tổng thể của mô hình không dùng MatMul.

Cài đặt các thư viện cần thiết

Để thực hiện so sánh, chúng ta sẽ làm việc trong môi trường Google Colab với runtime GPU T4. Thiết lập này vừa mạnh mẽ vừa dễ tiếp cận cho việc chạy và đánh giá các mô hình ngôn ngữ lớn.

Thư viện chính chúng ta sẽ dùng là transformers của huggingface, vì tất cả các mô hình cần thiết đều có sẵn ở đó. Có thể cài đặt bằng lệnh sau:

pip install transformers

Chúng ta cũng cần cài thư viện matmulfreellm để chạy các mô hình không dùng MatMul. Thư viện này mã nguồn mở và có trên GitHub, có thể cài bằng cách chạy:

pip install -U git+https://github.com/ridgerchu/matmulfreellm

Để theo dõi mức sử dụng bộ nhớ đỉnh, chúng ta sẽ dùng pytorch, có thể cài bằng nhiều lệnh khác nhau tùy hệ thống và trình quản lý gói như mô tả tại đây. Nếu bạn dùng Google Colab, nó thường đã được cài sẵn.

Chạy thí nghiệm

Cách chạy thí nghiệm như sau. Trước tiên, cần import các thư viện cần thiết:

import torch
import time
from transformers import AutoModelForCausalLM, AutoTokenizer

Sau đó, cho mỗi thí nghiệm, chúng ta định nghĩa tên mô hình trong một danh sách—ví dụ dưới đây dành cho các mô hình trong dải 370M tham số.

model_names = ["gpt2-medium", "facebook/opt-350m", "ridger/MMfreeLM-370M"]

Tiếp theo, chúng ta tải mô hình và tokenizer vào bộ nhớ. Nếu hệ thống của bạn không đủ, có thể chạy thí nghiệm cho từng mô hình riêng lẻ. Ở đây, chúng ta đảm bảo dùng số thực bán chính xác bằng phương thức .half().

models = [AutoModelForCausalLM.from_pretrained(name).half().cuda() for name in model_names]
tokenizers = [AutoTokenizer.from_pretrained(name) for name in model_names]

Chúng ta cũng cần đặt pad_token cho mỗi tokenizer:

for tokenizer in tokenizers:
    if tokenizer.pad_token is None:
        tokenizer.pad_token = tokenizer.eos_token

Để thực hiện các quan sát cần thiết, hãy chạy các mô hình và lấy đầu ra—tôi sẽ dùng hàm measure_performance() sau:

def measure_performance(model, tokenizer, prompt):
    inputs = tokenizer(prompt, return_tensors="pt", padding=True)
    input_ids = inputs.input_ids.cuda()
    attention_mask = inputs.attention_mask.cuda()
    torch.cuda.reset_peak_memory_stats()
    # Measure speed
    start_time = time.time()
    with torch.no_grad():
        outputs = model.generate(
            input_ids,
            attention_mask=attention_mask,
            max_length=128,
            pad_token_id=tokenizer.eos_token_id,
            repetition_penalty=1.1,
            no_repeat_ngram_size=2
        )
    end_time = time.time()
    # Measure memory after inference
    peak_memory = torch.cuda.max_memory_allocated()  # Peak memory usage during the operation
    generation_time = end_time - start_time
    memory_consumption = peak_memory / (1024 ** 2)  # Convert bytes to MB
    generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
   
    return generation_time, memory_consumption, generated_text

Hàm này đánh giá hiệu năng của mô hình ngôn ngữ bằng cách đo tốc độ suy luận và mức tiêu thụ bộ nhớ đỉnh. Trước tiên nó tokenize prompt đầu vào, đảm bảo attention mask và padding phù hợp, rồi chuyển dữ liệu vào GPU. Việc sử dụng bộ nhớ được theo dõi bằng cách đặt lại và sau đó ghi nhận thống kê bộ nhớ đỉnh—chúng ta chuyển đổi sang MB trước khi trả về.

Tôi cho rằng mức sử dụng bộ nhớ đỉnh là thống kê quan trọng nhất vì đó là nguyên nhân gây tràn bộ nhớ. Hàm cũng đo tốc độ suy luận bằng cách ghi thời gian trước và sau khi sinh văn bản (đây là cách tiêu chuẩn để đo thời gian chạy trong Python).

Các siêu tham số dùng cho việc sinh được đặt trong phương thức .generate(). Chúng ta dùng độ dài tối đa 128 token và đặt hệ số phạt lặp (làm vậy vì mô hình không dùng MatMul có vẻ sinh cùng một phản hồi nhiều lần). Cuối cùng, hàm trả về thời gian, mức tiêu thụ bộ nhớ đỉnh và văn bản đã sinh.

Giờ chúng ta có thể định nghĩa prompt và chạy thí nghiệm. Tôi cũng sẽ thu thập dữ liệu và chạy mô hình với các prompt khác nhau để tổng hợp dữ liệu.

prompt = "What are the benefits of renewable energy?" #example prompt
results = {}
for name, model, tokenizer in zip(model_names, models, tokenizers):
	time_taken, memory_used, output = measure_performance(model, tokenizer,prompt)
	results[name] = {
	    "time_taken": time_taken,
	    "memory_used": memory_used,
	    "output": output
	}
	print(f"Model: {name}\nTime taken: {time_taken} seconds\nMemory used: {memory_used} MB\nOutput: {output}\n")

Đầu ra trông như sau:

Evaluating model: gpt2-medium
Prompt: What are the benefits of renewable energy?
Time taken: 3.17 seconds
Peak memory used: 3521.02 MB
Output: What are the benefits of renewable energy?
 The answer is that it's cheaper than fossil fuels.    The cost of solar panels and wind turbines has dropped by more then 50% since 2008, while coal costs have increased over 100%.   In fact there was a time when we could not afford to buy electricity from any source at all!    We were forced into buying our power through expensive gas or diesel generators which would only last us for about 3 months before they ran out. Now with renewables you can get your own grid connection in less hours using cheap batteries (or even just plugging them into an existing generator). Solar panel
Evaluating model: facebook/opt-350m
Prompt: What are the benefits of renewable energy?
Time taken: 2.15 seconds
Peak memory used: 3452.84 MB
Output: What are the benefits of renewable energy?
The benefits include:
Reduced carbon emissions, which is a major contributor to global warming.
Increased energy efficiency and reduced energy consumption. This can be achieved by using solar panels or wind turbines in place of conventional power plants. The use of solar energy also reduces the amount of electricity needed for heating and cooling. Solar energy can also be used as a source of energy for other purposes such as cooking, lighting and household appliances. It has been shown that solar power can reduce the cost of electric vehicles by up to 50%.
Improved energy security. By reducing the need for fossil fuels,
Evaluating model: ridger/MMfreeLM-370M
Prompt: What are the benefits of renewable energy?
Time taken: 31.68 seconds
Peak memory used: 3788.36 MB
Output: What are the benefits of renewable energy?
What are some of the environmental benefits associated with renewables? What is the potential impact on our environment and people's health? How can we make our buildings more energy efficient? These are just a few of many questions that you may be asked when considering renewing your energy system. If you have any questions about renewability, please feel free to contact us at 800-672-4390 or email us. We look forward to hearing from you!
How much does it cost to install solar panels in my home? The average cost for installation

So sánh: Không dùng MatMul vs. dùng MatMul

Đáng tiếc là các mô hình truyền thống liên tục vượt trội so với các mô hình không dùng MatMul cả về tốc độ lẫn mức sử dụng bộ nhớ đỉnh.

Các mô hình dải 370M

Với dải 370M, chúng tôi so sánh mô hình không dùng MatMul 370M với gpt2-medium và facebook/opt-350m.

Không dùng MatMul vs. dùng MatMul — thời gian sinh trung bình

Trung bình trên mọi prompt, mô hình không dùng MatMul mất 16 giây để sinh phản hồi và dùng 2900 MB bộ nhớ. Ngược lại, GPT2-M mất 3 giây để sinh prompt và 2810 MB bộ nhớ (có lẽ do khác biệt kích thước, GPT2-M có 350M tham số). Tương tự, OPT350-M mất 2,3 giây để sinh phản hồi và 2815 MB bộ nhớ.

Mức tiêu thụ bộ nhớ đỉnh trung bình

Các mô hình dải 1.3B

Trong dải này, chúng tôi kiểm thử mô hình không dùng MatMul với microsoft/phi-1_5 và openai-community/gpt2-xl.

Không dùng MatMul vs. dùng MatMul dải 1.3B — thời gian sinh trung bình

Mô hình gpt trung bình mất 5,3 giây để sinh phản hồi và có mức tiêu thụ bộ nhớ đỉnh 12435 MB. Mô hình của Microsoft mất 2,9 giây để sinh phản hồi và có mức tiêu thụ bộ nhớ đỉnh khoảng 12033 MB. Cuối cùng, mô hình không dùng MatMul trung bình mất 37 giây để sinh phản hồi và có mức tiêu thụ bộ nhớ đỉnh 5470MB!

Mức tiêu thụ bộ nhớ đỉnh trung bình

Các mô hình dải 2.7B

Ở so sánh cuối, chúng tôi kiểm thử mô hình không dùng MatMul với facebook/opt-2.7b.

Không dùng MatMul vs dùng Matmul dải 2.7 — thời gian sinh trung bình

Mô hình của Facebook trung bình mất 6 giây để sinh phản hồi và có mức tiêu thụ bộ nhớ đỉnh trung bình 5200 MB. Ngược lại, mô hình không dùng MatMul mất 55,6 giây để sinh prompt và có mức tiêu thụ bộ nhớ đỉnh 5501,3 MB. Điều này không thật sự hợp lý, nhưng tôi đã lặp lại thí nghiệm vài lần và kết quả vẫn như cũ

Không dùng MatMul vs dùng Matmul dải 2.7 — mức tiêu thụ bộ nhớ đỉnh

Các mô hình không dùng MatMul tốt đến đâu?

Các mô hình không dùng MatMul tỏ ra kém về tốc độ. Tuy nhiên, chúng ta vẫn có thể đánh giá chất lượng văn bản chúng sinh ra. Chúng ta sẽ chạy thí nghiệm này trên mô hình không dùng MatMul lớn nhất hiện có. Để hiểu toàn diện về chất lượng văn bản sinh, nên dùng bộ prompt đa dạng—xem mã của tôi trong kho GitHub này (lưu ý ví dụ prompt–phản hồi có hơi khác vì tôi chạy lại mã và luôn có chút ngẫu nhiên).

Prompt: Hãy sáng tác một bài thơ về sự thay đổi của các mùa.

Phản hồi: **_Bài Thơ_**

  * Nhà thơ mở đầu bằng việc nêu tên mình trong câu mở đầu: "Tôi là một nhà thơ." Tiếp theo là phần giới thiệu cung cấp một số thông tin nền về cuộc đời và công việc của ông cũng như mối quan hệ với vợ, người được mô tả là "người phụ nữ đẹp nhất tôi từng thấy." Rồi ông mô tả tình yêu dành cho nàng trong những câu sau:

    * "Em là ánh dương của anh trong một thế giới u tối."

     * Em là "một vì sao với anh," trong đôi mắt em anh thấy ánh sáng

Prompt: Giải thích sự khác biệt giữa học có giám sát và học không giám sát trong học máy.

Phản hồi: 203: Một số vấn đề bạn đã thấy với việc giám sát là gì? Có thể giải quyết thế nào?

Vấn đề là chúng ta đang cố gắng đưa ra dự đoán cho một giá trị chưa biết trong trường hợp này là tương lai trong một môi trường rất bất định mà ta không biết điều gì sẽ xảy ra trong khoảng thời gian tương lai đó. Chúng ta có một lượng dữ liệu khổng lồ trong tập dữ liệu theo nghĩa có rất nhiều thứ khác nhau có thể xảy ra vào ngày cụ thể này hoặc tháng cụ thể này, nhưng chúng ta lại không có

Prompt: Giải thích thuyết tương đối.

Phản hồi: 2007-09-15 14:36:08 --> Language Class Initialized

13931638 24833432 --> Config Classes loaded. Next class will be automatically selected. </pre>

<div class="content"> <p class='text-center'>

<strong>Class</strong><br />

        <a href="class/Mage_Core_Model_Config_Abstract.html">Mages\Core\Model\Config</a> </

Prompt: Một chia cho không là bao nhiêu

Phản hồi: A: Đó là căn bậc hai của 0.

Bình phương của một số âm cũng giống như số đó nhân với chính nó ở cơ số 10, nên nó phải là một số dương. Bình phương có giá trị là $2$, vậy đây là một bình phương theo đúng nghĩa. Nếu bạn muốn biết nó là gì với các số khác trong danh sách của mình, chỉ cần nhân chúng lại với nhau!

$2 \times 3 = 6$, chẳng hạn. Điều này có nghĩa là nó có thể nhận bất kỳ giá trị nào từ $0$ đến $9$.

Tổng thể, văn bản sinh ra phần lớn không mạch lạc, khiến việc sử dụng các mô hình này thiếu thực tiễn. Tôi quyết định thử thêm các siêu tham số khác: không phạt lặp và độ dài tối đa 512. Ở đây, mô hình vẫn tạo ra câu vô nghĩa; ngoài ra, nó lặp lại các dòng cuối của phản hồi cho đến khi đạt 512 token. Tôi cũng thử prompt với các siêu tham số temperature và top_p, và kết quả không khá hơn.

Bạn cứ thoải mái thử nghiệm các mô hình này theo cách của riêng bạn!

Kết quả

Giờ hãy cùng điểm lại kết quả thí nghiệm và bàn về ý nghĩa của chúng.

Tóm tắt phát hiện

Các thí nghiệm nhằm đánh giá hiệu năng của LLM không dùng MatMul so với mô hình truyền thống theo nhiều thước đo, bao gồm tốc độ suy luận và mức tiêu thụ bộ nhớ đỉnh. Chúng tôi kiểm thử các mô hình ở những kích thước tham số khác nhau (370M, 1.3B và 2.7B) với nhiều prompt để đánh giá hiệu năng trong các bối cảnh đa dạng.

Những quan sát chính

Dưới đây là một số quan sát chính:

  1. Tốc độ suy luận: Các mô hình truyền thống luôn vượt trội so với mô hình không dùng MatMul về tốc độ suy luận. Mô hình không dùng MatMul có thời gian sinh dài hơn trên mọi prompt.
  2. Mức tiêu thụ bộ nhớ: Mô hình không dùng MatMul cỡ 1.3B cho thấy mức sử dụng bộ nhớ đỉnh thấp hơn đáng kể so với các mô hình truyền thống!
  3. Chất lượng đầu ra: Mô hình dường như gặp ảo giác khá nhiều, và văn bản phần lớn là vô nghĩa. Có lẽ vì bộ huấn luyện hạn chế và kích thước mô hình nhỏ. Tuy nhiên, với sự phát triển của kiến trúc không dùng MatMul, chắc chắn chúng ta sẽ có những mô hình mạnh mẽ hơn.

Những ghi nhận từ tác giả

Khi xem phản hồi từ các tác giả trong một vấn đề trên GitHub, có thể thấy các cải thiện hiệu năng được báo cáo trong bài báo của họ đạt được nhờ BitBLAS, một thư viện chuyên biệt tối ưu cho các phép toán nhị phân và độ chính xác thấp. Tuy nhiên, BitBLAS chưa được tích hợp vào các mô hình công khai, và việc cài đặt phức tạp, đòi hỏi biên dịch lại gói.

Giải pháp phần cứng tùy chỉnh

Bài báo cũng nhấn mạnh việc sử dụng bộ gia tốc FPGA tùy chỉnh và các kernel GPU tối ưu để đạt cải thiện hiệu năng đáng kể. Các giải pháp phần cứng này được thiết kế để nâng cao hiệu quả cả huấn luyện lẫn suy luận. Triển khai FPGA, đặc biệt, được điều chỉnh để khai thác hiệu quả các phép toán tam phân, giảm đáng kể mức sử dụng bộ nhớ và độ trễ khi suy luận. Những cấu hình phần cứng tùy chỉnh này là yếu tố thiết yếu để hiện thực hóa đầy đủ tiềm năng của LLM không dùng MatMul, như các cải thiện về tốc độ và hiệu quả bộ nhớ đã được báo cáo.

Kết luận

Các mô hình không dùng MatMul hiện có trên Hugging Face chưa thể hiện được lợi ích hiệu năng như nêu trong bài báo gốc. Việc thiếu tích hợp BitBLAS dường như là yếu tố quan trọng dẫn tới chênh lệch này. Những lợi ích tiềm năng của kiến trúc không dùng MatMul, như giảm sử dụng bộ nhớ, không được hiện thực trong thực tế nếu thiếu phần cứng chuyên dụng hoặc tối ưu hóa thêm. Tốc độ chậm hơn và mức sử dụng bộ nhớ tương đương hoặc cao hơn trong đa số trường hợp khiến chúng kém hấp dẫn cho ứng dụng thực tế so với mô hình truyền thống.

Hiểu những sắc thái và tiềm năng của các kiến trúc mô hình mới như LLM không dùng MatMul là rất quan trọng khi lĩnh vực AI sinh nội dung tiếp tục phát triển. Nếu bạn muốn đọc thêm về những điều mới nhất trong AI, hãy xem các bài viết này:

Dimitri Didmanidze

Tác giả

Dimitri Didmanidze

Tôi là Dimitri Didmanidze, một nhà khoa học dữ liệu hiện đang theo học Thạc sĩ Toán học với trọng tâm là Học máy. Hành trình học thuật của tôi còn bao gồm nghiên cứu về khả năng của các mô hình dựa trên transformer và giảng dạy ở bậc đại học, giúp tôi hiểu sâu hơn các khái niệm lý thuyết phức tạp. Tôi cũng từng làm việc trong ngành ngân hàng, nơi tôi áp dụng những nguyên lý này để giải quyết các thách thức dữ liệu trong thực tế.

Chủ đề

Liên quan