当前位置: 首页 > news >正文

AI的技术栈全知道

一文看懂AI技术栈:4层架构+5个选型原则

一、问题:AI 技术栈碎片化,如何高效构建?当你开始一个 AI 项目,迎面而来的是一堆陌生名词:Python、CUDA、PyTorch、TensorFlow、ONNX、TensorRT、Docker、Kubernetes……每个环节都有多种可选方案,稍有不慎就会陷入“框架切换”“环境冲突”“推理速度慢”等坑里。我见过太多开发者在“学新框架”的路上越走越远,却连一个端到端的 MVP 都跑不通。根本矛盾:AI 技术栈的广度与深度要求,远超传统软件开发。你需要同时掌握数据处理、模型训练、模型导出、推理部署、性能优化等多个域,且每个域的工具都在快速迭代。本文将用一个完整的端到端案例(PyTorch 训练 → ONNX 导出 → ONNX Runtime 推理),串起 AI 技术栈的核心环节,并给出可落地的选型建议。—## 二、方案:分层拆解 AI 技术栈一个典型的 AI 应用技术栈分为四层:| 层级 | 核心任务 | 主流工具 | 选型原则 ||------|----------|----------|----------|| 数据处理 | 清洗、增强、加载 | Pandas, PyTorch DataLoader, TF Dataset, NVIDIA DALI | 与框架兼容,IO 密集时用 DALI || 模型训练 | 定义网络、优化、调参 | PyTorch, TensorFlow, JAX | 新手推荐 PyTorch,生产环境考虑 TorchServe || 模型导出 | 中间表示、量化 | ONNX, TorchScript, TensorRT, OpenVINO | 跨平台必用 ONNX,GPU 加速用 TRT || 推理部署 | 服务化、边缘端 | ONNX Runtime, Triton Inference Server, TFLite, CoreML | 高性能用 Triton,轻量用 ONNX Runtime |核心思路:训练阶段用 PyTorch(灵活),导出为 ONNX(中立),推理阶段用 ONNX Runtime(高效)。这样既能享受 PyTorch 的开发体验,又能获得接近原生的推理性能。—## 三、代码实战:PyTorch → ONNX → ONNX Runtime 端到端### 1. 环境准备(保证可复现)bash# 创建虚拟环境,安装必要依赖conda create -n ai_stack python=3.9conda activate ai_stackpip install torch==2.1.0 torchvision==0.16.0 onnx==1.15.0 onnxruntime==1.17.0 numpy==1.26.0### 2. 训练一个简单的分类模型我们使用经典的 MNIST 数据集的子集,训练一个两层卷积网络。注意:这里故意简化数据量(只取 1000 张图),方便快速运行。python# train_model.pyimport torchimport torch.nn as nnimport torch.optim as optimfrom torchvision import datasets, transformsfrom torch.utils.data import DataLoader, Subset# 0. 定义网络(兼容 ONNX 导出:避免使用动态控制流)class SimpleCNN(nn.Module): def __init__(self, num_classes=10): super().__init__() self.features = nn.Sequential( nn.Conv2d(1, 16, kernel_size=3, padding=1), nn.ReLU(), nn.MaxPool2d(2), nn.Conv2d(16, 32, kernel_size=3, padding=1), nn.ReLU(), nn.MaxPool2d(2), ) self.classifier = nn.Sequential( nn.Flatten(), nn.Linear(32 * 7 * 7, 64), nn.ReLU(), nn.Linear(64, num_classes), ) def forward(self, x): x = self.features(x) x = self.classifier(x) return x# 1. 加载数据(仅取前1000张训练,200张测试)transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))])full_train = datasets.MNIST('./data', train=True, download=True, transform=transform)full_test = datasets.MNIST('./data', train=False, download=True, transform=transform)train_loader = DataLoader(Subset(full_train, indices=range(1000)), batch_size=32, shuffle=True)test_loader = DataLoader(Subset(full_test, indices=range(200)), batch_size=32, shuffle=False)# 2. 训练device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')model = SimpleCNN().to(device)criterion = nn.CrossEntropyLoss()optimizer = optim.Adam(model.parameters(), lr=0.001)print("开始训练...")for epoch in range(3): model.train() for images, labels in train_loader: images, labels = images.to(device), labels.to(device) optimizer.zero_grad() outputs = model(images) loss = criterion(outputs, labels) loss.backward() optimizer.step() # 简单验证 model.eval() correct = 0 total = 0 with torch.no_grad(): for images, labels in test_loader: images, labels = images.to(device), labels.to(device) outputs = model(images) _, predicted = torch.max(outputs, 1) total += labels.size(0) correct += (predicted == labels).sum().item() print(f"Epoch {epoch+1}, Test Acc: {100 * correct / total:.2f}%")# 保存 PyTorch 权重torch.save(model.state_dict(), 'model.pth')print("模型权重保存至 model.pth")### 3. 导出为 ONNXONNX 导出时需要指定输入张量的形状(动态批处理使用dynamic_axes)。注意:导出前必须将模型设置为 eval 模式。python# export_onnx.pyimport torchfrom train_model import SimpleCNN, devicemodel = SimpleCNN()model.load_state_dict(torch.load('model.pth', map_location='cpu'))model.eval()# 构造 dummy 输入:batch_size=1, channel=1, height=28, width=28dummy_input = torch.randn(1, 1, 28, 28)# 定义动态轴:batch 维度可变dynamic_axes = { 'input': {0: 'batch_size'}, 'output': {0: 'batch_size'}}torch.onnx.export( model, dummy_input, 'model.onnx', input_names=['input'], output_names=['output'], dynamic_axes=dynamic_axes, opset_version=17, do_constant_folding=True)print("ONNX 模型导出成功:model.onnx")### 4. 使用 ONNX Runtime 进行推理ONNX Runtime 支持 CPU/GPU,且无需安装 PyTorch。下面代码展示加载 ONNX 模型并对单张图片进行推理。python# inference_onnx.pyimport onnxruntime as ortimport numpy as npfrom torchvision import datasets, transformsfrom torch.utils.data import DataLoader, Subsetimport time# 加载测试数据中的一张图(仅用于演示)transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))])full_test = datasets.MNIST('./data', train=False, download=True, transform=transform)test_loader = DataLoader(Subset(full_test, indices=range(1)), batch_size=1)image, label = next(iter(test_loader))# 转成 numpy,并确保维度顺序为 NCHWinput_np = image.numpy().astype(np.float32)# 创建 ONNX Runtime 会话session = ort.InferenceSession('model.onnx')input_name = session.get_inputs()[0].nameoutput_name = session.get_outputs()[0].name# 推理(预热)_ = session.run([output_name], {input_name: input_np})# 正式计时(模拟批处理)batch_np = np.repeat(input_np, 10, axis=0) # batch_size=10start = time.time()for _ in range(100): outputs = session.run([output_name], {input_name: batch_np})end = time.time()print(f"ONNX Runtime 推理 100 批 (batch=10) 耗时: {(end-start)*1000:.2f} ms")pred = np.argmax(outputs[0], axis=1)print(f"预测标签: {pred[:5]}, 真实标签: {label.item()}")### 5. 对比 PyTorch 直接推理(可选)作为对照,我们也可以将导出的 ONNX 模型与 PyTorch 推理速度对比。但注意:ONNX Runtime 通常比 PyTorch eager 模式快 1.5~3 倍(尤其是 CPU 环境)。python# compare.py(附加代码,不单独运行)import torchfrom train_model import SimpleCNN, device# PyTorch 推理model_pt = SimpleCNN()model_pt.load_state_dict(torch.load('model.pth', map_location='cpu'))model_pt.eval()with torch.no_grad(): start = time.time() for _ in range(100): _ = model_pt(torch.from_numpy(batch_np)) end = time.time()print(f"PyTorch 推理 100 批耗时: {(end-start)*1000:.2f} ms")>说明:上述代码直接粘贴即可运行(需先运行train_model.pyexport_onnx.py)。如果 GPU 可用,可安装onnxruntime-gpu获得加速。—## 四、总结与最佳实践### 1. 技术栈选型建议-个人/小团队:PyTorch + ONNX Runtime 组合最灵活,学习成本低。-企业生产:训练用 PyTorch,部署用 NVIDIA Triton Inference Server(支持多框架多模型并行)。-边缘端:考虑 TensorRT(NVIDIA 设备)或 OpenVINO(Intel 设备),或者直接使用 TFLite(移动端/嵌入式)。-量化加速:ONNX Runtime 内置动态、静态量化工具,FP16/INT8 推理可提升 2~4 倍速度。### 2. 导出 ONNX 的常见陷阱-动态控制流(如if语句依赖输入)会导致导出失败,需提前改写成静态形式(如使用torch.where)。-自定义算子:ONNX 不支持 PyTorch 所有算子,需要注册或 fallback。建议先在torch.onnx.export中设置verify=True检查。-输入输出动态形状:务必设置dynamic_axes,否则导出的模型只能固定 batch 大小。### 3. 可操作建议1.从简单模型开始:不要一上来就尝试 YOLO / GPT,先跑通上面的 MNIST 案例,理解整个链路。2.使用版本锁定:ONNX 生态与框架版本强相关,建议在requirements.txt中固定 torch、onnx、onnxruntime 版本。3.压测找瓶颈:用 ONNX Runtime 的session.get_providers()检查是否真的使用了 GPU(CUDAExecutionProvider)。CPU 环境下可以尝试IExecutionProviderenable_cpu_mem_arena=False以降低内存碎片。4.拥抱容器化:用 Docker 打包运行时环境,避免不同机器 CUDA/系统库版本冲突。推荐用nvidia/cuda:11.8-runtime-ubuntu22.04作为基础镜像。### 4. 未来的扩展当你掌握了基础链路,可以进一步学习:-模型服务化:使用FastAPI 包装 ONNX Runtime 推理,配合 Docker 对外提供 REST API。-自动化量化:ONNX Runtime 的 QAT(量化感知训练) 在保持精度的同时大幅提速。-多 GPU 推理:用 Triton Inference Server 管理多进程推理,吞吐量翻倍。AI 技术栈的深度远不止上述内容,但“训练→导出→部署”这一闭环是所有 AI 工程师必须掌握的硬技能。不要被碎片化的工具吓倒,用最小的闭环启动,在实践中扩展认知——这就是最优的成长路径。

http://www.gsyq.cn/news/1625024.html

相关文章:

  • JMeter测试SOAP接口全攻略:从WSDL解析到性能压测
  • 2026邮件网关怎么选?主流品牌实测排名与选型指南
  • 调味品品牌策划设计:视维以全案思维助力传统赛道焕新
  • Java毕设选题推荐:基于 SpringBoot 的水务运行监测与智能应急决策系统的设计与实现 智慧水务突发事件调度处置系统【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 2026济宁黄金回收白银回收铂金回收旧料回收怎么选?五家高实价铂金白银线下门店测评清单 + 联系方式
  • 论文AI写作检测率高吗?2026最新检测数据
  • ACT:Learning Fine-Grained Bimanual Manipulation with Low-Cost Hardware
  • Doris离线部署与虚拟机扩容实战:从环境准备到资源管理的完整指南
  • SQL优化-索引扫描
  • 4563563
  • 2026年罗马尼亚EOR名义雇主服务商权威排行榜:揭晓五款精选五大方案
  • 合同管理的“三级跳”:道本×DeepSeek如何把三件事做到位
  • AI编程助手实战对比:Deepseek-V4 vs Claude-Opus工程能力深度解析
  • 仅限前500名开发者获取:LLM提示工程白皮书V3.2(含GPT-4.5适配层提示词迁移方案)
  • 2026视频去水印方法有哪些?靠谱视频去水印软件推荐
  • 新一代浏览器自动化框架:如何系统性解决Selenium的七大痛点
  • 生产级机器学习模型服务化落地实战指南
  • 机器学习论文精读四步法:从无效阅读到可复现操作
  • 机器学习系统工程实战:从模型上线到稳定服务的全链路体检
  • 【Java课程设计/毕业设计】基于 SpringBoot 的医疗机构中药材进销存运维系统的设计与实现 基于 SpringBoot 的中药材采购归档与库存统计系统【附源码、数据库、万字文档】
  • foo2zjs实战手册:解锁Linux打印兼容性的开源技术伙伴
  • 【学习记录】Week9(一):glibc堆结构精读与堆风水方法论——堆利用的基石
  • Seedance2.0实测:轻量级AI短剧生成闭环工具链
  • AI的灵感创作
  • 大模型轻量化推理技术选型与实践指南
  • DeepSeek V4本地部署三步落地:GGUF量化、API代理与中文Tokenizer实战
  • 基于Python的重庆市图书馆管理系统
  • JMeter邮件服务器压测实战:SMTP/POP3协议性能瓶颈定位与优化
  • 体制内必须用上的3个AI工具
  • Jakarta Validation 校验注解速查手册