系列教程说明
这是「AI零基础学习」系列教程的第55天晚课。每天早课讲理论,晚课做实战。
上篇回顾
今天早课,我们学习了AI应用部署的基本概念——从模型选型、API设计到部署平台选择。今晚的实战课,我们要真正动手,把一个AI应用从本地搬到线上,让全世界都能访问。
今晚目标
完成一个完整的AI应用部署流程:
- 用Python搭建一个AI文本摘要API
- 用Docker打包成容器
- 部署到免费云平台
- 绑定域名、配置HTTPS
学完今晚,你就能自豪地说:”我的AI应用上线了!”
第一步:搭建AI应用
我们以”文本摘要”为例,做一个简单但完整的AI应用。这个应用接收一段文字,返回摘要。
1.1 创建项目结构
打开终端,创建项目文件夹:
`bash
mkdir ai-summarizer
cd ai-summarizer
`
项目结构如下:
`
ai-summarizer/
├── app.py # 主应用
├── requirements.txt # 依赖列表
├── Dockerfile # Docker配置
└── README.md # 项目说明
`
1.2 编写主应用
创建 app.py:
`python
from flask import Flask, request, jsonify
from transformers import pipeline
app = Flask(__name__)
# 启动时加载模型(只加载一次)
print(“正在加载摘要模型…”)
summarizer = pipeline(“summarization”, model=”facebook/bart-large-cnn”)
print(“模型加载完成!”)
@app.route(“/”)
def home():
return jsonify({
“message”: “AI文本摘要服务已启动”,
“usage”: “POST /summarize,body: {“text”: “你的文本”}”
})
@app.route(“/summarize”, methods=[“POST”])
def summarize():
data = request.get_json()
if not data or “text” not in data:
return jsonify({“error”: “请提供text字段”}), 400
text = data[“text”]
# 文本太短不需要摘要
if len(text) < 50:
return jsonify({“summary”: text, “note”: “文本较短,无需摘要”})
# 调用模型生成摘要
result = summarizer(text, max_length=130, min_length=30, do_sample=False)
summary = result[0][“summary_text”]
return jsonify({
“original_length”: len(text),
“summary_length”: len(summary),
“summary”: summary
})
if __name__ == “__main__”:
app.run(host=”0.0.0.0″, port=5000)
`
1.3 编写依赖文件
创建 requirements.txt:
`
flask==3.1.1
transformers==4.52.4
torch==2.7.1
sentencepiece==0.2.0
`
1.4 本地测试
`bash
# 安装依赖
pip install -r requirements.txt
# 启动服务
python app.py
`
打开另一个终端,测试API:
`bash
curl -X POST http://localhost:5000/summarize
-H “Content-Type: application/json”
-d ‘{“text”: “人工智能(AI)正在改变我们的生活方式。从智能手机的语音助手到自动驾驶汽车,从医疗诊断到金融风控,AI技术已经渗透到各个领域。深度学习的突破使得机器在图像识别、自然语言处理等方面达到了接近甚至超越人类的水平。大语言模型的出现更是掀起了一场技术革命,让AI能够理解和生成人类语言,完成各种复杂的任务。”}’
`
你应该看到返回的摘要结果。本地测试通过,接下来把它打包部署上线!
第二步:Docker打包
Docker是把应用”装箱”的工具——不管在谁的电脑上,装了Docker就能跑你的应用。
2.1 编写Dockerfile
创建 Dockerfile:
`dockerfile
FROM python:3.11-slim
WORKDIR /app
# 安装依赖
COPY requirements.txt .
RUN pip install –no-cache-dir -r requirements.txt
# 复制代码
COPY app.py .
# 暴露端口
EXPOSE 5000
# 启动命令
CMD [“python”, “app.py”]
`
2.2 本地Docker测试
`bash
# 构建镜像
docker build -t ai-summarizer .
# 运行容器
docker run -p 5000:5000 ai-summarizer
`
再次用curl测试,确认Docker容器内的应用正常工作。
2.3 推送到Docker Hub
`bash
# 登录Docker Hub(没有账号先去 hub.docker.com 注册)
docker login
# 给镜像打标签(替换yourusername为你的用户名)
docker tag ai-summarizer yourusername/ai-summarizer:latest
# 推送
docker push yourusername/ai-summarizer:latest
`
第三步:部署到云平台
这里介绍三个免费方案,选一个最适合你的。
方案一:Hugging Face Spaces(最简单,推荐新手)
Hugging Face Spaces是AI应用的”免费公寓”,特别适合AI项目。
步骤:
- 注册 huggingface.co
- 点击 “New Space”
- 选择 “Docker” 类型
- 上传你的代码(包括Dockerfile)
- 等待自动构建完成
创建 README.md(Spaces需要这个文件):
`yaml
title: AI文本摘要
emoji: 📝
colorFrom: blue
colorTo: purple
sdk: docker
pinned: false
`
推送到Spaces:
`bash
# 安装git lfs
git lfs install
# 初始化仓库
git init
git remote add origin https://huggingface.co/spaces/yourusername/ai-summarizer
# 推送
git add .
git commit -m “Initial commit”
git push origin main
`
几分钟后,你的AI应用就有了一个 .hf.space 域名,全世界都能访问!
方案二:Railway(适合全栈应用)
Railway提供免费额度,支持自动部署。
- 注册 railway.app
- 连接GitHub仓库
- Railway自动检测Dockerfile并部署
- 自动分配
.up.railway.app域名
方案三:自己的服务器(最灵活)
如果你有云服务器(如阿里云、腾讯云),可以直接部署:
`bash
# SSH登录服务器
ssh user@your-server-ip
# 安装Docker
curl -fsSL https://get.docker.com | sh
# 拉取并运行
docker pull yourusername/ai-summarizer
docker run -d -p 80:5000 –name summarizer yourusername/ai-summarizer
`
第四步:配置域名和HTTPS
4.1 绑定自定义域名
以Cloudflare为例:
- 在Cloudflare添加A记录,指向服务器IP
- 在Railway/Hugging Face的设置中添加自定义域名
- 等待DNS生效(通常几分钟到几小时)
4.2 配置HTTPS(免费SSL证书)
如果用自己的服务器,用Caddy自动配置HTTPS:
`bash
# 安装Caddy
sudo apt install caddy
# 编辑Caddyfile
sudo nano /etc/caddy/Caddyfile
`
写入:
`
your-domain.com {
reverse_proxy localhost:5000
}
`
`bash
# 重启Caddy
sudo systemctl restart caddy
`
Caddy会自动申请Let’s Encrypt证书,HTTPS就这么搞定了!
第五步:监控和维护
上线不是终点,运维才是开始。
5.1 添加健康检查端点
在 app.py 中添加:
`python
@app.route(“/health”)
def health():
return jsonify({“status”: “ok”, “model”: “bart-large-cnn”})
`
5.2 添加日志
`python
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
@app.route(“/summarize”, methods=[“POST”])
def summarize():
logger.info(f”收到摘要请求,文本长度: {len(data[‘text’])}”)
# … 原有代码 …
logger.info(f”摘要完成,摘要长度: {len(summary)}”)
`
5.3 简单的访问统计
`python
from collections import Counter
import time
request_count = Counter()
start_time = time.time()
@app.route(“/stats”)
def stats():
uptime = int(time.time() – start_time)
return jsonify({
“total_requests”: sum(request_count.values()),
“uptime_seconds”: uptime,
“endpoints”: dict(request_count)
})
`
今日实战成果
恭喜!你已经完成了AI应用部署的完整流程:
- 搭建了AI应用 — Flask + Transformers实现文本摘要API
- Docker打包 — 应用容器化,环境一致性有保障
- 云平台部署 — 选了Hugging Face Spaces/Railway/自建服务器
- 域名和HTTPS — 专业级上线配置
- 监控运维 — 健康检查、日志、统计
你的AI应用现在已经在公网上运行了! 把链接分享给朋友,让他们也试试你的AI摘要服务。
🚇 地铁深读:AI应用的成本控制
专为地铁通勤设计,5-10分钟深度阅读。不读不影响主线。
模型推理的成本陷阱
你可能注意到了,我们的摘要服务用了 facebook/bart-large-cnn 模型。这个模型大约有4亿参数,加载后占用约1.5GB内存。在免费平台上,这个开销是可以接受的。但如果你想用更大的模型(比如Llama 70B),成本就会急剧上升。
三个省钱技巧
技巧一:模型量化
把模型从FP32(32位浮点)压缩到INT8(8位整数),内存占用减少75%,速度提升2-4倍,精度损失通常在1-2%以内。
`python
# 使用bitsandbytes量化
from transformers import AutoModelForCausalLM, BitsAndBytesConfig
quantization_config = BitsAndBytesConfig(load_in_8bit=True)
model = AutoModelForCausalLM.from_pretrained(
“meta-llama/Llama-2-7b”,
quantization_config=quantization_config
)
`
技巧二:请求缓存
如果用户提交了相同的文本,直接返回缓存结果,省掉模型推理。
`python
import hashlib
cache = {}
def get_cache_key(text):
return hashlib.md5(text.encode()).hexdigest()
@app.route(“/summarize”, methods=[“POST”])
def summarize():
text = data[“text”]
key = get_cache_key(text)
if key in cache:
return jsonify(cache[key]) # 命中缓存
# … 正常推理 …
cache[key] = result
return jsonify(result)
`
技巧三:按需加载
用Serverless方案(如Modal、AWS Lambda),没有请求时不占资源,有请求时自动启动。适合访问量不大的个人项目。
成本对比
| 方案 | 月成本 | 适合场景 |
|---|
|——|——–|———-|
| Hugging Face Spaces | 免费 | 个人项目、Demo |
|---|---|---|
| Railway免费额度 | 免费(有限制) | 小型应用 |
| 云服务器(2核4G) | 50-100元 | 中小型生产应用 |
| Serverless(Modal) | 按调用计费 | 访问量波动大的应用 |
| 专业GPU云(A100) | 2000-5000元/月 | 大模型生产级部署 |
关键原则:先用免费方案验证想法,有用户了再升级。不要一上来就租最贵的服务器。
推荐学习资源
- Docker官方教程:docs.docker.com/get-started
- Hugging Face部署指南:huggingface.co/docs/hub/spaces
- Flask官方文档:flask.palletsprojects.com
- Railway文档:docs.railway.app
下篇预告
明天早上8点:AI产品设计思维——如何从用户需求出发设计AI产品
明晚5点:AI产品设计实战——手把手设计一个AI产品方案
发表回复