AI应用架构师实战:AI培训系统前后端分离架构设计(含接口规范文档)
AI应用架构师实战:AI培训系统前后端分离架构设计(含接口规范文档)
一、引言 (Introduction)
钩子 (The Hook)
你是否曾经历过这样的困境:公司花费数月开发的AI培训系统,上线后却发现数据科学家抱怨模型训练数据难以获取,业务人员吐槽操作界面卡顿,运维团队被各种"数据孤岛"搞得焦头烂额,而新需求迭代时,前后端开发像两条平行线,沟通成本比开发成本还高?更要命的是,当需要集成新的AI模型时,整个系统如同蜘蛛网般牵一发而动全身——这不是你的错,而是架构设计之初就埋下的隐患。
2023年,Gartner报告显示,78%的AI项目失败源于架构设计缺陷,其中"前后端耦合度过高"和"AI服务与业务系统割裂"是两大主因。在AI技术飞速迭代的今天,一个灵活、可扩展、松耦合的架构成为AI培训系统成功的关键。而前后端分离架构,正是破解这些痛点的金钥匙。
定义问题/阐述背景 (The “Why”)
AI培训系统的核心价值与挑战
AI培训系统是企业AI战略落地的核心基础设施,它连接数据、算法、业务三大要素,支撑从数据标注、模型训练、评估优化到部署应用的全生命周期管理。根据McKinsey 2024年调研,具备完善AI培训系统的企业,其AI项目落地效率提升3.2倍,模型复用率提高67%,研发成本降低42%。然而,传统AI系统普遍存在以下痛点:
- 架构耦合严重:前端与后端代码混杂,模型训练模块与业务逻辑紧耦合,导致"牵一发而动全身",新功能开发周期长。
- 数据孤岛困境:结构化业务数据、非结构化文本/图像数据、模型训练日志分散在不同系统,数据预处理耗时占AI项目周期的60%以上。
- 模型复用困难:训练好的模型封装不规范,难以跨项目复用,重复造轮子现象普遍。
- 扩展性瓶颈:面对激增的训练任务或用户量,系统难以快速扩容,GPU资源利用率低。
- 开发协作低效:前后端开发依赖强,接口变更导致大量返工,跨团队沟通成本高。
前后端分离架构的破局之道
前后端分离架构(Frontend-Backend Separation, FBS)通过将用户界面(前端)与业务逻辑/数据处理(后端)完全分离,实现了"界面与数据解耦、开发与部署分离"。对于AI培训系统,这种架构带来三大核心优势:
- 开发效率提升:前后端团队可并行开发,前端基于Mock数据独立调试,后端专注API实现,协作效率提升40%+。
- 系统灵活性增强:前端可快速适配多端(Web/移动端/桌面端),后端可独立升级AI模型或数据处理逻辑,互不干扰。
- 资源利用率优化:AI训练任务(GPU密集型)与Web服务(CPU/内存密集型)可独立部署与弹性伸缩,降低资源浪费。
亮明观点/文章目标 (The “What” & “How”)
本文将以"AI培训系统"为实战载体,从0到1拆解前后端分离架构的设计与落地全过程。你将学到:
- 架构设计方法论:如何结合AI系统特性(数据密集、计算密集、模型迭代快)设计分层架构,包括前端、后端、数据层、AI服务层的协同机制。
- 接口规范制定:掌握AI系统接口的设计原则(幂等性、异步处理、版本控制等),以及核心接口(数据上传、模型训练、任务调度)的详细定义。
- 技术栈选型与实战:前端(React+TypeScript)、后端(FastAPI+Python)、AI服务(TensorFlow/PyTorch)的集成实践,含完整代码示例。
- 性能与安全优化:针对AI系统的高并发、大文件传输、模型安全等挑战,提供可落地的优化方案。
无论你是AI应用架构师、全栈开发者,还是希望将AI能力产品化的技术负责人,本文都能为你提供一套"架构设计+接口规范+实战代码"的完整解决方案。让我们开始这场AI系统架构的实战之旅!
二、基础知识/背景铺垫 (Foundational Concepts)
2.1 核心概念定义
2.1.1 AI培训系统的定义与构成
AI培训系统是支撑机器学习/深度学习模型从数据准备到训练部署全流程的平台化工具,其核心目标是降低AI开发门槛、提升模型研发效率。典型构成包括:
- 数据管理模块:数据上传、清洗、标注、版本控制(如DVC)。
- 模型开发模块:算法库、模型定义、超参数调优(如Optuna)。
- 训练调度模块:任务队列、资源分配(GPU/CPU)、分布式训练。
- 模型管理模块:模型版本、性能指标、A/B测试。
- 部署服务模块:模型导出、API封装、在线推理。
与传统业务系统相比,AI培训系统具有三大显著特性:
- 数据驱动:数据质量直接决定模型效果,需支持TB级结构化/非结构化数据处理。
- 计算密集:深度学习模型训练需大量GPU算力,单任务可能占用多卡数天。
- 迭代快速:模型架构、超参数、训练数据需频繁调整,系统需支持敏捷迭代。
2.1.2 前后端分离架构的核心内涵
前后端分离架构是一种将用户界面(前端)与业务逻辑/数据存储(后端)通过标准化接口分离开发与部署的软件架构模式。其核心特征包括:
- 职责分离:前端负责"展示与交互"(Presentation Layer),后端负责"业务逻辑与数据处理"(Service Layer)。
- 通信标准化:前后端通过HTTP/HTTPS+JSON/Protobuf等标准协议通信,接口定义遵循RESTful/GraphQL规范。
- 独立部署:前端资源(JS/CSS/HTML)部署在CDN或静态服务器,后端API部署在应用服务器,可独立扩缩容。
演进历程:从早期JSP/PHP的"前后端混合"(后端渲染HTML),到AJAX技术实现局部刷新,再到SPA(单页应用)+API的完全分离,前后端分离架构已成为现代Web应用的主流选择。
2.1.3 AI系统特有的架构挑战
将前后端分离架构应用于AI培训系统时,需额外应对以下挑战:
| 挑战类型 | 具体表现 | 传统Web系统对比 |
|---|---|---|
| 数据传输挑战 | 需支持GB级数据集上传、流式数据处理(如实时日志) | 多为KB级JSON数据交互 |
| 任务类型差异 | 存在大量异步长任务(模型训练,耗时小时级)与同步短任务(数据查询,毫秒级) | 以同步CRUD操作为主 |
| 资源调度复杂 | GPU资源稀缺且昂贵,需动态分配给优先级不同的训练任务 | 主要依赖CPU/内存,资源调度相对简单 |
| 状态管理特殊 | 训练任务状态(排队/运行/失败/完成)需实时同步到前端 | 多为无状态请求,依赖Cookie/Session管理状态 |
2.1.4 关键技术术语解析
| 术语 | 定义 | 在AI培训系统中的作用 |
|---|---|---|
| RESTful API | 基于HTTP动词(GET/POST/PUT/DELETE)设计的资源型接口规范 | 前后端通信的标准协议,如GET /api/models/{id}获取模型详情 |
| 微服务架构 | 将单体应用拆分为独立部署的小型服务,通过API网关通信 | 实现数据模块、训练模块、模型管理模块的解耦 |
| 异步通信 | 消息发送方无需等待接收方响应,通过消息队列(如RabbitMQ)实现通信 | 处理模型训练等长任务,避免前端请求超时 |
| WebSocket | 支持TCP全双工通信的协议,可实现服务器主动推送消息 | 实时推送训练任务进度、日志更新 |
| 容器化 | 用Docker将应用及其依赖打包为容器,实现环境一致性 | 解决AI训练环境依赖复杂(不同Python版本、CUDA版本)问题 |
| API网关 | 统一入口,负责路由转发、认证授权、限流熔断 | 管理多微服务API,提供统一的安全与监控能力 |
2.2 传统架构与前后端分离架构对比
2.2.1 架构演进历史
| 架构阶段 | 时间 | 核心特点 | AI系统痛点 |
|---|---|---|---|
| 单体架构(JSP/PHP) | 2000s | 前后端代码混合,后端渲染HTML,部署为单一应用 | 数据处理与模型训练代码耦合,修改一处需全量重启,迭代效率低 |
| 前后端半分离 | 2010s初 | 后端提供JSON接口,前端用jQuery异步请求,但仍依赖后端模板渲染部分页面 | 前端受限于后端技术栈,AI模型训练任务阻塞Web服务,系统稳定性差 |
| 前后端完全分离 | 2010s末 | 前端SPA(React/Vue)+后端API,独立部署,通过RESTful接口通信 | 解决了开发效率问题,但AI长任务通信、大文件传输等场景需特殊设计 |
| 云原生前后端分离 | 2020s | 前端微应用(qiankun)+后端微服务+容器化部署,支持弹性伸缩 | 适配AI系统的动态资源需求,实现训练任务与Web服务的资源隔离 |
2.2.2 架构对比:以用户上传数据训练模型为例
传统单体架构流程:
- 用户在JSP页面点击"上传数据",表单提交到后端Servlet。
- 后端Servlet接收文件,调用本地数据清洗函数,存入数据库。
- 调用本地模型训练函数(阻塞主线程),期间用户需等待。
- 训练完成后,后端渲染结果页面返回给用户。
问题:
- 训练任务阻塞Web服务,导致其他用户无法访问。
- 前端无法实时展示训练进度,用户体验差。
- 数据处理、模型训练、Web展示代码混杂,维护困难。
前后端分离架构流程:
- 前端(React)通过Axios上传文件到后端API(
POST /api/datasets)。 - 后端(FastAPI)接收文件后,返回任务ID,异步将数据清洗任务加入消息队列。
- 前端通过WebSocket连接后端,订阅任务ID对应的进度更新。
- 后端 worker 处理数据清洗→调用AI服务训练模型→更新任务状态。
- 后端通过WebSocket实时推送进度(如"50%: 正在训练第3个epoch")。
- 训练完成后,前端展示结果并提供模型下载链接。
优势:
- 长任务异步化,Web服务无阻塞。
- 实时进度推送,用户体验提升。
- 数据、训练、Web模块解耦,可独立扩展。
2.3 AI系统架构设计核心原则
结合AI系统特性与前后端分离思想,架构设计需遵循以下原则:
-
分层解耦原则
按职责分层(数据层→服务层→接口层→前端层),层间通过标准化接口通信,避免跨层调用。例如:数据层不直接调用AI训练函数,需通过服务层接口。 -
异步优先原则
对模型训练、数据预处理等长任务(>3秒),采用"请求-异步处理-结果回调"模式,避免前端超时。数学模型表示如下:
设任务平均耗时为 ( T ),前端超时阈值为 ( T_{timeout} ),若 ( T > T_{timeout} ),则必须采用异步通信。 -
资源隔离原则
AI训练(GPU密集)与Web服务(CPU密集)部署在不同容器/集群,通过Kubernetes进行资源调度,避免GPU占用导致Web服务资源不足。 -
可观测性原则
全链路日志(数据上传→训练→部署)、性能指标(GPU利用率、任务耗时)、告警机制(训练失败、资源超限)需可视化,可通过Prometheus+Grafana实现。 -
版本兼容原则
API版本控制(如/api/v1/models)、模型版本控制(如model-v1.2.0),确保旧版本客户端与新版本服务兼容。
三、核心内容/实战演练 (The Core - “How-To”)
3.1 AI培训系统总体架构设计
3.1.1 架构概览
AI培训系统前后端分离架构采用"五层三横"设计,如图3-1所示:
图3-1:AI培训系统前后端分离总体架构图
各层职责:
- 前端层:多端统一交互界面,负责数据展示、用户操作、实时进度显示。
- 接口层:统一通信入口,处理协议转换、认证授权、流量控制。
- 服务层:业务逻辑核心,协调各模块完成用户需求(如"训练模型"需调用数据服务+训练服务)。
- AI服务层:提供底层AI能力,封装算法库与训练引擎,对服务层暴露标准化接口。
- 数据层:存储各类数据,包括结构化元数据、大文件、缓存数据、日志等。
3.1.2 核心实体关系(ER)图
系统核心实体包括用户、数据集、模型、训练任务,其关系如图3-2所示:
图3-2:核心实体关系图
3.2 前端架构设计与技术选型
3.2.1 前端架构分层
前端采用"组件-页面-应用"三层架构,如图3-3所示:
图3-3:前端架构分层图
- 组件层:细粒度复用单元,分通用组件(UI库)和业务组件(如"训练进度条")。
- 页面层:对应路由的完整页面,由多个组件组合而成。
- 应用层:全局状态、路由、配置,贯穿整个应用生命周期。
3.2.2 技术栈选型
| 技术领域 | 选型 | 选型理由 |
|---|---|---|
| 核心框架 | React 18 + TypeScript | React组件化能力强,TypeScript静态类型检查减少AI数据处理相关bug(如类型错误) |
| 状态管理 | Redux Toolkit + RTK Query | Redux管理全局状态(用户信息、任务列表),RTK Query简化API请求与缓存 |
| UI组件库 | Ant Design Pro | 提供丰富的数据表格、表单、图表组件,适合AI系统数据展示 |
| 通信库 | Axios + Socket.IO | Axios处理RESTful API,Socket.IO封装WebSocket实现实时通信 |
| 数据可视化 | ECharts + TensorBoard.js | ECharts展示训练曲线,TensorBoard.js可视化模型结构 |
| 构建工具 | Vite | 比Webpack启动快10倍+,支持热更新,提升开发效率 |
| 测试工具 | Jest + React Testing Library | 单元测试与组件测试,确保AI数据处理逻辑正确 |
3.2.3 状态管理设计
AI培训系统需管理的状态包括:
- 用户状态:登录信息、权限角色。
- 任务状态:训练任务ID、进度、日志。
- 数据状态:当前选中的数据集、模型版本。
采用"Redux全局状态+组件局部状态"混合管理:
- 全局状态:用户信息、任务列表(多页面共享)。
- 局部状态:表单输入值、弹窗显隐(单组件私有)。
Redux状态结构示例:
interface RootState {
user: {
id: string;
name: string;
roles: string[];
};
tasks: {
list: Task[]; // Task数组
currentId: string | null; // 当前选中任务ID
progress: Record<string, number>; // {taskId: 进度百分比}
logs: Record<string, string[]>; // {taskId: 日志数组}
};
datasets: {
list: Dataset[];
selectedId: string | null;
};
}
RTK Query API切片示例(数据服务):
import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react';
export const datasetApi = createApi({
reducerPath: 'datasetApi',
baseQuery: fetchBaseQuery({ baseUrl: '/api/v1/' }),
endpoints: (builder) => ({
getDatasets: builder.query<Dataset[], void>({
query: () => 'datasets',
}),
uploadDataset: builder.mutation<{ taskId: string }, FormData>({
query: (data) => ({
url: 'datasets',
method: 'POST',
body: data,
}),
}),
}),
});
export const { useGetDatasetsQuery, useUploadDatasetMutation } = datasetApi;
3.3 后端架构设计与技术选型
3.3.1 微服务拆分
后端按"高内聚低耦合"原则拆分为5个核心微服务,如图3-4所示:
图3-4:后端微服务架构图
- 用户服务:认证授权、用户管理、权限控制,数据存储MySQL。
- 数据服务:数据集CRUD、清洗、标注,存储用MinIO(对象存储)+MongoDB(元数据)。
- 训练服务:任务调度、GPU资源分配、模型训练,依赖RabbitMQ(任务队列)+GPU集群。
- 模型服务:模型版本管理、性能指标、部署,存储用MinIO(模型文件)+PostgreSQL(结构化指标)。
- 监控服务:日志收集、指标监控、告警,基于Prometheus+Grafana。
3.3.2 技术栈选型
| 服务类型 | 核心技术 | 优势 |
|---|---|---|
| API网关 | Kong + Swagger | Kong高性能路由转发,Swagger自动生成API文档 |
| 微服务框架 | FastAPI + Uvicorn | FastAPI异步性能强(支持Python 3.7+),Uvicorn高并发支持(单机万级QPS) |
| 任务队列 | RabbitMQ | 支持优先级队列,可按任务紧急程度调度GPU资源 |
| 对象存储 | MinIO | S3兼容接口,适合存储TB级数据集和模型文件,支持分布式部署 |
| 关系型数据库 | PostgreSQL 14 | 支持JSON字段和数组类型,适合存储半结构化的AI任务元数据 |
| 缓存 | Redis 7.0 | 存储训练进度、临时结果,支持Pub/Sub模式实现消息通知 |
| 容器编排 | Kubernetes + Helm | 自动化部署、扩缩容,管理GPU资源分配(通过nvidia-device-plugin) |
| 服务发现 | Consul | 微服务注册与健康检查,确保API网关动态路由到可用服务 |
3.3.3 训练服务核心流程
训练服务是AI系统的"引擎",其核心流程如图3-5所示:
图3-5:训练服务核心流程图
关键步骤详解:
- 参数校验:检查数据集ID是否存在、模型配置是否合法(如学习率>0)。
- 资源检查:通过Kubernetes API查询GPU集群空闲资源,若不足则入队等待。
- 生成训练脚本:根据用户传入的模型结构(如ResNet-50)、超参数(学习率0.001)动态生成Python训练脚本。
- 进度上报:训练过程中每10秒将loss、accuracy写入Redis,键格式
task:{task_id}:progress。 - 结果保存:训练完成后,模型保存为ONNX格式(跨框架兼容),元数据(精度、耗时)写入PostgreSQL。
3.4 接口规范文档设计
3.4.1 接口设计原则
AI培训系统接口需遵循以下核心原则:
- 资源导向:RESTful风格,URL表示资源,如
/datasets(数据集集合)、/models/{id}(单个模型)。 - 幂等性:PUT/DELETE请求多次执行结果一致,避免重复创建任务。例如:
PUT /tasks/{id}重复调用仅更新状态。 - 版本控制:URL路径包含版本号,如
/api/v1/datasets,便于迭代兼容旧客户端。 - 异步任务标准:长任务返回格式统一为
{task_id: string, status: "pending", message: "任务已提交"}。 - 错误处理:统一错误响应格式
{code: int, message: string, request_id: string},便于问题追踪。
3.4.2 通用接口规范
3.4.2.1 请求/响应格式
请求头:
| 字段名 | 必选 | 描述 | 示例值 |
|---|---|---|---|
| Content-Type | 是 | 请求体格式 | application/json |
| Authorization | 是 | 认证令牌 | Bearer eyJhbGciOiJIUzI1NiIs… |
| X-Request-ID | 否 | 请求唯一标识(追踪用) | req-20240520123456-789 |
成功响应(同步):
{
"code": 200,
"message": "success",
"data": {
"id": "dataset-123",
"name": "MNIST数据集"
}
}
成功响应(异步):
{
"code": 202,
"message": "任务已接受",
"data": {
"task_id": "train-456",
"status": "pending",
"estimated_time": "30分钟"
}
}
错误响应:
{
"code": 400,
"message": "数据集名称不能为空",
"request_id": "req-20240520123456-789"
}
3.4.2.2 状态码定义
| 状态码 | 类别 | 说明 | 典型场景 |
|---|---|---|---|
| 200 | 成功(同步) | 请求已处理完成 | 获取数据集列表 |
| 202 | 成功(异步) | 请求已接受,任务异步处理 | 提交模型训练任务 |
| 400 | 客户端错误 | 请求参数错误 | 数据集名称为空 |
| 401 | 未认证 | Token无效或过期 | Authorization头缺失 |
| 403 | 权限不足 | 用户无操作权限 | 普通用户删除管理员创建的模型 |
| 404 | 资源不存在 | 请求的资源ID不存在 | 查询不存在的模型ID |
| 429 | 请求限流 | 超出API调用频率限制 | 短时间内多次提交训练任务 |
| 500 | 服务器错误 | 后端服务异常 | GPU驱动故障导致训练失败 |
3.4.3 核心接口定义
3.4.3.1 数据集接口
1. 上传数据集(异步)
- URL:
POST /api/v1/datasets - 请求体:
{
"name": "图像分类数据集",
"description": "包含10类动物图像,共1000张",
"data_type": "image",
"format": "zip",
"tags": ["分类", "动物"]
}
- 响应(202 Accepted):
{
"code": 202,
"message": "数据集上传任务已接受",
"data": {
"task_id": "data-upload-789",
"status": "pending",
"upload_url": "https://minio.example.com/upload/data-789.zip?token=xxx"
}
}
- 说明:先创建数据集元数据,返回预签名URL,前端直接上传文件到MinIO,避免后端中转。
2. 获取数据集列表(同步)
- URL:
GET /api/v1/datasets?page=1&size=10&sort=create_time&order=desc - 参数:page(页码)、size(每页条数)、sort(排序字段)、order(asc/desc)
- 响应(200 OK):
{
"code": 200,
"message": "success",
"data": {
"total": 120,
"pages": 12,
"items": [
{
"id": "dataset-123",
"name": "图像分类数据集",
"size": 204800000, // 字节
"data_type": "image",
"status": "ready",
"create_time": "2024-05-20T10:30:00Z"
}
]
}
}
3.4.3.2 训练任务接口
1. 创建训练任务(异步)
- URL:
POST /api/v1/train-tasks - 请求体:
{
"dataset_id": "dataset-123",
"model_name": "ResNet-50",
"framework": "pytorch",
"hyper_params": {
"epochs": 50,
"batch_size": 32,
"learning_rate": 0.001,
"optimizer": "Adam"
},
"resource_requirement": {
"gpu_count": 2,
"priority": "high"
}
}
- 响应(202 Accepted):
{
"code": 202,
"message": "训练任务已提交",
"data": {
"task_id": "train-123",
"status": "pending",
"estimated_start_time": "2024-05-20T14:30:00Z",
"estimated_duration": "2h30m"
}
}
2. 获取训练任务进度(同步)
- URL:
GET /api/v1/train-tasks/{task_id}/progress - 响应(200 OK):
{
"code": 200,
"message": "success",
"data": {
"task_id": "train-123",
"status": "running",
"progress": 60, // 百分比
"current_epoch": 30,
"total_epochs": 50,
"metrics": {
"loss": 0.32,
"accuracy": 0.89
},
"logs": [
"2024-05-20 14:35:00: 开始epoch 30",
"2024-05-20 14:36:20: batch 100/500, loss=0.31"
]
}
}
3.4.3.3 模型接口
1. 获取模型详情(同步)
- URL:
GET /api/v1/models/{model_id} - 响应(200 OK):
{
"code": 200,
"message": "success",
"data": {
"id": "model-456",
"name": "ResNet-50-动物分类",
"description": "基于ResNet-50训练的10类动物分类模型",
"framework": "pytorch",
"task_id": "train-123",
"dataset_id": "dataset-123",
"metrics": {
"accuracy": 0.92,
"precision": 0.91,
"recall": 0.90,
"f1": 0.905
},
"size": 98304000, // 字节
"create_time": "2024-05-20T17:00:00Z",
"version": "1.0.0"
}
}
2. 导出模型(异步)
- URL:
POST /api/v1/models/{model_id}/export - 请求体:
{
"format": "onnx", // 支持onnx/tflite/pb
"optimize": true, // 是否启用量化优化
"target_platform": "edge" // edge/cloud
}
- 响应(202 Accepted):
{
"code": 200,
"message": "模型导出任务已提交",
"data": {
"task_id": "export-789",
"status": "pending"
}
}
3.5 实战案例:核心模块实现
3.5.1 环境搭建
前置条件:
- 操作系统:Ubuntu 22.04 LTS
- 依赖工具:Docker 24.0.0+, Docker Compose 2.18.1+, Git
- GPU环境(可选):NVIDIA GPU + CUDA 11.7+
步骤1:克隆代码仓库
git clone https://github.com/ai-training-system/frontend-backend-separation.git
cd frontend-backend-separation
步骤2:启动基础设施(Docker Compose)
# docker-compose.yml 核心内容
version: '3.8'
services:
postgres:
image: postgres:14
environment:
POSTGRES_USER: aiuser
POSTGRES_PASSWORD: aipassword
POSTGRES_DB: aitraining
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
minio:
image: minio/minio
command: server /data --console-address ":9001"
environment:
MINIO_ROOT_USER: minioadmin
MINIO_ROOT_PASSWORD: minioadmin
ports:
- "9000:9000"
- "9001:9001"
volumes:
- minio_data:/data
rabbitmq:
image: rabbitmq:3-management
ports:
- "5672:5672"
- "15672:15672"
environment:
RABBITMQ_DEFAULT_USER: rabbitmq
RABBITMQ_DEFAULT_PASS: rabbitmq
volumes:
postgres_data:
minio_data:
启动命令:docker-compose up -d
3.5.2 后端训练服务实现(FastAPI)
步骤1:安装依赖
cd backend/train-service
pip install fastapi uvicorn pydantic python-multipart minio pika sqlalchemy torch
步骤2:定义数据模型(Pydantic)
# models/task.py
from pydantic import BaseModel
from typing import List, Optional, Dict
class HyperParams(BaseModel):
epochs: int = 10
batch_size: int = 32
learning_rate: float = 0.001
optimizer: str = "Adam"
class TrainTaskRequest(BaseModel):
dataset_id: str
model_name: str
framework: str = "pytorch"
hyper_params: HyperParams = HyperParams()
resource_requirement: Dict[str, int] = {"gpu_count": 1}
tags: Optional[List[str]] = None
步骤3:实现训练任务API
# main.py
from fastapi import FastAPI, BackgroundTasks, HTTPException
from models.task import TrainTaskRequest
from services.task_service import create_train_task, get_task_progress
from services.gpu_service import check_gpu_availability
import uuid
app = FastAPI(title="AI Training Service API")
@app.post("/api/v1/train-tasks", status_code=202)
async def submit_train_task(request: TrainTaskRequest, background_tasks: BackgroundTasks):
# 1. 检查GPU资源
required_gpus = request.resource_requirement.get("gpu_count", 1)
if not check_gpu_availability(required_gpus):
raise HTTPException(status_code=429, detail="GPU资源不足,请稍后再试")
# 2. 创建任务ID
task_id = f"train-{uuid.uuid4().hex[:8]}"
# 3. 保存任务记录到数据库(简化版)
task = create_train_task(task_id, request.dict())
# 4. 提交任务到后台执行(实际应放入RabbitMQ)
background_tasks.add_task(run_training, task_id, request.dict())
return {
"code": 202,
"message": "训练任务已提交",
"data": {
"task_id": task_id,
"status": "pending",
"estimated_duration": f"{request.hyper_params.epochs * 5}m" # 估算时间
}
}
@app.get("/api/v1/train-tasks/{task_id}/progress")
async def get_training_progress(task_id: str):
progress = get_task_progress(task_id)
if not progress:
raise HTTPException(status_code=404, detail="任务不存在")
return {
"code": 200,
"message": "success",
"data": progress
}
def run_training(task_id: str, task_params: dict):
"""模拟模型训练过程,实际应调用PyTorch/TensorFlow训练代码"""
import time
from services.db_service import update_task_status, update_task_progress
# 更新状态为"running"
update_task_status(task_id, "running")
# 模拟训练进度(10个epoch)
total_epochs = task_params["hyper_params"]["epochs"]
for epoch in range(total_epochs):
time.sleep(5) # 模拟每个epoch耗时
progress = int((epoch + 1) / total_epochs * 100)
metrics = {"loss": 0.5 - (epoch * 0.04), "accuracy": 0.6 + (epoch * 0.03)}
update_task_progress(task_id, progress, epoch + 1, total_epochs, metrics)
# 训练完成,更新状态为"completed"
update_task_status(task_id, "completed")
步骤4:启动后端服务
uvicorn main:app --host 0.0.0.0 --port 8000 --reload
3.5.3 前端训练任务页面实现(React+TypeScript)
步骤1:创建训练任务组件
// src/pages/ModelTrainingPage.tsx
import React, { useState } from 'react';
import { Form, Button, Card, Spin, message } from 'antd';
import { useMutation, useQuery } from '@reduxjs/toolkit/query/react';
import { trainApi } from '../services/trainApi';
import TrainingProgress from '../components/TrainingProgress';
const ModelTrainingPage: React.FC = () => {
const [form] = Form.useForm();
const [taskId, setTaskId] = useState<string | null>(null);
// RTK Query - 提交训练任务
const { mutateAsync: submitTrainTask, isLoading } = useMutation(
trainApi.submitTrainTask
);
// 提交表单处理函数
const handleSubmit = async () => {
try {
const values = await form.validateFields();
const response = await submitTrainTask(values);
setTaskId(response.data.task_id);
message.success('训练任务已提交,请等待...');
} catch (error) {
message.error('提交失败:' + (error as Error).message);
}
};
return (
<Card title="模型训练" style={{ maxWidth: 800, margin: '0 auto' }}>
{!taskId ? (
<Form form={form} layout="vertical" onFinish={handleSubmit}>
<Form.Item
name="dataset_id"
label="选择数据集"
rules={[{ required: true, message: '请选择数据集' }]}
>
{/* 数据集下拉框(简化版) */}
<select>
<option value="dataset-123">图像分类数据集</option>
<option value="dataset-456">文本情感分析数据集</option>
</select>
</Form.Item>
<Form.Item
name="model_name"
label="模型名称"
rules={[{ required: true, message: '请输入模型名称' }]}
>
<input placeholder="例如:ResNet-50-分类模型" />
</Form.Item>
<Form.Item name="hyper_params.epochs" label="训练轮次">
<input type="number" defaultValue={10} min={1} />
</Form.Item>
<Form.Item>
<Button type="primary" htmlType="submit" loading={isLoading}>
提交训练任务
</Button>
</Form.Item>
</Form>
) : (
<TrainingProgress taskId={task
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)