You need to enable JavaScript to run this app.
导航
调用批量推理接入点
最近更新时间:2024.12.16 21:13:52首次发布时间:2024.12.16 21:13:52

介绍

创建批量推理接入点后,通过batch Inference chat接口,使用批量推理服务,详情请参见批量推理说明

前提条件

当前支持Go语言SDK,其他语言的SDK待上线。

示例代码

批量推理接入点调用方法与在线推理接入点类似。
您需要升级最新的SDK,并关注下面示例代码中的变更。

  1. 设置超时时间timeout
  2. 调用client.StartBatchWorker()方法。
  3. 方法换成client.CreateBatchChatCompletion方法。
package main

import (
    "context"
    "fmt"
    "os"
    "sync"
    "time"

    "github.com/volcengine/volcengine-go-sdk/service/arkruntime"
    "github.com/volcengine/volcengine-go-sdk/service/arkruntime/model"
    "github.com/volcengine/volcengine-go-sdk/volcengine"
)

// main 函数是程序的入口点
func main() {
    // 设置超时时间为24小时
    timeout := time.Hour * 24
    // 设置工作线程数量为10000
    workerNum := 10000

    // 使用API密钥创建一个新的客户端实例,并设置超时时间
    // 注意:这里的API密钥是从环境变量中获取的,设定超时时间
    client := arkruntime.NewClientWithApiKey(os.Getenv("ARK_API_KEY"), arkruntime.WithTimeout(timeout))
    // 启动指定数量的工作线程
    client.StartBatchWorker(workerNum)

    // 创建一个上下文对象,用于控制请求的生命周期
    ctx := context.Background()
    // 初始化工作线程索引
    i := 0
    // 设置每个工作线程要执行的任务数量
    taskNum := 5
    // 创建一个等待组,用于等待所有工作线程完成任务
    wg := sync.WaitGroup{}
    // 循环启动工作线程
    for i < workerNum {
        // 增加等待组的计数器
        wg.Add(1)
        // 启动一个新的工作线程
        go func(index int) {
            // 在工作线程结束时减少等待组的计数器
            defer wg.Done()
            // 初始化任务索引
            j := 0
            // 循环执行任务
            for j < taskNum {
                // 创建一个聊天完成请求
                _, err := client.CreateBatchChatCompletion(ctx, model.ChatCompletionRequest{
                    // 从环境变量中读取,您批量推理请求的推理接入点
                    Model: os.Getenv("YOUR_ENDPOINT_ID"),
                    // 设置请求的消息内容
                    Messages: []*model.ChatCompletionMessage{
                        {
                            // 设置消息的角色为系统角色
                            Role: model.ChatMessageRoleSystem,
                            // 设置消息的内容
                            Content: &model.ChatCompletionMessageContent{
                                // 设置消息的字符串值
                                StringValue: volcengine.String("你是豆包,是由字节跳动开发的 AI 人工智能助手"),
                            },
                        },
                        {
                            // 设置消息的角色为用户角色
                            Role: model.ChatMessageRoleUser,
                            // 设置消息的内容
                            Content: &model.ChatCompletionMessageContent{
                                // 设置消息的字符串值
                                StringValue: volcengine.String("常见的十字花科植物有哪些?"),
                            },
                        },
                    },
                })
                // 增加任务索引
                j++
                // 检查是否有错误发生
                if err != nil {
                    // 如果有错误,打印错误信息并继续下一个任务
                    fmt.Printf("worker %d request %d Fail Err %s\n", index, j, err)
                    continue
                }
            }
        }(i)
        // 增加工作线程索引
        i++
    }
    // 等待所有工作线程完成任务
    wg.Wait()
}

核心参数说明及配置建议

BatchChat接口中,有以下核心配置:

超时时间timeout

在创建client时,配置的arkruntime.WithTimeout(timeout)的timeout值,代表着单个请求的超时时间。如果请求失败,client会在超时时间范围内自动重试请求,或者按照方舟服务端要求暂停若干时间后重试。在方舟服务端,会根据负载对请求做出暂不处理、排队、指定客户端若干时间后重试等操作。
推荐配置一个较大的超时时间(最大可以配置72小时),可以更好的服务端繁忙时保证请求完成比例。配置更高的超时时间并不会降低请求的吞吐量。

请求并发数workerNum

代表client向方舟服务端发起请求的最大并发数。在创建client后,需要在发起请求前,调用 client.StartBatchWorker(workerNum)启动Client端的Worker。推荐业务参照示例代码,以相同的并发数调用 client.CreateBatchChatCompletion方法,可。workNum决定了在服务端容量充足时,Client能达到的最大吞吐量。
需要综合考虑业务预期的最大峰值、平均时延、机器并发上线。

举例:业务预期的最大峰值QPS为5000,单个请求的平均延时为5秒,部署在2C4G的机器或容器上。

  • 业务并发:5000*5 = 25000
  • 机器配置限制:不考虑业务层损耗,可支持1000至1500的QPS

如果需要应对业务峰值时的业务量,可部署更多副本(推荐),提升机器配置(不推荐)。
建议的副本数为:5000/1000=5
每个副本上设置的请求并发数(workerNum)为1000*5=5000

其他说明及建议

  • 在服务高峰期,可能会有部分请求超时失败,业务需要根据需要判断是否重试。
  • 在服务高峰期,可能会有部分请求耗时较长,如业务场景对单个请求的超时有要求,请合理配置Timeout。
  • 如果需要较高的并发数(并发超过1000),需要提前提交工单,提高指定EP的并发限制。
  • Client StartBatchWorker会创建workNum个goroutine,推荐单个副本中全局使用同一个Client,避免创建大量goroutine带来的资源开销及浪费。