การเปรียบเทียบประสิทธิภาพโมเดล LLM ในเครื่อง

คลัง GitHub ของโครงการ

ที่มา

ฉันสร้าง LLM Speed Benchmark (LLMSB) ขึ้นในช่วงที่ทำงานเป็นนักศึกษาฝึกงานด้านวิศวกรรมแบบพาร์ตไทม์ที่ Anarchy (YC W23) LLMSB เป็นเครื่องมือเปรียบเทียบประสิทธิภาพสำหรับประเมินประสิทธิภาพของโมเดล LLM โดยใช้ไลบรารี transformers ของ HuggingFace สำหรับโหลดและเรียกใช้โมเดล LLM และทำการวัดค่าเหล่านี้:

  • เวลาทำงานทั้งหมด
  • โทเค็นต่อวินาที
  • ข้อมูลจำเพาะฮาร์ดแวร์ทั่วไป
  • การใช้งาน cpu (ความถี่ปัจจุบันและเปอร์เซ็นต์การใช้งานของคอร์ในช่วงเวลาต่าง ๆ)
  • การใช้งาน ram (การใช้งาน ram และ swap เมื่อเวลาผ่านไป)
  • การใช้งาน gpu (โหลด การใช้หน่วยความจำ และอุณหภูมิเมื่อเวลาผ่านไป)

ที่นี่ คือตัวอย่างการทำงานของการเปรียบเทียบประสิทธิภาพสำหรับโมเดล codellama-13b-oasst-sft-v10 ที่ทำงานบน H100 ฉันเป็นเจ้าของ Nvidia RTX 2070 Ti ซึ่งมี VRAM ขนาด 8 GB น่าเสียดายที่สำหรับโมเดล LLM สมัยใหม่ส่วนใหญ่ VRAM ขนาด 8 GB ไม่เพียงพอสำหรับใช้งานโมเดล เนื่องจากเหตุนี้ ฉันจึงใช้ RunPod เพื่อ “เช่า” GPU และรันการเปรียบเทียบประสิทธิภาพของฉันกับโมเดลบางรายการ

นี่คือเรื่องราวเบื้องหลัง/เรื่องราวต้นกำเนิดของ LLMSB เนื่องจากโครงการนี้เป็นโอเพนซอร์ส คุณจึงสามารถดูโค้ดได้ที่นี่ ด้านล่างนี้ ฉันได้ใส่ README จากคลังไว้ หากคุณต้องการลองดู

เกี่ยวกับ

🚧 LLM Speed Benchmark (LLMSB) ขณะนี้อยู่ในระยะเบตา (v0) โปรดอย่าใช้สิ่งนี้ในสภาพแวดล้อมการใช้งานจริง หรือใช้งานโดยยอมรับความเสี่ยงด้วยตนเอง เรายังคงแก้ไขปัญหาจุกจิกบางอย่างและปรับปรุงฟังก์ชันการทำงานอยู่ หากคุณพบข้อบกพร่องหรือมีข้อเสนอแนะ โปรดรายงานไว้ในประเด็นปัญหา ความคิดเห็นของคุณมีคุณค่าอย่างยิ่ง!

LLM Speed Benchmark (LLMSB) เป็นเครื่องมือเปรียบเทียบประสิทธิภาพสำหรับประเมินประสิทธิภาพของโมเดล LLM บนแพลตฟอร์มฮาร์ดแวร์ที่แตกต่างกัน เป้าหมายสูงสุดของมันคือการรวบรวมชุดข้อมูลที่ครอบคลุม ซึ่งให้รายละเอียดประสิทธิภาพของโมเดล LLM บนระบบต่าง ๆ เพื่อให้ผู้ใช้สามารถเลือกโมเดล LLM ที่เหมาะสมสำหรับโครงการของตนได้อย่างมีประสิทธิภาพยิ่งขึ้น

ข้อจำกัด

LLMSB อยู่ในเวอร์ชัน v0 ดังนั้นจึงมีข้อจำกัดดังนี้:

  • ออกแบบมาให้ทำงานบนระบบปฏิบัติการที่ใช้ debian เท่านั้น หรือกล่าวคือไม่ได้ออกแบบมาให้ทำงานบน Windows สาเหตุคือ LLMSB ใช้ neofetch และ nvidia-smi เพื่อรวบรวมเมตริกเบื้องหลัง และตรรกะของเส้นทางไฟล์อ้างอิงระบบปฏิบัติการแบบ unix
  • เนื่องจากวิธีการบันทึกเมตริก ตัวรวบรวมเมตริกอาจใช้เวลาสูงสุด 1 วินาทีในการรวบรวมแต่ละครั้ง ซึ่งหมายความว่าอย่างเร็วที่สุด เราสามารถรวบรวมเมตริกฮาร์ดแวร์ได้ทุก 1 วินาที
  • LLMSB ใช้ HuggingFace เท่านั้นในการโหลดและเรียกใช้โมเดล วิธีนี้ใช้งานได้ในขณะนี้ แต่เป้าหมายคือทำให้ LLMSB รองรับเฟรมเวิร์กหลายรูปแบบ ไม่ใช่เพียง HuggingFace
  • ปัจจุบัน โมเดลทั้งหมดถูกเรียกใช้ผ่านตรรกะที่นำเสนอในฟังก์ชัน run_llm() ซึ่งอยู่ใน src/hf.py โดยใช้ฟังก์ชัน AutoTokenizer() และ AutoModelForCausalLM() เพื่อโหลดและเรียกใช้โมเดล วิธีนี้ใช้งานได้ แต่จำกัดวิธีที่เราสามารถกำหนดค่า/เพิ่มประสิทธิภาพโมเดลเฉพาะได้ เมื่อทราบเช่นนี้ เป้าหมายคือการสร้างคลาสแยกสำหรับโมเดลยอดนิยมแต่ละรายการ และใช้คลาสเฉพาะของโมเดลจาก HuggingFace เช่น LlamaTokenizer และ LlamaForCausalLM แทน
  • LLMSB รวบรวมเฉพาะเมตริกทั่วไปในระดับสูงเท่านั้น ในอนาคต เราต้องการรวบรวมเมตริกระดับต่ำลง เราคิดว่าส่วนหนึ่งสามารถทำได้โดยใช้ ตัวห่อหุ้ม porfiler ของ Pytorch

ตัวอย่างผลลัพธ์

22 พฤศจิกายน 2023

LLMSB ถูกเรียกใช้/ทดสอบบน GPU L40 และ H100 ผ่าน RunPod ในการเปรียบเทียบประสิทธิภาพเหล่านั้น มีการทดสอบโมเดล llama-2-7b-hf, codellama-13b-oasst-sft-v10 และ mpt-7b ดูผลลัพธ์ที่นี่ หากสังเกตพบข้อผิดพลาด/ปัญหาใด ๆ โปรดรายงานไปยังประเด็นปัญหา

การตั้งค่า

  1. สร้างและเปิดใช้งานสภาพแวดล้อม python:

    python3 -m venv env
    source env/bin/activate
    
  2. ติดตั้งการอ้างอิงแพ็กเกจ (โดยใช้ APT):

    apt -y update
    apt install -y vim
    apt install -y neofetch
    
  3. ติดตั้งการอ้างอิงของ python:

    pip3 install transformers
    pip3 install psutil
    pip3 install gputil
    pip3 install tabulate
    pip3 install sentencepiece
    pip3 install protobuf
    
  4. ติดตั้ง Pytorch

    # install pytorch stable build, for linux, using CUDA 12.1:
    pip3 install torch torchvision torchaudio
    
  5. ติดตั้ง LLM-VM:

    pip install llm-vm
    
  6. (ไม่บังคับ) หากคุณกำลังใช้โมเดลอย่าง LLAMA คุณจะต้องมีโทเค็นการเข้าถึง HuggingFace ตั้งค่าโทเค็นการเข้าถึงของคุณที่นี่ จากนั้นบันทึกโทเค็นของคุณลงในคอนโซลโดยเรียกใช้คำสั่งต่อไปนี้:

    huggingface-cli login
    

วิธีการเรียกใช้

  1. ดำเนินการตามขั้นตอนที่ระบุไว้ในส่วน การตั้งค่า

  2. ในการกำหนดค่าชุดของคุณ คุณต้องสร้างไฟล์ json ที่มีพารามิเตอร์ต่อไปนี้ (นี่คือตัวอย่าง):

    • หมายเหตุ: ไม่ใช่ทุกเฟรมเวิร์กที่รองรับพารามิเตอร์เดียวกัน
    {
      "model": "bigscience/bloom-560m",   # the model's path/repo on HuggingFace (https://huggingface.co/models)
      "prompt": "Hello World!",           # the prompt you want to input into the LLM model
      "device": "cuda:0",                 # the device you want to run the LLM model on (GPU/CPU)
      "max_length": 50,                   # the maximun length of the generated tokens
      "temperature": 0.9,                 # temperatue value for the LLM model
      "top_k": 50,                        # top-k value for the LLM model
      "top_p": 0.9,                       # top-p value for the LLM model
      "num_return_sequences": 1,          # the number of independently ran instances of the model
      "time_delay": 0,                    # the time delay (seconds) the metrics-collecter will wait per interation
      "model_start_pause": 1,             # the time (seconds) the test will wait BEFORE running the LLM model
      "model_end_pause": 1                # the time (seconds) the test will wait AFTER the LLM model is done running,
      "framework": "llm-vm"               # the name of the framework/library you want to use to run the model
    }
    
  3. ใช้เส้นทางไปยังไฟล์การกำหนดค่าที่คุณสร้างในขั้นตอนก่อนหน้า แล้วเรียกใช้คำสั่งต่อไปนี้เพื่อเริ่มการเปรียบเทียบประสิทธิภาพ (เลือกหนึ่งตัวเลือก):

    # run one benchmark
    python3 run.py --config ./configs/llmvm_test.json
    
    # run more then one benchmark (in this case 3)
    python3 run.py --config ./configs/llmvm_test.json --loops 3
    
  4. หลังจากการเปรียบเทียบประสิทธิภาพทำงานเสร็จแล้ว ให้ตรวจสอบผลลัพธ์สุดท้ายในไฟล์ที่ควรมีลักษณะคล้ายดังนี้:

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

การตั้งค่า RunPod:

  1. ตั้งค่า RunPod ตั้งค่าใบรับรอง/คีย์ ssh ของคุณ และเริ่มต้น pod ให้ทำงาน คุณสามารถเข้าถึง pod ของคุณได้ที่หน้าคอนโซลของ RunPod

  2. คลิกปุ่ม “เชื่อมต่อ” เพื่อรับข้อมูลการเชื่อมต่อ ssh ข้อมูลนี้ควรมีลักษณะคล้ายดังนี้:

    ssh root&12.345.678.90 -p 12345 -i ~/.ssh/id_example
    
    • คำสั่งนี้จะมีรูปแบบดังนี้:

      ssh <user>@<ip-address> -p <port> -i <local-path-to-ssh-cert>
      
  3. เมื่อใช้คำสั่งในขั้นตอนที่ 2 คุณควรจะสามารถ ssh เข้าไปยัง pod และใช้ GPU ที่คุณเลือกใน pod ของ RunPod นั้นได้

  4. หากคุณต้องการคัดลอกไฟล์จาก pod ไปยังเครื่องของคุณ คุณจะเรียกใช้คำสั่งในรูปแบบนี้ (เป็นการอ้างอิงตัวแปรที่แสดงในขั้นตอนที่ 2):

    scp -P <port> -i <local-path-to-ssh-cert> <user>@<ip-address>:<path-to-file-in-pod> <path-to-local-directory>
    
    • นี่คือตัวอย่างของคำสั่งดังกล่าว:

      scp -P 12345 -i ~/.ssh/id_example <user>@<ip-address>:/root/test.txt /home/user1/Downloads/
      
  5. หลังจากใช้งาน pod เสร็จแล้ว ให้ปิดหรือหยุดชั่วคราว แต่โปรดระวัง หากคุณหยุดชั่วคราว คุณยังคงถูกเรียกเก็บค่าบริการ เพียงแต่ในจำนวนที่น้อยกว่ามาก

แหล่งข้อมูลที่ยอดเยี่ยม: