从零构建AI工程化项目:MLflow、DVC与Kubernetes实战指南

news2026/5/5 19:32:05
1. 项目概述与核心价值最近在GitHub上看到一个名为“ai-engineering-from-scratch”的项目作者是rohitg00。这个标题本身就充满了吸引力它直指当前技术领域最热门也最令人困惑的交叉点人工智能工程化。作为一名在软件开发和系统架构领域摸爬滚打了十多年的从业者我深知从零开始构建一个完整的AI工程化项目意味着什么。这绝不仅仅是调几个API或者跑通一个Jupyter Notebook那么简单它涉及从数据处理、模型训练、服务部署到监控维护的完整生命周期是一个系统工程问题。这个项目吸引我的地方在于“from-scratch”从零开始这个关键词。它暗示了一种不依赖黑盒服务、深入理解底层原理的实践路径。在AI应用爆炸式增长的今天很多团队和个人倾向于直接使用云服务商提供的现成AI服务这虽然能快速实现功能但也带来了成本不可控、技术栈锁定、模型可解释性差以及难以针对特定业务场景深度优化等一系列问题。因此掌握从零搭建AI工程化流水线的能力对于希望构建核心竞争力的技术团队和个人开发者而言变得至关重要。这个项目很可能就是一份关于如何系统化、工程化地实践AI开发的路线图或工具箱它面向的是那些不满足于“调包”希望深入理解并掌控AI应用全栈技术的工程师、研究员和技术决策者。2. 项目核心架构与设计思路拆解2.1 从“炼丹”到“工程”理念的转变传统的AI开发尤其是学术研究或小规模原型验证阶段常常被戏称为“炼丹”。数据科学家或研究员在一个相对隔离的环境如本地Jupyter Notebook中进行数据探索、特征工程和模型实验。一旦模型在验证集上取得了不错的指标项目往往就宣告“成功”。然而要将这个模型转化为一个稳定、可靠、可扩展的线上服务中间隔着巨大的鸿沟。这就是AI工程化要解决的核心问题。一个典型的AI工程化项目其生命周期至少包含以下几个关键阶段数据管理与版本控制如何高效地获取、清洗、标注海量数据如何对数据集进行版本化管理确保实验的可复现性模型开发与实验跟踪如何在团队协作中高效地进行模型实验如何系统地记录每一次实验的超参数、代码版本、数据集版本和性能指标模型训练与资源调度如何利用分布式计算资源如GPU集群加速训练如何管理训练任务的生命周期排队、调度、容错模型评估与验证除了准确率、F1值等离线指标如何设计面向业务的在线评估体系如A/B测试模型部署与服务化如何将训练好的模型打包成可服务的API如何管理模型版本如金丝雀发布、滚动更新如何保证服务的高可用和低延迟监控与持续学习线上服务如何监控预测性能的衰减概念漂移如何设计数据闭环利用线上反馈数据持续优化模型“ai-engineering-from-scratch”项目其设计思路必然是围绕上述完整生命周期展开的。它不会只教你用PyTorch或TensorFlow写一个模型而是会教你如何用工程化的工具链如DVC、MLflow、Kubeflow、FastAPI、Prometheus等将这些环节串联起来构建一个自动化、可观测、可维护的AI系统。2.2 技术栈选型背后的逻辑基于“从零开始”的理念项目在技术栈选型上可能会倾向于开源、可自托管、社区活跃的组件而非完全绑定某一家云厂商。以下是我推测项目可能涉及的核心技术栈及其选型理由数据与实验管理DVC (Data Version Control)这是一个将Git扩展到数据领域的工具。在AI项目中代码和模型固然重要但数据才是真正的“一等公民”。DVC允许你像管理代码一样通过Git来追踪大型数据集和模型文件的版本同时将实际文件存储在高性能的远程存储如S3、GCS、MinIO中。选它的理由是其与Git的无缝集成和出色的数据管道pipeline定义能力。MLflow由Databricks开源是目前最主流的机器学习生命周期管理平台之一。它的Tracking组件用于记录实验参数、指标和产出物模型、图表Projects用于打包可复现的代码Models用于模型打包和部署。选型理由是功能全面、社区生态好且与多种ML框架兼容。工作流编排与资源调度Kubeflow Pipelines或Apache Airflow对于复杂的、多步骤的机器学习流水线如数据预处理 - 特征工程 - 模型训练 - 模型评估需要一个工作流编排引擎。Kubeflow Pipelines深度集成Kubernetes原生支持容器化任务和GPU资源管理非常适合云原生AI场景。Airflow则更为通用调度能力极强但需要更多配置才能完美适配ML任务。如果项目强调云原生Kubeflow的可能性更大。Docker Kubernetes容器化和编排是现代化工程实践的基石。Docker确保模型训练和服务环境的一致性Kubernetes则提供了弹性的资源调度、服务发现和负载均衡能力是实现模型服务高可用的关键。模型服务化FastAPI或TensorFlow Serving / TorchServe对于将模型暴露为REST APIFastAPI因其高性能、自动生成API文档和易于使用而备受青睐适合包装自定义的推理逻辑。而TensorFlow Serving和TorchServe是框架原生的高性能服务化工具对自家模型格式支持最好吞吐量和延迟优化更到位。项目可能会同时介绍两者让开发者根据场景选择。监控与可观测性Prometheus Grafana这对黄金组合是云原生监控的事实标准。Prometheus可以抓取模型服务的各项指标如请求延迟、QPS、错误率Grafana则用于可视化。项目需要教你如何为模型服务定义和暴露自定义的业务指标比如预测结果的分布、特定类别样本的准确率等。Evidently AI或WhyLogs这些是专门用于监控数据漂移和模型性能的工具。它们可以定期分析线上服务接收的数据特征分布并与训练数据进行比较从而在业务指标下降之前预警概念漂移。注意技术选型没有银弹。项目的价值在于清晰地阐述每个工具在AI工程化流水线中的具体角色、解决了什么问题以及它们之间如何协同工作而不是简单地罗列一堆流行技术。3. 核心模块深度解析与实操要点3.1 数据版本化与管道管理实战数据是AI项目的燃料管理不善会导致实验无法复现、团队协作混乱。DVC在这里扮演了核心角色。实操步骤初始化与远程存储配置# 在项目根目录初始化DVC dvc init # 添加远程存储以Amazon S3为例 dvc remote add -d myremote s3://my-bucket/dvc-storage # 配置S3访问密钥也可通过环境变量或IAM角色 dvc remote modify myremote access_key_id YOUR_ACCESS_KEY dvc remote modify myremote secret_access_key YOUR_SECRET_KEY这里的关键是理解dvc remote的概念。DVC本身不存储大文件它只生成一个指向远程存储中实际文件位置的.dvc指针文件。这个指针文件很小可以随代码一起用Git管理。跟踪大型数据集# 假设你有一个data/raw目录存放原始数据 dvc add data/raw执行后DVC会将data/raw目录下的文件上传到你配置的远程存储如S3并在本地生成一个data/raw.dvc文件。你需要将data/raw.dvc和其对应的.gitignore文件DVC自动生成提交到Git仓库。定义可复现的数据处理管道 DVC的强大之处在于其管道Pipeline功能。你可以在dvc.yaml文件中定义一系列阶段stages。stages: prepare: cmd: python src/prepare.py data/raw data/prepared deps: - src/prepare.py - data/raw outs: - data/prepared params: - prepare.seed - prepare.test_size train: cmd: python src/train.py data/prepared model.pkl deps: - src/train.py - data/prepared outs: - model.pkl params: - train.learning_rate - train.batch_size metrics: - scores.json: cache: false # 指标文件通常不缓存每个stage定义了命令(cmd)、依赖(deps)、输出(outs)、参数(params)和指标(metrics)。运行dvc repro命令DVC会根据依赖关系自动判断哪些阶段需要重新执行确保了整个数据处理和训练流程的自动化与可复现性。实操心得.dvc文件要提交大文件不上传务必牢记只有.dvc文件进Git。首次dvc push将数据推送到远程团队成员git pull后需要运行dvc pull来同步数据。参数化一切将数据处理和模型训练中的可变因素如随机种子、训练轮数、学习率都定义为params。这样你可以通过dvc params diff轻松比较不同实验的参数差异。管道设计要模块化将复杂的流程拆分成多个小的、职责单一的stage这样不仅清晰也便于单独重跑某个失败的环节。3.2 实验跟踪与模型注册的艺术MLflow Tracking Server是我们所有实验的“实验室笔记本”。它的正确使用是团队协作和模型管理的基础。部署与集成启动MLflow Tracking Server最简单的方式是使用Docker。docker run -p 5000:5000 -v ./mlruns:/mlruns ghcr.io/mlflow/mlflow:v2.9.2这将启动一个服务器并将实验数据存储在本地./mlruns目录。生产环境建议配置后端存储如PostgreSQL和对象存储如S3用于存储Artifacts。在训练代码中集成MLflowimport mlflow import mlflow.sklearn # 如果你用scikit-learn # 设置跟踪服务器的URI mlflow.set_tracking_uri(http://localhost:5000) # 设置实验名称 mlflow.set_experiment(Customer-Churn-Prediction) # 开始一个实验运行 with mlflow.start_run(run_namexgboost_baseline): # 记录参数 mlflow.log_param(learning_rate, 0.1) mlflow.log_param(max_depth, 6) # 训练模型... model train_model(X_train, y_train, params) # 评估模型 accuracy, f1 evaluate_model(model, X_test, y_test) # 记录指标 mlflow.log_metric(accuracy, accuracy) mlflow.log_metric(f1_score, f1) # 记录图表如混淆矩阵 fig plot_confusion_matrix(...) mlflow.log_figure(fig, confusion_matrix.png) # 记录模型自动记录框架、环境等信息 mlflow.sklearn.log_model(model, model) # 也可以记录任意文件 mlflow.log_artifact(feature_importance.csv)运行代码后打开http://localhost:5000你就能看到一个清晰的UI展示所有实验的运行记录可以对比不同运行的参数和指标。模型注册表Model Registry进阶 当模型通过离线评估后需要将其推送到线上环境。MLflow Model Registry提供了模型版本控制和生命周期管理。注册模型在UI界面或通过API可以将某个运行产生的模型注册到名为Churn-Production的模型库中。版本控制与阶段转换注册后产生Version 1。你可以将其阶段Stage从None改为Staging进行预发布测试。测试通过后再改为Production。同一时间只有一个版本可以处于Production阶段这天然支持了金丝雀发布和回滚。API调用部署服务时可以通过mlflow.pyfunc.load_model(model_urimodels:/Churn-Production/Production)来加载处于生产阶段的最新模型实现模型更新与服务的解耦。提示将MLflow Tracking Server的访问URI设置为环境变量而不是硬编码在代码中。这样便于在不同环境开发、测试、生产中切换。4. 模型服务化与云原生部署实战4.1 基于FastAPI构建模型API服务FastAPI以其现代、快速和易用性成为构建模型API服务的首选。下面我们构建一个完整的服务。项目结构model_service/ ├── app/ │ ├── __init__.py │ ├── main.py # FastAPI应用主文件 │ ├── api.py # 路由定义 │ ├── models.py # Pydantic数据模型 │ ├── ml_model.py # 模型加载与预测逻辑 │ └── dependencies.py # 依赖项如模型加载器 ├── requirements.txt ├── Dockerfile └── tests/核心代码解析 (app/main.py和app/ml_model.py):# app/ml_model.py import mlflow.pyfunc import logging from typing import Any, Dict import pandas as pd logger logging.getLogger(__name__) class ModelLoader: 模型加载器实现单例模式避免重复加载模型 _instance None _model None def __new__(cls): if cls._instance is None: cls._instance super(ModelLoader, cls).__new__(cls) cls._instance.load_model() return cls._instance def load_model(self): 从MLflow Model Registry加载生产环境模型 try: # 模型URI格式models:/model_name/stage model_uri models:/Churn-Production/Production logger.info(fLoading model from {model_uri}) self._model mlflow.pyfunc.load_model(model_uri) logger.info(Model loaded successfully.) except Exception as e: logger.error(fFailed to load model: {e}) raise def predict(self, input_data: Dict[str, Any]) - Dict[str, Any]: 执行预测 if self._model is None: raise RuntimeError(Model is not loaded.) # 将输入字典转换为DataFrameMLflow pyfunc模型通用输入格式 input_df pd.DataFrame([input_data]) prediction self._model.predict(input_df) # 假设是二分类返回概率和类别 probability float(prediction[0]) if isinstance(prediction[0], (np.floating, float)) else 0.0 return { prediction: churn if probability 0.5 else no_churn, probability: probability, model_version: 1.0 # 可以从模型元数据中动态获取 } # app/main.py from fastapi import FastAPI, Depends from app.api import router as api_router from app.ml_model import ModelLoader from contextlib import asynccontextmanager import logging logging.basicConfig(levellogging.INFO) logger logging.getLogger(__name__) asynccontextmanager async def lifespan(app: FastAPI): 生命周期管理启动时加载模型关闭时清理可选 # 启动时 logger.info(Starting up... Loading ML model.) # 初始化ModelLoader会触发模型加载 _ ModelLoader() yield # 关闭时 logger.info(Shutting down...) app FastAPI(titleCustomer Churn Prediction API, lifespanlifespan) # 包含路由 app.include_router(api_router, prefix/api/v1) # app/api.py from fastapi import APIRouter, Depends, HTTPException from pydantic import BaseModel from app.ml_model import ModelLoader import logging router APIRouter() logger logging.getLogger(__name__) # 定义请求/响应数据模型 class PredictionRequest(BaseModel): customer_id: str tenure: int monthly_charges: float total_charges: float # ... 其他特征 class PredictionResponse(BaseModel): customer_id: str prediction: str probability: float model_version: str router.post(/predict, response_modelPredictionResponse) async def predict( request: PredictionRequest, model_loader: ModelLoader Depends(lambda: ModelLoader()) # 依赖注入 ): try: # 将Pydantic模型转换为字典 input_dict request.dict() # 调用模型预测 result model_loader.predict(input_dict) return PredictionResponse( customer_idrequest.customer_id, **result ) except Exception as e: logger.exception(fPrediction failed for {request.customer_id}) raise HTTPException(status_code500, detailstr(e))Docker化封装# Dockerfile FROM python:3.10-slim WORKDIR /app # 安装系统依赖如有需要 # RUN apt-get update apt-get install -y --no-install-recommends gcc ... # 复制依赖文件并安装 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 复制应用代码 COPY ./app ./app # 暴露端口 EXPOSE 8000 # 启动命令使用uvicorn提升性能 CMD [uvicorn, app.main:app, --host, 0.0.0.0, --port, 8000, --workers, 4]4.2 Kubernetes部署与弹性伸缩将Docker镜像部署到Kubernetes集群是实现高可用、弹性伸缩的最终步骤。关键Kubernetes资源配置文件Deployment (deployment.yaml)定义应用副本和更新策略。apiVersion: apps/v1 kind: Deployment metadata: name: churn-model-api spec: replicas: 3 # 初始3个副本 selector: matchLabels: app: churn-model-api template: metadata: labels: app: churn-model-api spec: containers: - name: api image: your-registry/churn-model-api:latest ports: - containerPort: 8000 env: - name: MLFLOW_TRACKING_URI # 通过环境变量配置MLflow地址 value: http://mlflow-server.default.svc.cluster.local:5000 resources: requests: memory: 512Mi cpu: 250m limits: memory: 1Gi cpu: 500m livenessProbe: httpGet: path: /health # 需要在API中添加健康检查端点 port: 8000 initialDelaySeconds: 30 periodSeconds: 10 readinessProbe: httpGet: path: /ready port: 8000 initialDelaySeconds: 5 periodSeconds: 5livenessProbe和readinessProbe至关重要它们确保Kubernetes能正确管理Pod的生命周期。Service (service.yaml)为Pod提供稳定的网络访问入口。apiVersion: v1 kind: Service metadata: name: churn-model-api-service spec: selector: app: churn-model-api ports: - port: 80 targetPort: 8000 type: ClusterIP # 内部访问如需对外暴露可使用NodePort或IngressHorizontal Pod Autoscaler (hpa.yaml)根据CPU或自定义指标自动伸缩。apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: churn-model-api-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: churn-model-api minReplicas: 2 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 70 # 可以添加基于自定义指标如QPS的伸缩需要安装Metrics Server和Prometheus Adapter部署命令# 构建并推送镜像 docker build -t your-registry/churn-model-api:latest . docker push your-registry/churn-model-api:latest # 应用Kubernetes配置 kubectl apply -f deployment.yaml kubectl apply -f service.yaml kubectl apply -f hpa.yaml # 查看状态 kubectl get pods,svc,hpa5. 监控、可观测性与持续迭代5.1 集成Prometheus与Grafana模型服务上线后监控其健康度和业务指标是运维的核心。在FastAPI应用中暴露指标使用prometheus-fastapi-instrumentator中间件。# app/main.py 中添加 from prometheus_fastapi_instrumentator import Instrumentator instrumentator Instrumentator().instrument(app) instrumentator.expose(app) # 通常在lifespan启动后调用这会自动暴露/metrics端点包含请求计数、延迟等标准HTTP指标。添加自定义业务指标监控预测结果的分布。from prometheus_client import Counter, Histogram PREDICTION_COUNTER Counter(model_predictions_total, Total predictions, [model_version, outcome]) PREDICTION_LATENCY Histogram(model_prediction_latency_seconds, Prediction latency in seconds) # 在预测函数中记录 router.post(/predict) async def predict(...): start_time time.time() try: result model_loader.predict(input_dict) outcome result[prediction] # 记录成功预测 PREDICTION_COUNTER.labels(model_versionresult[model_version], outcomeoutcome).inc() return result except Exception as e: # 记录失败预测 PREDICTION_COUNTER.labels(model_versionunknown, outcomeerror).inc() raise finally: PREDICTION_LATENCY.observe(time.time() - start_time)配置Prometheus抓取与Grafana看板在Prometheus配置中添加Job来抓取你服务的/metrics端点。然后在Grafana中创建看板可视化服务总QPS和延迟P99 P95。各模型版本的调用量和成功率。预测结果如churnvsno_churn的分布变化。系统资源使用率CPU 内存。5.2 数据漂移检测与模型迭代模型性能衰减往往源于线上数据分布概念漂移或特征与预测目标关系协变量漂移的变化。我们需要主动检测。使用Evidently AI进行周期性检测创建检测脚本定期如每天从线上服务日志或特征存储中采样一批预测请求和结果与训练集参考数据进行比较。import pandas as pd from evidently.report import Report from evidently.metric_preset import DataDriftPreset, TargetDriftPreset # 加载参考数据训练集和当前数据线上样本 reference_data pd.read_csv(train_data.csv) current_data pd.read_csv(today_predictions.csv) # 创建并运行数据漂移报告 data_drift_report Report(metrics[DataDriftPreset()]) data_drift_report.run(reference_datareference_data, current_datacurrent_data) drift_result data_drift_report.as_dict() # 检查是否有显著漂移 if drift_result[metrics][0][result][dataset_drift]: logger.warning(Significant data drift detected!) # 触发警报发送邮件、Slack消息或创建Jira工单自动化与警报将上述脚本设置为Kubernetes CronJob或Airflow DAG定期执行。当检测到显著漂移时通过Webhook触发警报通知团队需要重新评估或重新训练模型。构建数据闭环在线上服务中设计机制收集真实的业务反馈如用户是否真的流失了。将这些带标签的新数据存储起来作为下一轮模型训练的数据来源实现模型的持续学习和迭代。6. 常见问题与排查技巧实录在实际搭建和运维这样一个从零开始的AI工程化平台时你会遇到各种各样的问题。以下是我在实践中总结的一些典型问题及其排查思路。问题1DVC push/pull 速度极慢或失败。可能原因网络问题远程存储如S3配置错误或权限不足单个文件过大。排查步骤检查网络与权限使用aws s3 ls s3://your-bucket或对应云存储命令测试连接和权限。检查DVC远程配置dvc remote list和dvc remote modify myremote --local查看配置。优化大文件对于超大数据集考虑是否可以先进行抽样用于开发。或者检查DVC是否在尝试推送.git目录等无关文件。使用.dvcignore文件排除。启用传输加速/分块对于云存储确保启用传输加速。DVC本身支持文件分块但对于超大文件手动分割可能更可靠。问题2MLflow UI中看不到实验记录。可能原因Tracking Server URI设置错误运行代码时未成功连接服务器服务器后端存储如数据库连接问题。排查步骤确认URI在代码中打印mlflow.get_tracking_uri()确认与运行的服务器地址一致。检查服务器日志查看MLflow Tracking Server容器的日志看是否有错误。docker logs container_id。检查网络连通性从运行代码的机器上用curl http://mlflow-server:5000测试是否能访问服务器。检查后端存储如果使用数据库检查数据库服务是否正常表是否创建。问题3Kubernetes Pod一直处于CrashLoopBackOff状态。可能原因应用启动失败如依赖缺失、模型加载失败资源配置requests/limits不合理健康检查配置不当。排查步骤查看Pod日志这是第一步也是最重要的一步。kubectl logs pod_name或kubectl logs pod_name --previous查看上次崩溃的日志。描述Pod状态kubectl describe pod pod_name查看Events部分常有镜像拉取失败、资源不足等明确错误。进入Pod调试kubectl exec -it pod_name -- /bin/bash尝试手动运行启动命令看具体报错。检查健康检查如果应用启动较慢initialDelaySeconds设置过短会导致Pod刚启动就被判定为不健康而被重启。适当调大这个值。问题4模型服务API响应延迟高。可能原因模型本身推理慢服务资源不足CPU被限流网络延迟序列化/反序列化开销大。排查步骤定位瓶颈使用APM工具如Py-Spy对服务进行性能剖析看时间主要消耗在模型预测还是数据预处理。监控资源通过Grafana查看Pod的CPU/内存使用率是否接近limits。如果CPU被限流Throttling需要提高limits。优化预测批处理修改API支持批量预测减少单次请求的框架开销。模型优化使用ONNX Runtime、TensorRT或框架自有的优化工具对模型进行图优化、量化和编译。硬件加速确保Pod调度到带有GPU的节点并正确配置GPU资源。检查依赖项某些数据处理库如Pandas在单次调用时可能有初始化开销。考虑预热或使用更轻量的替代方案。问题5检测到数据漂移后该如何行动不要立即重新训练数据漂移是重新评估模型的信号但不是自动重新训练的指令。标准操作流程根因分析是业务逻辑变化如产品改版数据管道Bug还是不可控的外部因素影响评估漂移是否导致了业务指标如转化率的显著下降进行快速的在线A/B测试对比新旧模型在当前数据上的表现。数据收集如果确认需要新模型启动新一轮数据标注或利用近期收集的反馈数据。实验与验证在离线环境下用新数据训练和评估多个候选模型。谨慎上线通过影子部署Shadow Deployment或金丝雀发布将新模型小流量导入线上严密监控其表现确认优于旧模型后再全量替换。构建一个完整的、生产级的AI工程化体系是一个持续迭代的过程。从“ai-engineering-from-scratch”这样的项目入手最大的收获不是熟悉了一堆工具而是建立起一套系统性的思维框架如何以可复现、可协作、可监控、可维护的方式将数据科学家的想法转化为稳定创造价值的软件服务。这套框架和能力正是在AI时代构建技术护城河的关键。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2585942.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…