系列教程说明
这是「AI零基础70天学习计划」系列教程的第55篇,共140篇(每天早课+晚课)。
上篇回顾
昨天我们学习了如何微调大模型,让AI更懂你的业务需求。今天我们将探讨如何把训练好的AI应用部署到线上,让真实用户能够使用。
什么是AI应用部署?
想象一下,你花了几周时间训练了一个AI模型,它在你的电脑上运行得很好。但是,如果你想让朋友也能用,让客户也能用,甚至让全世界的人都能用——你就需要把它部署到互联网上。
部署的核心目标:
- 让AI服务24小时在线运行
- 支持多人同时使用
- 保证响应速度和稳定性
- 控制成本,按需扩展
部署前的准备工作
确定你的应用类型
1. API服务型
- 提供RESTful API接口
- 其他应用通过HTTP调用你的AI
- 适合:企业内部系统、开发者工具
2. Web应用型
- 用户直接访问网页使用
- 包含前端界面和后端服务
- 适合:面向普通用户的产品
3. 嵌入式集成型
- 集成到现有系统中
- 作为功能模块存在
- 适合:已有产品的AI增强
评估资源需求
计算资源:
- CPU:轻量级推理任务
- GPU:深度学习模型推理(推荐NVIDIA T4或A10)
- 内存:模型加载和并发处理
存储需求:
- 模型文件大小(几GB到几十GB)
- 用户数据存储
- 日志和监控数据
网络带宽:
- 预估用户访问量
- API请求频率
- 数据传输量
主流部署方案对比
方案一:云服务器自建
适用场景:需要完全控制环境,有运维团队
步骤:
- 购买云服务器(阿里云、腾讯云、AWS等)
- 安装Python环境和依赖
- 配置Web框架(Flask/FastAPI)
- 设置反向代理(Nginx)
- 配置进程管理(Gunicorn/PM2)
- 申请域名和SSL证书
优点:
- 完全掌控,自由度高
- 可深度定制
- 长期成本可控
缺点:
- 需要运维能力
- 扩展性需要自己实现
- 故障恢复需要手动处理
方案二:容器化部署(Docker + Kubernetes)
适用场景:微服务架构,需要快速扩展
核心流程:
`dockerfile
# Dockerfile示例
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 8000
CMD [“uvicorn”, “main:app”, “–host”, “0.0.0.0”, “–port”, “8000”]
`
优点:
- 环境一致性好
- 易于扩展和迁移
- 生态丰富
缺点:
- 学习曲线陡峭
- 小项目可能过度工程化
方案三:Serverless无服务器
适用场景:请求量波动大,不想管理服务器
代表平台:
- AWS Lambda
- 阿里云函数计算
- 腾讯云云函数
优点:
- 按使用量付费
- 自动扩缩容
- 无需运维
缺点:
- 冷启动延迟
- 运行时间限制
- 调试困难
方案四:AI专用平台
适用场景:快速上线AI应用,降低技术门槛
代表平台:
- Hugging Face Spaces
- Replicate
- Modal
- BentoCloud
优点:
- 开箱即用
- 内置GPU支持
- 社区生态
缺点:
- 定制性有限
- 可能有平台锁定
实战:用FastAPI部署AI服务
让我们从最基础的API服务开始:
步骤1:创建API服务
`python
# main.py
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import openai
app = FastAPI()
class ChatRequest(BaseModel):
message: str
user_id: str = “default”
class ChatResponse(BaseModel):
reply: str
tokens_used: int
@app.post(“/chat”, response_model=ChatResponse)
async def chat_endpoint(request: ChatRequest):
try:
# 调用OpenAI API
response = openai.ChatCompletion.create(
model=”gpt-3.5-turbo”,
messages=[
{“role”: “user”, “content”: request.message}
]
)
return ChatResponse(
reply=response.choices[0].message.content,
tokens_used=response.usage.total_tokens
)
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@app.get(“/health”)
async def health_check():
return {“status”: “healthy”}
`
步骤2:添加错误处理和日志
`python
import logging
from fastapi import Request
from fastapi.responses import JSONResponse
# 配置日志
logging.basicConfig(
level=logging.INFO,
format=’%(asctime)s – %(name)s – %(levelname)s – %(message)s’
)
logger = logging.getLogger(__name__)
# 全局异常处理
@app.exception_handler(Exception)
async def global_exception_handler(request: Request, exc: Exception):
logger.error(f”Unhandled exception: {exc}”)
return JSONResponse(
status_code=500,
content={“detail”: “Internal server error”}
)
# 请求日志中间件
@app.middleware(“http”)
async def log_requests(request: Request, call_next):
logger.info(f”Request: {request.method} {request.url}”)
response = await call_next(request)
logger.info(f”Response: {response.status_code}”)
return response
`
步骤3:配置环境变量和密钥
`python
import os
from dotenv import load_dotenv
load_dotenv()
# 从环境变量读取配置
OPENAI_API_KEY = os.getenv(“OPENAI_API_KEY”)
DATABASE_URL = os.getenv(“DATABASE_URL”)
DEBUG = os.getenv(“DEBUG”, “false”).lower() == “true”
if not OPENAI_API_KEY:
raise ValueError(“OPENAI_API_KEY environment variable is required”)
`
步骤4:部署到云服务器
`bash
# 1. 安装依赖
pip install fastapi uvicorn openai python-dotenv
# 2. 创建requirements.txt
pip freeze > requirements.txt
# 3. 启动服务
uvicorn main:app –host 0.0.0.0 –port 8000
# 4. 生产环境使用Gunicorn
gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker -b 0.0.0.0:8000
`
性能优化策略
1. 模型优化
量化压缩:
- 将FP32模型转为INT8或INT4
- 减少内存占用,提升推理速度
- 工具:ONNX Runtime、TensorRT
模型蒸馏:
- 用大模型训练小模型
- 保持性能的同时减小模型体积
2. 缓存策略
`python
from functools import lru_cache
import hashlib
# 简单的响应缓存
cache = {}
def get_cache_key(message: str) -> str:
return hashlib.md5(message.encode()).hexdigest()
async def chat_with_cache(message: str):
cache_key = get_cache_key(message)
if cache_key in cache:
return cache[cache_key]
# 调用AI接口
response = await call_ai_api(message)
cache[cache_key] = response
return response
`
3. 异步处理
`python
import asyncio
from concurrent.futures import ThreadPoolExecutor
executor = ThreadPoolExecutor(max_workers=4)
async def process_in_background(task):
loop = asyncio.get_event_loop()
result = await loop.run_in_executor(executor, heavy_computation, task)
return result
`
4. 负载均衡
Nginx配置示例:
`nginx
upstream ai_backend {
server 127.0.0.1:8001;
server 127.0.0.1:8002;
server 127.0.0.1:8003;
server 127.0.0.1:8004;
}
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://ai_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
`
监控与运维
关键指标监控
1. 服务健康指标
- 响应时间(P50、P95、P99)
- 错误率(4xx、5xx)
- 请求吞吐量(QPS)
2. 资源使用指标
- CPU使用率
- 内存占用
- GPU利用率
- 磁盘I/O
3. 业务指标
- 用户活跃度
- API调用次数
- Token消耗量
- 成本统计
监控工具推荐
开源方案:
- Prometheus + Grafana:指标收集和可视化
- ELK Stack:日志收集和分析
- Sentry:错误追踪
云服务方案:
- 阿里云ARMS
- 腾讯云APM
- AWS CloudWatch
告警设置
`yaml
# Prometheus告警规则示例
groups:
- name: ai_service_alerts
rules:
- alert: HighErrorRate
expr: rate(http_requests_total{status=~”5..”}[5m]) > 0.1
for: 2m
labels:
severity: critical
annotations:
summary: “High error rate detected”
- alert: HighLatency
expr: histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m])) > 2
for: 5m
labels:
severity: warning
annotations:
summary: “High latency detected”
`
成本控制
成本构成分析
1. 计算成本
- 服务器/实例费用
- GPU租赁费用
- 按量计费 vs 包年包月
2. API调用成本
- OpenAI/Anthropic等API费用
- 按Token计费
- 批量折扣
3. 存储成本
- 模型文件存储
- 用户数据存储
- 日志存储
降本策略
1. 智能路由
- 简单任务用小模型
- 复杂任务用大模型
- 动态选择最优模型
2. 缓存复用
- 相似问题复用答案
- 热点内容预生成
- 本地缓存减少API调用
3. 弹性伸缩
- 根据流量自动扩缩
- 低峰期释放资源
- 使用Spot实例降低成本
安全最佳实践
1. API安全
认证授权:
`python
from fastapi import Depends, HTTPException, status
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
security = HTTPBearer()
async def verify_token(credentials: HTTPAuthorizationCredentials = Depends(security)):
token = credentials.credentials
if not validate_token(token):
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail=”Invalid authentication credentials”
)
return token
`
速率限制:
`python
from fastapi import Request
from datetime import datetime, timedelta
from collections import defaultdict
request_counts = defaultdict(list)
async def rate_limit(request: Request):
client_ip = request.client.host
now = datetime.now()
# 清理1分钟前的记录
request_counts[client_ip] = [
t for t in request_counts[client_ip]
if now – t < timedelta(minutes=1)
]
# 检查是否超过限制
if len(request_counts[client_ip]) >= 60:
raise HTTPException(status_code=429, detail=”Too many requests”)
request_counts[client_ip].append(now)
`
2. 数据安全
- 传输加密(HTTPS)
- 存储加密(AES-256)
- 数据脱敏处理
- 定期备份
3. 输入验证
`python
from pydantic import validator
class ChatRequest(BaseModel):
message: str
@validator(‘message’)
def validate_message(cls, v):
if len(v) > 10000:
raise ValueError(‘Message too long’)
if len(v.strip()) == 0:
raise ValueError(‘Message cannot be empty’)
# 过滤潜在的恶意输入
if ” in v.lower():
raise ValueError(‘Invalid characters in message’)
return v.strip()
`
今日行动项
动手实践:
- 用FastAPI创建一个简单的AI聊天API
- 添加健康检查和错误处理端点
- 使用Gunicorn部署到本地环境
- 测试并发请求下的表现
思考题:
- 你的AI应用预计有多少用户?需要什么级别的扩展能力?
- 你的预算范围是多少?哪种部署方案最经济?
- 你有哪些安全合规要求需要满足?
下篇预告
今晚5点:我们将进入第9周,探讨AI伦理与安全的第一个话题——AI偏见与公平性。了解AI系统可能存在的偏见来源,以及如何检测和缓解这些偏见。
地铁深读:Docker部署AI应用完整实战
为什么选择Docker?
传统部署最大的痛点是环境不一致——在你电脑上能跑的代码,到了服务器就报错。Docker通过容器化技术解决了这个问题:
- 一次构建,到处运行
- 环境隔离,互不干扰
- 版本控制,快速回滚
- 资源限制,安全可靠
完整的Docker化AI应用
项目结构:
`
ai-chat-app/
├── app/
│ ├── __init__.py
│ ├── main.py
│ ├── models/
│ ├── services/
│ └── utils/
├── tests/
├── Dockerfile
├── docker-compose.yml
├── requirements.txt
├── .env.example
└── README.md
`
Dockerfile优化版:
`dockerfile
# 多阶段构建,减小镜像体积
FROM python:3.11-slim as builder
WORKDIR /app
COPY requirements.txt .
RUN pip install –user –no-cache-dir -r requirements.txt
FROM python:3.11-slim
WORKDIR /app
COPY –from=builder /root/.local /root/.local
COPY . .
ENV PATH=/root/.local/bin:$PATH
EXPOSE 8000
# 健康检查
HEALTHCHECK –interval=30s –timeout=3s –start-period=5s –retries=3
CMD curl -f http://localhost:8000/health || exit 1
CMD [“gunicorn”, “app.main:app”, “-w”, “4”, “-k”, “uvicorn.workers.UvicornWorker”, “-b”, “0.0.0.0:8000”]
`
docker-compose.yml:
`yaml
version: ‘3.8’
services:
ai-app:
build: .
ports:
- “8000:8000”
environment:
- OPENAI_API_KEY=${OPENAI_API_KEY}
- DATABASE_URL=${DATABASE_URL}
volumes:
- ./models:/app/models
restart: unless-stopped
redis:
image: redis:7-alpine
ports:
- “6379:6379”
nginx:
image: nginx:alpine
ports:
- “80:80”
- “443:443”
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./ssl:/etc/nginx/ssl
depends_on:
- ai-app
`
部署到Kubernetes
Deployment配置:
`yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: ai-chat-app
spec:
replicas: 3
selector:
matchLabels:
app: ai-chat
template:
metadata:
labels:
app: ai-chat
spec:
containers:
- name: ai-app
image: your-registry/ai-chat-app:latest
ports:
- containerPort: 8000
resources:
requests:
memory: “512Mi”
cpu: “250m”
limits:
memory: “1Gi”
cpu: “500m”
env:
- name: OPENAI_API_KEY
valueFrom:
secretKeyRef:
name: ai-secrets
key: openai-key
livenessProbe:
httpGet:
path: /health
port: 8000
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /health
port: 8000
initialDelaySeconds: 5
periodSeconds: 5
`
Service配置:
`yaml
apiVersion: v1
kind: Service
metadata:
name: ai-chat-service
spec:
selector:
app: ai-chat
ports:
- protocol: TCP
port: 80
targetPort: 8000
type: LoadBalancer
`
自动扩缩容
`yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: ai-chat-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: ai-chat-app
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
`
CI/CD自动化
GitHub Actions示例:
`yaml
name: Deploy AI App
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Login to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_HUB_USERNAME }}
password: ${{ secrets.DOCKER_HUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v4
with:
push: true
tags: your-registry/ai-chat-app:${{ github.sha }}
- name: Deploy to K8s
uses: azure/k8s-deploy@v4
with:
manifests: |
k8s/deployment.yaml
k8s/service.yaml
images: |
your-registry/ai-chat-app:${{ github.sha }}
`
实战建议
1. 从小开始
- 先部署单机版验证功能
- 逐步添加监控、日志、告警
- 最后考虑高可用和扩展
2. 文档先行
- 记录部署流程
- 编写故障排查手册
- 维护配置变更日志
3. 安全第一
- 定期更新依赖
- 扫描镜像漏洞
- 实施最小权限原则
4. 成本意识
- 监控资源使用率
- 清理未使用的资源
- 选择合适的实例类型
今日收获:
- 理解了AI应用部署的核心概念和挑战
- 掌握了主流部署方案的优缺点对比
- 学会了用FastAPI构建生产级AI服务
- 了解了性能优化、监控和安全的最佳实践
明天早上8点:Day56——早课 AI产品设计思维
发表回复