摘要:大多数人工智能教程都止步于真正的工作开始之处。它们只展示了如何加载模型、运行推理,甚至对小型数据集进行微调——但却很少讨论在实际系统中部署该模型时会发生什么。而这才是真正的挑战所在。
大多数人工智能教程都止步于真正的工作开始之处。它们只展示了如何加载模型、运行推理,甚至对小型数据集进行微调——但却很少讨论在实际系统中部署该模型时会发生什么。而这才是真正的挑战所在。
在本文中,我将分析我在构建真实人工智能项目过程中遇到的 8 个难题(最终我找到了答案)。每个部分都包含实用步骤、完整的代码示例,以及我希望有人早点告诉我的经验教训。
刚开始的时候,我浪费了好几个小时来安装和重新安装库。解决办法是什么?从第一天开始就将你的环境容器化。
# Dockerfile for AI projectsFROM python:3.11-slimRUN apt-get update && apt-get install -y \build-essential \git \&& rm -rf /var/lib/apt/lists/*WORKDIR /appCOPY requirements.txt requirements.txtRUN pip install --no-cache-dir -r requirements.txtCOPY . .CMD ["python", "main.py"]为什么这很重要:可重复性。如果你的环境不可重复,那么当你从开发环境转移到生产环境时,你的模型就会崩溃。
模型失败并非因为本身质量差,而是因为数据质量差。在我参与的 80% 项目中,最大的收益来自于数据清理,而不是花哨的架构。
import pandas as pdfrom sklearn.model_selection import train_test_splitdf = pd.read_csv("customer_data.csv")# drop duplicatesdf = df.drop_duplicates# handle missing valuesdf = df.fillna(method="ffill")# encode categorical valuesdf = pd.get_dummies(df, columns=["city", "gender"])# split datatrain, test = train_test_split(df, test_size=0.2, random_state=42)专业提示:务必可视化类别分布。不平衡的数据会悄无声息地破坏你的模型。
在尝试最新的 Transformer 架构之前,务必先从一个简单的基线模型开始。你会惊讶地发现,它通常“足够好”。
from sklearn.ensemble import RandomForestClassifierfrom sklearn.metrics import classification_reportX_train = train.drop("label", axis=1)y_train = train["label"]X_test = test.drop("label", axis=1)y_test = test["label"]model = RandomForestClassifier(n_estimators=100, random_state=42)model.fit(X_train, y_train)y_pred = model.predict(X_test)print(classification_report(y_test, y_pred))这虽然不怎么引人注目,但它能给你一个基准。只有这样,你才应该引入深度学习。
如果您不跟踪实验,那么您就只能猜测了。像 MLflow 这样的工具可以防止您在尝试了 30 种超参数组合却忘记了哪种组合有效时陷入混乱。
pip install mlflowimport mlflowimport mlflow.sklearnwith mlflow.start_run:model = RandomForestClassifier(n_estimators=200)model.fit(X_train, y_train)mlflow.sklearn.log_model(model, "model")mlflow.log_param("n_estimators", 200)mlflow.log_metric("accuracy", model.score(X_test, y_test))结果:每次运行都会记录指标、参数和结果。不再需要用便签记录超参数。
微调可能成本高昂。通常,从预训练模型中提取特征就足够了。
from transformers import AutoTokenizer, AutoModelimport torchtokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")model = AutoModel.from_pretrained("bert-base-uncased")inputs = tokenizer("AI is transforming workflows", return_tensors="pt")with torch.no_grad:embeddings = model(**inputs).last_hidden_state.mean(dim=1)print(embeddings.shape) # (1, 768)关键洞察:除非拥有大量高质量的数据,否则不要进行全面训练。请使用迁移学习。
如果没有人可以访问,您的模型就毫无用处。FastAPI 可以在几分钟内将模型转换为 API。
pip install fastapi uvicornfrom fastapi import FastAPIimport joblibapp = FastAPImodel = joblib.load("model.pkl")@app.post("/predict")def predict(features: dict):prediction = model.predict([list(features.values)])return {"prediction": prediction.tolist}运行服务器:
uvicorn main:app --reload现在你的模型是一个 HTTP 端点。简单、强大,并且可以投入生产。
7、生产环境中的监控我第一次部署模型时,以为已经完成了。两周后,准确率下降了 20%。原因是什么?数据漂移。
from evidently.report import Reportfrom evidently.metric_preset import DataDriftPresetreport = Report(metrics=[DataDriftPreset])report.run(reference_data=train, current_data=test)report.save_html("report.html")经验教训:模型不会突然失效,它们会缓慢退化。监控并非可有可无。
你的队友不会运行 Python 脚本,他们想要一个按钮。Gradio 来了。
pip install gradioimport gradio as grimport joblibmodel = joblib.load("model.pkl")def predict(input1, input2):return model.predict([[input1, input2]])[0]demo = gr.Interface(fn=predict, inputs=["number", "number"], outputs="label")demo.launch现在任何人都可以通过简洁的 Web 界面使用你的模型。
经过多年的 AI 系统构建,我发现一个残酷的事实:最难的不是训练模型,而是围绕模型的一切。数据管道、监控、部署、可用性——项目生死攸关。
值得铭记的名言:“业余爱好者谈论模型,专业人士谈论数据管道。”
如果你想在人工智能领域更上一层楼,那就别再纠结于架构,开始掌握自动化、部署和监控。这才是交付真实系统的方法。
来源:小思说科技