尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
从零开始AI工程化:手写神经网络到部署的完整实践复盘
前阵子我把自己的“ai-engineering-from-scratch”项目完整复盘了一遍所谓从零开始不是用现成框架搭个demo就完事而是把数据、模型、训练、部署这条链路里的每个环节都亲手摸了一遍。这个项目既是我个人学习路线的总结也是一份可以照着走的地图。它适合三类人刚入门机器学习、但被各种概念和工具绕晕的初学者写过不少模型脚本、但想让自己的代码更工程化的同学以及想在一个完整项目里搞明白AI系统是怎么从无到有运转起来的实践者。这个项目解决的核心问题很朴素为什么别人能跑出漂亮的训练曲线、能顺利部署上线而你自己写的东西总是“本地能跑换台机器就垮”答案不是模型玄学而是工程细节。我把它拆成四块——路线设计、环境工具链、核心实现、坑位排查每块都填上了实际踩过的雷和对应的解法。1. 从零开始的项目定位与学习路线设计1.1 为什么要“从零开始”而不是直接调包市面上现成的AI框架太多PyTorch、TensorFlow、scikit-learn一装几十行代码就能出结果。但这样学下来很多人的困境是模型能跑但不知道loss曲线为什么长这样换个数据分布就不知道如何调参代码一放到服务器上就各种报错。从零开始做AI工程核心目的就是把黑盒打开。我给自己定的规矩每个核心概念先手写一遍再放开支持库。比如线性回归的最小二乘解我尝试不调sklearn.linear_model.LinearRegression用NumPy手推一遍正规方程反向传播我手写过一次矩阵求导才知道每一层shape变化是怎么回事。这个阶段很慢但慢得值。另外一个动因是AI工程不仅仅是模型代码它包含数据版本、特征存储、实验追踪、模型服务化、监控回滚等。这些在调包教程里几乎不会出现但真实项目中占了80%的工作量。从零开始意味着我不能跳过这些“脏活”正是这些“脏活”才是工程师和只会跑notebook的人的分水岭。1.2 硬核但可行的学习路线图我把从零开始的学习路线划分为四个阶段每个阶段都有明确出口避免永远在准备、永远不上手。第一阶段是基础数学与编程地基。高等数学的极限、导数、梯度线性代数中的矩阵运算概率论里的分布和最大似然不需要像数学系那样推导所有定理但必须能理解梯度下降里包不包含矩阵转置的逻辑。编程语言我选了Python但重点学习NumPy的多维数组、广播机制和向量化运算这些在后续手写网络时直接决定你跑得动还是跑不动。第二阶段是机器学习核心算法手写。从最简单的KNN、线性回归、逻辑回归开始然后是决策树和随机森林再到多层感知机。这个阶段坚持一个原则先在NumPy里实现一遍再和scikit-learn的结果对比。对比时看两个指标一是训练集上的拟合能力二是预测结果的最大误差。误差在可接受范围内说明你理解对了对不上就去Debug前向传播、损失函数和梯度。第三阶段是工程工具链。进入Git、Docker、MLflow、DVC这些工具。这个阶段解决的关键问题是“可复现”。我见过太多项目代码提交到GitHub但数据集没管、环境依赖没锁版本三个月后自己都跑不起来了。从零搭建AI工程必须把环境、数据、代码三样都固化成产物。第四阶段是端到端完整项目。我选了一个中等规模的任务房价预测加一个图像分类小项目。为什么要两个房价预测是典型的表格数据、梯度模型逻辑清晰适合验证数据清洗和特征工程图像分类则涉及卷积、数据增强、GPU训练能逼着你处理数据管线和显存问题。两个项目做完从零开始这件事才算闭环。我在实际规划中留了30%的缓冲时间给“卡壳”。比如手写CNN时我卡在im2col函数上了一个周末如果没有缓冲很容易产生挫败感而放弃。2. 环境与工具链搭建从裸机到可复现实验环境2.1 裸机起步Python、GPU、IDE和Docker的一次性配置环境搭建是我踩坑最多的区域尤其是GPU版本的CUDA和PyTorch匹配问题。我一开始图省事直接pip install torch结果跑的时候提示CUDA driver版本不够又去更新驱动连带系统里的其他库出了问题。正确的搭建姿势是先装好GPU驱动用nvidia-smi确认驱动支持的最高CUDA版本再根据这个版本去安装对应版本的PyTorch。举个例子驱动版本是535.183.01它支持的CUDA最高是12.2那么我就选择PyTorch官方预编译的cu121版本而不是最新的cu124。这一步搞定后用torch.cuda.is_available()验证不要着急跑训练。Python环境我用的是虚拟环境加Docker结合的方式。本地开发用virtualenv或conda但交付和运行统一用Docker。Docker镜像把操作系统、CUDA运行时、Python依赖都锁死镜像标签里标明项目版本比如ai-eng:0.3.0。这样不管是换机器还是给别人复现一行docker pull就完事不用再“碰运气”装环境。IDE方面我用VS Code加Remote Container插件直接在容器里写代码。这样调试时看到的路径就是容器内的环境不会出现本地和容器路径不一致导致数据加载报错的情况。运行docker run --gpus all --shm-size8g启动容器时--shm-size必须设置否则PyTorch的多进程DataLoader会报共享内存不足。2.2 数据、代码和实验的三版控制AI工程里代码用Git做版本管理远远不够数据集也必须纳入版本管理。我用DVCData Version Control管理数据目录。第一次看很反直觉DVC本身不存数据二进制内容而是把数据文件的哈希和存储位置记录下来再用dvc push推到S3或本地文件服务器。这样Git仓库里只有几十MB的元数据但数据集每个历史版本都能精确回溯。实验记录的痛点则是“试过哪些超参、哪个结果最好”。我一开始用Excel记录很快发现误差太多改错一个值就得重新对账。后来换成了MLflow每个实验跑完后自动把参数、指标、模型文件、标签记录到后端。mlflow.set_experiment(housing-price)之后每次运行的mlflow.log_param(lr, 0.01)和mlflow.log_metric(rmse, 2.3)都会固化。在模型训练脚本里加三行代码价值远超想象——你可以在十几次实验后直接拿MLflow的UI做排序选出最低RMSE对应的run再用mlflow.register_model把那个模型注册成版本。对于代码本身我从一开始就养成了“一次提交对应一个可运行状态”的习惯。哪怕只是改了注释只要跑得通就提交搭配清晰的commit message比如feat: add early stopping callback。这比写一大堆分支有用得多也让以后回滚某个坏掉的实验时能准确定位到是哪次提交导致的。3. 核心实现手写一个迷你神经网络并工程化3.1 项目选型与数据准备先拿房价预测练手我的从零实现项目选了“波士顿房价”的替代品——加州住房数据集因为有历史原因波士顿那个数据集有隐私争议edu平台都不建议教学使用了。加州住房数据集包含8个特征都是连续值回归任务非常适合线性模型和简单神经网络的对比验证。数据准备阶段我干了三件事缺失值统计、离群点观察、特征归一化。用df.info()和df.isna().sum()看缺失率缺失超过30%的特征我直接丢弃缺失少的用中位数填充。离群点画了箱线图比如households特征有极大值代表大公寓楼回归模型对极端值很敏感我做了一个剪枝把超过99.5%分位的样本删除训练时收敛明显更稳。归一化我选择了StandardScaler把特征变成均值为0、标准差为1。这一步必须只对训练集做再对测试集做同样的变换否则就用到了未来信息造成数据泄漏。数据准备完成后划分so训练集、验证集、测试集比例设为8:1:1。我特意加了随机种子random_state42保证每次运行划分一致这能让实验对比公平。3.2 手写梯度下降和反向传播的实操细节我实现了一个两层的全连接网络隐藏层用ReLU输出层用线性激活损失函数用均方误差MSE。整个核心代码核心集中在几个NumPy矩阵运算上。前向传播逻辑# 单层前向保留中间变量用于反向传播 z1 X W1 b1 a1 np.maximum(0, z1) # ReLU z2 a1 W2 b2 y_hat z2 loss np.mean((y_hat - y) ** 2)反向传播时最关键的是记住每一边的shape。我在手写的时候犯过一个典型错误dW2 a1.T d_z2写成a1 d_z2.T导致维度对不上或者结果完全错误。踩坑之后我的办法是写shape注释# a1: [batch, hidden] - a1.T: [hidden, batch] # d_z2: [batch, 1] - a1.T d_z2: [hidden, 1]然后让公式和shape互相校验。如果你的矩阵乘法结果shape对不上那一定是把转置放错了位置。梯度下降更新参数时我加了一个小技巧——梯度裁剪。因为刚从零写出来的网络经常出现loss变成NaN原因就是某一层梯度过大。用grad_clip np.clip(grad, -1.0, 1.0)将梯度限制在[-1,1]区间问题立刻缓解。这个方法比调学习率见效快也帮助我理解了为什么现代框架有clip_grad_norm_这个函数。训练循环里我用mini-batch方法batch_size取32学习率0.01训练轮次100。每轮计算验证集上的RMSE并保存验证集上最好的模型参数。我还实现了一个简单的early stopping验证集RMSE连续10轮不下降就停止训练并恢复最佳参数。3.3 把训练得到的模型封装成可复用接口从零实现目的不是写一个一次性脚本而是做成一个小型AI工程模块。我最后整理出的项目结构是这样的ai-engineering-from-scratch/ ├── data/ # 存放原始数据及DVC管理 ├── src/ │ ├── data_prep.py # 清洗、归一化、划分数据集 │ ├── model.py # 手写网络类包含forward/backward/predict │ ├── train.py # 训练脚本记录MLflow │ └── evaluate.py # 评估脚本输出MAE/RMSE ├── docker/ │ └── Dockerfile ├── dvc.yaml └── requirements.txt模型类里除了fit和predict我还加了一个save和load方法把训练好的权重用np.savez保存为压缩格式。这样后续部署时只需要加载权重文件并执行前向传播不依赖原始的训练环境。这个封装思路是从零开始项目向生产环境过渡的第一步如果以后想过度到PyTorch只需替换内部实现接口不变。4. 常见问题与排查技巧实录4.1 训练不收敛、loss爆炸和过拟合的快速定位训练跑不起来或者效果极差时我有一套固定的排查顺序。第一步看loss是否大于一个合理边界。如果第一轮loss就是几百先查数据归一化特征没有归一化时MSE期望值随特征量级大幅波动。第二步看梯度打印每层梯度的均值和范数如果梯度极大优先做梯度裁剪。第三步看学习率学习率0.1在MSE上大概率振荡降到0.001后loss曲线立即丝滑。过拟合我用的是四件套增加训练数据量、加正则化、加dropout、早停。手工神经网络里实现L2正则化很简单在权重梯度上加上lambda * w。dropout则在隐藏层输出后随机mask元素同时注意只在训练时启用推理时不用。吃了几次亏之后我学到的关键一点评估模型时务必关掉dropout否则预测结果每次都不一样你都不知道该信哪个。数据泄漏是个隐蔽问题。有一次我发现验证集RMSE出奇地低仔细排查才发现我在归一化时把训练集和验证集混在一起做了StandardScaler拟合。修正方式是先fit训练集的Scaler再用这个Scaler去transform验证集和测试集。记住所有来自全局的统计信息只能从训练集中计算。4.2 环境依赖和容器运行的“一言难尽”时刻Docker跑GPU应用时常见报错是could not select device instance with token这种通常是因为容器没启用GPU。解决方法是启动时加--gpus all还要确认NVIDIA Container Toolkit已经装好。另一个高频问题是/usr/lib/x86_64-linux-gnu/libgomp.so.1: version GOMP_4.0 not found为了NVIDIA官方镜像古老的CUDA-11.0版本很容易触发。直接升级镜像到nvidia/cuda:12.2.0-runtime-ubuntu22.04即可。依赖版本冲突我也遇到过很多次比如numpy版本要求冲突。我的对策是用requirements.txt锁定精确版本包括传递依赖。可以使用pip freeze requirements.lock.txt生成锁定文件但不要让这个文件过于宽泛否则换机器后依然可能出问题。更彻底的做法是依赖Docker镜像层把requirements.lock.txt作为镜像构建的一部分镜像内环境完全隔离外界哪怕pip install了再多的包也不会影响容器内部。还有一个细节DataLoader多进程时的num_workers设得过大本机内存不足容器直接OOM。我一般从num_workers2开始调逐步增加到CPU核数的一半观察内存占用。遇到共享内存报错就加--shm-size4g实在不行就把num_workers降到0用单进程加载反正数据集不算大代价只是慢十分钟。4.3 问题速查表现象可能原因快速解法loss是NaN梯度爆炸、学习率过大梯度裁剪、降低lr到1e-3或1e-4训练loss下降但验证loss上升过拟合加L2正则、dropout、早停验证loss异常低数据泄漏检查归一化/特征选择是否用到全局信息数据集路径错误容器内外路径不一致统一使用容器内路径或挂载时-v指定一致目录GPU显存不足batch_size过大或特征图太多减小batch_size或使用torch.cuda.amp混合精度训练慢但CPU占用不高DataLoader瓶颈、GPU等待提高num_workers利用prefetch不同运行结果差异大随机种子未固定设置seed并固定NumPy/PyTorch/random手写代码梯度与数值梯度不一致反向传播公式有误用数值梯度检查法grad_check解析梯度与f(xeps)-f(x-eps) / 2eps比较数值梯度检查法是手写网络调试的神器。我在写完手写反向传播后写了一个assert_grad_close函数对每个参数用有限差分逼近真实梯度然后跟手算梯度做对比相对误差小于1e-4就认为反向传播实现正确。没有它我大概率要把那个a1.T d_z2的bug留到很久之后才痛苦地发现。5. 项目复盘与个人实操体会5.1 我改变的三个习惯复盘整个“ai-engineering-from-scratch”项目过程我最深的三个心得如下。第一把“能跑”和“跑得对”分开。以前我写完代码只确认它没报错现在会额外检查数值正确性比如用手算的数据验证前向输出用梯度检查验证反向传播用标准化后的指标评估模型。多花30分钟换来的是后续排错节省三天。第二每一次实验都应留下可复现的痕迹。我不再临时改参数就跑而是固定实验配置到YAML文件把配置文件的哈希一并记录到MLflow。这样即使同一个模型跑了十次每一条记录对应什么配置一清二楚。第三先想清楚如何评估再动手训练。我一开始只盯着RMSE忽略了模型在不同区间的表现差异后来加入了MAE和预测值分布直方图发现模型对高价位房屋的系统性低估。如果不分层分析这个缺口很难从单一指标里看出来。5.2 从零开始之后还能怎么扩展这个项目做完之后我建议的下一步不是急着堆更多模型而是把现有的模型服务化。我后来写了一个简单的FastAPI服务把predict方法暴露成POST /predict接口输入特征JSON返回预测值。然后加上了Prometheus监控指标记录推理耗时和请求量。这些看起来不起眼但正是生产和研究环境的差距所在。如果做深度学习扩展可以把手写网络替换为PyTorch实现但在替换时我建议保留手写版本作为“参照物”用同一个数据集、同样的超参跑一遍对比两个版本的loss曲线可以验证框架是否与你的理解一致。我现在经常这么干它能帮你发现你对某个算子的理解错误而不是简单信框架的“正确”。最后想说的是“ai-engineering-from-scratch”这个项目最宝贵的产物不是模型精度而是你亲手揭开重重黑盒后形成的直觉。你会知道梯度为什么容易消失知道卡住时应该去看梯度范数还是看数据比例知道替换环境时最可能坏在哪。这种直觉无法从任何教程里直接抄来只能通过一次次从零开始构建来积累。如果你的项目正处于相似阶段别怕慢一步一步亲手做比再多的速成课都管用。
RELATED

相关推荐

Python实现EAST与CRNN的OCR文字检测识别全流程

Python实现EAST与CRNN的OCR文字检测识别全流程

简介:这份资源面向图像文字检测与识别方向的学习者,提供一套基于 Python 的完整实现方案,适合作为课程设计、毕业设计或工程实训的参考项目。代码采用 Keras 搭配 TensorFlow 后端编写,便于生产环境部署与维护。其中 EAST 模型负责…

📅 2026/10/1 12:13:05
Python图像文字检测与识别:EAST+CRNN+CTC实战指南

Python图像文字检测与识别:EAST+CRNN+CTC实战指南

简介:这份资源面向希望入门或进阶自然场景文字检测与识别的学习者,可作为课程设计、毕业设计、大作业或工程实训的参考项目。其核心是用Keras配合TensorFlow后端实现EAST文字检测与CRNNCTC文字识别:EAST以目标检测方式回归文本框四角坐标&…

📅 2026/10/1 12:13:05
基于Python与U-Net的眼底图像视杯视盘分割实战

基于Python与U-Net的眼底图像视杯视盘分割实战

简介:基于Python的眼底图像视杯视盘分割项目,面向计算机、人工智能等专业课程设计或毕业设计场景,提供完整源码、文档说明与截图演示。项目实现了视杯、视盘及血管的自动分割与可视化,支持杯盘比(vCDR)计算…

📅 2026/10/1 12:13:05
MORE NEWS

更多资讯

📰

聚合AI外贸GEO服务商哪家强?适用于小语种站点与Google/Bing双引擎优化

海外买家正在转向AI提问,外贸获客逻辑已经变了全球贸易数字化进程正在加速,海外采购商的决策入口正在发生根本性迁移。过去是搜关键词、打开网页、逐一比较,如今越来越多买家直接向ChatGPT、Gemini、Claude等AI提问:有哪些靠谱的中…

📰

Pi实战 04:多智能体与高级工作流篇

Pi实战 04:多智能体与高级工作流篇 来源:Pi 作者 Mario Zechner 博客、ruizrica2 开源项目 “agent”、HN 讨论、Reddit r/PiCodingAgent、cmux 演示。 Pi 没有内置子代理(sub-agents)、没有 plan mode、没有后台 bash。官方态度很…

📰

从零搭建AI工程:提示词、Agent与RAG实战指南

如果你在 GitHub 上搜过 ai-engineering-from-scratch 这个名字,应该能猜到它不是一个“调几个 API 跑个 demo”的玩具项目。它是一个从零到一、把大模型应用从想法推到生产环境的完整方法论,核心覆盖提示词工程(Prompt Engineering&#x…

📰

2026本地部署大模型完全指南:工具选型、量化部署与生产加固

1. 项目概述:为什么2026年“本地部署大模型”不再是极客玩具,而是生产力刚需2026年,我拆开第三台二手RTX 4090工作站时,手边正跑着一个刚微调完的7B参数模型——它正在帮我自动整理过去三年所有会议录音的要点,并同步生…

📰

开源模型一键部署成 OpenAI 兼容 API:四种推理引擎路线

你手里有一批不错的开源模型,可是绕不开一个问题:怎么让现有系统以最小成本用起来?最省事的答案就是“OpenAI 兼容 API”。不管是 ChatGPT、Claude 还是开源模型,只要服务方提供一套长得像 OpenAI 格式的接口,所有基于…

📰

DeepSeek Harness架构实战:MCP协议、Skill桥接与Token预算工程指南

1. 这不是创业故事,是单人Agent工程极限压力测试的实录 “一个人、九个月、20万行代码、每个月烧掉40亿 token”——这行标题在技术圈刷屏时,我第一反应不是惊叹,而是立刻打开终端查了查自己上周的OpenRouter账单:378万token。数字…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬