用LLMPerf优化大型语言模型负载测试 新标题准确概括了文章的核心内容,强调了使用LLMPerf进行负载测试的重要性,并保持了简洁和吸引力。
大语言模型(LLM)在实际运用前,需要经过负载测试,以确保其能够应对生产环境中的流量。传统的机器学习模型负载测试工具如Locust通常能够捕捉每秒请求数(RPS)和请求延迟百分位等基本性能指标,但这些指标对于大型语言模型来说并不完全适用。LLM由于其庞大的规模和更高的计算需求,通常具有更低的RPS和更高的延迟。因此,基于令牌(token)的性能指标成为评估LLM性能的更佳选择。 本文介绍了如何使用LLMPerf工具进行此类负载测试,以便从部署和服务的角度了解LLM的实际表现。LLMPerf是建立在Ray分布式计算框架上的,可以模拟生产级别的实时流量。通过调整输入和输出令牌的参数,可以更精确地评估模型在不同生成任务中的性能。具体参数包括每秒生成第一个令牌所需的时间(Time to First Token)、每秒生成的总输出令牌数(Total Output Tokens Per Second)等。 LLM特定的性能指标 主要的性能指标包括: - 时间到第一个令牌(Time to First Token):这是生成第一个令牌所需的时间,特别适合流式处理应用场景,例如使用ChatGPT时,当第一个文本片段(令牌)出现时,我们开始处理信息。 - 每秒总输出令牌数(Total Output Tokens Per Second):这是模型每秒生成的总令牌数,可以视为RPS的更细致版本。 此外,还有一些其他指标,如令牌间隔延迟(inter-token latency),这些指标也会影响模型性能的评估。 LLMPerf工具介绍 LLMPerf基于Ray框架,可以创建分布式负载测试,模拟实际的生产流量。使用LLMPerf时,需要确保运行负载测试的客户端机器具有足够的计算能力。随着模型处理并发请求或吞吐量的增加,客户端机器的数量和性能也需要相应增加。 将LLMPerf应用于Amazon Bedrock 环境设置 本文使用SageMaker Classic Notebook Instance进行示例测试,选择conda_python3内核和ml.g5.12xlarge实例,确保具有足够的计算能力。同时,需要配置AWS凭证,以便LLMPerf访问托管在Bedrock或SageMaker上的模型。 配置LiteLLM 首先配置LiteLLM API结构,支持多种模型提供商。本文中,选择配置与Amazon Bedrock兼容的模型“Claude 3 Sonnet”,并传递一个查询请求: ```python import os from litellm import completion os.environ["AWS_ACCESS_KEY_ID"] = "输入你的访问密钥ID" os.environ["AWS_SECRET_ACCESS_KEY"] = "输入你的秘密访问密钥" os.environ["AWS_REGION_NAME"] = "us-east-1" response = completion( model="anthropic.claude-3-sonnet-20240229-v1:0", messages=[{ "content": "谁是罗杰·费德勒?","role": "user"}] ) output = response.choices[0].message.content print(output) ``` 执行负载测试 使用LLMPerf的token_benchmark_ray.py脚本,传递相关参数执行负载测试: sh %%sh python llmperf/token_benchmark_ray.py \ --model bedrock/anthropic.claude-3-sonnet-20240229-v1:0 \ --mean-input-tokens 1024 \ --stddev-input-tokens 200 \ --mean-output-tokens 1024 \ --stddev-output-tokens 200 \ --max-num-completed-requests 30 \ --num-concurrent-requests 1 \ --timeout 300 \ --llm-api litellm \ --results-dir bedrock-outputs 测试运行300秒后,会生成一个包含统计结果的输出目录。这些结果可以通过pandas库进行更清晰的解析: ```python import json from pathlib import Path import pandas as pd individual_path = Path("bedrock-outputs/bedrock-anthropic-claude-3-sonnet-20240229-v1-0_1024_1024_individual_responses.json") summary_path = Path("bedrock-outputs/bedrock-anthropic-claude-3-sonnet-20240229-v1-0_1024_1024_summary.json") with open(individual_path, "r") as f: individual_data = json.load(f) with open(summary_path, "r") as f: summary_data = json.load(f) summary_metrics = { "模型": summary_data.get("model"), "平均输入令牌数": summary_data.get("mean_input_tokens"), "输入令牌数标准差": summary_data.get("stddev_input_tokens"), "平均输出令牌数": summary_data.get("mean_output_tokens"), "输出令牌数标准差": summary_data.get("stddev_output_tokens"), "平均时间到第一个令牌 (秒)": summary_data.get("results_ttft_s_mean"), "平均令牌间隔延迟 (秒)": summary_data.get("results_inter_token_latency_s_mean"), "平均输出吞吐量 (令牌/秒)": summary_data.get("results_mean_output_throughput_token_per_s"), "完成请求数": summary_data.get("results_num_completed_requests"), "错误率": summary_data.get("results_error_rate") } print("Claude 3 Sonnet - 性能摘要:\n") for k, v in summary_metrics.items(): print(f"{k}: {v}") ``` 实际应用 在实际应用中,LLMPerf可以在多个模型提供商和平台上运行负载测试,帮助你选择最适合你用例的模型和部署栈。通过这些测试,可以更好地了解模型在实际生产环境中的表现。 业内人士评价与公司背景 负载测试和评估是确保LLM在生产环境中高效运行的关键步骤。本文作者是一名AWS机器学习架构师,他指出,传统的负载测试工具难以全面评估LLM的性能,而基于令牌的指标能够提供更准确的评估结果。LLMPerf的出现填补了这一空白,为开发人员提供了有力的工具,使其能够在模型选择和部署中做出更明智的决策。
