NOTE欢迎来到“从零搭建AI小程序全栈实战”系列文章!
此为本系列的第一篇文章。
零、写在第一篇文章之前
0.1 总览
欢迎来到”从零搭建AI小程序全栈实战”系列。
这是一套完整的项目驱动型教程,不是零散的知识点堆砌。我们将从一台带GPU的笔记本和一台云服务器开始,一步一步搭建一个真正能用的垃圾分类识别小程序。
本系列文章包括
| 标题 | 技术步骤 |
|---|---|
| 从零搭建AI小程序全栈实战(一) | 环境准备 笔记本GPU服务器内网穿透打通 |
| 从零搭建AI小程序全栈实战(二·上篇) | Spring Boot 基础功能开发 CRUD + 图片上传 + 调用 AI 推理 |
| 从零搭建AI小程序全栈实战(二·下篇) | 后端工程化加固 统一响应 + 异常处理 + 接口文档 + 数据校验 |
| 从零搭建AI小程序全栈实战(三) | 微信小程序前端 拍照识别 历史记录全链路打通 |
| 从零搭建AI小程序全栈实战(四) | 模型训练 ResNet图像分类 Flask推理API部署 |
学完之后,你将拥有:
-
一个自己训练的ResNet图像分类模型,跑在笔记本GPU上
-
一个Spring Boot业务后端,能接收图片、调AI、存数据库
-
一个微信小程序,拍照上传,1秒出分类结果
-
一条内网穿透通道,笔记本在家,服务器在云端,网络互通
这当然是一个玩具项目,也是一个麻雀虽小、五脏俱全的全栈AI应用。
0.2 你会获得什么
-
把 GPU 变成远程推理服务
-
独立搭建 Spring Boot 业务后端
-
微信小程序从拍照到出结果的全链路贯通
0.3 你需要准备什么
硬件
-
一台带 NVIDIA 显卡的笔记本(GTX 1060 以上都能跑,不一定要 4060)
-
一台云服务器(2核2G,够跑Spring Boot)
软件基础
-
会用基础的Linux命令行 例如 cd / ls / mkdir
-
写过一点 Python,知道 import 怎么用
-
不需要了解 Java 和 Spring Boot
-
不需要了解微信小程序
0.4 成品
-
一个能够识别有机物和可回收物的算法模型
-
一个能够上传图片进行识别的微信小程序
-
一个能够正常处理接口并转发请求的SpringBoot后端
一、这篇文章将要做的
1.1 总览
学完这篇文章,你能让笔记本GPU对外提供API,同时服务器能够调用到它。
1.2 目标
-
笔记本跑通GPU推理——驱动、CUDA、PyTorch、Flask
-
服务器跑通Spring Boot——JDK、Demo应用
-
打通网络——frps、frpc、验证
二、Windows环境
2.1 配置 Nvidia 显卡
2.1.1 安装nvidia-smi
打开 NVIDIA 官网下载对应驱动(Game Ready 即可),安装后重启。
在命令行执行 nvidia-smi,确认驱动版本和 CUDA 版本(如 CUDA 12.x)。
2.1.2 安装CUDA Toolkit
下载 CUDA Toolkit 11.8(兼容性好,占用空间小): CUDA Toolkit 11.8 Download
选择 Windows → x86_64 → exe(local),安装时选“精简”模式。
2.1.3 安装cuDNN
下载 cuDNN(需要注册 NVIDIA 账号): cuDNN Archive
选择和 CUDA 11.8 对应的版本,解压后将 bin、include、lib 文件夹内容复制到 CUDA 安装目录(默认 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8)对应文件夹内。
2.2 配置 conda 环境
下载 Miniconda Windows 64-bit,一路下一步安装
打开 Anaconda Prompt,创建虚拟环境:
conda create -n ai-env python=3.10 -yconda activate ai-env2.3 配置 PyTorch
- 安装 PyTorch:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118- 验证 GPU:
python -c "import torch; print(torch.cuda.is_available())"输出 True 即成功。
2.4 搭建第一个 Flask API
- 安装 Flask:
pip install flask- 新建目录
DEMO_Project\demo-assist\api-server, 在里面创建app.py:
from flask import Flask, request, jsonifyimport torch
app = Flask(__name__)
@app.route('/health')def health(): return jsonify({"status": "ok", "cuda": torch.cuda.is_available()})
@app.route('/predict', methods=['POST'])def predict(): # 暂时返回固定结果,后续接模型 data = request.get_json() return jsonify({"result": "fake_prediction", "input": data})
if __name__ == '__main__': app.run(host='0.0.0.0', port=5000, debug=True)- 启动
python app.py- 用浏览器访问
http://localhost:5000/health,看到包含"cuda":true的 JSON 即可。
2.5 安装内网穿透客户端 frpc
-
下载 frp Windows 版,解压到本地,放到
DEMO_Project\demo-assist\frp文件夹中。 -
先不配置,等服务器端 ready。
2.6 安装 Intellij IDEA
-
打开浏览器,访问 JetBrains 官网
-
选择 Community Edition(免费版,够用),点击下载
-
下载完成后双击安装包,一路下一步,注意以下选项:
-
Create Desktop Shortcut → 勾选(桌面快捷方式)
-
Add “Open Folder as Project” → 勾选
-
其余默认即可
-
-
安装完成后启动 IDEA,选择 “Don’t send”(不发送使用数据)
三、在 Windows 上创建 Spring Boot 项目
3.1 创建 Spring Boot 项目
-
在 IDEA 欢迎界面,点击 New Project
-
左侧选择 Spring Boot(如果没有,点左侧 Spring Initializr)
-
右侧配置以下信息:
选项 值 Name demoLocation [你的项目目录]\DEMO_project\demoLanguage JavaType MavenGroup com.exampleArtifact demoJDK 选择 JDK 21(如果没有,点旁边的下载按钮下载)Java 21Packaging Jar -
点击 Next
-
在依赖选择界面,左侧找到
Spring Web,勾选它 -
点击 Create(或 Finish)
-
IDEA 会自动下载依赖,等待右下角进度条走完
3.2 编写 DemoApplication
-
IDEA 默认已经生成了
DemoApplication.java,路径在src/main/java/com/example/demo/DemoApplication.java -
将其内容替换为以下代码
package com.example.demo;
import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication@RestControllerpublic class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); }
@GetMapping("/hello") public String hello() { return "Hello from Server!"; }}3.3 本地启动验证
-
IDEA 右上角找到绿色三角形按钮,点击运行(或快捷键
Shift + F10) -
底部控制台出现
Started DemoApplication in ... seconds表示启动成功 -
打开浏览器访问
http://localhost:8080/hello -
看到
Hello from Server!即成功 -
按红色方块按钮停止(或快捷键
Ctrl + F2)
3.4 打包 JAR
-
IDEA 右侧边栏点击 Maven(竖排的 “m” 图标)
-
展开
demo→Lifecycle -
双击 package
-
等待控制台出现
BUILD SUCCESS -
生成的 JAR 文件在项目目录
target/demo-0.0.1-SNAPSHOT.jar
四、服务器环境
4.1 安全组放行端口
安全组放行端口:8080、5000、7000(入方向)
4.2 安装软件包
4.2.1 安装 JDK 21
SSH 连接服务器,执行以下命令:
sudo apt update && sudo apt upgrade -ysudo apt install openjdk-21-jdk git curl -yjava -version # 确认版本为214.2.2 安装 frps
安装内网穿透服务端 frps:
wget https://github.com/fatedier/frp/releases/download/v0.52.3/frp_0.52.3_linux_amd64.tar.gztar -xzf frp_0.52.3_linux_amd64.tar.gzcd frp_0.52.3_linux_amd64/4.3 创建 frps 服务
- 创建
/etc/systemd/system/frps.service:
sudo vi /etc/systemd/system/frps.service- 输入以下内容
[Unit]Description=frpsAfter=network.target
[Service]Type=simpleExecStart=/root/frp_0.52.3_linux_amd64/frps -c /root/frp_0.52.3_linux_amd64/frps.tomlRestart=on-failureUser=root
[Install]WantedBy=multi-user.target- 使用
:wq保存并退出
五、打通网络
5.1 在 Windows端 配置 frpc
- 编辑解压后的
frpc.toml(或frpc.ini):
serverAddr = "你的服务器公网IP"serverPort = 7000
[[proxies]]name = "ai-api"type = "tcp"localIP = "127.0.0.1"localPort = 5000remotePort = 5000- 在
frp目录下启动:
frpc -c frpc.toml出现 success 等字样即连接成功。
5.2 在 服务器端 配置 frps
- 切换到
frps.toml所在目录
cd frp_0.52.3_linux_amd64/- 编辑
frps.toml
bindPort = 7000# 如果需要 dashboard 可加下面两行(不要暴露公网)# webServer.addr = "127.0.0.1"# webServer.port = 7500- 在 服务器端 启动刚配置好的服务
sudo systemctl start frps5.3 验证打通
在服务器上执行:
curl http://localhost:5000/health如果能返回笔记本上的 JSON(包含 “cuda”
现在,你的 Spring Boot 应用可以配置 http://localhost:5000 作为模型推理地址,无需公网 IP。
六、验收清单
-
笔记本
python -c "import torch; print(torch.cuda.is_available())"输出True -
笔记本 Flask API 的
/health接口能返回 GPU 可用信息 -
服务器
curl http://自己公网IP:8080/hello返回Hello from Server! -
服务器
curl http://localhost:5000/health能拿到笔记本返回的结果