模型服务网格:云原生下的模型服务管理

作者:王夕宁

模型服务网格(Model Service Mesh)是一种架构模式,用于在分布式环境中部署和管理机器学习模型服务。它提供了一个可扩展的、高性能的基础架构,用于将多个模型服务进行管理、部署和调度,以此更好地处理模型的部署、版本管理、路由和推理请求的负载均衡。

模型服务网格的核心思想是将模型部署为可伸缩的服务,并通过网格来管理和路由这些服务, 简化模型服务的管理和运维。它通过将模型服务抽象为可编排的、可伸缩的单元,使得模型的部署、扩展和版本控制变得更加容易。它还提供了一些核心功能,如负载均衡、自动伸缩、故障恢复等,以确保模型服务的高可用性和可靠性。模型可以根据实际的推理请求负载进行自动缩放和负载均衡,从而实现高效的模型推理。

模型服务网格还提供了一些高级功能,如流量分割、A/B 测试、灰度发布等,以便更好地控制和管理模型服务的流量,可以轻松切换和回滚不同的模型版本。它还支持动态路由,可以根据请求的属性,如模型类型、数据格式或其他元数据,将请求路由到适当的模型服务。

阿里云服务网格 ASM 已经提供了一个可扩展的、高性能的模型服务网格基础能力,用于将多个模型服务进行管理、部署和调度,以此更好地处理模型的部署、版本管理、路由和推理请求的负载均衡。通过使用模型服务网格,开发人员可以更轻松地部署、管理和扩展机器学习模型,同时提供高可用性、弹性和灵活性,以满足不同的业务需求。

使用模型服务网格进行多模型推理服务

模型服务网格基于 KServe ModelMesh 实现,针对大容量、高密度和频繁变化的模型用例进行了优化,可以智能地将模型加载到内存中或从内存中卸载,以在响应性和计算之间取得平衡。

模型服务网格提供了以下功能:

  • 缓存管理
  • Pod 作为分布式最近最少使用 (LRU) 缓存进行管理。
  • 根据使用频率和当前请求量,加载和卸载模型的副本。
  • 智能放置和加载
  • 模型放置通过 Pod 之间的缓存寿命和请求负载来平衡。
  • 使用队列来处理并发模型加载,并最大限度地减少对运行时流量的影响。
  • 弹性
  • 失败的模型加载会在不同的 Pod 中自动重试。
  • 操作简便性
  • 自动和无缝地处理滚动模型更新。

以下是部署模型示例,使用前提可以参考 [1]。

1.1 创建存储声明 PVC

在 ACK 集群中,使用如下 YAML 创建存储声明 my-models-pvc:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: my-models-pvcnamespace: modelmesh-serving
spec:accessModes:- ReadWriteManyresources:requests:storage: 1GistorageClassName: alibabacloud-cnfs-nasvolumeMode: Filesystem

然后运行如下命令:

kubectl get pvc -n modelmesh-serving

将会得到如下类似的预期结果:

NAME STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS            AGE
my-models-pvc    Bound    nas-379c32e1-c0ef-43f3-8277-9eb4606b53f8   1Gi        RWX            alibabacloud-cnfs-nas   2h

1.2 创建 Pod 来访问 PVC

为了使用新的 PVC,我们需要将其作为卷安装到 Kubernetes Pod。然后我们可以使用这个 pod 将模型文件上传到持久卷。

让我们部署一个pvc-access Pod,并要求 Kubernetes 控制器通过指定“my-models-pvc”来声明我们之前请求的 PVC:

kubectl apply  -n modelmesh-serving  -f - <<EOF
---
apiVersion: v1
kind: Pod
metadata:name: "pvc-access"
spec:containers:- name: mainimage: ubuntucommand: ["/bin/sh", "-ec", "sleep 10000"]volumeMounts:- name: "my-pvc"mountPath: "/mnt/models"volumes:- name: "my-pvc"persistentVolumeClaim:claimName: "my-models-pvc"
EOF

确认 pvc-access Pod 应该正在运行:

kubectl get pods -n modelmesh-serving | grep pvc-access

将会得到如下类似的预期结果:

pvc-access 1/1     Running

1.3 将模型存储在持久卷上

现在,我们需要将我们的 AI 模型添加到存储卷中,我们将使用 scikit-learn 训练的 MNIST 手写数字字符识别模型。可以从 kserve/modelmesh-minio-examples 仓库****[2]****下载 mnist-svm.joblib 模型文件的副本。

通过以下命令,将 mnist-svm.joblib 模型文件复制到 pvc-access pod 上的 /mnt/models 文件夹中:

kubectl -n modelmesh-serving cp mnist-svm.joblib pvc-access:/mnt/models/

执行如下命令,确认 model 已经加载成功:

kubectl -n modelmesh-serving exec -it pvc-access -- ls -alr /mnt/models/

应该得到如下内容:

-rw-r--r-- 1 501 staff 344817 Oct 30 11:23 mnist-svm.joblib

1.4 部署推理服务

接下来,我们需要部署一个 sklearn-mnist 推理服务:

apiVersion: serving.kserve.io/v1beta1
kind: InferenceService
metadata:name: sklearn-mnistnamespace: modelmesh-servingannotations:serving.kserve.io/deploymentMode: ModelMesh
spec:predictor:model:modelFormat:name: sklearnstorage:parameters:type: pvcname: my-models-pvcpath: mnist-svm.joblib

几十秒钟后(取决于镜像拉取速度),新的推理服务 sklearn-mnist 应该准备就绪。

运行如下命令:

kubectl get isvc -n modelmesh-serving

将会得到如下类似的预期结果:

NAME URL                  READY
sklearn-mnist   grpc://modelmesh-serving.modelmesh-serving:8033   True

1.5 运行推理服务

现在我们可以使用 curl 发送推理请求到我们的 sklearn-mnist 模型。数组形式的请求数据表示待分类的数字图像扫描中 64 个像素的灰度值。

MODEL_NAME="sklearn-mnist"
ASM_GW_IP="ASM网关IP地址"
curl -X POST -k "http://${ASM_GW_IP}:8008/v2/models/${MODEL_NAME}/infer" -d '{"inputs": [{"name": "predict", "shape": [1, 64], "datatype": "FP32", "contents": {"fp32_contents": [0.0, 0.0, 1.0, 11.0, 14.0, 15.0, 3.0, 0.0, 0.0, 1.0, 13.0, 16.0, 12.0, 16.0, 8.0, 0.0, 0.0, 8.0, 16.0, 4.0, 6.0, 16.0, 5.0, 0.0, 0.0, 5.0, 15.0, 11.0, 13.0, 14.0, 0.0, 0.0, 0.0, 0.0, 2.0, 12.0, 16.0, 13.0, 0.0, 0.0, 0.0, 0.0, 0.0, 13.0, 16.0, 16.0, 6.0, 0.0, 0.0, 0.0, 0.0, 16.0, 16.0, 16.0, 7.0, 0.0, 0.0, 0.0, 0.0, 11.0, 13.0, 12.0, 1.0, 0.0]}}]}'

JSON 响应应如下所示,推断扫描的数字是“8”:

{
"modelName": "sklearn-mnist__isvc-3c10c62d34","outputs": [{"name": "predict","datatype": "INT64","shape": ["1","1"],"contents": {"int64Contents": ["8"]}}]
}

使用模型服务网格自定义模型运行时

模型服务网格(Model Service Mesh,简称为 ModelMesh) 针对大容量、高密度和频繁变化的模型推理服务的部署运行进行了优化,可以智能地将模型加载到内存中或从内存中卸载,以在响应性和计算之间取得最佳的平衡。

ModelMesh 默认集成了以下模型服务器运行环境,例如:

  • Triton Inference Server,NVIDIA 的服务器,适用于 TensorFlow、PyTorch、TensorRT 或 ONNX 等框架。
  • MLServer,Seldon 的基于 Python 的服务器,适用于 SKLearn、XGBoost 或 LightGBM 等框架。
  • OpenVINO Model Server,英特尔用于英特尔 OpenVINO 或 ONNX 等框架的服务器。
  • TorchServe,支持包含 eager 模式的 PyTorch 模型。

如果这些模型服务器无法满足您的特定要求时,譬如需要处理推理的自定义逻辑,或者您的模型所需的框架还不在上述支持列表中,您可以自定义服务运行时来进行扩展支撑。

具体可以参考 [3]。

为大语言模型 LLM 提供服务

大语言模型 LLM(Large Language Model)指参数数量达到亿级别的神经网络语言模型,例如:GPT-3、GPT-4、PaLM、PaLM2 等。以下介绍如何为大语言模型 LLM 提供服务。

使用前提可以具体参考 [4]。

3.1 构建自定义运行时

构建自定义运行时,提供带有提示调整配置的 HuggingFace LLM。此示例中的默认值设置为我们预先构建的自定义运行时镜像和预先构建的提示调整配置。

3.1.1 实现一个继承自 MLServer MLModel 的类

kfp-tekton/samples/peft-modelmesh-pipeline 目录 [5] 中的 peft_model_server.py 文件包含了如何提供带有提示调整配置的 HuggingFace LLM 的所有代码。

下面的 _load_model 函数显示我们将选择已训练的 PEFT 提示调整配置的预训练 LLM 模型。分词器也作为模型的一部分进行定义,因此可以用于对推理请求中的原始字符串输入进行编码和解码,而无需要求用户预处理其输入为张量字节。

from typing import Listfrom mlserver import MLModel, types
from mlserver.codecs import decode_argsfrom peft import PeftModel, PeftConfig
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
import osclass PeftModelServer(MLModel):async def load(self) -> bool:self._load_model()self.ready = Truereturn self.ready@decode_argsasync def predict(self, content: List[str]) -> List[str]:return self._predict_outputs(content)def _load_model(self):model_name_or_path = os.environ.get("PRETRAINED_MODEL_PATH", "bigscience/bloomz-560m")peft_model_id = os.environ.get("PEFT_MODEL_ID", "aipipeline/bloomz-560m_PROMPT_TUNING_CAUSAL_LM")self.tokenizer = AutoTokenizer.from_pretrained(model_name_or_path, local_files_only=True)config = PeftConfig.from_pretrained(peft_model_id)self.model = AutoModelForCausalLM.from_pretrained(config.base_model_name_or_path)self.model = PeftModel.from_pretrained(self.model, peft_model_id)self.text_column = os.environ.get("DATASET_TEXT_COLUMN_NAME", "Tweet text")returndef _predict_outputs(self, content: List[str]) -> List[str]:output_list = []for input in content:inputs = self.tokenizer(f'{self.text_column} : {input} Label : ',return_tensors="pt",)with torch.no_grad():inputs = {k: v for k, v in inputs.items()}outputs = self.model.generate(input_ids=inputs["input_ids"], attention_mask=inputs["attention_mask"], max_new_tokens=10, eos_token_id=3)outputs = self.tokenizer.batch_decode(outputs.detach().cpu().numpy(), skip_special_tokens=True)output_list.append(outputs[0])return output_list
3.1.2 构建 Docker 镜像

实现了模型类之后,我们需要将其依赖项(包括 MLServer)打包到一个支持 ServingRuntime 资源的镜像中。参考如下 Dockerfile 进行镜像构建。

# TODO: choose appropriate base image, install Python, MLServer, and
# dependencies of your MLModel implementation
FROM python:3.8-slim-buster
RUN pip install mlserver peft transformers datasets
# ...# The custom `MLModel` implementation should be on the Python search path
# instead of relying on the working directory of the image. If using a
# single-file module, this can be accomplished with:
COPY --chown=${USER} ./peft_model_server.py /opt/peft_model_server.py
ENV PYTHONPATH=/opt/# environment variables to be compatible with ModelMesh Serving
# these can also be set in the ServingRuntime, but this is recommended for
# consistency when building and testing
ENV MLSERVER_MODELS_DIR=/models/_mlserver_models \MLSERVER_GRPC_PORT=8001 \MLSERVER_HTTP_PORT=8002 \MLSERVER_LOAD_MODELS_AT_STARTUP=false \MLSERVER_MODEL_NAME=peft-model# With this setting, the implementation field is not required in the model
# settings which eases integration by allowing the built-in adapter to generate
# a basic model settings file
ENV MLSERVER_MODEL_IMPLEMENTATION=peft_model_server.PeftModelServerCMD mlserver start ${MLSERVER_MODELS_DIR}
3.1.3 创建新的 ServingRuntime 资源

可以使用以下代码块中的 YAML 模板创建一个新的 ServingRuntime 资源,并将其指向您刚创建的镜像。

apiVersion: serving.kserve.io/v1alpha1
kind: ServingRuntime
metadata:name: peft-model-servernamespace: modelmesh-serving
spec:supportedModelFormats:- name: peft-modelversion: "1"autoSelect: truemultiModel: truegrpcDataEndpoint: port:8001grpcEndpoint: port:8085containers:- name: mlserverimage:  registry.cn-beijing.aliyuncs.com/test/peft-model-server:latestenv:- name: MLSERVER_MODELS_DIRvalue: "/models/_mlserver_models/"- name: MLSERVER_GRPC_PORTvalue: "8001"- name: MLSERVER_HTTP_PORTvalue: "8002"- name: MLSERVER_LOAD_MODELS_AT_STARTUPvalue: "true"- name: MLSERVER_MODEL_NAMEvalue: peft-model- name: MLSERVER_HOSTvalue: "127.0.0.1"- name: MLSERVER_GRPC_MAX_MESSAGE_LENGTHvalue: "-1"- name: PRETRAINED_MODEL_PATHvalue: "bigscience/bloomz-560m"- name: PEFT_MODEL_IDvalue: "aipipeline/bloomz-560m_PROMPT_TUNING_CAUSAL_LM"# - name: "TRANSFORMERS_OFFLINE"#   value: "1" # - name: "HF_DATASETS_OFFLINE"#   value: "1"   resources:requests:cpu: 500mmemory: 4Gilimits:cpu: "5"memory: 5GibuiltInAdapter:serverType: mlserverruntimeManagementPort: 8001memBufferBytes: 134217728modelLoadingTimeoutMillis: 90000

然后使用 kubectl apply 命令创建 ServingRuntime 资源,您将在 ModelMesh 部署中看到您的新自定义运行时。

3.2 部署 LLM 服务

为了使用您新创建的运行时部署模型,您需要创建一个 InferenceService 资源来提供模型服务。该资源是 KServe 和 ModelMesh 用于管理模型的主要接口,代表了模型在推理中的逻辑端点。

apiVersion: serving.kserve.io/v1beta1
kind: InferenceService
metadata:name: peft-demonamespace: modelmesh-servingannotations:serving.kserve.io/deploymentMode: ModelMesh
spec:predictor:model:modelFormat:name: peft-modelruntime: peft-model-serverstorage:key: localMinIOpath: sklearn/mnist-svm.joblib

在前面的代码块中,InferenceService 命名为 peft-demo,并声明其模型格式为 peft-model,与之前创建的示例自定义运行时使用相同的格式。还传递了一个可选字段 runtime,明确告诉 ModelMesh 使用 peft-model-server运行时来部署此模型。

3.3 运行推理服务

现在我们可以使用 curl 发送推理请求到我们上面部署的 LLM 模型服务。

MODEL_NAME="peft-demo"
ASM_GW_IP="ASM网关IP地址"
curl -X POST -k http://${ASM_GW_IP}:8008/v2/models/${MODEL_NAME}/infer -d @./input.json

其中 input.json 表示请求数据:

{"inputs": [{"name": "content","shape": [1],"datatype": "BYTES","contents": {"bytes_contents": ["RXZlcnkgZGF5IGlzIGEgbmV3IGJpbm5pbmcsIGZpbGxlZCB3aXRoIG9wdGlvbnBpZW5pbmcgYW5kIGhvcGU="]}}]
}

bytes_contents 对应的是字符串“Every day is a new beginning, filled with opportunities and hope”的 base64 编码。

JSON 响应应如下所示,推断扫描的数字是“8”:

{
"modelName": "peft-demo__isvc-5c5315c302","outputs": [{"name": "output-0","datatype": "BYTES","shape": ["1","1"],"parameters": {"content_type": {"stringParam": "str"}},"contents": {"bytesContents": ["VHdlZXQgdGV4dCA6IEV2ZXJ5IGRheSBpcyBhIG5ldyBiaW5uaW5nLCBmaWxsZWQgd2l0aCBvcHRpb25waWVuaW5nIGFuZCBob3BlIExhYmVsIDogbm8gY29tcGxhaW50"]}}]
}

其中 bytesContents 进行 base64 解码后的内容为:

Tweet text : Every day is a new binning, filled with optionpiening and hope Label : no complaint

至此,说明上述大语言模型 LLM 的模型服务请求得到了预期的结果。

总结

阿里云服务网格 ASM 已经提供了一个可扩展的、高性能的模型服务网格基础能力,用于将多个模型服务进行管理、部署和调度,以此更好地处理模型的部署、版本管理、路由和推理请求的负载均衡。

欢迎试用:https://www.aliyun.com/product/servicemesh

欢迎使用钉钉搜索钉钉群号加入我们。群号:30421250

相关链接:

[1] 以下是部署模型示例,使用前提可以参考

https://help.aliyun.com/zh/asm/user-guide/multi-model-inference-service-using-model-service-mesh?spm=a2c4g.11186623.0.0.7c4e6561k1qyJV#213af6d078xu7

[2] kserve/modelmesh-minio-examples 仓库

https://github.com/kserve/modelmesh-minio-examples/blob/main/sklearn/mnist-svm.joblib

[3] 具体可以参考

https://help.aliyun.com/zh/asm/user-guide/customizing-the-model-runtime-using-the-model-service-mesh?spm=a2c4g.11186623.0.0.1db77614Vw96Eu

[4] 使用前提可以具体参考

https://help.aliyun.com/zh/asm/user-guide/services-for-the-large-language-model-llm?spm=a2c4g.11186623.0.0.29777614EEBYWt#436fc73079euz

[5] kfp-tekton/samples/peft-modelmesh-pipeline 目录https://github.com/kubeflow/kfp-tekton

点击此处,直达 ASM 产品详情页。

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

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

相关文章

0基础开发EtherNet/IP:协议格式,JAVA、C#、C++处理

经过一阵倒腾&#xff0c;把CIP、Ethernet/ip协议搞到手 协议的概念和理论就不提及了&#xff0c;上网随便一搜索EtherNet/IP遍地都是。 直接将协议关键点列举出来吧。 更多协议资料 www.jngbus.com 通讯软件群 30806722 这里讲解的是TCP和UDP协议的格式&#xff0c;EtherN…

vue.config.js中打包相关配置

1.原始篇 let path require(path); const webpack require(webpack); const ThemeColorReplacer require(webpack-theme-color-replacer); const { getThemeColors, modifyVars } require(./src/utils/themeUtil); const { resolveCss } require(./src/utils/theme-color…

Python并发与多线程:并发网络通信模型

在Python中&#xff0c;有多种方式可以实现并发网络通信模型&#xff0c;其中包括多线程、多进程、协程和异步IO等。在本篇中&#xff0c;我们主要讨论多线程实现并发网络通信的方法。 使用多线程可以在一个程序中同时处理多个网络连接&#xff0c;从而提高程序的性能和效率。…

如何本地部署虚拟数字克隆人 SadTalker

环境&#xff1a; Win10 SadTalker 问题描述&#xff1a; 如何本地部署虚拟数字克隆人 SadTalker 解决方案&#xff1a; SadTalker&#xff1a;学习逼真的3D运动系数&#xff0c;用于风格化的音频驱动的单图像说话人脸动画 单张人像图像&#x1f64e; ♂️音频&#x1f3…

伊恩·斯图尔特《改变世界的17个方程》傅里叶变换笔记

主要是课堂的补充&#xff08;yysy&#xff0c;我觉得课堂的教育模式真有够无聊的&#xff0c;PPT、写作业、考试&#xff0c;感受不到知识的魅力。 它告诉我们什么&#xff1f; 空间和时间中的任何模式都可以被看作不同频率的正弦模式的叠加。 为什么重要&#xff1f; 频率分量…

【图解数据结构】顺序表实战指南:手把手教你详细实现(超详细解析)

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;图解数据结构、算法模板 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. ⛳️线性表1.1 &#x1f514;线性表的定义1.2 &#x1f514;线性表的存储结构 二. ⛳️顺序表…

论文阅读_CogTree_推理的认知树

英文名称: From Complex to Simple: Unraveling the Cognitive Tree for Reasoning with Small Language Models中文名称: 从复杂到简单&#xff1a;揭示小型语言模型推理的认知树链接: http://arxiv.org/abs/2311.06754v1代码: https://github.com/alibaba/EasyNLP作者: Junbi…

OpenCompass大模型测评

一、笔记 为什么大模型需要开展测评? 大模型测评有以下原因&#xff1a; 1、让普通用户了解大模型的能力和特点&#xff0c;选择合适的大模型 2、让开发者了解大模型的能力边界&#xff0c;找到提升的地方 3、让管理机构更了解大模型&#xff0c;减少大模型带来的社会风险 …

为vs code配置unity开发环境

1.安装.NET.Core SDK 我们可以访问官网下载安装SDK及tool&#xff08;https://www.microsoft.com/net/download/core&#xff09;下载。有的系统只提供了执行文件&#xff0c;没有提供安装包&#xff0c;需要自己做一些配置。 下载好对应的版本就可以安装了&#xff0c;安装好以…

Video 不支持微信小程序的show-bottom-progress属性

原文地址&#xff1a;Video 不支持微信小程序的show-bottom-progress属性-鹭娃网络 相关平台 微信小程序 小程序基础库: 2.20.1使用框架: React 复现步骤 import { Video} from tarojs/components; 渲染一个Video播放视频&#xff0c;无法隐藏手机屏幕最底部的进度条&#…

【JavaEE】文件操作与IO

作者主页&#xff1a;paper jie_博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文于《JavaEE》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精力)打造&…

L1-067 洛希极限(Java)

科幻电影《流浪地球》中一个重要的情节是地球距离木星太近时&#xff0c;大气开始被木星吸走&#xff0c;而随着不断接近地木“刚体洛希极限”&#xff0c;地球面临被彻底撕碎的危险。但实际上&#xff0c;这个计算是错误的。 洛希极限&#xff08;Roche limit&#xff09;是一…

【SpringCloud】微服务框架后端部署详细过程记录20240119

前言&#xff1a;前两天公司接到客户提供的一个微服务框架&#xff0c;导师让我在本地部署验证一下该框架的可用性&#xff0c;借此机会记录一下微服务项目的一个基本部署流程&#xff0c;仅供学习参考&#xff0c;如有不足还请指正&#xff01; 文件结构 提供的压缩文件共包含…

IDEA在重启springboot项目时没有自动重新build

IDEA在重启springboot项目时没有自动重新build 问题描述 当项目里面某些依赖或者插件更新了&#xff0c;target的class文件没有找到&#xff0c;导致不是我们需要的效果。 只能手动的清理target文件&#xff0c;麻烦得很 &#xff0c; 单体项目还好说&#xff0c;一次清理就…

如何让 Websocket兼容低版本浏览器

要使WebSocket兼容低版本浏览器&#xff0c;可以使用一些降级策略。以下是一些可能的方法&#xff1a; 使用WebSocket的替代方案&#xff1a;在低版本浏览器中&#xff0c;可以使用一些基于HTTP的长轮询或流技术来实现类似于WebSocket的功能。常见的替代方案包括Comet、SSE&…

C++从零开始的打怪升级之路(day16)

这是关于一个普通双非本科大一学生的C的学习记录贴 在此前&#xff0c;我学了一点点C语言还有简单的数据结构&#xff0c;如果有小伙伴想和我一起学习的&#xff0c;可以私信我交流分享学习资料 那么开启正题 今天分享的内容是string类的模拟实现 当然string类里面有100多个…

7、机器学习中的数据泄露(Data Leakage)

找到并修复这个以微妙的方式破坏你的模型的问题。 数据泄露这个概念在kaggle算法竞赛中经常被提到,这个不同于我们通常说的生活中隐私数据暴露,而是在竞赛中经常出现某支队伍靠着对极个别feature的充分利用,立即将对手超越,成功霸占冠军位置,而且与第二名的差距远超第二名…

一键搭建你的知识库

效果 说明 由于安装包安装需要glibc>2.7 我就不尝试了 因为glib升级是一个繁琐的过程 没有升级的意义 只是为了体验知识库 没必要浪费时间 1.1docker compose部署trilium 1.1.创建目录 mkdir -p /opt/triliumcd /opt/trilium 1.2.编写docker-comppose.yml文件 vim dock…

【51单片机】矩阵按键

0、前言 参考&#xff1a;普中 51 单片机开发攻略 1、硬件 2、软件 main.c #include <reg52.h> #include <intrins.h> #include "delayms.h"typedef unsigned int u16; //对数据类型进行声明定义 typedef unsigned char u8; #define GPIO_KEY P1 #d…

统计学-R语言-7.1

文章目录 前言假设检验的原理假设检验的原理提出假设做出决策表述结果效应量 总体均值的检验总体均值的检验(一个总体均值的检验) 练习 前言 本章主题是假设检验(hypothesis testing)。与参数估计一样&#xff0c;假设检验也是对总体参数感兴趣&#xff0c;如比例、比例间的差…