核心提要
高频 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)开通阿里云相关服务
-
登录阿里云控制台,开通 Function Compute(FC) 服务(选择就近地域,如华东 2(上海));
-
开通 对象存储 OSS 服务,创建 Bucket(私有读写,地域与 FC 一致,避免跨地域网络延迟);
-
开通 AccessKey ,记录
AccessKey ID和AccessKey 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 的特性,函数封装需满足:
-
冷启动优化 :模型在函数初始化阶段(
initializer)加载,而非每次请求加载,避免重复开销; -
请求/响应轻量化:简化参数解析与结果格式化,减少非推理耗时;
-
异常容错:添加请求参数校验、模型推理异常捕获,避免单个请求故障导致实例崩溃;
-
资源适配:适配 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 函数基础部署
-
登录阿里云 FC 控制台,进入对应地域,创建服务 (命名:
mnist-infer-service,配置日志存储到 SLS,便于排查问题); -
创建函数 (命名:
mnist-infer-function):-
运行环境:Python 3.9;
-
函数代码:上传本地
mnist_infer_function.py; -
层配置:绑定已创建的
onnxruntime_layer依赖层; -
实例规格:选择 弹性实例(推荐:1vCPU 2GB 内存,满足 AI 推理算力需求);
-
初始化钩子:填写
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 可用)
-
从 FC 控制台获取 HTTP 触发器地址(如
https://xxx.cn-shanghai.fcapp.run/mnist-infer-service/mnist-infer-function); -
本地编写测试脚本,发送单请求验证:
import requests
import base64
from PIL import Image
from io import BytesIO1. 加载测试图像并转为 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)压测结果核心指标关注
-
平均响应时间 :≤
180ms(满足高频 API 低延迟要求); -
请求成功率 :≥
99.99%(无大量请求被拒绝或超时); -
错误率 :≤
0.01%(无服务内部错误)。
(2)扩缩容效果验证(FC 控制台监控)
进入 FC 函数监控面板,查看"实例数变化""并发数变化":
-
压测开始后,实例数从
5(最小空闲实例)快速扩容至100(最大实例数),扩容耗时 ≤10秒(秒级扩容,满足高频场景需求); -
压测结束后,实例数从
100缓慢缩容至5,缩容过程无流量波动; -
单实例并发数稳定在
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,实现了:
-
高频支撑:QPS 峰值 1000+,单请求响应延迟 ≤ 180ms,满足高频场景需求;
-
动态扩缩容:从 5 个空闲实例到 100 个峰值实例秒级完成,谷时自动缩容,兼顾性能与成本;
-
免运维:无需关注底层服务器部署、扩容、运维,专注于 AI 模型与业务逻辑。
2. 进阶方向
-
多模型批量部署:使用 FC 应用中心,实现多个 AI API 的批量部署与统一扩缩容管理;
-
Serverless 与 k8s 结合:使用阿里云 ASK(Serverless Kubernetes),兼顾 k8s 的灵活性与 Serverless 的弹性,适配更复杂的 AI 场景;
-
自动模型更新:搭建 CI/CD 流水线,模型更新后自动转为 ONNX 格式并上传至 OSS,FC 函数自动重载模型,无需手动部署;
-
成本精细化管控:使用阿里云 Cost Explorer,分析函数调用量、实例使用量与成本的关系,进一步优化扩缩容配置,降低总体成本。
附:常见问题排查
-
冷启动时间过长(>3 秒):排查模型下载速度(优先使用 OSS 内网)、依赖包体积(使用 FC 层拆分)、实例规格(升级实例内存/CPU);
-
扩缩容不及时,请求被拒绝:提高扩容阈值(如从 8 降至 6)、缩短扩容冷却时间(如从 5 秒降至 3 秒)、提高单实例并发数;
-
推理延迟飙升:排查单实例并发数过高(降低并发数)、模型推理优化未开启(启用 ONNX Runtime 图优化)、实例资源不足(升级实例规格);
-
函数调用报权限错误:排查 OSS Bucket 权限(配置 FC 服务角色访问 OSS)、AccessKey 权限不足(授予 AliyunOSSReadOnlyAccess 权限)。