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系统普遍存在以下痛点:

  1. 架构耦合严重:前端与后端代码混杂,模型训练模块与业务逻辑紧耦合,导致"牵一发而动全身",新功能开发周期长。
  2. 数据孤岛困境:结构化业务数据、非结构化文本/图像数据、模型训练日志分散在不同系统,数据预处理耗时占AI项目周期的60%以上。
  3. 模型复用困难:训练好的模型封装不规范,难以跨项目复用,重复造轮子现象普遍。
  4. 扩展性瓶颈:面对激增的训练任务或用户量,系统难以快速扩容,GPU资源利用率低。
  5. 开发协作低效:前后端开发依赖强,接口变更导致大量返工,跨团队沟通成本高。
前后端分离架构的破局之道

前后端分离架构(Frontend-Backend Separation, FBS)通过将用户界面(前端)与业务逻辑/数据处理(后端)完全分离,实现了"界面与数据解耦、开发与部署分离"。对于AI培训系统,这种架构带来三大核心优势:

  • 开发效率提升:前后端团队可并行开发,前端基于Mock数据独立调试,后端专注API实现,协作效率提升40%+。
  • 系统灵活性增强:前端可快速适配多端(Web/移动端/桌面端),后端可独立升级AI模型或数据处理逻辑,互不干扰。
  • 资源利用率优化:AI训练任务(GPU密集型)与Web服务(CPU/内存密集型)可独立部署与弹性伸缩,降低资源浪费。

亮明观点/文章目标 (The “What” & “How”)

本文将以"AI培训系统"为实战载体,从0到1拆解前后端分离架构的设计与落地全过程。你将学到:

  1. 架构设计方法论:如何结合AI系统特性(数据密集、计算密集、模型迭代快)设计分层架构,包括前端、后端、数据层、AI服务层的协同机制。
  2. 接口规范制定:掌握AI系统接口的设计原则(幂等性、异步处理、版本控制等),以及核心接口(数据上传、模型训练、任务调度)的详细定义。
  3. 技术栈选型与实战:前端(React+TypeScript)、后端(FastAPI+Python)、AI服务(TensorFlow/PyTorch)的集成实践,含完整代码示例。
  4. 性能与安全优化:针对AI系统的高并发、大文件传输、模型安全等挑战,提供可落地的优化方案。

无论你是AI应用架构师、全栈开发者,还是希望将AI能力产品化的技术负责人,本文都能为你提供一套"架构设计+接口规范+实战代码"的完整解决方案。让我们开始这场AI系统架构的实战之旅!

二、基础知识/背景铺垫 (Foundational Concepts)

2.1 核心概念定义

2.1.1 AI培训系统的定义与构成

AI培训系统是支撑机器学习/深度学习模型从数据准备到训练部署全流程的平台化工具,其核心目标是降低AI开发门槛、提升模型研发效率。典型构成包括:

  • 数据管理模块:数据上传、清洗、标注、版本控制(如DVC)。
  • 模型开发模块:算法库、模型定义、超参数调优(如Optuna)。
  • 训练调度模块:任务队列、资源分配(GPU/CPU)、分布式训练。
  • 模型管理模块:模型版本、性能指标、A/B测试。
  • 部署服务模块:模型导出、API封装、在线推理。

与传统业务系统相比,AI培训系统具有三大显著特性:

  1. 数据驱动:数据质量直接决定模型效果,需支持TB级结构化/非结构化数据处理。
  2. 计算密集:深度学习模型训练需大量GPU算力,单任务可能占用多卡数天。
  3. 迭代快速:模型架构、超参数、训练数据需频繁调整,系统需支持敏捷迭代。
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 架构对比:以用户上传数据训练模型为例

传统单体架构流程

  1. 用户在JSP页面点击"上传数据",表单提交到后端Servlet。
  2. 后端Servlet接收文件,调用本地数据清洗函数,存入数据库。
  3. 调用本地模型训练函数(阻塞主线程),期间用户需等待。
  4. 训练完成后,后端渲染结果页面返回给用户。

问题

  • 训练任务阻塞Web服务,导致其他用户无法访问。
  • 前端无法实时展示训练进度,用户体验差。
  • 数据处理、模型训练、Web展示代码混杂,维护困难。

前后端分离架构流程

  1. 前端(React)通过Axios上传文件到后端API(POST /api/datasets)。
  2. 后端(FastAPI)接收文件后,返回任务ID,异步将数据清洗任务加入消息队列。
  3. 前端通过WebSocket连接后端,订阅任务ID对应的进度更新。
  4. 后端 worker 处理数据清洗→调用AI服务训练模型→更新任务状态。
  5. 后端通过WebSocket实时推送进度(如"50%: 正在训练第3个epoch")。
  6. 训练完成后,前端展示结果并提供模型下载链接。

优势

  • 长任务异步化,Web服务无阻塞。
  • 实时进度推送,用户体验提升。
  • 数据、训练、Web模块解耦,可独立扩展。

2.3 AI系统架构设计核心原则

结合AI系统特性与前后端分离思想,架构设计需遵循以下原则:

  1. 分层解耦原则
    按职责分层(数据层→服务层→接口层→前端层),层间通过标准化接口通信,避免跨层调用。例如:数据层不直接调用AI训练函数,需通过服务层接口。

  2. 异步优先原则
    对模型训练、数据预处理等长任务(>3秒),采用"请求-异步处理-结果回调"模式,避免前端超时。数学模型表示如下:
    设任务平均耗时为 ( T ),前端超时阈值为 ( T_{timeout} ),若 ( T > T_{timeout} ),则必须采用异步通信。

  3. 资源隔离原则
    AI训练(GPU密集)与Web服务(CPU密集)部署在不同容器/集群,通过Kubernetes进行资源调度,避免GPU占用导致Web服务资源不足。

  4. 可观测性原则
    全链路日志(数据上传→训练→部署)、性能指标(GPU利用率、任务耗时)、告警机制(训练失败、资源超限)需可视化,可通过Prometheus+Grafana实现。

  5. 版本兼容原则
    API版本控制(如/api/v1/models)、模型版本控制(如model-v1.2.0),确保旧版本客户端与新版本服务兼容。

三、核心内容/实战演练 (The Core - “How-To”)

3.1 AI培训系统总体架构设计

3.1.1 架构概览

AI培训系统前后端分离架构采用"五层三横"设计,如图3-1所示:

渲染错误: Mermaid 渲染失败: Lexical error on line 2. Unrecognized text. ... TD subgraph 前端层(用户交互) A[Web ----------------------^

图3-1:AI培训系统前后端分离总体架构图

各层职责

  • 前端层:多端统一交互界面,负责数据展示、用户操作、实时进度显示。
  • 接口层:统一通信入口,处理协议转换、认证授权、流量控制。
  • 服务层:业务逻辑核心,协调各模块完成用户需求(如"训练模型"需调用数据服务+训练服务)。
  • AI服务层:提供底层AI能力,封装算法库与训练引擎,对服务层暴露标准化接口。
  • 数据层:存储各类数据,包括结构化元数据、大文件、缓存数据、日志等。
3.1.2 核心实体关系(ER)图

系统核心实体包括用户、数据集、模型、训练任务,其关系如图3-2所示:

上传

发起

创建

被用于

生成

被用于

USER

DATASET

string

dataset_id

PK

string

name

string

owner_id

FK

string

storage_path

datetime

create_time

enum

status

TRAIN_TASK

string

task_id

PK

string

dataset_id

FK

string

model_id

FK

string

user_id

FK

json

hyper_params

enum

status

float

progress

datetime

start_time

datetime

end_time

MODEL

string

model_id

PK

string

name

string

user_id

FK

string

task_id

FK

string

storage_path

float

accuracy

datetime

create_time

INFERENCE_TASK

图3-2:核心实体关系图

3.2 前端架构设计与技术选型

3.2.1 前端架构分层

前端采用"组件-页面-应用"三层架构,如图3-3所示:

应用层

路由管理

状态管理

全局配置

页面层

数据上传页

模型训练页

结果展示页

组件层

通用组件

业务组件

Button/Input

Table/Chart

数据集上传组件

训练进度组件

模型性能可视化组件

图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所示:

API网关

用户服务

数据服务

训练服务

模型服务

监控服务

MySQL

MinIO

MongoDB

RabbitMQ

GPU集群

PostgreSQL

Prometheus

Grafana

图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所示:

渲染错误: Mermaid 渲染失败: Parse error on line 14: ... M --> N[更新任务状态为"完成"] L --> O[Web -----------------------^ Expecting 'SQE', 'DOUBLECIRCLEEND', 'PE', '-)', 'STADIUMEND', 'SUBROUTINEEND', 'PIPE', 'CYLINDEREND', 'DIAMOND_STOP', 'TAGEND', 'TRAPEND', 'INVTRAPEND', 'UNICODE_TEXT', 'TEXT', 'TAGSTART', got 'STR'

图3-5:训练服务核心流程图

关键步骤详解

  1. 参数校验:检查数据集ID是否存在、模型配置是否合法(如学习率>0)。
  2. 资源检查:通过Kubernetes API查询GPU集群空闲资源,若不足则入队等待。
  3. 生成训练脚本:根据用户传入的模型结构(如ResNet-50)、超参数(学习率0.001)动态生成Python训练脚本。
  4. 进度上报:训练过程中每10秒将loss、accuracy写入Redis,键格式task:{task_id}:progress
  5. 结果保存:训练完成后,模型保存为ONNX格式(跨框架兼容),元数据(精度、耗时)写入PostgreSQL。

3.4 接口规范文档设计

3.4.1 接口设计原则

AI培训系统接口需遵循以下核心原则:

  1. 资源导向:RESTful风格,URL表示资源,如/datasets(数据集集合)、/models/{id}(单个模型)。
  2. 幂等性:PUT/DELETE请求多次执行结果一致,避免重复创建任务。例如:PUT /tasks/{id}重复调用仅更新状态。
  3. 版本控制:URL路径包含版本号,如/api/v1/datasets,便于迭代兼容旧客户端。
  4. 异步任务标准:长任务返回格式统一为{task_id: string, status: "pending", message: "任务已提交"}
  5. 错误处理:统一错误响应格式{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
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐