로컬 LLM 모델 벤치마크

프로젝트의 GitHub 저장소

배경 이야기

LLM Speed Benchmark(LLMSB)는 제가 애너키 (YC W23)에서 파트타임 엔지니어 인턴으로 일할 때 만들었습니다. LLMSB는 LLM 모델의 성능을 평가하기 위한 벤치마킹 도구입니다. 이는 HuggingFace의 transformers 라이브러리를 사용하여 LLM 모델을 로드하고 실행하며 다음을 측정합니다:

  • 총 실행 시간
  • 초당 토큰 수
  • 일반 하드웨어 사양
  • cpu 사용량 (현재 주파수 및 코어 사용률 %의 시간 경과)
  • ram 사용량 (RAM 및 스왑의 시간 경과)
  • gpu 사용량 (로드, 메모리 사용량 및 온도의 시간 경과)

여기codellama-13b-oasst-sft-v10 모델이 H100에서 실행된 벤치마크 실행의 예입니다. 개인적으로는 Nvidia RTX 2070 Ti를 보유하고 있으며, 이는 8GB의 VRAM을 가지고 있습니다. 안타깝게도 대부분의 최신 LLM 모델의 경우 8GB VRAM으로는 모델을 다루기에 충분하지 않습니다. 이 때문에 특정 모델에서 벤치마크를 실행하기 위해 GPU를 “대여"하기 위해 RunPod를 사용했습니다.

이것이 LLMSB의 배경/기원 이야기입니다. 프로젝트가 오픈소스이므로 코드를 여기에서 확인할 수 있습니다. 아래에는 리포지토리의 README를 포함했습니다. 확인하고 싶다면 아래를 참조하세요.

소개

🚧 LLM Speed Benchmark(LLMSB)는 현재 베타(v0) 단계입니다. 프로덕션 환경에서 사용하지 마시거나 사용 시 본인 책임 하에 사용하시기 바랍니다. 우리는 아직 몇몇 문제를 해결하고 기능을 개선 중입니다. 버그를 발견하거나 제안이 있으면 친절히 이슈에 보고해 주세요. 여러분의 피드백은 매우 소중합니다!

LLM Speed Benchmark(LLMSB)는 다양한 하드웨어 플랫폼에서 LLM 모델의 성능을 평가하기 위한 벤치마킹 도구입니다. 궁극적인 목표는 여러 시스템에서의 LLM 모델 성능에 대한 포괄적인 데이터셋을 작성하여 사용자가 프로젝트에 적합한 LLM 모델을 보다 효과적으로 선택할 수 있도록 돕는 것입니다.

제한 사항

LLMSB는 v0이므로 다음과 같은 제한이 있습니다:

  • LLMSB는 Debian 기반 운영 체제에서만 실행되도록 설계되었으며, 즉 Windows에서 실행되도록 설계되지 않았습니다. 이는 LLMSB가 내부적으로 메트릭을 수집하기 위해 neofetch와 nvidia-smi를 사용하고 파일 경로 로직이 Unix 계열 운영 체제를 기반으로 하기 때문입니다.
  • 메트릭이 기록되는 방식 때문에 메트릭 수집기는 수집을 수행하는 데 최대 1초가 걸릴 수 있습니다. 이는 빠른 경우에도 하드웨어 메트릭을 1초마다 수집할 수 있음을 의미합니다.
  • LLMSB는 모델을 로드하고 실행하기 위해 HuggingFace만 사용합니다. 현재로서는 작동하지만 목표는 HuggingFace뿐만 아니라 여러 프레임워크를 지원하는 것입니다.
  • 현재 모든 모델은 src/hf.py에 위치한 run_llm() 함수에서 제시된 로직을 통해 실행되며, 이곳에서 AutoTokenizer()와 AutoModelForCausalLM() 함수가 모델을 로드하고 실행하는 데 사용됩니다. 이 방법은 작동하지만 특정 모델을 구성/최적화하는 데 제약을 줍니다. 이를 인식하고, 목표는 각 인기 모델에 대해 별도의 클래스를 생성하고 LlamaTokenizer 및 LlamaForCausalLM과 같은 HuggingFace의 모델별 클래스를 활용하는 것입니다.
  • LLMSB는 일반적이고 높은 수준의 메트릭만 수집합니다. 향후에는 더 낮은 수준의 메트릭을 수집하고자 합니다. 이는 부분적으로 Pytorch의 프로파일러 래퍼를 사용하여 수행할 수 있을 것으로 생각합니다.

샘플 출력

2023년 11월 22일

LLMSB는 RunPod를 통해 L40 및 H100 GPU에서 실행/테스트되었습니다. 해당 벤치마크에서는 llama-2-7b-hf, codellama-13b-oasst-sft-v10, 및 mpt-7b 모델이 테스트되었습니다. 결과는 여기에서 확인하세요. 오류/문제가 발견되면 이슈에 보고해 주세요.

설정

  1. 파이썬 환경 생성 및 활성화:

    python3 -m venv env
    source env/bin/activate
    
  2. 패키지 종속성 설치 (APT 사용):

    apt -y update
    apt install -y vim
    apt install -y neofetch
    
  3. 파이썬 종속성 설치:

    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 인증서/키를 설정한 다음 파드를 실행하세요. RunPod의 콘솔 페이지(RunPod 콘솔 페이지)에서 파드에 액세스할 수 있습니다.

  2. SSH 연결 정보를 얻으려면 “Connect” 버튼을 클릭하세요. 이 정보는 다음과 유사해야 합니다:

    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로 접속하고 해당 RunPod 파드에서 선택한 GPU를 사용할 수 있어야 합니다.

  4. 파드에서 로컬 머신으로 파일을 복사하려면 다음 형식의 명령을 실행합니다(이는 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. 파드 사용을 마쳤으면 종료하거나 일시 중지하세요. 다만 주의: 일시 중지하면 요금이 계속 부과되지만 훨씬 적게 청구됩니다.

유용한 자료: