基准本地LLM模型
背景故事
我在Anarchy (YC W23)担任兼职工程实习生期间构建了LLM速度基准(LLMSB)。LLMSB是一个用于评估LLM模型性能的基准工具。它使用HuggingFace的transformers库来加载和运行LLM模型,并测量:
- 总运行时间
- 每秒令牌数
- 一般硬件规格
- CPU使用率(当前频率和核心使用百分比随时间变化)
- RAM使用率(RAM和交换空间随时间变化)
- GPU使用率(负载、内存使用和温度随时间变化)
这里是一个基准运行的示例,针对在H100上运行的codellama-13b-oasst-sft-v10模型。我个人拥有一块Nvidia RTX 2070 Ti,它有8 GB的显存。遗憾的是,对于大多数现代LLM模型,8 GB的显存不足以与模型进行交互。因此,我使用RunPod来“租用”GPU并在某些模型上运行我的基准测试。
这就是LLMSB的背景故事/起源故事。由于该项目是开源的,您可以在这里查看代码。下面,我包含了来自仓库的README,如果您想查看。
关于
🚧 LLM速度基准(LLMSB)目前处于测试版(v0)。请不要在生产环境中使用,或自行承担风险。我们仍在解决一些问题并改善功能。如果您遇到任何错误或有建议,请在问题下报告。您的反馈非常宝贵!
LLM速度基准(LLMSB)是一个用于评估LLM模型在不同硬件平台上性能的基准工具。其最终目标是编制一个全面的数据集,详细说明LLM模型在各种系统上的性能,使用户能够更有效地选择适合其项目的LLM模型。
限制
LLMSB处于v0版本,因此存在一些限制:
- 仅设计用于在基于Debian的操作系统上运行,也就是说,它不适用于Windows。这是因为LLMSB在后台使用neofetch和nvidia-smi来收集指标,文件路径逻辑基于Unix操作系统。
- 由于指标的记录方式,指标收集器可能需要最多1秒的时间来进行一次收集。这意味着,在最快的情况下,我们每秒可以收集一次硬件指标。
- LLMSB仅使用HuggingFace来加载和运行模型。目前这样可以,但目标是让LLMSB支持多个框架,而不仅仅是HuggingFace。
- 目前,所有模型都是通过位于src/hf.py中的run_llm()函数中呈现的逻辑运行的,其中使用了AutoTokenizer()和AutoModelForCausalLM()函数来加载和运行模型。这是可行的,但限制了我们配置/优化特定模型的方式。考虑到这一点,目标是为每个流行模型创建单独的类,并利用HuggingFace的模型特定类,如LlamaTokenizer和LlamaForCausalLM。
- LLMSB仅收集一般的高层次指标。未来,我们希望收集更低层次的指标。我们认为这可以部分通过使用Pytorch的profiler wrapper来实现。
示例输出
2023年11月22日
LLMSB在L40和H100 GPU上进行了运行/测试。在这些基准测试中,测试了模型llama-2-7b-hf、codellama-13b-oasst-sft-v10和mpt-7b。查看结果这里。如果发现任何错误/问题,请将其报告到问题中。
设置
-
创建并激活Python环境:
python3 -m venv env source env/bin/activate -
安装软件包依赖项(使用APT):
apt -y update apt install -y vim apt install -y neofetch -
安装Python依赖项:
pip3 install transformers pip3 install psutil pip3 install gputil pip3 install tabulate pip3 install sentencepiece pip3 install protobuf -
安装Pytorch
# 安装适用于Linux的稳定版本的pytorch,使用CUDA 12.1: 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模型的温度值 "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。
-
点击“连接”按钮以获取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中的命令,您应该能够ssh进入pod并使用您在该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后,关闭或暂停它。但请注意,如果您暂停它,您仍然会被收费,只是费用会少得多。