로컬 LLM 모델 벤치마크
배경 이야기
저는 Anarchy (YC W23)에서 파트타임 엔지니어링 인턴으로 일하던 동안 LLM Speed Benchmark(LLMSB)를 만들었습니다. LLMSB는 LLM 모델의 성능을 평가하기 위한 벤치마킹 도구입니다. 이는 LLM 모델을 불러오고 실행하기 위해 HuggingFace의 transformers 라이브러리를 사용하며, 다음을 측정합니다:
- 총 실행 시간
- 초당 토큰 수
- 일반적인 하드웨어 사양
- CPU 사용량(현재 주파수 및 시간에 따른 코어 사용률 %)
- RAM 사용량(RAM 및 스왑의 시간 경과에 따른 사용량)
- GPU 사용량(부하, 메모리 사용량, 및 시간 경과에 따른 온도)
여기는 H100에서 실행된 codellama-13b-oasst-sft-v10 모델에 대한 벤치마크 실행 예시입니다. 저는 개인적으로 VRAM이 8 GB인 Nvidia RTX 2070 Ti를 가지고 있습니다. 안타깝게도 대부분의 현대적인 LLM 모델의 경우 8 GB VRAM은 모델과 상호작용하기에 충분하지 않습니다. 이 때문에 저는 RunPod를 사용하여 GPU를 “대여”하고 특정 모델들에 대해 벤치마크를 실행했습니다.
이것이 LLMSB의 배경 이야기/탄생 이야기였습니다. 이 프로젝트는 오픈소스이므로, 코드는 여기에서 확인할 수 있습니다. 아래에는 확인해 보고 싶으신 경우를 위해 저장소의 README를 포함했습니다.
소개
🚧 LLM Speed Benchmark(LLMSB)는 현재 베타(v0) 상태입니다. 이를 프로덕션에서 사용하지 마시고, 사용하더라도 본인 책임하에 사용해 주십시오. 우리는 아직 몇 가지 문제를 다듬고 기능을 개선하고 있습니다. 버그를 발견하거나 제안 사항이 있으시면 ISSUES에 신고해 주시기 바랍니다. 여러분의 피드백은 매우 소중합니다!
LLM Speed Benchmark(LLMSB)는 다양한 하드웨어 플랫폼에서 LLM 모델의 성능을 평가하기 위한 벤치마킹 도구입니다. 최종 목표는 다양한 시스템에서 LLM 모델의 성능을 자세히 기록한 포괄적인 데이터셋을 구축하여, 사용자가 자신의 프로젝트에 맞는 LLM 모델을 더 효과적으로 선택할 수 있도록 돕는 것입니다.
제한 사항
LLMSB는 v0이므로 몇 가지 제한 사항이 있습니다:
- 데비안 기반 운영 체제에서만 실행되도록 설계되었으며, 즉 Windows에서 실행되도록 설계되지 않았습니다. 이는 LLMSB가 내부적으로 지표를 수집하기 위해 neofetch와 nvidia-smi를 사용하고, 파일 경로 로직이 유닉스 운영 체제를 기반으로 하기 때문입니다.
- 지표가 기록되는 방식 때문에, 지표 수집기가 한 번 수집하는 데 최대 1초가 걸릴 수 있습니다. 이는 가장 빠르게도 하드웨어 지표를 1초마다 수집할 수 있다는 뜻입니다.
- LLMSB는 모델을 로드하고 실행하는 데 HuggingFace만 사용합니다. 이는 현재는 잘 동작하지만, 목표는 LLMSB가 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 모델이 테스트되었습니다. 결과는 여기에서 확인하세요. 오류/문제가 발견되면 ISSUES에 신고해 주시기 바랍니다.
설정
-
파이썬 환경을 생성하고 활성화합니다:
python3 -m venv env source env/bin/activate -
패키지 종속성을 설치합니다(APT 사용):
apt -y update apt install -y vim apt install -y neofetch -
파이썬 종속성을 설치합니다:
pip3 install transformers pip3 install psutil pip3 install gputil pip3 install tabulate pip3 install sentencepiece pip3 install protobuf -
Pytorch를 설치합니다
# CUDA 12.1을 사용하여, 리눅스용 pytorch stable build를 설치합니다: pip3 install torch torchvision torchaudio -
LLM-VM을 설치합니다:
pip install llm-vm -
(선택 사항) LLAMA와 같은 모델을 사용 중이라면 HuggingFace 접근 토큰이 필요합니다. 여기에서 접근 토큰을 설정한 다음, 다음 명령을 실행하여 토큰을 콘솔에 저장합니다:
huggingface-cli login
실행 방법
-
설정 섹션에 나열된 단계를 완료합니다.
-
설정을 구성하려면 다음 매개변수를 포함하는 json 파일을 만들어야 합니다(예시는 다음과 같습니다):
- 참고: 모든 프레임워크가 동일한 매개변수를 지원하는 것은 아닙니다
{ "model": "bigscience/bloom-560m", # HuggingFace에서의 모델 경로/저장소 (https://huggingface.co/models) "prompt": "Hello World!", # LLM 모델에 입력하고 싶은 프롬프트 "device": "cuda:0", # LLM 모델을 실행할 장치(GPU/CPU) "max_length": 50, # 생성될 토큰의 최대 길이 "temperature": 0.9, # LLM 모델의 temperature 값 "top_k": 50, # LLM 모델의 top-k 값 "top_p": 0.9, # LLM 모델의 top-p 값 "num_return_sequences": 1, # 모델의 독립적으로 실행된 인스턴스 수 "time_delay": 0, # 지표 수집기가 각 반복마다 기다릴 시간 지연(초) "model_start_pause": 1, # 테스트가 LLM 모델 실행 전에 기다릴 시간(초) "model_end_pause": 1 # 테스트가 LLM 모델 실행이 끝난 후 기다릴 시간(초) "framework": "llm-vm" # 모델을 실행하는 데 사용하고 싶은 프레임워크/라이브러리의 이름 } -
이전 단계에서 생성한 설정 파일의 경로를 사용하여, 벤치마크를 시작하려면 다음을 실행합니다(하나를 선택하세요):
# 벤치마크 하나 실행 python3 run.py --config ./configs/llmvm_test.json # 벤치마크를 하나보다 많이 실행(이 경우 3개) python3 run.py --config ./configs/llmvm_test.json --loops 3 -
벤치마크 실행이 끝나면, 다음과 비슷하게 생긴 파일에서 최종 결과를 확인합니다:
report_2023-11-25_05:55:04.207515_utc_1ffc4fa7-3aa9-4878-b874-1ff445e1ff8a.json
RunPod 설정:
-
RunPod을 설정하고, ssh 인증서/키를 설정한 뒤, pod를 실행합니다. RunPod의 콘솔 페이지에서 pod에 접근할 수 있습니다.
-
“Connect” 버튼을 클릭하여 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>
-
-
2단계의 명령을 사용하면 pod에 ssh로 접속하여 해당 RunPod pod에서 선택한 GPU를 사용할 수 있어야 합니다.
-
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/
-
-
pod 사용이 끝나면 종료하거나 일시 중지합니다. 하지만 주의하세요. 일시 중지하더라도 요금은 계속 부과되지만, 훨씬 적게 부과됩니다.
훌륭한 자료:
- 프롬프트 데이터셋: awesome-chatgpt-prompts, bigscience/P3, 및 writing-prompts
- LLM 매개변수에 대해 더 알아보기
- 클라우드 기반 LLM 모델을 벤치마크하기에 좋은 벤치마크
- 멋진 LLM 인텔리전스 리더보드: FastEval 및 open_llm_leaderboard