1838 字
9 分钟
从零搭建AI小程序全栈实战(一):环境准备
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 你会获得什么#

  1. 把 GPU 变成远程推理服务

  2. 独立搭建 Spring Boot 业务后端

  3. 微信小程序从拍照到出结果的全链路贯通

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 对应的版本,解压后将 binincludelib 文件夹内容复制到 CUDA 安装目录(默认 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8)对应文件夹内。

2.2 配置 conda 环境#

下载 Miniconda Windows 64-bit,一路下一步安装
打开 Anaconda Prompt,创建虚拟环境:

Terminal window
conda create -n ai-env python=3.10 -y
conda activate ai-env

2.3 配置 PyTorch#

  • 安装 PyTorch:
Terminal window
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
  • 验证 GPU:
Terminal window
python -c "import torch; print(torch.cuda.is_available())"

输出 True 即成功。

2.4 搭建第一个 Flask API#

  • 安装 Flask:
Terminal window
pip install flask
  • 新建目录 DEMO_Project\demo-assist\api-server , 在里面创建 app.py
from flask import Flask, request, jsonify
import 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)
  • 启动
Terminal window
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

  • 右侧配置以下信息:

    选项
    Namedemo
    Location[你的项目目录]\DEMO_project\demo
    LanguageJava
    TypeMaven
    Groupcom.example
    Artifactdemo
    JDK选择 JDK 21(如果没有,点旁边的下载按钮下载)
    Java21
    PackagingJar
  • 点击 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
@RestController
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@GetMapping("/hello")
public String hello() {
return "Hello from Server!";
}
}

3.3 本地启动验证#

  1. IDEA 右上角找到绿色三角形按钮,点击运行(或快捷键 Shift + F10

  2. 底部控制台出现 Started DemoApplication in ... seconds 表示启动成功

  3. 打开浏览器访问 http://localhost:8080/hello

  4. 看到 Hello from Server! 即成功

  5. 按红色方块按钮停止(或快捷键 Ctrl + F2

3.4 打包 JAR#

  1. IDEA 右侧边栏点击 Maven(竖排的 “m” 图标)

  2. 展开 demoLifecycle

  3. 双击 package

  4. 等待控制台出现 BUILD SUCCESS

  5. 生成的 JAR 文件在项目目录 target/demo-0.0.1-SNAPSHOT.jar

四、服务器环境#

4.1 安全组放行端口#

安全组放行端口:8080、5000、7000(入方向)

4.2 安装软件包#

4.2.1 安装 JDK 21#

SSH 连接服务器,执行以下命令:

Terminal window
sudo apt update && sudo apt upgrade -y
sudo apt install openjdk-21-jdk git curl -y
java -version # 确认版本为21

4.2.2 安装 frps#

安装内网穿透服务端 frps:

Terminal window
wget https://github.com/fatedier/frp/releases/download/v0.52.3/frp_0.52.3_linux_amd64.tar.gz
tar -xzf frp_0.52.3_linux_amd64.tar.gz
cd frp_0.52.3_linux_amd64/

4.3 创建 frps 服务#

  • 创建 /etc/systemd/system/frps.service
Terminal window
sudo vi /etc/systemd/system/frps.service
  • 输入以下内容
[Unit]
Description=frps
After=network.target
[Service]
Type=simple
ExecStart=/root/frp_0.52.3_linux_amd64/frps -c /root/frp_0.52.3_linux_amd64/frps.toml
Restart=on-failure
User=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 = 5000
remotePort = 5000
  • frp 目录下启动:
Terminal window
frpc -c frpc.toml

出现 success 等字样即连接成功。

5.2 在 服务器端 配置 frps#

  • 切换到frps.toml所在目录
Terminal window
cd frp_0.52.3_linux_amd64/
  • 编辑frps.toml
Terminal window
bindPort = 7000
# 如果需要 dashboard 可加下面两行(不要暴露公网)
# webServer.addr = "127.0.0.1"
# webServer.port = 7500
  • 在 服务器端 启动刚配置好的服务
Terminal window
sudo systemctl start frps

5.3 验证打通#

在服务器上执行:

Terminal window
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 能拿到笔记本返回的结果

从零搭建AI小程序全栈实战(一):环境准备
https://47.113.107.125:80/posts/ai-miniapp/01-环境准备/
作者
TerryC
发布于
2026-01-01
许可协议
CC BY-NC-SA 4.0