Đối sánh các mô hình LLM cục bộ

Kho GitHub của dự án

Bối cảnh

Tôi đã xây dựng LLM Speed Benchmark (LLMSB) trong thời gian tôi làm Thực tập sinh Kỹ sư bán thời gian tại Anarchy (YC W23). LLMSB là một công cụ đo hiệu năng để đánh giá hiệu suất của một mô hình LLM. Nó sử dụng thư viện transformers của HuggingFace để tải và chạy một mô hình LLM và nó đo lường:

  • tổng thời gian chạy
  • số token mỗi giây
  • thông số phần cứng chung
  • mức sử dụng cpu (tần số hiện tại & tỷ lệ sử dụng % của các lõi theo thời gian)
  • mức sử dụng ram (ram & swap theo thời gian)
  • mức sử dụng gpu (mức tải, mức sử dụng bộ nhớ, & nhiệt độ theo thời gian)

ĐÂY là một ví dụ về một lần chạy đối sánh cho mô hình codellama-13b-oasst-sft-v10 chạy trên một H100. Cá nhân tôi sở hữu một Nvidia RTX 2070 Ti, vốn có 8 GB VRAM. Đáng tiếc là, đối với hầu hết các mô hình LLM hiện đại, 8 GB VRAM là không đủ để làm việc với một mô hình. Do đó, tôi đã sử dụng RunPod để “thuê” GPU và chạy các bài đo chuẩn của mình trên một số mô hình nhất định.

Đây là bối cảnh/câu chuyện khởi đầu của LLMSB. Vì dự án là mã nguồn mở, bạn có thể xem mã ĐÂY. Bên dưới, tôi đã đưa vào README từ kho lưu trữ nếu bạn muốn xem qua.

Giới thiệu

🚧 LLM Speed Benchmark (LLMSB) hiện đang ở giai đoạn beta (v0). Vui lòng không sử dụng công cụ này trong môi trường sản xuất, hoặc hãy sử dụng với rủi ro của riêng bạn. Chúng tôi vẫn đang khắc phục một số vấn đề nhỏ và cải thiện chức năng. Nếu bạn gặp bất kỳ lỗi nào hoặc có đề xuất, vui lòng báo cáo chúng trong ISSUES. Phản hồi của bạn là vô cùng quý giá!

LLM Speed Benchmark (LLMSB) là một công cụ đo hiệu năng để đánh giá hiệu suất của các mô hình LLM trên các nền tảng phần cứng khác nhau. Mục tiêu cuối cùng của nó là tổng hợp một bộ dữ liệu toàn diện mô tả hiệu suất của các mô hình LLM trên nhiều hệ thống khác nhau, giúp người dùng lựa chọn mô hình LLM phù hợp hơn cho các dự án của họ.

Hạn chế

LLMSB đang ở v0, vì vậy nó có các hạn chế:

  • Chỉ được thiết kế để chạy trên các hệ điều hành dựa trên debian, tức là nó không được thiết kế để chạy trên Windows. Điều này là vì LLMSB sử dụng neofetch và nvidia-smi để thu thập số liệu ở phía dưới và logic đường dẫn tệp dựa trên các hệ điều hành unix.
  • Do cách các số liệu được ghi lại, bộ thu thập số liệu có thể mất tới 1 giây để thực hiện một lần thu thập. Điều này có nghĩa là, nhanh nhất, chúng ta có thể thu thập số liệu phần cứng mỗi 1 giây.
  • LLMSB chỉ sử dụng HuggingFace để tải và chạy các mô hình. Điều này hiện vẫn ổn, nhưng mục tiêu là để LLMSB hỗ trợ nhiều framework, không chỉ HuggingFace.
  • Hiện tại, tất cả các mô hình đều được chạy qua logic được trình bày trong hàm run_llm(), nằm trong src/hf.py, nơi các hàm AutoTokenizer() và AutoModelForCausalLM() được dùng để tải và chạy một mô hình. Cách này hoạt động nhưng nó hạn chế cách chúng ta có thể cấu hình/tối ưu các mô hình cụ thể. Biết điều này, mục tiêu là tạo các lớp riêng cho từng mô hình phổ biến và thay vào đó sử dụng các lớp cụ thể cho mô hình của HuggingFace, như LlamaTokenizer & LlamaForCausalLM.
  • LLMSB chỉ thu thập các số liệu tổng quát, mức cao. Trong tương lai, chúng tôi muốn thu thập các số liệu ở mức thấp hơn. Chúng tôi nghĩ điều này một phần có thể được thực hiện bằng cách sử dụng [lớp bao bọc profiler] của Pytorch(https://pytorch.org/tutorials/recipes/recipes/profiler_recipe.html).

Kết quả mẫu

22 tháng 11, 2023

LLMSB đã được chạy/kiểm thử trên GPU L40 và H100 thông qua RunPod. Trong các bài đo đó, các mô hình llama-2-7b-hf, codellama-13b-oasst-sft-v10, & mpt-7b đã được thử nghiệm. Xem kết quả ĐÂY. Nếu phát hiện bất kỳ lỗi/vấn đề nào, vui lòng báo cáo chúng lên ISSUES.

Thiết lập

  1. Tạo và kích hoạt môi trường python:

    python3 -m venv env
    source env/bin/activate
    
  2. Cài đặt các phụ thuộc của gói (sử dụng APT):

    apt -y update
    apt install -y vim
    apt install -y neofetch
    
  3. Cài đặt các phụ thuộc python:

    pip3 install transformers
    pip3 install psutil
    pip3 install gputil
    pip3 install tabulate
    pip3 install sentencepiece
    pip3 install protobuf
    
  4. Cài đặt Pytorch

    # cài đặt bản ổn định của pytorch, cho linux, sử dụng CUDA 12.1:
    pip3 install torch torchvision torchaudio
    
  5. Cài đặt LLM-VM:

    pip install llm-vm
    
  6. (tùy chọn) Nếu bạn đang sử dụng các mô hình như LLAMA, bạn sẽ cần một mã truy cập HuggingFace. Thiết lập mã truy cập của bạn ĐÂY rồi lưu mã của bạn vào console bằng cách chạy lệnh sau:

    huggingface-cli login
    

Cách chạy

  1. Hoàn thành các bước được liệt kê trong phần Thiết lập.

  2. Để cấu hình bộ của bạn, bạn cần tạo một tệp json với các tham số sau (đây là một ví dụ):

    • LƯU Ý: không phải mọi framework đều hỗ trợ cùng các tham số
    {
      "model": "bigscience/bloom-560m",   # đường dẫn/kho của  hình trên HuggingFace (https://huggingface.co/models)
      "prompt": "Hello World!",           # lời nhắc bạn muốn đưa vào  hình LLM
      "device": "cuda:0",                 # thiết bị bạn muốn chạy  hình LLM trên đó (GPU/CPU)
      "max_length": 50,                   # độ dài tối đa của các token được sinh ra
      "temperature": 0.9,                 # giá trị nhiệt độ cho  hình LLM
      "top_k": 50,                        # giá trị top-k cho  hình LLM
      "top_p": 0.9,                       # giá trị top-p cho  hình LLM
      "num_return_sequences": 1,          # số lượng phiên bản  hình được chạy độc lập
      "time_delay": 0,                    # độ trễ thời gian (giây)  bộ thu thập số liệu sẽ chờ mỗi lần lặp
      "model_start_pause": 1,             # thời gian (giây) bài kiểm tra sẽ chờ TRƯỚC khi chạy  hình LLM
      "model_end_pause": 1                # thời gian (giây) bài kiểm tra sẽ chờ SAU khi  hình LLM chạy xong,
      "framework": "llm-vm"               # tên của framework/thư viện bạn muốn sử dụng để chạy  hình
    }
    
  3. Dùng đường dẫn tới tệp cấu hình bạn tạo ở bước trước, chạy lệnh sau để bắt đầu bài đo chuẩn (chọn một tùy chọn):

    # chạy một bài đo chuẩn
    python3 run.py --config ./configs/llmvm_test.json
    
    # chạy nhiều hơn một bài đo chuẩn (trong trường hợp này là 3)
    python3 run.py --config ./configs/llmvm_test.json --loops 3
    
  4. Sau khi bài đo chuẩn chạy xong, hãy xem kết quả cuối cùng trong một tệp sẽ trông giống như sau:

    report_2023-11-25_05:55:04.207515_utc_1ffc4fa7-3aa9-4878-b874-1ff445e1ff8a.json
    

Thiết lập RunPod:

  1. Thiết lập RunPod, thiết lập cert/key ssh của bạn, và khởi chạy một pod. Bạn có thể truy cập pod của mình trên Trang Console của RunPod.

  2. Nhấp vào nút “Connect” để lấy thông tin kết nối ssh. Thông tin này sẽ trông giống như sau:

    ssh root&12.345.678.90 -p 12345 -i ~/.ssh/id_example
    
    • Lệnh này sẽ được định dạng như sau:

      ssh <user>@<ip-address> -p <port> -i <local-path-to-ssh-cert>
      
  3. Dùng lệnh ở bước #2, bạn sẽ có thể ssh vào pod và sử dụng GPU bạn đã chọn trong pod RunPod đó.

  4. Nếu bạn muốn sao chép một tệp từ pod về máy cục bộ của mình, bạn sẽ chạy lệnh theo định dạng này (điều này đang tham chiếu đến các biến được hiển thị ở bước #2):

    scp -P <port> -i <local-path-to-ssh-cert> <user>@<ip-address>:<path-to-file-in-pod> <path-to-local-directory>
    
    • Đây là một ví dụ về lệnh như vậy:

      scp -P 12345 -i ~/.ssh/id_example <user>@<ip-address>:/root/test.txt /home/user1/Downloads/
      
  5. Sau khi bạn dùng xong pod, hãy tắt nó hoặc tạm dừng nó. Nhưng lưu ý, nếu bạn tạm dừng nó thì bạn vẫn sẽ bị tính phí, chỉ là ít hơn nhiều.

Các nguồn tuyệt vời: