使用热门AI工具LLMPerf和LiteLLM对Amazon Bedrock上私有化部署的的DeepSeek-R1进行基准测试

开源的基础模型使AI行业的开发者与企业能够通过微调来开发拥有特定领域知识,并且满足特定需求的定制化AI应用,同时保持低成本和对模型和数据管理的控制。然而开源模型的弊端则是部署往往占据整个项目超30%的时间,因为工程师需要通过反复测试来优化服务器的容量并配置服务器系统参数。这一过程既复杂又耗时,需要专业的AI技能并迭代测试,才能达到预期的效果。

Amazon Bedrock提供的自定义模型导入功能简化了开发者自定义模型的部署过程,提供了标准而简单的API用于模型部署和API调用。大家可以自行上传模型的权重,让亚马逊云科技自动以优化方式完全托管模型部署流程,从而确保模型的高效运行和成本控制。Amazon Bedrock自定义模型导入还支持自动扩展,包括缩减计算资源至零(scale to zero)。如果模型在5分钟内未被调用,模型底层的计算资源会自动缩减至零,只有在使用时才按5分钟的时间窗口增量计费。此外它还支持自动扩展,在AI应用需要更高并发时自动扩展,通过副本的形式增加模型数量。这些功能使得Amazon Bedrock自定义模型导入功能成为开发者和企业在Amazon Bedrock上部署自定义模型的最佳选择,因为它兼顾了部署的简便性和成本。

在将我们自定义导入的模型投入生产环境给用户使用之前,使用基准测试工具评估其性能非常重要。这些AI工具有助于检测在用户使用过程中潜在问题,并验证模型部署是否能够很好的处理预期的流量并发。

本篇文章是关于将DeepSeek及开源基础模型通过自定义模型导入Amazon Bedrock的教程。本文介绍了如何使用流行的AI开源工具LLMPerf和LiteLLM对Amazon Bedrock上的自定义模型进行性能基准测试,同时我们也会分享示例Notebook代码,展示如何逐步部署DeepSeek-R1-Distill-Llama-8B模型。本教程同样适用于Amazon Bedrock自定义模型导入支持的任何其他模型。

实验前提条件

本文的实验需要大家在Amazon Bedrock中部署一个自定义模型。如果尚未在亚马逊云科技账户中部署,请参考Amazon Bedrock的官方文档 - 自定义模型导入部署DeepSeek-R1 Llama蒸馏模型。
 

使用开源AI工具LLMPerf和LiteLLM进行性能基准测试

为了对DeepSeek-R1进行基准测试,我们将使用LLMPerf,一个用于AI模型测试基础模型的流行开源库。LLMPerf通过创建并发的客户端Ray Clients来模拟用户请求进行负载测试,并分析AI模型的响应数据。LLMPerf的一个重要的优势是支持非常多的基础模型API,这里也包括我们将要用到的工具LiteLLM,LiteLLM目前支持所有Amazon Bedrock上的模型。

配置LiteLLM工具进行自定义模型API调用

LiteLLM是一个功能强大的开源AI工具,可作为AI应用开的发Python SDK或API网关来使用,简化开发人员的运维工作量,目前支持超过100种不同的基础模型,提供标准化的API接口抽象层以适配不同模型提供商的API格式要求。它目前也支持Amazon Bedrock的多种API,包括模型调用的InvokeModel和Converse API(Bedrock上模型的统一API接口),并支持调用在Amazon Bedrock上托管的自定义模型。

要使用LiteLLM调用自定义模型的API推理,我们需要指定API中相关model参数(详情请参阅Amazon Bedrock文档):bedrock/provider_route/model_arn。这个参数的格式如下:

  • provider_route:表示LiteLLM向AI模型的请求/响应规范格式。例如DeepSeek R1模型可以使用DeepSeek R1的路由模板调用(deepseek_r1),或者使用Llama的路由模板调用(llama)。
  • model_arn:导入模型在亚马逊云科技上的资源名称(ARN),可通过控制台或ListImportedModels API请求获取。

以下代码脚本使用DeepSeek R1聊天模板调用自定义模型:

import time
from litellm import completion

while True:
    try:
        response = completion(
            model=f"bedrock/deepseek_r1/{model_id}",
            messages=[{"role": "user", "content": """Given the following financial data:
        - Company A's revenue grew from $10M to $15M in 2023
        - Operating costs increased by 20%
        - Initial operating costs were $7M
        
        Calculate the company's operating margin for 2023. Please reason step by step."""},
                      {"role": "assistant", "content": "<think>"}],
            max_tokens=4096,
        )
        print(response['choices'][0]['message']['content'])
        break
    except:
        time.sleep(60)

配置LLMPerf对DeepSeek进行基准测试

LLMPerf使用Ray分布式计算框架来模拟客户端发送请求,仿真用户真实负载。它会生成多个远程的客户端,每个客户端可以调用模型API发送并发请求。这些客户端作为一个Actor计算单元并行执行并发请求,在框架里llmperf.requests_launcher模块负责管理请求的分发,并可以模拟多种负载场景和并发模式。同时每个客户端都会独立的收集测试性能指标,包括延迟(latency)、吞吐量(throughput)和错误率(error rate)。

负载性能测试中两个关键指标是:

  • 延迟(Latency):处理单个请求所需的时间。
  • 吞吐量(Throughput):每秒模型生成的令牌数。

选择合适的基准测试配置,需要大家多次实验进行具体参数选择。如不同的API请求批处理大小,同时监测Bedrock上计算资源GPU利用率,并考虑可用内存、模型大小以及真实环境下工作负载的具体需求。尽管Amazon Bedrock自定义模型导入功能提供了预优化的计算资源服务配置(latency-optimized推理模式),但仍然需要大家提前验证部署的延迟和吞吐量,保证AI应用的性能。

大家可以通过修改token_benchmark.py测试脚本来配置基准测试,该脚本允许定义以下参数:

  • LLM API:使用LiteLLM框架调用的Amazon Bedrock自定义模型。
  • Model:定义模型的provider_route API调用输入/输出格式、API参数和ARN ID,与上一节介绍的相同。
  • 输入/输出令牌的均值和标准差:用于决定测试中API调用模型的输入/输出令牌数的概率分布,模拟变化的模型输入和输出。
  • 并发请求数:模拟AI应用实际支持的最大用户数。
  • 完成的请求总数:测试过程中发送到模型API的请求总数。

如下就是一个执行基准测试调用模型并配置相应参数的Bash命令。

python3 ${
   
   {LLM_PERF_SCRIPT_DIR}}/token_benchmark_ray.py \\
--model "bedrock/llama/{model_id}" \\
--mean-input-tokens {mean_input_tokens} \\
--stddev-input-tokens {stddev_input_tokens} \\
--mean-output-tokens {mean_output_tokens} \\
--stddev-output-tokens {stddev_output_tokens} \\
--max-num-completed-requests ${
   
   {LLM_PERF_MAX_REQUESTS}} \\
--timeout 1800 \\
--num-concurrent-requests ${
   
   {LLM_PERF_CONCURRENT}} \\
--results-dir "${
   
   {LLM_PERF_OUTPUT}}" \\
--llm-api litellm \\
--additional-sampling-params '{
   
   {}}'

基准测试完成后,LLMPerf将输出两个JSON文件:一个包含各项指标全部的测试数据,另一个包含每次调用模型产生的详细数据。

计算资源缩减至零和冷启动延迟

一个大家需要注意的是Amazon Bedrock自定义模型导入在未使用时,计算资源会自动缩减至零。因此在运行测试前,需要先发送一个预请求以确保至少有一个可使用的AI模型副本。如果在测试中收到了模型尚未启动的错误,则需要等待大约10秒至1分钟让Bedrock启用至少一个模型副本,然后再次尝试调用,之后即可进行基准测试。

以DeepSeek-R1-Distill-Llama-8B蒸馏模型的测试为例

假设大家在Amazon Bedrock自定义模型导入上托管了DeepSeek-R1-Distill-Llama-8B模型,并作为一个低流量的AI应用的大语言模型(最多2个并发请求)。大家可以配置以下的输入输出tokens参数,以模拟对大模型输入/输出变化的tokens,例如:

  • 客户端数量:2
  • 输入令牌均值:500
  • 输入令牌标准差:25
  • 输出令牌均值:1000
  • 输出令牌标准差:100
  • 每个客户端的调用请求数:50

这个测试大约持续8分钟,最终大家会得到一份多个指标汇总的性能报告,报告内容如下。

inter_token_latency_s
    p25 = 0.010615988283217918
    p50 = 0.010694698716183695
    p75 = 0.010779359342088015
    p90 = 0.010945443657517748
    p95 = 0.01100556307365132
    p99 = 0.011071086908721675
    mean = 0.010710014800224604
    min = 0.010364670612635254
    max = 0.011485444453299149
    stddev = 0.0001658793389904756
ttft_s
    p25 = 0.3356793452499005
    p50 = 0.3783651359990472
    p75 = 0.41098671700046907
    p90 = 0.46655246950049334
    p95 = 0.4846706690498647
    p99 = 0.6790834719300077
    mean = 0.3837810468001226
    min = 0.1878921090010408
    max = 0.7590946710006392
    stddev = 0.0828713133225014
end_to_end_latency_s
    p25 = 9.885957818500174
    p50 = 10.561580732000039
    p75 = 11.271923759749825
    p90 = 11.87688222009965
    p95 = 12.139972019549713
    p99 = 12.6071144856102
    mean = 10.406450886010116
    min = 2.6196457750011177
    max = 12.626598834998731
    stddev = 1.4681851822617253
request_output_throughput_token_per_s
    p25 = 104.68609252502657
    p50 = 107.24619111072519
    p75 = 108.62997591951486
    p90 = 110.90675007239598
    p95 = 113.3896235445618
    p99 = 116.6688412475626
    mean = 107.12082450567561
    min = 97.0053466021563
    max = 129.40680882698936
    stddev = 3.9748004356837137
number_input_tokens
    p25 = 484.0
    p50 = 500.0
    p75 = 514.0
    p90 = 531.2
    p95 = 543.1
    p99 = 569.1200000000001
    mean = 499.06
    min = 433
    max = 581
    stddev = 26.549294727074212
number_output_tokens
    p25 = 1050.75
    p50 = 1128.5
    p75 = 1214.25
    p90 = 1276.1000000000001
    p95 = 1323.75
    p99 = 1372.2
    mean = 1113.51
    min = 339
    max = 1392
    stddev = 160.9598415942952
Number Of Errored Requests: 0
Overall Output Throughput: 208.0008834264341
Number Of Completed Requests: 100
Completed Requests Per Minute: 11.20784995697034
Bash

除了以上的总结报告外,大家还会获得每个API请求调用的首令牌时间(Time to First Token)和令牌吞吐量(Token Throughput)的直方图分析。

使用LLMPerf分析基准测试结果,并通过Amazon CloudWatch估算成本

LLMPerf可以帮助大家评估Amazon Bedrock上导入的自定义模型的性能,大家无需给LLMPerf提供也不需要了解Bedrock底层的基础设施配置。这些基础测试获得的信息对于优化AI应用用户体验至关重要。此外基准测试还能我们帮助估算AI模型的部署成本。

通过Amazon CloudWatch,大家可以监控Amazon Bedrock自定义模型导入在负载测试期间自动扩展的模型副本数。模型副本数量(ModelCopy)作为CloudWatch中的关键指标(Namespace:AWS/Bedrock)中的一部分,模型ARN ID会在指标监控图中以标签显示,下图就是一个模型副本数量的监控图。监控此数据有助于部署成本的估算,因为Bedrock云资源的用量与模型副本的数量直接相关。

总结

虽然Amazon Bedrock自定义模型导入简化了模型部署和模型使用中的自动扩展,但对于部署后模型的性能基准测试仍然是需要的,通过这种方式我们可以生产环境下的AI模型性能进行评估,并在成本、延迟和吞吐量等关键指标上对不同模型进行比较,进而选出最优的模型。欢迎大家尝试本文分享的示例Notebook代码,并使用自己导入的自定义模型进行测试!

猜你喜欢

转载自blog.csdn.net/m0_66628975/article/details/146254226
今日推荐