本地 LLM 模型基准测试
背景故事
我在 Anarchy(YC W23) 担任兼职工程实习生期间,构建了 LLM Speed Benchmark(LLMSB)。LLMSB 是一个用于评估 LLM 模型性能的基准测试工具。它使用 HuggingFace 的 transformers 库来加载并运行 LLM 模型,并测量:
- 总运行时间
- 每秒 token 数
- 通用硬件规格
- CPU 使用率(当前频率与各核心使用率百分比随时间变化)
- 内存使用率(内存与交换分区随时间变化)
- GPU 使用率(负载、内存使用率与温度随时间变化)
这里 是在 H100 上运行 codellama-13b-oasst-sft-v10 模型的一次基准测试示例。我个人拥有一块 Nvidia RTX 2070 Ti,它有 8 GB 的显存。遗憾的是,对于大多数现代 LLM 模型来说,8 GB 显存不足以与模型交互。因此,我使用 RunPod 来“租用” GPU,并在某些模型上运行我的基准测试。
这就是 LLMSB 的背景/起源故事。由于该项目是开源的,你可以在这里查看代码。下面,如果你想了解更多,我附上了该仓库中的 README。
关于
🚧 LLM Speed Benchmark(LLMSB)目前处于测试版(v0)。请不要在生产环境中使用,或者请自行承担风险。我们仍在修复一些小问题并改进功能。如果你遇到任何错误或有建议,请在 ISSUES 下报告。你的反馈非常宝贵!
LLM Speed Benchmark(LLMSB)是一个用于评估 LLM 模型在不同硬件平台上性能的基准测试工具。它的最终目标是编制一个全面的数据集,详细记录 LLM 模型在各种系统上的表现,从而使用户能够更有效地为他们的项目选择合适的 LLM 模型。
局限性
LLMSB 目前处于 v0,因此它有一些局限性:
- 只设计用于在基于 Debian 的操作系统上运行,也就是说,它并不是为 Windows 设计的。这是因为 LLMSB 在底层使用 neofetch 和 nvidia-smi 来收集指标,而且文件路径逻辑基于类 Unix 操作系统。
- 由于指标的记录方式,指标收集器可能需要长达 1 秒才能完成一次采集。这意味着,最快情况下,我们每 1 秒才能收集一次硬件指标。
- LLMSB 只使用 HuggingFace 来加载和运行模型。这个方案目前可用,但我们的目标是让 LLMSB 支持多个框架,而不仅仅是 HuggingFace。
- 目前,所有模型都是通过 src/hf.py 中的 run_llm() 函数所呈现的逻辑来运行的,其中使用了 AutoTokenizer() 和 AutoModelForCausalLM() 函数来加载并运行模型。这样可以工作,但它限制了我们对特定模型进行配置/优化的方式。基于这一点,我们的目标是为每个流行模型创建单独的类,并改用 HuggingFace 针对特定模型的类,例如 LlamaTokenizer 和 LlamaForCausalLM。
- LLMSB 只收集通用的高层指标。未来,我们希望收集更低层级的指标。我们认为这可以部分通过使用 Pytorch 的 porfiler wrapper 来实现。
示例输出
2023 年 11 月 22 日
LLMSB 通过 RunPod 在 L40 和 H100 GPU 上进行了运行/测试。在这些基准测试中,模型 llama-2-7b-hf、codellama-13b-oasst-sft-v10 和 mpt-7b 被测试。请在这里查看结果。如果发现任何错误/问题,请将其报告到 ISSUES。
设置
-
创建并激活 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
# 使用 CUDA 12.1 安装适用于 linux 的 pytorch 稳定版: pip3 install torch torchvision torchaudio -
安装 LLM-VM:
pip install llm-vm
6.(可选)如果你正在使用像 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, # 生成 token 的最大长度 "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。
-
点击“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 步中的命令,你应该能够 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 使用后,关闭它或暂停它。但请注意,如果你暂停它,仍然会收费,只是会少很多。
很好的资源:
- 提示词数据集:awesome-chatgpt-prompts、bigscience/P3 和 writing-prompts
- 了解更多关于 LLM 参数的信息
- 用于对基于云的 LLM 模型进行基准测试的优秀基准工具
- 很酷的 LLM 智能排行榜:FastEval 和 open_llm_leaderboard