使用 MLRun 和 MinIO 设置开发机器
MLOps 之于机器学习,就像 DevOps 之于传统软件开发一样。两者都是一组旨在改善工程团队(开发或 ML)和 IT 运营 (Ops) 团队之间协作的实践和原则。目标是使用自动化来简化开发生命周期,从规划和开发到部署和运营。这些方法的主要好处之一是持续改进。
在之前关于 MLOps 工具主题的文章中,我介绍了 KubeFlow Pipelines 2.0 和 MLflow。在这篇文章中,我想介绍 MLRun,这是另一个 MLOps 工具,如果您正在为您的组织购买 MLOps 工具,则应考虑使用该工具。但在深入研究之前,让我们快速了解一下 MLOps 的前景。
MLOps 格局
虽然这三种工具都旨在为您的所有 AI/ML 需求提供完整的端到端工具,但它们都以不同的动机或设计目标开始。
-
KubeFlow 着手实现 Kubernetes 的民主化。KubeFlow 的核心 KubeFlow Pipelines 要求代码通过部署到 Kubernetes Pod 的无服务器函数运行。
-
MLflow 最初是一种工具,用于跟踪实验以及与 ML 实验相关的所有内容,例如指标、项目(数据)和模型本身。MLflow 了解常用的 ML 框架,如果选择,可以要求 MLflow 自动捕获它认为重要的所有实验数据。
-
MLRun 的使命是消除样板代码,这与其他 MLOps 工具不同。它还需要创建无服务器函数,但它更进一步,因为它知道流行的 ML 框架——因此,不需要对纪元循环进行编码,并且对分布式训练的代码支持较低。
关于 MLRun 的更多信息
MLRun 是一个开源 MLOps 框架,最初由专门从事数据科学的公司 Iguazio 创建。2023 年 1 月,Iguazio 被麦肯锡公司收购,现在是麦肯锡人工智能部门 QuantumBlack 的一部分。
让我们看一下安装选项和需要部署的服务。
安装选项
MLRun 网站推荐了三种在本地安装 MLRun 的方法。Iguazio 还维护托管服务。
本地选项:
-
本地部署:在笔记本电脑或单个服务器上使用 Docker 撰写文件部署 MLRun 服务。此选项需要 Docker Desktop,并且比 Kubernetes 安装更简单。它非常适合试验 MLRun 功能;但是,您将无法横向扩展计算资源。
-
Kubernetes 集群:在自己的 Kubernetes 集群上部署 MLRun 服务。此选项支持弹性缩放;但是,安装起来更复杂,因为它需要您自行安装 Kubernetes。您还可以使用此选项部署到 Docker Desktop 启用的 Kubernetes 集群。
-
Amazon Web Services (AWS):在 AWS 上部署 MLRun 服务。此选项是安装 MLRun 的最简单方法。MLRun 软件是免费的;但是,AWS 基础设施服务是有成本的。
托管服务:
此外,如果您不介意共享环境,那么 Iguazio 提供托管服务。Iguazio 提供 14 天免费试用。
MLRun 服务简介
MLRun UI:MLRun UI 是一个基于 Web 的用户界面,您可以在其中查看项目和项目运行。
MLRun API:MLRun API 是代码将用于创建项目和启动运行的编程接口。
Nuclio:Nuclio 是一个开源的无服务器计算平台,专为高性能应用程序而设计,特别是在数据处理、实时分析和事件驱动架构方面。它抽象了基础架构管理的复杂性,使开发人员能够专注于编写和部署函数或微服务。
MinIO:将 MLRun 部署到 Kubernetes 集群时,MLRun 使用 MinIO 进行对象存储。我们将把它包含在我们的本地 Docker compose 部署中,因为在后续的文章中,我们需要从对象存储中读取用于模型训练的数据集。当我们创建一个简单的烟雾测试笔记本时,我们也将在这篇文章中使用它,以确保 MLRun 正常启动并运行。
安装 MLRun 服务
我将在此处展示的安装与 MLRun 安装和设置指南中显示的略有不同。首先,我想在此安装中包含 MinIO,以便我们的无服务器函数可以从对象存储加载数据集。此外,我想要用于运行 Jupyter Notebooks 和 MLRun API 的单独服务。(包含 Jupyter 的 MLRun 的 Docker Compose 文件将 MLRun API 和 Jupyter Notebook 服务打包到同一服务中。最后,我将重要的环境变量放在 .env 文件中,这样就不需要手动创建环境变量。MLRun 服务的 Docker Compose 文件和 config.env 文件如下所示。您也可以在此处下载它们以及本文的所有代码。
services:init_nuclio:image: alpine:3.18command:- "/bin/sh"- "-c"- |mkdir -p /etc/nuclio/config/platform; \cat << EOF | tee /etc/nuclio/config/platform/platform.yamlruntime:common:env:MLRUN_DBPATH: http://${HOST_IP:?err}:8080local:defaultFunctionContainerNetworkName: mlrundefaultFunctionRestartPolicy:name: alwaysmaxRetryCount: 0defaultFunctionVolumes:- volume:name: mlrun-stuffhostPath:path: ${SHARED_DIR:?err}volumeMount:name: mlrun-stuffmountPath: /home/jovyan/data/logger:sinks:myStdoutLoggerSink:kind: stdoutsystem:- level: debugsink: myStdoutLoggerSinkfunctions:- level: debugsink: myStdoutLoggerSinkEOFvolumes:- nuclio-platform-config:/etc/nuclio/configjupyter:image: "mlrun/jupyter:${TAG:-1.6.2}"ports:#- "8080:8080"- "8888:8888"environment:MLRUN_ARTIFACT_PATH: "/home/jovyan/data/{{project}}"MLRUN_LOG_LEVEL: DEBUGMLRUN_NUCLIO_DASHBOARD_URL: http://nuclio:8070MLRUN_HTTPDB__DSN: "sqlite:home/jovyan/data/mlrun.db?check_same_thread=false"MLRUN_UI__URL: http://localhost:8060# using local storage, meaning files / artifacts are stored locally, so we want to allow access to themMLRUN_HTTPDB__REAL_PATH: "/home/jovyan/data"# not running on k8s meaning no need to store secretsMLRUN_SECRET_STORES__KUBERNETES__AUTO_ADD_PROJECT_SECRETS: "false"# let mlrun control nuclio resourcesMLRUN_HTTPDB__PROJECTS__FOLLOWERS: "nuclio"volumes:- "${SHARED_DIR:?err}:/home/jovyan/data"networks:- mlrunmlrun-api:image: "mlrun/mlrun-api:${TAG:-1.6.2}"ports:- "8080:8080"environment:MLRUN_ARTIFACT_PATH: "${SHARED_DIR}/{{project}}"# using local storage, meaning files / artifacts are stored locally, so we want to allow access to themMLRUN_HTTPDB__REAL_PATH: /dataMLRUN_HTTPDB__DATA_VOLUME: "${SHARED_DIR}"MLRUN_LOG_LEVEL: DEBUGMLRUN_NUCLIO_DASHBOARD_URL: http://nuclio:8070MLRUN_HTTPDB__DSN: "sqlite:data/mlrun.db?check_same_thread=false"MLRUN_UI__URL: http://localhost:8060# not running on k8s meaning no need to store secretsMLRUN_SECRET_STORES__KUBERNETES__AUTO_ADD_PROJECT_SECRETS: "false"# let mlrun control nuclio resourcesMLRUN_HTTPDB__PROJECTS__FOLLOWERS: "nuclio"volumes:- "${SHARED_DIR:?err}:/data"networks:- mlrunmlrun-ui:image: "mlrun/mlrun-ui:${TAG:-1.6.2}"ports:- "8060:8090"environment:MLRUN_API_PROXY_URL: http://mlrun-api:8080MLRUN_NUCLIO_MODE: enableMLRUN_NUCLIO_API_URL: http://nuclio:8070MLRUN_NUCLIO_UI_URL: http://localhost:8070networks:- mlrunnuclio:image: "quay.io/nuclio/dashboard:${NUCLIO_TAG:-stable-amd64}"ports:- "8070:8070"environment:NUCLIO_DASHBOARD_EXTERNAL_IP_ADDRESSES: "${HOST_IP:?err}"volumes:- /var/run/docker.sock:/var/run/docker.sock- nuclio-platform-config:/etc/nuclio/configdepends_on:- init_nuclionetworks:- mlrunminio:image: quay.io/minio/minio#network_mode: "host"volumes:#- /d/data:/data#- ./data:/data- ~/minio-data:/dataports:- 9000:9000- 9001:9001#extra_hosts:# - "host.docker.internal:host-gateway"environment:MINIO_ROOT_USER: 'minio_user'MINIO_ROOT_PASSWORD: 'minio_password'MINIO_ADDRESS: ':9000'MINIO_STORAGE_USE_HTTPS: FalseMINIO_CONSOLE_ADDRESS: ':9001'#MINIO_LAMBDA_WEBHOOK_ENABLE_function: 'on'#MINIO_LAMBDA_WEBHOOK_ENDPOINT_function: 'http://localhost:5000'command: minio server /datahealthcheck:test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]interval: 30stimeout: 20sretries: 3networks:- mlrunvolumes:nuclio-platform-config: {}networks:mlrun:name: mlrun
文件名: compose-with-jupyter-minio.yaml
# MLRun configuration
HOST_IP=127.17.0.01
SHARED_DIR=~/mlrun-data
文件名: config.env
运行下面显示的 docker-compose 命令将启动我们的服务。
docker-compose -f compose-with-jupyter-minio.yaml --env-file config.env up -d
服务在 Docker 中运行后,导航到以下 URL 以查看 Jupyter、MinIO、MLRun 和 Nuclio 的控制台。
-
Jupyter Notebook:http://localhost:8888/lab
-
MinIO控制台:http://localhost:9001/browser
-
MLRun 控制台:http://localhost:8060/mlrun/projects
-
Nuclio 控制台:http://localhost:8070/projects
在结束在开发计算机上设置 MLRun 的练习之前,让我们创建并运行一个简单的无服务器函数,以确保一切正常。
运行简单的无服务器函数
在本演示中,我们将使用 Jupyter 服务器。它已经安装了 Python mlrun 库。如果您需要其他库,可以启动终端选项卡并安装它们。我们将需要 minio Python SDK。下面的屏幕截图显示了如何启动终端窗口并安装 minio 库。
单击“终端”按钮,您将获得一个类似于下面所示的选项卡。
此选项卡的操作方式与 Mac 上的“终端”应用程序类似。它允许您将所需的任何库安装到 Jupyter 服务中,我们的函数将在其中执行。
安装库后,创建一个名为“simple demo”的新文件夹并导航到它。下载此帖子的示例代码,并将以下文件上传到新文件夹:
- simple_serverless_function.py
- simple_serverless_function_setup.ipynb
- minio.env
- mlrun.env
- minio_utilities.py
我们要发送到 MLRun 的函数是 simple_serverless_function.py,如下所示。函数名称为“train_model”——我们不会在这篇文章中训练实际模型。我们只是想让无服务器函数正常工作。请注意,此函数具有“mlrun.handler()”装饰器。它包装了能够解析和保存输入和输出的函数。此外,它不必是密封的(仅使用其中定义的资源)——它可以使用在模块级别导入的库,这些库可以是其他代码模块。在我们的例子中,我们有一个位于同一目录中的minio实用程序模块。
from typing import Dictimport mlrun
import minio_utilities as mu@mlrun.handler()
def train_model(data_bucket: str=None, training_parameters: Dict=None):logger = mu.create_logger()logger.info(data_bucket)logger.info(training_parameters)bucket_list = mu.get_bucket_list()logger.info(bucket_list)
文件名: simple_serverless_function.py
在功能方面,这个函数所做的只是记录输入参数,只是为了好玩,我正在连接到 MinIO 以获取所有存储桶的列表。作为这个简单演示的一部分,我想证明 MinIO 的连接性。minio_utilities.py 中的 get_bucket_list() 函数如下所示。
import logging
import os
import sys
from typing import Any, Dict, List, Tuplefrom dotenv import load_dotenv
from minio import Minio
from minio.error import S3ErrorLOGGER_NAME = 'train'
LOGGING_LEVEL = logging.INFOload_dotenv('minio.env')
MINIO_URL = os.environ['MINIO_URL']
MINIO_ACCESS_KEY = os.environ['MINIO_ACCESS_KEY']
MINIO_SECRET_KEY = os.environ['MINIO_SECRET_KEY']
if os.environ['MINIO_SECURE']=='true': MINIO_SECURE = True
else: MINIO_SECURE = Falsedef create_logger() -> None:logger = logging.getLogger(LOGGER_NAME)#if not logger.hasHandlers():logger.setLevel(LOGGING_LEVEL)formatter = logging.Formatter('%(process)s %(asctime)s | %(levelname)s | %(message)s')stdout_handler = logging.StreamHandler(sys.stdout)stdout_handler.setLevel(logging.DEBUG)stdout_handler.setFormatter(formatter)logger.handlers = []logger.addHandler(stdout_handler)return loggerdef get_bucket_list() -> List[str]:logger = create_logger()# Get data of an object.try:# Create client with access and secret keyclient = Minio(MINIO_URL, # host.docker.internalMINIO_ACCESS_KEY, MINIO_SECRET_KEY,secure=MINIO_SECURE)buckets = client.list_buckets()except S3Error as s3_err:logger.error(f'S3 Error occurred: {s3_err}.')raise s3_errexcept Exception as err:logger.error(f'Error occurred: {err}.')raise errreturn buckets
文件名: minio_utilities.py
用于保存 MinIO 连接信息的“minio.env”文件如下所示。您需要获取自己的访问密钥和密钥,并将它们放入此文件中。另外,请注意,我使用“minio”作为 MinIO 的主机名。这是因为我们从与 MinIO 相同的 Docker Compose 网络中的服务进行连接。如果要从此网络外部连接到此 MinIO 实例,请使用 localhost。
MINIO_URL=minio:9000
MINIO_ACCESS_KEY=lwycuW6S5f7yJZt65tRK
MINIO_SECRET_KEY=d6hXquiXGpbmfR8OdX7Byd716hmhN87xTyCX8S0K
MINIO_SECURE=false
minio.env file
回顾一下,我们有一个无服务器函数,它记录了传递给它的所有输入参数。它还连接到 MinIO 并获取存储桶列表。我们现在唯一需要做的就是打包我们的函数并将其传递给 MLRun。我们将在 simple_serverless_function_setup.ipynb 笔记本中执行此操作。下面是这个笔记本中的单元格。
导入我们需要的库。
import os
import mlrun
下面的单元格使用“mlrun.env”文件来通知我们的环境在哪里可以找到 MLRun API 服务。它还将 MLRun 连接到兼容 S3 的对象存储,以保存项目。这是我们通过 docker compose 文件创建的 MinIO 实例。
# Set the environment:
mlrun.set_environment(env_file='mlrun.env', artifact_path='s3://mlrun/simple-demo')
# remote MLRun service address
MLRUN_DBPATH=http://mlrun-api:8080# AWS S3/services credentials
S3_ENDPOINT_URL=minio:9000
AWS_ACCESS_KEY_ID={Put MinIO access key here.}
AWS_SECRET_ACCESS_KEY={Put MinIO secret key here.}
文件名: mlrun.env file
接下来,我们创建一个 MLRun 项目。此项目将与我们的所有指标和工件相关联。用于此步骤的项目目录是代码所在的文件夹。
# Create the project:
project_name='simple-test'
project_dir = os.path.abspath('./')
project = mlrun.get_or_create_project(project_name, project_dir, user_project=False)
print(project_dir)
set_function() 方法告诉 MLRun 在哪里可以找到你的函数以及你希望它如何运行。handler 参数必须包含使用 mlrun.handler() 装饰器批注的函数的名称。
# Create the serverless function.
trainer = project.set_function("simple_serverless_function.py", name="trainer", kind="job",image="mlrun/mlrun",handler="train_model"
)
下面的单元格创建了一些示例模型训练参数。
# Sample hyperparameters
training_parameters = {'batch_size': 32,'device': 'cpu','dropout_input': 0.2,'dropout_hidden': 0.5,'epochs': 5,'input_size': 784,'hidden_sizes': [1024, 1024, 1024, 1024],'lr': 0.025,'momentum': 0.5,'output_size': 10,'smoke_test_size': -1}
最后,我们开始运行该函数,如下所示。“local”参数告诉 MLRun 在当前系统上运行该函数,在本例中为 Jupyter Notebook 服务器。如果设置为 False,则该函数将发送到 Nuclio。此外,“inputs”参数的类型需要为 Dict[str, str];如果您使用其他任何东西,则会出现错误。
# Run the function.
trainer_run = project.run_function("trainer",inputs={"data_bucket": "mnist"},params={"training_parameters": training_parameters},local=True
)
在 MLRun UI 中查看结果
功能完成后,转到 MLRun 主页以查找您的项目。单击表示项目的磁贴。我们的函数是在“简单测试”项目下运行的。
下一页将显示所有运行中与项目相关的所有内容。如下所示。
在“作业和工作流”部分下查看,然后单击要查看的运行。这将显示有关运行的详细信息,如下所示。
对调试有用的是“日志”选项卡。在这里,我们可以看到我们从简单函数中记录的消息,这些函数记录了输入参数,连接到 MinIO,然后记录了在 MinIO 中找到的所有存储桶。
摘要和后续步骤
在这篇文章中,我们使用 Docker Compose 在开发机器上安装了 MLRun。我们还创建并运行了一个简单的无服务器函数,以了解如何在 MLRun 中构建代码。我们的代码能够连接到 MinIO 以编程方式检索存储桶列表。我们还将 MLRun 配置为使用 MinIO 进行工件存储。
显然,我们简单的无服务器功能几乎没有触及 MLRun 可以做的事情的表面。接下来的步骤包括使用流行的框架实际训练模型,使用 MLRun 进行分布式训练,以及探索对大型语言模型的支持。
相关文章:
![](https://img-blog.csdnimg.cn/img_convert/5a2ee657d2ccb37de6f412208ebc08c8.png)
使用 MLRun 和 MinIO 设置开发机器
MLOps 之于机器学习,就像 DevOps 之于传统软件开发一样。两者都是一组旨在改善工程团队(开发或 ML)和 IT 运营 (Ops) 团队之间协作的实践和原则。目标是使用自动化来简化开发生命周期,从规划和开发到部署和…...
![](https://www.ngui.cc/images/no-images.jpg)
资质申请表详解:填写《建筑幕墙工程设计专项资质申请表》的要点
填写《建筑幕墙工程设计专项资质申请表》的要点如下,按照清晰、分点表示和归纳的方式整理,并参考了文章中的相关数字和信息: 一、封面 申报企业名称:按照工商营业执照内容填写全称,并加盖企业公章。填报日期…...
![](https://csdnimg.cn/release/blog_editor_html/release2.3.6/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=N7T8)
华为手机怎么找回删除的照片?掌握3个方法,恢复不是梦
由于误删、设备故障、软件更新等原因,我们有时可能会不慎丢失这些宝贵的照片。当面对空空如也的相册时,那种失落感无法言喻。华为手机该怎么找回删除的照片呢?但是,请不要绝望!在科技的帮助下,我们可以采取…...
![](https://img-blog.csdnimg.cn/direct/f3245312f01c43e880639298e37d333a.png)
数据结构试题 20-21
真需要就死记吧 二叉树遍历-先序(非递归)【图解代码】_哔哩哔哩_bilibili 解释一下步骤: 一个循环为: 1.取节点 2.放右子树 3.放左子树 每次循环,都要从栈里取出一个节点 先放右子树,再放左子树 那这道题就是,先放1&am…...
![](https://img-blog.csdnimg.cn/direct/10f92475fd9a41edbc1ff17b4390cbf0.png)
vscode插件开发之 - TestController
TesController概要介绍 TestController 组件是用于实现自定义测试框架和集成测试结果的。它允许开发者定义自己的测试运行器,以支持在VSCode中运行和展示测试。以下是一些使用 TestController 组件的主要场景: 自定义测试框架:如果你正在开发…...
![](https://www.ngui.cc/images/no-images.jpg)
QBitArray使用详解
QBitArray使用详解 一、创建和初始化 QBitArray1.1 QBitArray默认构造1.2 QBitArray指定大小的构造1.3 QBitArray指定大小和初始值的构造 二、设置和访问位2.1 QBitArray设置单个位2.2 QBitArray访问单个位2.3 QBitArray使用下标操作符 三、设置所有位3.1 QBitArray将所有位设置…...
![](https://www.ngui.cc/images/no-images.jpg)
基于Python的自然语言处理项目 ChatTTS 推荐
**项目名称:ChatTTS** ChatTTS是一个基于Python的自然语言处理项目,旨在实现一个简单的文本到语音转换系统。它使用深度学习技术,通过自然语言处理和语音合成算法,将文本转换为语音输出。 **项目介绍**: Chat…...
![](https://img-blog.csdnimg.cn/img_convert/76d4d0bc1f2921b79d2b04a87f1ca136.png)
论 To B 产品:从概念到市场实践
本文作者为 360 奇舞团产品经理 论 To B 产品:从概念到市场实践 To B 产品在商业世界中扮演着至关重要的角色。相较于面向消费者的To C市场,To B市场更专注于为其他企业提供产品和服务。理解和成功运营To B产品需要对其特定的市场需求和运作方式有深刻的…...
![](https://img-blog.csdnimg.cn/direct/00d4fdeb7b0d4dbb99e88f325ef249d8.gif#)
如何通过自定义模块DIY出专属个性化的CSDN主页?一招教你搞定!
个人主页:学习前端的小z 个人专栏:HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论! 文章目录 💯如何通过HTMLCSS自定义模板diy出自己的个性化csdn主页&#x…...
![](https://img-blog.csdnimg.cn/direct/94e6e061a6714089a4b03469192040cb.png)
[BSidesCF 2020]Had a bad day1
看到页面有两个按钮 先随便点一个试一下,当我们点击之后发现url是有变动的 感觉url是有点东西的,可能是某种注入,先尝试一下sql注入,发现给出了报错 通过报错我们可以确定是文件包含漏洞,那我们试试php伪协议去读取一下…...
![](https://img-blog.csdnimg.cn/direct/01077d7fcefb43e89780c0d294502a74.jpeg)
从媒体网站的频道划分看媒体邀约的分类?
传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 媒体宣传加速季,100万补贴享不停,一手媒体资源,全国100城线下落地执行。详情请联系胡老师。 在我们举行活动的时候,通常会邀请媒体到现场来…...
![](https://img-blog.csdnimg.cn/direct/6f054b0adb28494baf80dc5a734afe15.png#pic_center)
Day40
Day40 监听器 概念: 监听器用于监听web应用中某些对象信息的创建、销毁、增加,修改,删除等动作的 发生,然后作出相应的响应处理。当范围对象的状态发生变化的时候,服务器自动调用 监听器对象中的方法。 常用于统计在线…...
![](https://www.ngui.cc/images/no-images.jpg)
linux基础 - 内核的基础概念
目录 零. 前言 一. 源码简介 二. 存储管理 物理内存管理: 虚拟内存管理: 内存分配与回收: 三. CPU 和进程管理 进程管理: CPU 管理: 四. 文件系统 文件系统的概念 常见的 Linux 文件系统类型 文件系统的工…...
![](https://img-blog.csdnimg.cn/direct/d53c1a6605e44e7e9973cd5f5b69be35.png)
centos7系统使用docker-compose安装部署jenkins
CentOS7系统使用docker-compose安装部署jenkins,并实现前后端自动构建 记录一次工作中部署jenkins的真实经历,总结了相关经验 1.准备环境 1.java 由于最新的jenkins需要jdk11以上才能支持,而系统里的jdk是1.8的,因此等jenkins安…...
![](https://www.ngui.cc/images/no-images.jpg)
传染病报卡内容——丙型
--丙型 select a.morbiditdate 发病日期, diagnosedate 诊断日期, a.deathdate 死亡日期, a.casetypequality 病例分类,a.hcvrna "HCR_RNA定量" from zl_sdmb.t_报卡记录 t, c1_infectiousv1_6 a where t.id a.fileid and t.卡片种类 传…...
![](https://img-blog.csdnimg.cn/img_convert/5696d4f56b6bd346684a60b70824cf64.png)
本地快速部署大语言模型开发平台Dify并实现远程访问保姆级教程
文章目录 前言1. Docker部署Dify2. 本地访问Dify3. Ubuntu安装Cpolar4. 配置公网地址5. 远程访问6. 固定Cpolar公网地址7. 固定地址访问 前言 本文主要介绍如何在Linux Ubuntu系统使用Docker快速部署大语言模型应用开发平台Dify,并结合cpolar内网穿透工具实现公网环境远程访问…...
![](https://img-blog.csdnimg.cn/img_convert/5a9a40dcc2eb2c6e8cdbe51512a45e4e.png)
《Cloud Native Data Center Networking》(云原生数据中心网络设计)读书笔记 -- 02 Clos拓扑
本章回答以下问题: 什么是 Clos 拓扑,它与“接入 - 汇聚 - 核心”拓扑有何不同?Clos 拓扑的特征是什么?Clos 拓扑对数据中心网络的影响是什么? Clos拓扑 云原生数据中心基础设施的先行者们想要构建一种支持大规模水平扩展网络。 基本的Clos拓扑如图…...
![](https://img-blog.csdnimg.cn/img_convert/079c8456958b43a6309f579e028312c9.gif)
VUE3版本新特性
VUE3版本新特性 VUE3和VUE2的区别路由的使用vite安装项目新特性使用 1.VUE3和VUE2的区别 2020年9月18日,Vue.js发布版3.0版本,代号:One Piece 于 2022 年 2 月 7 日星期一成为新的默认版本! Vue3性能更高,初次渲染快55%, 更新渲染快133% 。…...
![](https://img-blog.csdnimg.cn/direct/d81af40beeff47e69ec6fcf9848c5098.png)
【Oracle篇】Oracle数据库坏块处理:rman修复坏块实践与案例分析(第七篇,总共八篇)
💫《博主介绍》:✨又是一天没白过,我是奈斯,DBA一名✨ 💫《擅长领域》:✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux,也在扩展大数据方向的知识面✌️…...
![](https://www.ngui.cc/images/no-images.jpg)
学懂C#编程:从一个简单的例子理解事件处理
在C#中,事件是一种特殊的委托类型,用于在对象上发生某些事情时通知订阅者。事件的处理通常包括定义事件,创建触发事件的条件,以及订阅该事件的事件处理程序。 以下是一个简单的C#事件处理示例: using System;// 定义…...
![](https://img-blog.csdnimg.cn/direct/992e0f65ed3a4afb9b11e7b4e6187563.png)
深入理解指针(2)
4. const 修饰指针 4.1 const修饰变量 变量是可以修改的,如果把变量的地址交给⼀个指针变量,通过指针变量的也可以修改这个变量。 但是如果我们希望⼀个变量加上⼀些限制,不能被修改,怎么做呢?这就是const的作⽤。 …...
![](https://img-blog.csdnimg.cn/img_convert/87c7b01bbab847a4812e5d5667fcc1a1.png)
C#.Net筑基-集合知识全解
01、集合基础知识 .Net 中提供了一系列的管理对象集合的类型,数组、可变列表、字典等。从类型安全上集合分为两类,泛型集合 和 非泛型集合,传统的非泛型集合存储为Object,需要类型转。而泛型集合提供了更好的性能、编译时类型安全…...
![](https://csdnimg.cn/release/blog_editor_html/release2.3.6/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=N7T8)
AI PPT生成器,一键在线智能生成PPT工具
PPT作为商业沟通和教育培训中的重要工具,PPT制作对于我们来说并不陌生。但是传统的PPT制作不仅耗时,而且想要做出精美的PPT,需要具备一定的设计技能。下面小编就来和大家分享几款AI PPT工具,只要输入主题,内容就可以在…...
![](https://img-blog.csdnimg.cn/direct/42fabcd443304f079fa80098e09dbf37.png)
stm32学习笔记---零基础入门介绍2
目录 STM32介绍 STM32家族系列 ARM介绍 ARM内核型号种类 我们学习用的STM32 片上资源/外设(Peripheral) 命名规则 系统结构 引脚定义 STM32的启动配置 STM32最小系统电路和其他部分电路 最小系统板的实物图 附:安装软件准备 声明…...
![](https://img-blog.csdnimg.cn/direct/bfa6d43c665b40a1ac1d68f79d8c1d9e.png)
搭建取图系统app源码开发,满足广泛应用需求
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 前言 图片已成为信息传递的重要媒介,广泛应用于各个领域。为满足日益增长的图片需求,搭建一款高效的取图系统,可以为用户提供便捷、全面的…...
![](https://img-blog.csdnimg.cn/direct/363f647b48c94a2f9022b8512656a56d.png)
语音质量评价方法之MOS
引言 在语音增强、语音合成、语音转换、声音转换、语音克隆、语音修复等等领域,常常要对输出的语音进行评价。对语音的质量评价一般关注两个方面,即主观评价和客观评价。主观评价就是人凭借听觉感受对语音进行打分,客观评价比较广泛…...
![](https://img-blog.csdnimg.cn/direct/e0c25c6597db4abba748c5a2188d45a8.png)
gorm简介
【1】ORM: 即Object-Relational Mapping,它的作用是在关系型数据库和对象之间作一个映射,这样我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它们就可以了。 【2】GORM gorm是go语言的一个orm…...
![](https://img-blog.csdnimg.cn/direct/78d105dc198a44c7876a1274c8c3860f.png)
MySQL:SELECT list is not in GROUP BY clause 报错 解决方案
一、前言 一大早上测试环境,发现测试环境的MySQL报错了。 SELECT list is not in GROUP BY clause and contains nonaggregated column二、解决方案 官方文档中提到: 大致意思: 用于GROUP BY的SQL / 92标准要求满足以下条件: SE…...
![](https://www.ngui.cc/images/no-images.jpg)
IPython的使用技巧
1、解释说明 IPython是一个强大的Python交互式shell,它提供了丰富的功能,如自动补全、历史记录、内置帮助等。IPython使得在命令行下编写和测试Python代码变得更加方便和高效。 2、使用示例 安装IPython: pip install ipython启动IPython…...
![](https://www.ngui.cc/images/no-images.jpg)
Spring Boot 多线程例子
在Spring Boot中,多线程可以通过Java的并发工具来实现。以下是一些常见的多线程实现方法: 1. 使用Async注解和CompletableFuture: 首先,需要在Spring Boot应用的主类上添加EnableAsync注解,以启用异步支持。 java Spr…...
![](https://img-blog.csdnimg.cn/bf87123628e64f27927bfb5379015d73.png)
免费域名注册工具/上海网站排名seo公司
经济学中有个著名的结论,贸易可以让贸易双方都获益,这里我们用一个例子来说明,为什么是这样的。 分析如下: 馒头对于甲的价值: 0.5瓶啤酒=1个馒头 馒头对于乙的价值: 6瓶啤酒=&…...
![](https://images2015.cnblogs.com/blog/7841/201603/7841-20160302112933111-249108144.png)
制作一个视频网站/冯站长之家
**本文针对的是启明星系统的数据库备份与还原,这同样适合其他数据库。 数据库自动备份工具(最后更新时间2015.7.24):http://files.cnblogs.com/files/mqingqing123/dbback_release.rar (1)数据库如何备份&a…...
![](/images/no-images.jpg)
上海网站建设哪家公司好/淘宝站外引流推广方法
1 简介 1.1 Log4net的优点: 几乎所有的大型应用都会有自己的用于跟踪调试的API。因为一旦程序被部署以后,就不太可能再利用专门的调试工具了。然而一个管理员可能需要有一套强大的日志系统来诊断和修复配置上的问题。 经验表明,日志记录往往…...
![](/images/no-images.jpg)
网站建设项目进度汇报/seo薪酬如何
容性负载对于功率放大器提出了更高的要求,既需要功率放大器有很好的动态相应能力,还要求功率放大器要拥有很好的电流驱动能力。为了更好的使容性负载具有更好的响应特性,驱动功率放大器中需要容性负载的放电回路。综上所述容性负载对功放提出…...
![](/images/no-images.jpg)
wordpress全品滚动/手机百度app最新版下载
汽车无线通信模块市场的企业竞争态势 该报告涉及的主要国际市场参与者有u-blox、Fibocom、Telit、Sierra Wireless、Huawei、GosuncnWelink、MeiG Smart Technology、Murata、Gemalto、Quectel Wireless、Sunsea Telecommunications、Neoway Technology、Winext Technology、Lo…...
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
网站建设备案需要什么/seo排名优化软件
/* 描述 Description Bessie不小心游荡出Farmer John的田地,而走进了相邻的农民的地。她举起一个木瓜,木 瓜对奶牛来说可是不可多得得美味。这个木瓜林像一般的威斯康星州的田地一样被分割成一个 R行C列的网格(1 < R < 40, 1 < C < 40)。Bes…...