Pagtataya ng mga Lokal na Modelong LLM

GitHub Repo ng Proyekto

Pinagmulan

Binuo ko ang LLM Speed Benchmark (LLMSB) noong panahon ko bilang part-time na Engineering Intern sa Anarchy (YC W23). Ang LLMSB ay isang kasangkapan sa benchmarking para sa pagtatasa ng pagganap ng isang modelong LLM. Ginagamit nito ang aklatan ng HuggingFace na transformers para sa paglo-load at pagpapatakbo ng isang modelong LLM at sinusukat nito ang:

  • kabuuang oras ng pagpapatakbo
  • mga token bawat segundo
  • pangkalahatang mga espesipikasyon ng hardware
  • paggamit ng cpu (kasalukuyang frequency at % ng paggamit ng mga core sa paglipas ng panahon)
  • paggamit ng ram (ram at swap sa paglipas ng panahon)
  • paggamit ng gpu (load, paggamit ng memorya, at temperatura sa paglipas ng panahon)

DITO ay isang halimbawa ng isang benchmark run para sa modelong codellama-13b-oasst-sft-v10 na tumatakbo sa isang H100. May sarili akong Nvidia RTX 2070 Ti, na may 8 GB na VRAM. Sa kasamaang-palad, para sa karamihan ng mga modernong modelong LLM, ang 8 GB ng VRAM ay hindi sapat upang makipag-ugnayan sa isang modelo. Dahil dito, ginamit ko ang RunPod upang “magrenta” ng GPU(s) at patakbuhin ang aking mga benchmark sa ilang partikular na mga modelo.

Ito ang pinagmulan/kuwentong pinagmulan ng LLMSB. Dahil open-source ang proyekto, maaari mong tingnan ang code DITO. Sa ibaba, isinama ko ang README mula sa repo kung nais mo itong tingnan.

Tungkol Dito

🚧 Ang LLM Speed Benchmark (LLMSB) ay kasalukuyang nasa beta (v0). Mangyaring huwag itong gamitin sa production, o gamitin ito sa sarili mong panganib. Inaayos pa namin ang ilang mga problema at pinapabuti ang functionality. Kung makatagpo ka ng anumang mga bug o may mga mungkahi ka, mangyaring iulat ang mga ito sa ISSUES. Ang iyong puna ay napakahalaga!

Ang LLM Speed Benchmark (LLMSB) ay isang kasangkapan sa benchmarking para sa pagtatasa ng pagganap ng mga modelong LLM sa iba’t ibang plataporma ng hardware. Ang pangunahing layunin nito ay buuin ang isang komprehensibong dataset na nagdedetalye ng pagganap ng mga modelong LLM sa iba’t ibang sistema, na nagbibigay-daan sa mga gumagamit na mas epektibong piliin ang tamang modelong LLM(s) para sa kanilang mga proyekto.

Mga Limitasyon

Ang LLMSB ay nasa v0, kaya may mga limitasyon ito:

  • Idinisenyo lamang itong tumakbo sa mga operasyong sistemang batay sa debian, ibig sabihin, hindi ito idinisenyo para tumakbo sa Windows. Ito ay dahil gumagamit ang LLMSB ng neofetch at nvidia-smi upang mangalap ng mga sukatan sa ilalim ng hood at ang lohika ng filepath ay batay sa mga operasyong sistemang unix.
  • Dahil sa kung paano nire-record ang mga sukatan, maaaring abutin ng metrics collector nang hanggang 1 segundo upang makagawa ng isang pagkolekta. Ibig sabihin nito, sa pinakamabilis, makakakolekta tayo ng mga sukatan ng hardware bawat 1 segundo.
  • Gumagamit lamang ang LLMSB ng HuggingFace para mag-load at magpatakbo ng mga modelo. Gumagana ito sa ngayon, ngunit ang layunin ay magkaroon ang LLMSB ng suporta para sa maraming mga framework, hindi lamang HuggingFace.
  • Sa kasalukuyan, lahat ng mga modelo ay pinatatakbo sa pamamagitan ng lohika na ipinapakita sa function na run_llm(), na matatagpuan sa src/hf.py, kung saan ginagamit ang mga function na AutoTokenizer() at AutoModelForCausalLM() upang mag-load at magpatakbo ng isang modelo. Gumagana ito ngunit nililimitahan nito kung paano natin mako-config/ma-o-optimize ang mga partikular na modelo. Dahil dito, ang layunin ay lumikha ng magkakahiwalay na mga klase para sa bawat sikat na modelo at gamitin sa halip ang mga model-specific na klase ng HuggingFace, gaya ng LlamaTokenizer at LlamaForCausalLM.
  • Nangangalap lamang ang LLMSB ng pangkalahatan, mataas na antas, na mga sukatan. Sa hinaharap, nais naming mangalap ng mas mababang antas na mga sukatan. Sa tingin namin ay maaari itong bahagyang gawin gamit ang wrapper ng Pytorch na porfiler wrapper.

Mga Halimbawang Output

Nobyembre 22, 2023

Sinubukan ang LLMSB sa isang L40 at H100 GPU sa pamamagitan ng RunPod. Sa mga benchmark na iyon, sinubukan ang mga modelong llama-2-7b-hf, codellama-13b-oasst-sft-v10, at mpt-7b. Tingnan ang mga resulta DITO. Kung may mapansing anumang mga error/isyu, mangyaring iulat ang mga ito sa ISSUES.

Pagse-set Up

  1. Lumikha at i-activate ang kapaligirang python:

    python3 -m venv env
    source env/bin/activate
    
  2. I-install ang mga dependency ng package (gamit ang APT):

    apt -y update
    apt install -y vim
    apt install -y neofetch
    
  3. I-install ang mga dependency ng python:

    pip3 install transformers
    pip3 install psutil
    pip3 install gputil
    pip3 install tabulate
    pip3 install sentencepiece
    pip3 install protobuf
    
  4. I-install ang Pytorch

    # install pytorch stable build, for linux, using CUDA 12.1:
    pip3 install torch torchvision torchaudio
    
  5. I-install ang LLM-VM:

    pip install llm-vm
    
  6. (opsyonal) Kung gumagamit ka ng mga modelo tulad ng LLAMA, kakailanganin mo ng HuggingFace access token. I-set up ang iyong access token DITO pagkatapos ay i-save ang iyong token sa iyong console sa pamamagitan ng pagpapatakbo ng sumusunod na utos:

    huggingface-cli login
    

Paano Patakbuhin

  1. Kumpletuhin ang mga hakbang na nakalista sa seksyong Pagse-set Up.

  2. Upang i-configure ang iyong set, kailangan mong lumikha ng isang json file na may mga sumusunod na parameter (narito ang isang halimbawa):

    • TANDAAN: hindi lahat ng framework ay sumusuporta sa parehong mga parameter
    {
      "model": "bigscience/bloom-560m",   # ang landas/repo ng modelo sa HuggingFace (https://huggingface.co/models)
      "prompt": "Hello World!",           # ang prompt na gusto mong ipasok sa modelong LLM
      "device": "cuda:0",                 # ang device na gusto mong patakbuhin ang modelong LLM (GPU/CPU)
      "max_length": 50,                   # ang pinakamataas na haba ng mga nabuong token
      "temperature": 0.9,                 # halaga ng temperatura para sa modelong LLM
      "top_k": 50,                        # halaga ng top-k para sa modelong LLM
      "top_p": 0.9,                       # halaga ng top-p para sa modelong LLM
      "num_return_sequences": 1,          # ang bilang ng magkakahiwalay na pinatakbong mga instance ng modelo
      "time_delay": 0,                    # ang pagkaantala ng oras (segundo) na hihintayin ng metrics-collecter sa bawat pag-uulit
      "model_start_pause": 1,             # ang oras (segundo) na hihintayin ng pagsusulit BAGO patakbuhin ang modelong LLM
      "model_end_pause": 1                # ang oras (segundo) na hihintayin ng pagsusulit PAGKATAPOS matapos tumakbo ang modelong LLM,
      "framework": "llm-vm"               # ang pangalan ng framework/aklatan na gusto mong gamitin upang patakbuhin ang modelo
    }
    
  3. Gamit ang landas papunta sa config file na nilikha mo sa nakaraang hakbang, patakbuhin ang sumusunod upang simulan ang benchmark (pumili ng isang opsyon):

    # patakbuhin ang isang benchmark
    python3 run.py --config ./configs/llmvm_test.json
    
    # patakbuhin ang higit sa isang benchmark (sa kasong ito 3)
    python3 run.py --config ./configs/llmvm_test.json --loops 3
    
  4. Pagkatapos matapos tumakbo ang benchmark, tingnan ang huling mga resulta sa isang file na dapat magmukhang ganito:

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

Pagse-set Up ng RunPod:

  1. I-set up ang RunPod, i-set up ang iyong ssh cert/key, at magpaandar ng pod. Maa-access mo ang iyong (mga) pod sa Pahina ng Console ng RunPod.

  2. I-click ang button na “Connect” upang makuha ang impormasyon ng koneksyong ssh. Ang impormasyong ito ay dapat magmukhang ganito:

    ssh root&12.345.678.90 -p 12345 -i ~/.ssh/id_example
    
    • Ang utos na ito ay iimformat nang ganito:

      ssh <user>@<ip-address> -p <port> -i <local-path-to-ssh-cert>
      
  3. Gamit ang utos sa hakbang #2, dapat ay makakapag-ssh ka sa pod at magamit ang GPU na pinili mo sa RunPod pod na iyon.

  4. Kung nais mong kopyahin ang isang file mula sa pod papunta sa iyong lokal na makina, isasagawa mo ang utos sa format na ito (ito ay tumutukoy sa mga variable na ipinakita sa hakbang #2):

    scp -P <port> -i <local-path-to-ssh-cert> <user>@<ip-address>:<path-to-file-in-pod> <path-to-local-directory>
    
    • Narito ang isang halimbawa ng gayong utos:

      scp -P 12345 -i ~/.ssh/id_example <user>@<ip-address>:/root/test.txt /home/user1/Downloads/
      
  5. Kapag tapos ka na sa pod, i-shut down ito o i-pause ito. Ngunit babala, kung ipo-pause mo ito ay sisingilin ka pa rin, mas kaunti lang.

Mahuhusay na Mga Pinagmulan: