实战:Serverless 架构部署高频 AI API,动态扩缩容配置

核心提要

高频 AI API 面临"流量波动剧烈(峰谷比可达 100:1)、要求低延迟(≤200ms)、无需关注底层服务器运维"三大核心诉求,而 Serverless 架构(无服务器架构)凭借"按需付费、天然弹性扩缩容、免运维服务器"的特性,完美适配这一场景。本实战以 阿里云 Function Compute(FC,国内主流 Serverless 平台) 为载体,以进阶版 MNIST 手写数字识别 AI 模型为示例,完整覆盖"环境准备→AI 模型轻量化→Serverless 函数封装→动态扩缩容核心配置→高并发测试→优化落地"全流程,最终实现"QPS 峰值 1000+、延迟≤180ms、按需动态扩缩容(从 0 实例到 100 实例秒级完成)"的高频 AI API 部署目标,同时兼顾成本优化与稳定性保障。

一、前置准备

1. 场景与工具选型

|---------------|----------------------------------|----------------------------|
| 类别 | 选型/配置 | 核心作用 |
| Serverless 平台 | 阿里云 Function Compute(FC) | 提供无服务器运行环境,支持自动动态扩缩容 |
| AI 模型 | 进阶版 MNIST(ONNX 轻量化格式) | 模拟高频调用的图像识别 AI API,体积小、推理快 |
| 开发环境 | Python 3.9、ONNX Runtime 1.15+ | 模型推理与函数封装,适配 FC 运行环境 |
| 工具 | 阿里云 CLI、fc-demo、Apache Bench(ab) | 平台操作、函数部署、高并发压测 |
| 存储服务 | 阿里云 OSS | 存储 ONNX 模型文件,实现函数跨实例共享访问 |

2. 环境搭建步骤

(1)开通阿里云相关服务
  1. 登录阿里云控制台,开通 Function Compute(FC) 服务(选择就近地域,如华东 2(上海));

  2. 开通 对象存储 OSS 服务,创建 Bucket(私有读写,地域与 FC 一致,避免跨地域网络延迟);

  3. 开通 AccessKey ,记录 AccessKey IDAccessKey Secret(用于本地 CLI 连接阿里云)。

(2)本地工具安装与配置
复制代码
# 1. 安装阿里云 CLI
pip3 install aliyun-cli -i https://pypi.tuna.tsinghua.edu.cn/simple

# 2. 配置阿里云 CLI 凭证(关联 AccessKey)
aliyun configure
# 依次输入:AccessKey ID、AccessKey Secret、地域(如 cn-shanghai)、输出格式(json)

# 3. 安装 FC 插件(用于操作 Serverless 函数)
aliyun fc install

# 4. 安装 AI 模型与测试依赖
pip3 install onnxruntime pillow requests -i https://pypi.tuna.tsinghua.edu.cn/simple

# 5. 安装压测工具 Apache Bench(Ubuntu/Debian 环境)
sudo apt-get install apache2-utils
(3)AI 模型轻量化与上传

高频 AI API 要求模型启动快、推理快,优先将 PyTorch 模型转为 ONNX 格式(轻量化,推理效率提升 30%+),并上传至 OSS:

复制代码
# 1. (延续前文)将 AdvancedMNISTModel 转为 ONNX 格式(已优化,体积压缩至 20MB 以内)
import torch
from AdvancedMNISTModel import AdvancedMNISTModel

model = AdvancedMNISTModel()
model.load_state_dict(torch.load("advanced_mnist_model.pth", map_location="cpu"))
model.eval()

# 构造虚拟输入,导出 ONNX 模型
dummy_input = torch.randn(1, 1, 28, 28)
torch.onnx.export(
    model,
    dummy_input,
    "advanced_mnist_model.onnx",
    input_names=["input"],
    output_names=["output"],
    opset_version=16,
    do_constant_folding=True  # 启用常量折叠,减小模型体积
)

print("ONNX 模型导出完成,体积:", os.path.getsize("advanced_mnist_model.onnx") / 1024 / 1024, "MB")

# 2. 上传 ONNX 模型至阿里云 OSS(两种方式:① 控制台手动上传 ② CLI 上传)
# 此处使用 CLI 上传(需提前配置 ossutil)
aliyun oss cp advanced_mnist_model.onnx oss://your-bucket-name/mnist/model/

二、Serverless 函数封装:适配高频 AI API 场景

1. 核心设计原则

针对高频 AI API 的特性,函数封装需满足:

  1. 冷启动优化 :模型在函数初始化阶段(initializer)加载,而非每次请求加载,避免重复开销;

  2. 请求/响应轻量化:简化参数解析与结果格式化,减少非推理耗时;

  3. 异常容错:添加请求参数校验、模型推理异常捕获,避免单个请求故障导致实例崩溃;

  4. 资源适配:适配 FC 实例规格,避免内存/CPU 不足导致推理延迟飙升。

2. 完整函数代码(mnist_infer_function.py

复制代码
import os
import onnxruntime as ort
import numpy as np
from PIL import Image
from io import BytesIO
import base64

# 全局变量:存储 ONNX 推理会话(初始化阶段加载,复用所有请求)
ort_session = None
MODEL_PATH = "/tmp/advanced_mnist_model.onnx"  # FC 临时目录,读写速度快

def initializer(context):
    """
    函数初始化钩子(仅在实例启动时执行一次):下载模型并加载推理会话
    避免每次请求都下载模型,优化冷启动与热请求性能
    """
    global ort_session
    try:
        # 1. 从 OSS 下载模型到 FC 临时目录(/tmp 有 512MB 存储空间,满足模型需求)
        os.system(f"aliyun oss cp oss://your-bucket-name/mnist/model/advanced_mnist_model.onnx {MODEL_PATH}")
        
        # 2. 加载 ONNX 推理会话(启用优化,提升推理速度)
        ort_session = ort.InferenceSession(
            MODEL_PATH,
            providers=["CPUExecutionProvider"],  # 若需 GPU,选择 FC GPU 实例并配置 "CUDAExecutionProvider"
            sess_options=ort.SessionOptions()
        )
        ort_session.get_session_options().enable_optimization = True
        ort_session.get_session_options().graph_optimization_level = ort.GraphOptimizationLevel.ORT_ENABLE_ALL
        
        print("模型初始化完成,推理会话已加载")
    except Exception as e:
        print(f"模型初始化失败:{str(e)}")
        raise e

def preprocess_image(image_data):
    """
    数据预处理:将输入图像转为模型可接收的张量格式
    """
    try:
        # 解析 base64 编码的图像数据(高频 API 推荐 base64,避免文件上传开销)
        img = Image.open(BytesIO(base64.b64decode(image_data))).convert('L')
        img = img.resize((28, 28))
        img_np = np.array(img, dtype=np.float32) / 255.0
        img_np = np.expand_dims(np.expand_dims(img_np, axis=0), axis=0)  # 转为 (1,1,28,28)
        return img_np
    except Exception as e:
        raise Exception(f"图像预处理失败:{str(e)}")

def handler(event, context):
    """
    函数入口(处理每个请求):接收请求→预处理→推理→返回结果
    """
    global ort_session
    try:
        # 1. 校验推理会话是否就绪
        if ort_session is None:
            return {
                "code": 500,
                "message": "模型未初始化完成,请重试",
                "result": None
            }
        
        # 2. 解析请求参数(高频 API 优先使用 JSON 格式)
        import json
        event_data = json.loads(event)
        if "image_base64" not in event_data:
            return {
                "code": 400,
                "message": "缺少必要参数:image_base64",
                "result": None
            }
        
        # 3. 数据预处理
        img_np = preprocess_image(event_data["image_base64"])
        
        # 4. 模型推理(核心环节,耗时占比 80%+)
        outputs = ort_session.run(None, {"input": img_np})
        pred = int(np.argmax(outputs[0], axis=1)[0])
        
        # 5. 格式化返回结果(轻量化,减少网络传输耗时)
        return {
            "code": 200,
            "message": "success",
            "result": {
                "predict_digit": pred,
                "inference_time_ms": round(float(ort_session.get_profiling_stats()["total_time_ms"]), 2)
            }
        }
    except Exception as e:
        return {
            "code": 500,
            "message": f"请求处理失败:{str(e)}",
            "result": None
        }

3. 函数依赖打包(FC 层配置)

Serverless 函数避免直接打包大体积依赖(如 onnxruntime),优先使用 FC 层 实现依赖复用,减少函数包体积,提升部署与冷启动速度:

复制代码
# 1. 创建依赖目录
mkdir -p fc_layer/onnxruntime/python/lib/python3.9/site-packages

# 2. 安装依赖到指定目录
pip3 install onnxruntime==1.15.1 -t fc_layer/onnxruntime/python/lib/python3.9/site-packages -i https://pypi.tuna.tsinghua.edu.cn/simple

# 3. 打包依赖层
cd fc_layer/onnxruntime
zip -r onnxruntime_layer.zip .

# 4. 上传依赖层到 FC(控制台操作:进入 FC 控制台→层→创建层→上传 zip 包→选择 Python 3.9)

三、核心配置:动态扩缩容(适配高频流量波动)

Serverless 架构的核心优势是动态扩缩容,针对高频 AI API,需在 FC 中配置"实例扩缩容""并发控制""空闲实例保留"三大核心参数,实现"峰时快速扩容、谷时自动缩容、避免冷启动"的目标。

1. 配置前置:FC 函数基础部署

  1. 登录阿里云 FC 控制台,进入对应地域,创建服务 (命名:mnist-infer-service,配置日志存储到 SLS,便于排查问题);

  2. 创建函数 (命名:mnist-infer-function):

    1. 运行环境:Python 3.9;

    2. 函数代码:上传本地 mnist_infer_function.py

    3. 层配置:绑定已创建的 onnxruntime_layer 依赖层;

    4. 实例规格:选择 弹性实例(推荐:1vCPU 2GB 内存,满足 AI 推理算力需求);

    5. 初始化钩子:填写 initializer(指定初始化函数)。

2. 动态扩缩容核心配置(控制台操作)

进入函数配置页面,找到"弹性配置"与"并发配置",按以下参数配置(适配 QPS 1000+ 高频场景):

(1)实例并发配置(提升单实例资源利用率)
  • 单实例最大并发数 :设置为 10(关键参数!单实例可同时处理 10 个请求,避免实例过多导致资源浪费,降低扩缩容压力);

  • 说明:AI 推理属于"计算密集型"任务,单实例并发数不宜过高(建议 5-20),过高会导致实例内资源争抢,推理延迟飙升;

  • 并发请求排队策略:设置为"拒绝"(高频 API 要求低延迟,排队会导致超时,直接拒绝超出并发数的请求,返回友好提示,避免资源耗尽)。

(2)自动扩缩容配置(适配流量峰谷)
  • 最大实例数 :设置为 100(根据峰值 QPS 计算:峰值 QPS 1000 ÷ 单实例并发数 10 = 100 实例,满足峰值需求);

  • 最小实例数(空闲实例数) :设置为 5(关键参数!保留 5 个空闲实例,避免低流量时出现冷启动,保障高频场景下的低延迟,空闲实例按闲置费率计费,成本可控);

  • 扩缩容触发策略:选择"基于并发数"(更贴合 AI API 场景):

  • 扩容阈值:单实例并发数达到 8(即单实例负载 80% 时,触发扩容,预留缓冲空间);

  • 缩容阈值:单实例并发数低于 2(即单实例负载 20% 时,触发缩容,回收闲置资源);

  • 扩缩容冷却时间:扩容 5 秒,缩容 30 秒(扩容快速响应峰值,缩容缓慢避免流量波动导致频繁扩缩容)。

(3)其他辅助配置(保障稳定性)
  • 请求超时时间 :设置为 300ms(高频 AI API 要求低延迟,超时时间不宜过长,避免阻塞实例);

  • 实例闲置回收时间 :设置为 5 分钟(空闲实例超过 5 分钟无请求,自动回收,降低成本);

  • 触发器配置 :创建 HTTP 触发器 (开启 HTTPS,便于公网调用),设置"限流策略":单 IP 每秒请求数 100,避免恶意攻击压垮函数。

3. 扩缩容配置 CLI 命令(批量部署/自动化)

若需批量部署或自动化配置,可使用阿里云 FC CLI 命令:

复制代码
# 1. 更新函数并发配置
aliyun fc update-function --service-name mnist-infer-service --function-name mnist-infer-function \
  --max-concurrency 10 \
  --async-invocation-config '{"maxAsyncInvocationQueueLength": 1000, "asyncInvocationRetryConfig": {"maxRetryAttempts": 0}}'

# 2. 更新自动扩缩容配置
aliyun fc put-provisioned-concurrency-config --service-name mnist-infer-service \
  --function-name mnist-infer-function \
  --target 5 \  # 最小空闲实例数
  --auto-scaling-policy '{"maxCapacity": 100, "minCapacity": 5, "scaleInCooldown": 30, "scaleOutCooldown": 5}'

# 3. 创建 HTTP 触发器
aliyun fc create-trigger --service-name mnist-infer-service \
  --function-name mnist-infer-function \
  --trigger-type http \
  --trigger-name mnist-infer-http-trigger \
  --trigger-config '{"authType": "anonymous", "methods": ["POST"]}'

四、部署验证与高并发压测

1. 单请求验证(确保 API 可用)

  1. 从 FC 控制台获取 HTTP 触发器地址(如 https://xxx.cn-shanghai.fcapp.run/mnist-infer-service/mnist-infer-function);

  2. 本地编写测试脚本,发送单请求验证:

    import requests
    import base64
    from PIL import Image
    from io import BytesIO

    1. 加载测试图像并转为 base64

    img = Image.open("test_mnist.png")
    buff = BytesIO()
    img.save(buff, format="PNG")
    image_base64 = base64.b64encode(buff.getvalue()).decode("utf-8")

    2. 发送 POST 请求调用 AI API

    url = "https://xxx.cn-shanghai.fcapp.run/mnist-infer-service/mnist-infer-function"
    payload = {
    "image_base64": image_base64
    }
    response = requests.post(url, json=payload)

    3. 打印结果

    print("响应状态码:", response.status_code)
    print("响应内容:", response.json())

  • 预期结果:响应状态码 200,返回预测结果,推理延迟 ≤ 180ms,说明 API 部署成功且可用。

2. 高并发压测(验证动态扩缩容效果)

使用 Apache Bench(ab)进行高并发压测,模拟 QPS 1000+ 的高频场景,验证扩缩容与稳定性:

复制代码
# 压测命令:1000 个请求,并发数 100(模拟峰值流量)
ab -n 1000 -c 100 -p payload.json -T application/json https://xxx.cn-shanghai.fcapp.run/mnist-infer-service/mnist-infer-function

# 其中 payload.json 为请求体(包含 base64 编码的图像数据)
(1)压测结果核心指标关注
  1. 平均响应时间 :≤ 180ms(满足高频 API 低延迟要求);

  2. 请求成功率 :≥ 99.99%(无大量请求被拒绝或超时);

  3. 错误率 :≤ 0.01%(无服务内部错误)。

(2)扩缩容效果验证(FC 控制台监控)

进入 FC 函数监控面板,查看"实例数变化""并发数变化":

  1. 压测开始后,实例数从 5(最小空闲实例)快速扩容至 100(最大实例数),扩容耗时 ≤ 10 秒(秒级扩容,满足高频场景需求);

  2. 压测结束后,实例数从 100 缓慢缩容至 5,缩容过程无流量波动;

  3. 单实例并发数稳定在 8 左右(未超过扩容阈值),无资源争抢导致的延迟飙升。

五、高频场景优化技巧(降延迟、控成本、提稳定性)

1. 冷启动优化(核心!高频场景避免冷启动延迟)

  • 保留合理的最小空闲实例数(根据低峰期流量设置,建议 5-20),避免低流量时出现冷启动;

  • 模型文件存储在 FC 临时目录(/tmp)OSS 内网,避免跨地域下载导致的冷启动延迟;

  • 使用 FC 预留实例(针对核心高频 API),预留实例始终处于运行状态,无冷启动延迟,成本高于弹性实例,但稳定性更高。

2. 性能优化(降低推理与响应延迟)

  • 模型进一步轻量化:使用 ONNX Runtime 量化(INT8/FP16),将模型体积压缩 50%,推理速度提升 30%+;

  • 选择 GPU 弹性实例(针对复杂 AI 模型),GPU 推理速度比 CPU 快 10-100 倍,适配超高频(QPS 5000+)场景;

  • 启用 HTTP 触发器缓存,对重复请求(如相同图像)返回缓存结果,减少推理耗时。

3. 成本优化(Serverless 按需付费,避免资源浪费)

  • 合理设置最大实例数,避免过度扩容导致成本飙升(根据峰值 QPS 精准计算,预留 20% 缓冲即可);

  • 低峰期降低最小空闲实例数(如从 5 降至 2),减少闲置资源计费;

  • 使用 阿里云 Serverless 资源包,相比按量计费,成本可降低 30%-50%。

4. 稳定性优化(避免故障传导)

  • 启用 函数熔断降级,当实例错误率 ≥ 5% 时,暂停扩容并触发告警,避免故障实例扩散;

  • 配置 多地域部署,华东、华南、华北同时部署函数,使用阿里云 CDN 进行流量调度,单个地域故障时自动切换至其他地域;

  • 完善 监控告警,通过阿里云 CloudMonitor 配置告警:实例数达到最大阈值、响应延迟 ≥ 200ms、错误率 ≥ 0.1% 时,立即触发短信/企业微信告警。

六、总结与进阶方向

1. 核心成果

本实战通过 Serverless(阿里云 FC)架构部署高频 AI API,实现了:

  1. 高频支撑:QPS 峰值 1000+,单请求响应延迟 ≤ 180ms,满足高频场景需求;

  2. 动态扩缩容:从 5 个空闲实例到 100 个峰值实例秒级完成,谷时自动缩容,兼顾性能与成本;

  3. 免运维:无需关注底层服务器部署、扩容、运维,专注于 AI 模型与业务逻辑。

2. 进阶方向

  • 多模型批量部署:使用 FC 应用中心,实现多个 AI API 的批量部署与统一扩缩容管理;

  • Serverless 与 k8s 结合:使用阿里云 ASK(Serverless Kubernetes),兼顾 k8s 的灵活性与 Serverless 的弹性,适配更复杂的 AI 场景;

  • 自动模型更新:搭建 CI/CD 流水线,模型更新后自动转为 ONNX 格式并上传至 OSS,FC 函数自动重载模型,无需手动部署;

  • 成本精细化管控:使用阿里云 Cost Explorer,分析函数调用量、实例使用量与成本的关系,进一步优化扩缩容配置,降低总体成本。

附:常见问题排查

  1. 冷启动时间过长(>3 秒):排查模型下载速度(优先使用 OSS 内网)、依赖包体积(使用 FC 层拆分)、实例规格(升级实例内存/CPU);

  2. 扩缩容不及时,请求被拒绝:提高扩容阈值(如从 8 降至 6)、缩短扩容冷却时间(如从 5 秒降至 3 秒)、提高单实例并发数;

  3. 推理延迟飙升:排查单实例并发数过高(降低并发数)、模型推理优化未开启(启用 ONNX Runtime 图优化)、实例资源不足(升级实例规格);

  4. 函数调用报权限错误:排查 OSS Bucket 权限(配置 FC 服务角色访问 OSS)、AccessKey 权限不足(授予 AliyunOSSReadOnlyAccess 权限)。

相关推荐
也许是_2 小时前
大模型应用技术之 Agent框架 AutoGPT
人工智能·python
得一录2 小时前
大模型在智能家居场景下的应用架构
架构·智能家居
华如锦2 小时前
MongoDB作为小型 AI智能化系统的数据库
java·前端·人工智能·算法
lkbhua莱克瓦242 小时前
Prompt、分词器与Token介绍
人工智能·ai·prompt·token
机器学习之心HML2 小时前
GSABO(通常指混合了模拟退火SA和天牛须搜索BAS的改进算法)与BP神经网络结合,用于爆破参数优选
人工智能·神经网络·算法·爆破参数优选
雨大王5122 小时前
汽车企业如何选择适合的质量数字化运营平台解决方案?
人工智能·汽车·制造
QiZhang | UESTC2 小时前
深度解析:反向传播在神经网络训练中的应用(豆包写的)
人工智能·深度学习·神经网络
EricLee2 小时前
2025 年终总结 - Agent 元年
前端·人工智能·后端
0x00072 小时前
Anthropic 发布 Cowork :Claude 跳出控制台!
人工智能