当前位置: 首页 > news >正文

WandB使用笔记

最近看代码,发现代码中有wandb有关的内容,搜索了一下发现是一个模型训练工具,然后学习了一下,这里记录一下使用过程,方便以后查阅。

WandB使用笔记

  • 登录WandB 并 创建团队
  • 安装 WandB 并 登录
  • 模型训练过程跟踪
  • 模型版本管理
  • 自动调参
  • 不同的模型训练工具对比
  • 参考资料

作者自注:之前训练模型一直使用的是Visdom,感觉非常好用,然后现在学习了一下WandB,发现先各有优劣。Visdom的曲线实时跟踪效果好,但是功能简单。WandB曲线实时跟踪效果差(可能是我的网的问题),但是功能强大,可以保存每次模型调优的参数,这样就不用手动再记录了;可以实现模型的版本管理,这样就可以随便改代码,不用担心改坏了;可以进行参数分析,这样就可以有目的的进行参数调优;可以进行自动调参,这样可在完成粗调制后进行局部的参数寻优。感觉以后两个可以同时使用,提高模型调优的效率

登录WandB 并 创建团队

点击下面的网站进入WandB:https://wandb.ai/site,然后点击界面中的 LOGIN 进行登录。

在这里插入图片描述

如下需要选择登录的方式,这里我选择的是 GitHub 。

在这里插入图片描述

完成登陆后进入如下初始界面,点击图片中红框中的内容,创建一个新的 team

在这里插入图片描述

之后进入如下界面,输入团队名称,并点击 Create team ,完成团队的创建。

在这里插入图片描述

团队创建成功后出现如下界面,选择是否把自己的 runs 更新到 team ,这里选择 Update

在这里插入图片描述

如此就完成了登录和团建创建过程!

如果想要删除创建的团队,则在主界面点击创建的团队,如下图所示:

在这里插入图片描述

进入团队后,点击 Team settings ,如下图所示:

在这里插入图片描述

接着滑动到最下面,点击 Delete team

在这里插入图片描述

接着需要你输入 团队的名称 进行删除,这里的逻辑跟GitHub删除项目一样。

在这里插入图片描述

安装 WandB 并 登录

使用 pip 安装 WandB:

pip install wandb

在这里插入图片描述

验证安装是否成功:

wandb --version

在这里插入图片描述

首次使用 WandB 时,需要登录账户:

wandb login

在这里插入图片描述

登录后,WandB 会提示输入 API 密钥。可以从 WandB 的 API 密钥页面 获取密钥,点击图片中的红框部分,复制密钥,然后粘贴到上图的 3 标识的地方,并点击回车,如此就完成了登录过程。

在这里插入图片描述

如果你之前已经登陆过了,则会出现如下的内容:
在这里插入图片描述

然后在终端输入如下的命令即可重新登录:

wandb login --relogin

在这里插入图片描述

模型训练过程跟踪

将如下代码复制到PyCharm中,进行实验。

import wandb
import torch
from torch import nn
import torchvision
from torchvision import transforms
import datetime
from argparse import Namespacedevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
config = Namespace(project_name='wandb_demo',batch_size=512,hidden_layer_width=64,dropout_p=0.1,lr=1e-4,optim_type='Adam',epochs=150,ckpt_path='checkpoint.pt'
)def create_dataloaders(config):transform = transforms.Compose([transforms.ToTensor()])ds_train = torchvision.datasets.MNIST(root="./mnist/", train=True, download=True, transform=transform)ds_val = torchvision.datasets.MNIST(root="./mnist/", train=False, download=True, transform=transform)ds_train_sub = torch.utils.data.Subset(ds_train, indices=range(0, len(ds_train), 5))dl_train = torch.utils.data.DataLoader(ds_train_sub, batch_size=config.batch_size, shuffle=True, drop_last=True)dl_val = torch.utils.data.DataLoader(ds_val, batch_size=config.batch_size, shuffle=False, drop_last=True)return dl_train, dl_valdef create_net(config):net = nn.Sequential()net.add_module("conv1", nn.Conv2d(in_channels=1, out_channels=config.hidden_layer_width, kernel_size=3))net.add_module("pool1", nn.MaxPool2d(kernel_size=2, stride=2))net.add_module("conv2", nn.Conv2d(in_channels=config.hidden_layer_width,out_channels=config.hidden_layer_width, kernel_size=5))net.add_module("pool2", nn.MaxPool2d(kernel_size=2, stride=2))net.add_module("dropout", nn.Dropout2d(p=config.dropout_p))net.add_module("adaptive_pool", nn.AdaptiveMaxPool2d((1, 1)))net.add_module("flatten", nn.Flatten())net.add_module("linear1", nn.Linear(config.hidden_layer_width, config.hidden_layer_width))net.add_module("relu", nn.ReLU())net.add_module("linear2", nn.Linear(config.hidden_layer_width, 10))net.to(device)return netdef train_epoch(model, dl_train, optimizer):model.train()for step, batch in enumerate(dl_train):features, labels = batchfeatures, labels = features.to(device), labels.to(device)preds = model(features)loss = nn.CrossEntropyLoss()(preds, labels)loss.backward()optimizer.step()optimizer.zero_grad()return modeldef eval_epoch(model, dl_val):model.eval()accurate = 0num_elems = 0for batch in dl_val:features, labels = batchfeatures, labels = features.to(device), labels.to(device)with torch.no_grad():preds = model(features)predictions = preds.argmax(dim=-1)accurate_preds = (predictions == labels)num_elems += accurate_preds.shape[0]accurate += accurate_preds.long().sum()val_acc = accurate.item() / num_elemsreturn val_acc
def train(config=config):dl_train, dl_val = create_dataloaders(config)model = create_net(config);optimizer = torch.optim.__dict__[config.optim_type](params=model.parameters(), lr=config.lr)# ======================================================================nowtime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')wandb.init(project=config.project_name, config=config.__dict__, name=nowtime, save_code=True)model.run_id = wandb.run.id# ======================================================================model.best_metric = -1.0for epoch in range(1, config.epochs + 1):model = train_epoch(model, dl_train, optimizer)val_acc = eval_epoch(model, dl_val)if val_acc > model.best_metric:model.best_metric = val_acctorch.save(model.state_dict(), config.ckpt_path)nowtime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')print(f"epoch【{epoch}】@{nowtime} --> val_acc= {100 * val_acc:.2f}%")# ======================================================================wandb.log({'epoch': epoch, 'val_acc': val_acc, 'best_val_acc': model.best_metric})# ======================================================================# ======================================================================wandb.finish()# ======================================================================return model

上述代码最关键的就是如下三个部分:

  1. 初始化部分:
wandb.init(project=config.project_name, config=config.__dict__, name=nowtime, save_code=True)
  1. 模型训练参数上传
wandb.log({'epoch': epoch, 'val_acc': val_acc, 'best_val_acc': model.best_metric})
  1. 模型训练完成关闭wandb:
wandb.finish()

最后在PyCharm中输入如下代码,即可运行上述代码:

model = train(config)

代码运行成功,即可出现如下的界面,点击下图中红框中的部分,即可跳转到曲线监视界面。

在这里插入图片描述

模型训练过程监视界面如下图所示:

在这里插入图片描述

点击下图中的红框部分,更改曲线的横坐标值。

在这里插入图片描述

如下图所示,将横坐标值更改为 epoch。

在这里插入图片描述

然后我们还可以增加一个 section

在这里插入图片描述

在新的 section 中添加新的显示模块,如下图所示:

在这里插入图片描述

此处我们添加了验证集的准确率,实现实时的监控。

在这里插入图片描述

模型训练结束,我们可以点击 runs 查看历史记录。

在这里插入图片描述

如下图可以看到,我们刚才监视的曲线,如图中的长方形红框所示。然后点击小红框中的 runs ,查看每一次训练过程的模型参数。

在这里插入图片描述

每一次模型训练的参数如下图所示,可以选择图中红框中的内容,选择需要的参数进行显示。

在这里插入图片描述

可选择的指标如下图所示:

在这里插入图片描述

对于某些我们比较关注的指标,我们可以将其固定显示:

在这里插入图片描述

固定后,我们回到 Workspace 界面,即可看到固定的参数。

在这里插入图片描述

模型版本管理

除了可以记录实验日志传递到 wandb 网站的云端服务器 并进行可视化分析。wandb还能够将实验关联的数据集,代码和模型 保存到 wandb 服务器。我们可以通过 wandb.log_artifact的方法来保存任务的关联的重要成果。例如 dataset, code,和 model,并进行版本管理。

当我们跑出一个相对不错的结果时,我们希望把这个结果给保存下来,此时我们就可以使用该功能。

我们先使用run_id 恢复 run任务,以便继续记录。

import wandb
# resume the run
run = wandb.init(project='wandb_demo', id='6h5xkv16', resume='allow')

上述代码中的 id 是用来关联我们训练的 runs 的,参数的值来自下图红框中的内容,想搞关联某一次的训练过程,就把某一次训练的 ID 写入上述代码。

在这里插入图片描述
保存数据集的代码:

# save dataset
arti_dataset = wandb.Artifact(name='mnist', type='dataset')
arti_dataset.add_dir('mnist/')
wandb.log_artifact(arti_dataset)

保存模型文件的代码:

# save code
arti_code = wandb.Artifact(name='py', type='code')
arti_code.add_file('./wandb_test.py')
wandb.log_artifact(arti_code)

保存模型权重的代码:

# save model
arti_model = wandb.Artifact(name='cnn', type='model')
arti_model.add_file(config.ckpt_path)
wandb.log_artifact(arti_model)

最后结束时要使用一下代码:

# finish时会提交保存
wandb.finish()

上传后的效果如图所示:

在这里插入图片描述

自动调参

sweep采用类似master-workers的controller-agents架构,controller在wandb的服务器机器上运行,agents在用户机器上运行,controller和agents之间通过互联网进行通信。同时启动多个agents即可轻松实现分布式超参搜索。

在这里插入图片描述

使用Sweep的3步骤:

  1. 配置 sweep_config
# 配置 Sweep config
sweep_config = {'method': 'random',  # 选择调优算法,超参数搜索方法:随机搜索'metric': {          # 定义调优目标'name': 'val_acc','goal': 'maximize'},'parameters': {     # 定义超参空间'project_name': {'value': 'wandb_demo'},    # 固定不变的超参'epochs': {'value': 10},'ckpt_path': {'value': 'checkpoint.pt'},'optim_type': {                             # 离散型分布超参'values': ['Adam', 'SGD', 'AdamW']},'hidden_layer_width': {'values': [16, 32, 48, 64, 80, 96, 112, 128]},'lr': {                                     # 连续型分布超参'distribution': 'log_uniform_values','min': 1e-6,'max': 0.1},'batch_size': {'distribution': 'q_uniform','q': 8,'min': 32,'max': 256,},'dropout_p': {'distribution': 'uniform','min': 0,'max': 0.6,}},# 'early_terminate': {    # 定义剪枝策略 (可选)#     'type': 'hyperband',    # 使用 HyperBand 作为早停策略#     'min_iter': 3,          # 最小评估迭代次数(第 3 次迭代后开始考虑剪枝)#     'eta': 2,               # 成倍增长的资源分配比例(每次迭代中仅保留约 1/eta 的实验)#     's': 3                  # HyperBand 的最大阶数,影响资源分配的层级# }
}
from pprint import pprint
pprint(sweep_config)

Sweep支持如下3种调优算法:

(1)网格搜索:grid. 遍历所有可能得超参组合,只在超参空间不大的时候使用,否则会非常慢。

(2)随机搜索:random. 每个超参数都选择一个随机值,非常有效,一般情况下建议使用。

(3)贝叶斯搜索:bayes.
创建一个概率模型估计不同超参数组合的效果,采样有更高概率提升优化目标的超参数组合。对连续型的超参数特别有效,但扩展到非常高维度的超参数时效果不好。

  1. 初始化 sweep controller
# 初始化 sweep controller
sweep_id = wandb.sweep(sweep_config, project=config.project_name)
  1. 启动 sweep agents
# 启动 Sweep agent
# 该agent 随机搜索 尝试5次
wandb.agent(sweep_id, train, count=5)

等代码跑完我们就有了一个 sweep,如下图所示:

在这里插入图片描述

进入 sweep 之后就可以添加 Parallel coordinatesParameter importance 进行参数分析。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

不同的模型训练工具对比

工具实验管理数据版本控制模型部署团队协作离线支持特点
TensorBoard轻量级工具,适合快速原型开发
WandB功能全面,支持超参数调优和实时协作
Comet简单易用,支持离线模式
MLflow实验管理与模型部署一体化
Neptune强大的可视化功能
Sacred极简实验管理工具
Polyaxon分布式训练与大规模实验管理支持
DVC专注于数据和模型版本控制
ClearML全面的 MLOps 功能

参考资料

30分钟吃掉wandb模型训练可视化

wandb我最爱的炼丹伴侣操作指南

30分钟吃掉wandb可视化自动调参

wandb可视化调参完全指南

相关文章:

WandB使用笔记

最近看代码,发现代码中有wandb有关的内容,搜索了一下发现是一个模型训练工具,然后学习了一下,这里记录一下使用过程,方便以后查阅。 WandB使用笔记 登录WandB 并 创建团队安装 WandB 并 登录模型训练过程跟踪模型版本管…...

TTL 传输中过期问题定位

问题: 工作环境中有一个acap的环境,ac的wan口ip是192.168.186.195/24,ac上lan上有vlan205,其ip子接口地址192.168.205.1/24,ac采用非nat模式,而是路由模式,在上级路由器上有192.168.205.0/24指向…...

spring mvc源码学习笔记之五

pom.xml 内容如下 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…...

Java 数据库连接 - Sqlite

Java 数据库连接 - Sqlite PS: 1. 连接依赖库&#xff1a;[sqlite-jdbc-xxx.jar](https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc)(根据连接的数据库版本选择) 2. 支持一次连接执行多次sql语句&#xff1b; 3. 仅本地连接&#xff1b;使用说明&#xff1a; publ…...

【Rust自学】10.2. 泛型

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 题外话&#xff1a;泛型的概念非常非常非常重要&#xff01;&#xff01;&#xff01;整个第10章全都是Rust的重难点&#xff01;&#xf…...

鸿蒙MPChart图表自定义(六)在图表中绘制游标

在鸿蒙开发中&#xff0c;MPChart 是一个非常强大的图表库&#xff0c;它可以帮助我们创建各种精美的图表。今天&#xff0c;我们将继续探索鸿蒙MPChart的自定义功能&#xff0c;重点介绍如何在图表中绘制游标。 OpenHarmony三方库中心仓 一、效果演示 以下是效果演示图&…...

PHP在做api开发中,RSA加密签名算法如何使用 ?

RSA 加密是什么 RSA&#xff08;Rivest-Shamir-Adleman&#xff09;是最早的公钥密码系统之一&#xff0c;广泛用于安全数据传输。3 位数学家 Rivest、Shamir 和 Adleman 的名字来命名的。 是非对称加密的一种 这种算法非常可靠&#xff0c;密钥越长&#xff0c;它就越难破解。…...

PHP+Redis的基本操作方法

一、Redis连接与认证 二、String操作 三、Hash操作 四、List操作 五、Set操作 六、Zset操作 一、Redis连接与认证 $redis new Redis(); //连接参数&#xff1a;ip、端口、连接超时时间&#xff0c;连接成功返回true&#xff0c;否则返回false $ret $redis->connec…...

非docker方式部署openwebui过程记录

之前一直用docker方式部署openwebui&#xff0c;结果这东西三天两头升级&#xff0c;我这一升级拉取docker镜像硬盘空间嗖嗖的占用&#xff0c;受不了&#xff0c;今天改成了直接部署&#xff0c;以下是部署过程记录。 一、停止及删除没用的docker镜像占用的硬盘空间 docker s…...

豆包ai 生成动态tree 增、删、改以及上移下移 html+jquery

[豆包ai 生成动态tree 增、删、改以及上移下移 htmljquery) 人工Ai 编程 推荐一Kimi https://kimi.moonshot.cn/ 推荐二 豆包https://www.doubao.com/ 实现效果图 html 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF…...

基于STM32环境温湿度监测系统设计(附项目代码zip)

一.介绍 本文详细介绍了一种基于STM32F103C8T6微控制器DS18B20温度传感器DHT11温湿度传感器的环境监测系统。该系统旨在实时监测周围环境的温度与湿度&#xff0c;通过OLED实时显示温湿度值&#xff0c;通过USART串口实时打印温湿度值&#xff0c;并在温湿度超过预设阈值时&am…...

Kafka配置公网或NLB访问(TCP代理)

这套配置适用于TCP代理和公网访问&#xff0c;kafka版本2.8&#xff0c;版本如果不同配置参数会有一些差异&#xff0c;原理一致 分几种场景&#xff0c;正常来说我们直接使用kafka IP地址访问就行&#xff0c;考虑到网络架构和环境安全&#xff0c;需要使用公网或代理访问kaf…...

30分钟学会css

CSS 基本语法 CSS&#xff08;Cascading Style Sheets&#xff09;是一种样式表语言&#xff0c;用于描述 HTML&#xff08;或 XML&#xff09;文档的呈现。它可以控制网页元素的颜色、字体、布局等外观样式&#xff0c;实现内容与表现的分离&#xff0c;让网页设计更加灵活和…...

若依修改超级管理员admin的密码

通过接口方式或者页面 /system/user/resetPwd 需改其他用户的密码 修改其他用户的加密的密码&#xff0c;然后通过数据库将admin更新为这个密码就修改好了...

《柴油遗产-无耻时代》V98375官方版

靠近你所在赛道上的另一名玩家进行攻击或防守&#xff0c;跳到另一条赛道上进行恢复&#xff0c;或闪到对手背后打他个措手不及。与队友合作&#xff0c;充分利用每个角色的独特玩法来控制战斗走向&#xff01; 《柴油遗产-无耻时代》官方版 https://pan.xunlei.com/s/VODW7xDX…...

加固服务器有什么用?

为什么越来越多的企业和个人都在加固他们的服务器&#xff1f;加固服务器不仅可以保护数据安全&#xff0c;还能提升整体系统的稳定性和可靠性。下面是聚名网的一些介绍。 加固服务器的首要目的就是提高安全性。随着网络攻击手段的不断演变&#xff0c;黑客和恶意软件的威胁也…...

Json字符串解析失败

通过第三方服务&#xff0c;拿到响应体的data对象&#xff08;拿到的时候对象是有值的&#xff09; 通过JSON.parseObject方法&#xff0c;拿到的对象&#xff0c;值为null 通过查看对应的json字符串&#xff0c;发现命名不一样... JSONField SeriealizedName注解是用来解析j…...

比较 FreeSWITCH 的 asr 事件和回调函数

用 lua 来描述&#xff0c;是这样的 第一种做法&#xff1a; session:setVariable("fire_asr_events", "true") session:execute("detect_speech", "start-input-timers") 识别到结果之后可以收到 DETECTED_SPEECH 事件 另外一个做法…...

Pytorch 三小时极限入门教程

一、引言 在当今的人工智能领域&#xff0c;深度学习占据了举足轻重的地位。而 Pytorch 作为一款广受欢迎的深度学习框架&#xff0c;以其简洁、灵活的特性&#xff0c;吸引了大量开发者投身其中。无论是科研人员探索前沿的神经网络架构&#xff0c;还是工程师将深度学习技术落…...

125个Docker的常用命令

基本命令命令描述示例docker run创建并启动一个容器docker run -it ubuntu bashdocker ps列出当前运行的容器docker psdocker ps -a列出所有容器&#xff0c;包括未运行的docker ps -adocker stop停止一个运行中的容器docker stop [CONTAINER_ID]docker start启动一个已停止的容…...

C# 设计模式(结构型模式):组合模式

C# 设计模式&#xff08;结构型模式&#xff09;&#xff1a;组合模式 在软件设计中&#xff0c;有时我们需要处理的是一组对象&#xff0c;而这些对象既可以是单独的元素&#xff0c;也可以是由多个子元素组成的复合体。这时&#xff0c;组合模式&#xff08;Composite Patte…...

【HarmonyOS】:DevEco Studio安装与应用工程创建指南

前言 本文旨在为初涉 HarmonyOS 开发的开发者提供一份详尽的入门指南&#xff0c;涵盖从安装最新版 DevEco Studio 到使用该 IDE 创建首个应用工程的具体步骤。通过遵循本指南&#xff0c;您将能够顺利搭建起自己的开发环境&#xff0c;并迈出构建HarmonyOS应用的第一步。 一、…...

【C/C++】手搓项目中常用小工具:日志、sqlit数据库、Split切割、UUID唯一标识

每日激励&#xff1a;“不设限和自我肯定的心态&#xff1a;I can do all things。 — Stephen Curry” 绪论​&#xff1a; 本章将写到一些手搓常用工具&#xff0c;方便在项目中的使用&#xff0c;并且在手搓的过程中一些函数如&#xff1a;日志 宏中的__VA_ARGS__接收可变参…...

【论文阅读】Anchor-based fast spectral ensemble clustering

论文地址&#xff1a;Anchor-based fast spectral ensemble clustering - ScienceDirect 代码地址&#xff1a; 摘要 集成聚类通过融合多个基础聚类方法&#xff0c;可以获得更好且更稳健的结果&#xff0c;因此受到广泛关注。尽管近年来已经出现了许多代表性的算法&#xff…...

asp.net core 发布到iis后,一直500.19,IIS设置没问题,安装了sdk,文件夹权限都有,还是报错

原因就是没有安装ASP.NET Core 9.0 Runtime (v9.0.0) - Windows Hosting Bundle&#xff0c;我是只安装了.net core的sdk&#xff0c;下面介绍下sdk和hosting bundle的关系 在 .NET Core 和 ASP.NET Core 的开发中&#xff0c;SDK&#xff08;Software Development Kit&#x…...

牛客月赛108

目录 A. 小S按按钮 C. 小T数星星 E. 小M种树 A. 小S按按钮 &#xff08;1&#xff09; 二分答案的右边界一定要开大。若 x 等于 0&#xff0c;最多 2 * y 次 &#xff08;2&#xff09;根据是要最小还是最多&#xff0c;调整 if ( check ( mid ) ) 里的是 l 还是 r #include&l…...

QML自定义进度条和单选按钮的样式

1.自定义进度条的样式 1.1代码展示 import QtQuick 2.9 import QtQuick.Window 2.2 import QtQuick.Controls 2.1Window {visible: truewidth: 640height: 480title: qsTr("Hello World")ProgressBar {id: myProgressvalue: 0.5padding: 2anchors.centerIn: parent…...

jetbrain 安装 copilot

问题一&#xff1a;Sign in failed. Reason: Request signInInitiate failed with message: Request to /github.com/login/device/code> timed out after 30000ms, request id: 11, error code: -32603 解决方案&#xff1a; 参考资料&#xff1a;https://github.com/orgs/…...

FPGA 4x4矩阵键盘 实现

1原理 FPGA(现场可编程门阵列)4x4矩阵键盘的实现原理主要基于行列扫描法,通过FPGA对键盘的扫描和识别,实现对键盘输入信号的采集和处理。以下是对FPGA 4x4矩阵键盘实现原理的详细解释: 一、矩阵键盘的基本原理 结构:4x4矩阵键盘由4行和4列组成,共16个按键。每个按键位…...

探索 JMeter While Controller:循环测试的奇妙世界

嘿&#xff0c;宝子们&#xff01;今天咱们就来聊聊 JMeter 里超级厉害的 While 控制器&#xff0c;它就像是一把神奇的钥匙&#xff0c;能帮我们打开循环测试的大门&#xff0c;模拟出各种各样复杂又有趣的场景哦&#xff01; 一、While 控制器初印象 想象一下&#xff0c;你…...

Facebook元宇宙项目中的智能合约应用:提升虚拟空间的自治能力

近年来&#xff0c;Facebook在元宇宙领域的探索引起了广泛关注。元宇宙是一个融合虚拟现实&#xff08;VR&#xff09;、增强现实&#xff08;AR&#xff09;和互联网的沉浸式数字空间。在这个过程中&#xff0c;智能合约技术被认为是提升虚拟空间自治能力的关键工具。通过自动…...

前后端规约

文章目录 引言I 【强制】前后端交互的 API请求内容响应体响应码II 【推荐】MVC响应体III【参考】IV 其他引言 服务器内部重定向必须使用 forward;外部重定向地址必须使用 URL 统一代理模块生成,否则会因线上采用 HTTPS 协议而导致浏览器提示“不安全”,并且还会带来 URL 维护…...

获取 Astro Bot AI 语音来增强您的游戏体验!

有很多用户尝试过Astro Bot&#xff0c;却被Astro Bot可爱的声音所吸引。您是否想知道如何使用 Astro Bot 语音来拨打恶作剧电话或用他的声音说话&#xff1f;如果您有&#xff0c;那么这篇文章适合您。我们将向您展示如何为 Astro Bot 提供逼真的 AI 声音并在在线对话中使用它…...

javaEE-多线程进阶-JUC的常见类

juc:指的是java.util.concurrent包&#xff0c;该包中加载了一些有关的多线程有关的类。 目录 一、Callable接口 FutureTask类 参考代码&#xff1a; 二、ReentrantLock 可重入锁 ReentrantLock和synchronized的区别&#xff1a; 1.ReentantLock还有一个方法&#xff1a…...

nginx配置 - 资源参数配置(性能优化)

nginx - 资源参数配置 (性能优化) 一、worker_rilimit_nofile配置的含义使用场景如何调整参数系统级文件描述符限制(补充)二、worker_connections三、两者之间的数值关系四、sendfile五、keepalive_timeout本文重点讨论: 最大文件描述符数量 worker_rilimit_nofile和最大连…...

TiDB 升级至高版本提示'mysql.tidb_runaway_watch' doesn't exist 问题处理

作者&#xff1a; asd80703406 原文来源&#xff1a; https://tidb.net/blog/90394c97 背景 近期发现很多人从低版本升级至TiDB v7 或者v8版本&#xff0c;均遇到了tidb-server启动失败&#xff0c;提示报错如下&#xff1a; ["get runaway watch record failed"…...

利用Deeplearning4j进行 图像识别

目录 图像识别简介 神经网络 感知器 前馈神经网络 自动编码器 受限玻尔兹曼机 深度卷积网络 理解图像内容以及图像含义方面&#xff0c;计算机遇到了很大困难。本章先介绍计算机理解图像教育方面 遇到的难题&#xff0c;接着重点讲解一个基于深度学习的解决方法。我们会…...

使用Python构建智能医疗诊断系统

医疗诊断系统在现代医疗领域中扮演着重要角色,尤其在辅助医生进行初步诊断、缩短诊断时间方面更是发挥了显著作用。借助Python强大的数据处理能力和机器学习工具,我们可以构建一个智能医疗诊断系统。本文将详细介绍实现过程,并结合代码示例帮助您理解。 引言 现代医学产生…...

NLP 技术的突破与未来:从词嵌入到 Transformer

在过去的十年中&#xff0c;自然语言处理&#xff08;NLP&#xff09;经历了深刻的技术变革。从早期的统计方法到深度学习的应用&#xff0c;再到如今Transformer架构的普及&#xff0c;NLP 的发展不仅提高了模型的性能&#xff0c;还扩展了其在不同领域中的应用边界。 1. 词嵌…...

【2024年-11月-9日-开源社区openEuler实践记录】OpenAMDC:开启智能边缘计算与系统管控的新征程

一、开篇&#xff1a;邂逅 OpenAMDC 大家好&#xff0c;我是 fzr123&#xff0c;在开源项目的浩瀚天地里持续探索&#xff0c;今天要带大家深入了解一项极具前瞻性与创新性的开源成果——OpenAMDC。在边缘计算蓬勃兴起、系统复杂度与日俱增的时代背景下&#xff0c;OpenAMDC 宛…...

ELK日志平台搭建 (最新版)

一、安装 JDK 1. 下载 JDK 21 RPM 包 wget https://download.oracle.com/java/21/latest/jdk-21_linux-x64_bin.rpm2. 安装 JDK 21,使用 rpm 命令安装下载的 RPM 包&#xff1a; sudo rpm -ivh jdk-21_linux-x64_bin.rpm3. 配置环境变量 编辑 /etc/profile 文件以配置 JAVA_HO…...

蓝桥杯备赛:C++基础,顺序表和vector(STL)

目录 一.C基础 1.第一个C程序&#xff1a; 2.头文件&#xff1a; 3.cin和cout初识&#xff1a; 4.命名空间&#xff1a; 二.顺序表和vector&#xff08;STL&#xff09; 1.顺序表的基本操作&#xff1a; 2.封装静态顺序表&#xff1a; 3.动态顺序表--vector&#xff1a;…...

MySQL数据库——常见慢查询优化方式

本文详细介绍MySQL的慢查询相关概念&#xff0c;分析步骤及其优化方案等。 文章目录 什么是慢查询日志&#xff1f;慢查询日志的相关参数如何启用慢查询日志&#xff1f;方式一&#xff1a;修改配置文件方式二&#xff1a;通过命令动态启用 分析慢查询日志方式一&#xff1a;直…...

【NX入门篇】

NX入门篇 一、UG NX 由来二、软件如何启动&#xff08;UG NX 12.0&#xff09;三、使用步骤四、常用命令 一、UG NX 由来 UG NX由来&#xff1a; 1969 年&#xff1a;UG 的开发始于美国麦道航空公司&#xff0c;基于 C 语言开发实现&#xff1b;1976 年&#xff1a;UG问世&am…...

卡码网 ACM答题编程模板

背景&#xff1a; input() 在 ACM 编程中的底层调用原理 1. input() 的核心原理 在 Python 中&#xff0c;input() 的底层实现依赖于标准输入流 sys.stdin。每次调用 input() 时&#xff0c;Python 会从 sys.stdin 中读取一行字符串&#xff0c;直到遇到换行符 \n 或文件结束…...

vue代理问题

vue代理问题 场景:前后端分离项目问题,在前端中请求接口,返回数据这个过程,但是在这个过程中,前端会有两个环境,一个是开发环境,一个是生产环境. 在开发环境中请求接口可能会遇到跨域问题,比如请求的端口是3000,当前端口是8080,这时候就会遇到跨域问题,或者ip不同,也会存在跨…...

软考 高级 架构师 第十 章软件工程3

1.系统测试 系统测试是为了发现错误而执行程序的过程&#xff0c;成功的测试是发现了至今尚未被发现的错误的测试。 测试原则&#xff1a; 1&#xff09;应尽早并不断的进行测试 2&#xff09;测试工作应避免由原开发软件的人或小组承担 3&#xff09;在 设计测试方案时&#…...

GoF23种设计模式 简介

文章目录 面向对象(OO)设计原则&#xff08;7&#xff09;单一职责原则开闭原则里氏代换原则依赖倒转原则接口隔离原则合成复用原则迪米特法则 创建型模式 &#xff08;5&#xff09;工厂方法模式 &#xff08;类模式&#xff0c;其余都是对象模式&#xff09;抽象工厂模式建造…...

【FlutterDart】页面切换 PageView PageController(9 /100)

上效果&#xff1a; 有些不能理解官方例子里的动画为什么没有效果&#xff0c;有可能是我写法不对 后续如果有动画效果修复了&#xff0c;再更新这篇&#xff0c;没有动画效果&#xff0c;总觉得感受的丝滑效果差了很多 上代码&#xff1a; import package:flutter/material.…...

旧服务改造及微服务架构演进

旧服务改造及微服务架构演进 微服务架构演进1.微服务架构2.微服务架构的特点3.单体架构与微服务架构之间的对比4.微服务架构演进历程 旧服务改造1. 微服务拆分的一些通用原则2.微服务拆分策略&#xff08;1&#xff09;功能维度拆分策略&#xff08;2&#xff09;非功能维度拆分…...