本地 LLM 模型基准测试

项目的 GitHub 仓库

背景故事

我在 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-hfcodellama-13b-oasst-sft-v10mpt-7b 被测试。请在这里查看结果。如果发现任何错误/问题,请将其报告到 ISSUES。

设置

  1. 创建并激活 python 环境:

    python3 -m venv env
    source env/bin/activate
    
  2. 安装包依赖项(使用 APT):

    apt -y update
    apt install -y vim
    apt install -y neofetch
    
  3. 安装 python 依赖项:

    pip3 install transformers
    pip3 install psutil
    pip3 install gputil
    pip3 install tabulate
    pip3 install sentencepiece
    pip3 install protobuf
    
  4. 安装 Pytorch

    # 使用 CUDA 12.1 安装适用于 linux 的 pytorch 稳定版:
    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",   # 模型在 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"               # 你希望用于运行模型的框架/库名称
    }
    
  3. 使用你在上一步创建的配置文件路径,运行以下命令以开始基准测试(任选其一):

    # 运行一次基准测试
    python3 run.py --config ./configs/llmvm_test.json
    
    # 运行多次基准测试(此处为 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 证书/密钥,并启动一个 pod。你可以在 RunPod 的控制台页面访问你的 pod。

  2. 点击“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>
      
  3. 使用第 #2 步中的命令,你应该能够 ssh 进入该 pod,并使用你在该 RunPod pod 中选择的 GPU。

  4. 如果你想把一个文件从 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/
      
  5. 在你完成 pod 使用后,关闭它或暂停它。但请注意,如果你暂停它,仍然会收费,只是会少很多。

很好的资源: