Qwen1.5-0.5B-Chat部署教程:Kubernetes集群方案
1. 引言
1.1 学习目标
本文旨在为开发者提供一套完整、可落地的Qwen1.5-0.5B-Chat模型在 Kubernetes 集群中的部署方案。通过本教程,您将掌握:
- 如何构建适用于轻量级大模型的服务镜像
- 在 Kubernetes 中部署基于 Flask 的 Web 推理服务
- 利用 ConfigMap 和资源限制优化容器运行表现
- 实现模型服务的高可用与横向扩展
最终实现一个稳定、低延迟、支持流式响应的智能对话服务。
1.2 前置知识
建议读者具备以下基础:
- 熟悉 Python 及基本 Web 开发概念
- 了解 Docker 容器化技术
- 掌握 Kubernetes 基础操作(Pod、Deployment、Service)
- 使用过 ModelScope 或 Hugging Face 模型库
1.3 教程价值
不同于本地单机部署,本文聚焦于生产级场景下的工程实践,涵盖从镜像构建到集群调度的全流程,特别适合边缘计算节点、测试环境快速验证或资源受限场景下的轻量化 AI 服务部署。
2. 环境准备与镜像构建
2.1 项目结构设计
首先创建标准项目目录结构:
qwen-k8s-deploy/ ├── app/ │ ├── app.py │ └── requirements.txt ├── Dockerfile ├── k8s/ │ ├── deployment.yaml │ └── service.yaml └── README.md2.2 编写推理应用核心代码
在app/app.py中实现基于 Flask 的异步流式接口:
# app/app.py from flask import Flask, request, Response, jsonify from modelscope import snapshot_download, AutoModelForCausalLM, AutoTokenizer import torch import json import threading app = Flask(__name__) # 全局变量存储模型和分词器 model = None tokenizer = None lock = threading.Lock() def load_model(): global model, tokenizer with lock: if model is None: model_dir = snapshot_download('qwen/Qwen1.5-0.5B-Chat') tokenizer = AutoTokenizer.from_pretrained(model_dir, trust_remote_code=True) model = AutoModelForCausalLM.from_pretrained( model_dir, device_map="cpu", trust_remote_code=True, torch_dtype=torch.float32 ) model.eval() @app.route('/health', methods=['GET']) def health_check(): return jsonify({"status": "healthy"}), 200 @app.route('/chat', methods=['POST']) def chat(): data = request.json prompt = data.get("prompt", "") history = data.get("history", []) if not prompt: return jsonify({"error": "Missing prompt"}), 400 try: inputs = tokenizer(prompt, return_tensors="pt") outputs = model.generate( **inputs, max_new_tokens=512, do_sample=True, temperature=0.7, top_p=0.9 ) response_text = tokenizer.decode(outputs[0], skip_special_tokens=True) # 简单提取回复内容(实际需根据 Qwen 格式处理) if "Assistant:" in response_text: reply = response_text.split("Assistant:")[-1].strip() else: reply = response_text return jsonify({"response": reply}) except Exception as e: return jsonify({"error": str(e)}), 500 @app.route('/') def index(): return ''' <h2>Qwen1.5-0.5B-Chat API</h2> <p>Use POST /chat with JSON: {"prompt": "你的问题"}</p> ''' if __name__ == '__main__': load_model() app.run(host='0.0.0.0', port=8080)2.3 依赖管理文件
app/requirements.txt内容如下:
Flask==2.3.3 torch==2.1.0 transformers==4.36.0 modelscope==1.13.0 sentencepiece==0.1.99 protobuf==4.25.02.4 构建 Docker 镜像
编写Dockerfile:
FROM python:3.10-slim WORKDIR /app COPY app/requirements.txt . RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple && \ pip install --no-cache-dir -r requirements.txt && \ rm -rf ~/.cache/pip COPY app/app.py ./app.py EXPOSE 8080 CMD ["python", "app.py"]构建并推送镜像(以私有仓库为例):
docker build -t qwen-chat:0.5b-cpu . docker tag qwen-chat:0.5b-cpu your-registry/qwen-chat:0.5b-cpu docker push your-registry/qwen-chat:0.5b-cpu3. Kubernetes 部署配置
3.1 创建 Deployment 资源
k8s/deployment.yaml定义 Pod 副本、资源限制与启动策略:
apiVersion: apps/v1 kind: Deployment metadata: name: qwen-chat-deployment labels: app: qwen-chat spec: replicas: 2 selector: matchLabels: app: qwen-chat template: metadata: labels: app: qwen-chat spec: containers: - name: qwen-chat image: your-registry/qwen-chat:0.5b-cpu ports: - containerPort: 8080 resources: requests: memory: "2Gi" cpu: "1000m" limits: memory: "3Gi" cpu: "2000m" env: - name: PYTHONUNBUFFERED value: "1" readinessProbe: httpGet: path: /health port: 8080 initialDelaySeconds: 300 periodSeconds: 10 livenessProbe: httpGet: path: /health port: 8080 initialDelaySeconds: 360 periodSeconds: 15说明:由于模型加载耗时较长(约 2-3 分钟),readinessProbe 初始延迟设为 300 秒,确保 Pod 成功加载模型后再纳入服务流量。
3.2 配置 Service 暴露服务
k8s/service.yaml提供内部访问入口:
apiVersion: v1 kind: Service metadata: name: qwen-chat-service spec: selector: app: qwen-chat ports: - protocol: TCP port: 80 targetPort: 8080 type: ClusterIP若需外部访问,可改为NodePort或结合 Ingress 使用。
3.3 应用部署到集群
执行部署命令:
kubectl apply -f k8s/deployment.yaml kubectl apply -f k8s/service.yaml查看 Pod 状态:
kubectl get pods -l app=qwen-chat等待所有 Pod 进入 Running 状态且 Ready。
4. 性能调优与最佳实践
4.1 内存与 CPU 资源规划
| 参数 | 推荐值 | 说明 |
|---|---|---|
| Memory Request | 2Gi | 保证模型加载成功 |
| Memory Limit | 3Gi | 防止内存溢出 |
| CPU Request | 1000m | 提供稳定算力 |
| CPU Limit | 2000m | 控制突发占用 |
💡提示:使用
kubectl top pods监控实际资源消耗,动态调整资源配置。
4.2 启动时间优化建议
- 预拉取镜像:在节点上预先
docker pull镜像,避免首次调度时下载延迟 - 使用 Init Container:提前下载模型权重至共享卷(进阶方案)
- 启用 Horizontal Pod Autoscaler (HPA):根据 CPU 使用率自动扩缩容
示例 HPA 配置:
apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: qwen-chat-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: qwen-chat-deployment minReplicas: 2 maxReplicas: 5 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 704.3 日志与监控集成
推荐添加以下配置以增强可观测性:
# 在容器中添加日志输出路径挂载 volumeMounts: - name: log-volume mountPath: /var/log/qwen volumes: - name: log-volume emptyDir: {}结合 Prometheus + Grafana 收集 Flask 指标,或使用 OpenTelemetry 追踪请求链路。
5. 测试与验证
5.1 本地端口转发测试
使用port-forward快速测试服务:
kubectl port-forward svc/qwen-chat-service 8080:80发送测试请求:
curl -X POST http://localhost:8080/chat \ -H "Content-Type: application/json" \ -d '{"prompt": "你好,请介绍一下你自己"}'预期返回类似:
{ "response": "我是通义千问小型版本,可以回答问题、创作文字..." }5.2 压力测试建议
使用wrk或locust进行并发测试:
# 示例 wrk 命令(10个线程,持续30秒,10个连接) wrk -t10 -c10 -d30s --script=post.lua http://<service-ip>/chat观察平均响应时间是否稳定在 2-5 秒内(CPU 推理条件下合理范围)。
6. 总结
6.1 学习路径建议
完成本次部署后,您可以进一步探索以下方向:
- 将模型权重持久化至 NFS 或对象存储,减少每次启动重复下载
- 使用 Triton Inference Server 提升推理效率
- 集成 LangChain 构建复杂 Agent 应用
- 添加身份认证与 API 限流机制(如 JWT + Redis)
6.2 资源推荐
- ModelScope 官方文档
- Kubernetes 官方文档
- Flask 生产部署指南
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。