基准本地LLM模型

项目的GitHub仓库

背景故事

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

设置

  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

    # 安装适用于Linux的稳定版本的pytorch,使用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",   # 模型在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"               # 您想用来运行模型的框架/库的名称
    }
    
  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. 点击“连接”按钮以获取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后,关闭或暂停它。但请注意,如果您暂停它,您仍然会被收费,只是费用会少得多。

优秀资源: