slurm部署安装

news2025/1/12 23:44:53

slurm部署安装

管理节点和计算节点

在所有节点执行

安装系统工具

apt install -y build-essential curl wget munge

将hosts文件

 vim /etc/hosts

xxx.xxx.xxx.xxx  xxx

分发到其他计算节点

创建slurm用户

useradd -m slurm
mkdir /var/spool/slurmd /var/spool/slurmctld
chown slurm:slurm /var/spool/slurmd /var/spool/slurmctld

配置munge(在管理节点执行)

 /usr/sbin/mungekey --create  #生成的文件在/etc/munge

 ll /etc/munge
-rw-------   1 munge munge  128 Nov 20 09:29 munge.key

将munge.key分发到其他计算节点
scp munge.key 10.250.2.232:/etc/munge/

在所有节点添加用户及用户组
chown munge:munge /etc/munge/munge.key
启动
systemctl start munge

配置slurmdbd

首先要有一个数据,我这里使用容器里面的MariaDB

 kubectl exec -it volador-database-deploy-5fb94cd59f-4mm5g -- /bin/bash
 
 MariaDB [(none)]> create user 'slurm'@'localhost' identified by '123456';
Query OK, 0 rows affected (0.024 sec)

MariaDB [(none)]> create database slurm_acct_db;
Query OK, 1 row affected (0.000 sec)

MariaDB [(none)]> grant all on slurm_acct_db.* TO 'slurm'@'localhost' identified by '123456' with grant option;
Query OK, 0 rows affected (0.013 sec)

MariaDB [(none)]> grant all on slurm_acct_db.* TO 'slurm'@'system0' identified by '123456' with grant option;
Query OK, 0 rows affected, 1 warning (0.004 sec)

MariaDB [(none)]> create database slurm_jobcomp_db;
Query OK, 1 row affected (0.001 sec)

MariaDB [(none)]> grant all on slurm_jobcomp_db.* TO 'slurm'@'localhost' identified by '123456' with grant option;
Query OK, 0 rows affected (0.016 sec)

MariaDB [(none)]> grant all on slurm_jobcomp_db.* TO 'slurm'@'system0' identified by '123456' with grant option;
Query OK, 0 rows affected, 1 warning (0.002 sec)

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;

部署MySQL
安装依赖环境
root@4090-208:/usr/local/mysql-5.7.18# apt-get install cmake bison libncurses5-dev gcc g++  libncurses5 -y 
下载安装包
root@4090-208:/usr/local/mysql-5.7.18# wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-boost-5.7.18.tar.gz

root@4090-208:/usr/local/mysql-5.7.18# tar -zxf mysql-boost-5.7.18.tar.gz -C /usr/local/
创建用户用户组
root@4090-208:/usr/local/mysql-5.7.18# groupadd mysql
root@4090-208:/usr/local/mysql-5.7.18# useradd -g mysql mysql
编译安装MySQL
cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DWITH_BOOST=./boost/boost_1_59_0 \
-DSYSCONFDIR=/etc \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_READLINE=1 \
-DMYSQL_TCP_PORT=3306 \
-DEXTRA_CHARSETS=all \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci


make -j4 && make install -j4
配置MySQL

设置MySQL用户权限

root@4090-208:/usr/local# chown -R mysql:mysql /usr/local/mysql

修改配置文件

vim /etc/my.cnf

[client]
port = 3306
socket = /tmp/mysql.sock

[mysqld]
character_set_server=utf8
init_connect='SET NAMES utf8'
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
lower_case_table_names = 1

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

max_connections=5000

default_time_zone='+8:00'

启动数据库

/usr/local/mysql/support-files/mysql.server start

将MySQL的客户端库添加环境变量

echo "export LD_LIBRARY_PATH=/usr/local/mysql/lib:$LD_LIBRARY_PATH" | sudo tee -a /etc/profile
source /etc/profile

系统默认会查找/usr/bin下的命令;建立一个链接文件。

ln -s /usr/local/mysql/bin/mysql /usr/bin

新建slurmdbd.conf文件

root@4090-208:~# vim /etc/slurm/slurmdbd.conf
#
# Example slurmdbd.conf file.
#
# See the slurmdbd.conf man page for more information.
#
# Archive info
#ArchiveJobs=yes
#ArchiveDir="/tmp"
#ArchiveSteps=yes
#ArchiveScript=
#JobPurge=12
#StepPurge=1
#
# Authentication info
AuthType=auth/munge
#AuthInfo=/var/run/munge/munge.socket.2
#
# slurmDBD info为启用slurmdbd的管理服务器,与slurm.conf中的AccountingStorageHost一致
DbdHost=4090-208 #<Slurm控制节点或容器IP>
#DbdBackupHost=mn02
DbdPort=6819
SlurmUser=root
MessageTimeout=30
DebugLevel=7
#DefaultQOS=normal,standby
LogFile=/var/log/slurmdbd.log
PidFile=/usr/local/slurm/run/slurmdbd.pid
#PluginDir=/usr/lib/slurm
#PrivateData=accounts,users,usage,jobs
PrivateData=jobs
#TrackWCKey=yes
#
# Database info
StorageType=accounting_storage/mysql
StorageHost=[IP]  #数据库容器的IP或主机名
#StorageBackupHost=mn02
StoragePort=3306
StoragePass=123456
StorageUser=root
StorageLoc=slurm_acct_db
CommitDelay=1

启动

/usr/local/slurm/sbin/slurmdbd

配置slurm(所有节点执行)

安装基本的 Debian 软件包构建要求:
apt-get install build-essential fakeroot devscripts equivs libmunge-dev

解压包

tar -xaf  slurm-24.05.4.tar.bz2

进到slurm源目录

安装 Slurm 包依赖项:
 mk-build-deps -i debian/control

管理节点执行

构建slurm包

 debuild -b -uc -us

编译安装slurm(所有节点执行)

./configure --prefix=/usr/local/slurm --sysconfdir=/etc/slurm

make -j$(nproc) && make install -j$(nproc)

在管理节点执行

root@4090-208:~# vim /etc/slurm/slurm.conf


# slurm.conf file generated by configurator easy.html.
# Put this file on all nodes of your cluster.
# See the slurm.conf man page for more information.
#


ControlMachine=4090-208 #<YOUR-HOST-NAME>


ControlAddr=[ip]
AuthType=auth/munge

AccountingStorageEnforce=associations,limits,qos
AccountingStorageHost=4090-208     # 主节点
AccountingStoragePort=6819
AccountingStorageType=accounting_storage/slurmdbd

StateSaveLocation=/mnt/volume/slurm # 存储slurmctld服务状态的目录,如有备份控制节点,则需要所有SlurmctldHost节点都能共享读写该目录
SlurmdSpoolDir=/var/spool/slurmd
#AccountingStorageUser=
#AccountingStoreJobComment=Yes
AccountingStorageTRES=gres/gpu # 设置GPU时需要
GresTypes=gpu # 设置GPU时需要

AcctGatherEnergyType=acct_gather_energy/none
AcctGatherFilesystemType=acct_gather_filesystem/none
AcctGatherInterconnectType=acct_gather_interconnect/none
AcctGatherNodeFreq=0
#AcctGatherProfileType=acct_gather_profile/none
JobAcctGatherFrequency=30
JobAcctGatherType=jobacct_gather/linux

#SlurmctldParameters=enable_configless   #如果不是无配置模式则注销此行
MpiDefault=none
ProctrackType=proctrack/linuxproc
ReturnToService=1
SlurmUser=root                      #slurm
SwitchType=switch/none
SchedulerType=sched/builtin
#SelectType=select/linear
SelectType=select/cons_tres
SelectTypeParameters= CR_CPU     #基于CPU调度
#SelectTypeParameters=CR_Core,CR_CORE_DEFAULT_DIST_BLOCK      #基于Core和内存调度
TaskPlugin=task/affinity        #够将一个或多个进程绑定到一个或多个处理器上运行
ClusterName=slurmcls #<YOUR-HOST-NAME>
SlurmctldLogFile=/var/log/slurmctld.log
SlurmdLogFile=/var/log/slurmd.log
SlurmctldPort=6817    #slurmctld服务端口
SlurmdPort=6818        #slurmd服务的端口
MailProg=/var/spool/mail

NodeName=4090-[209-213] Gres=gpu:4090:8 CPUs=72 Sockets=2 CoresPerSocket=36 ThreadsPerCore=2 RealMemory=256000 State=UNKNOWN

PartitionName=cpu-node Nodes=ALL Default=YES MaxTime=INFINITE State=UP
PartitionName=gpu-node Nodes=ALL Default=NO MaxTime=INFINITE State=UP

查看配置

root@fm-manage-01:/etc/slurm# /usr/local/slurm/bin/scontrol show config | grep -i accounting

资源要按实际写

分发到不同计算节点
scp 

启动slurm

在管理节点执行

root@4090-208:~# /usr/local/slurm/sbin/slurmctld

root@4090-208:~# ps -ef |grep slurm
root      285883       1  0 Dec12 ?        00:00:05 /usr/local/slurm/sbin/slurmdbd
root      286340       1  0 Dec12 ?        00:07:17 /usr/local/slurm/sbin/slurmctld
root      286341  286340  0 Dec12 ?        00:00:00 slurmctld: slurmscriptd
root      319327  298959  0 06:47 pts/0    00:00:00 grep --color=auto slurm

在计算节点执行

配置gres.conf(GPU)

root@4090-209:/etc/slurm# cat gres.conf 
Name=gpu Type=4090 File=/dev/nvidia0
Name=gpu Type=4090 File=/dev/nvidia1
Name=gpu Type=4090 File=/dev/nvidia2
Name=gpu Type=4090 File=/dev/nvidia3
Name=gpu Type=4090 File=/dev/nvidia4
Name=gpu Type=4090 File=/dev/nvidia5
Name=gpu Type=4090 File=/dev/nvidia6

Name=gpu Type=4090 File=/dev/nvidia7

root@4090-209:/usr/local/slurm/sbin# ./slurmd

root@ubuntu-27:/usr/local/slurm/sbin# ps -ef |grep slurmd
root     1221625       1  0 10:21 ?        00:00:00 ./slurmd
root     1271541 1134559  0 10:43 pts/0    00:00:00 grep --color=auto slurmd

在管理节点查看节点状态

设置状态
/usr/local/slurm/bin/scontrol update NodeName=4090-213 State=idle

root@4090-208:/etc/slurm# /usr/local/slurm/bin/sinfo 
PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
cpu-node*    up   infinite      5   idle 4090-[209-213]
gpu-node     up   infinite      5   idle 4090-[209-213]

详细信息
root@4090-208:/etc/slurm# /usr/local/slurm/bin/scontrol show node 
NodeName=4090-209 Arch=x86_64 CoresPerSocket=36 
   CPUAlloc=0 CPUEfctv=72 CPUTot=72 CPULoad=0.00
   AvailableFeatures=(null)
   ActiveFeatures=(null)
   Gres=gpu:4090:8
   NodeAddr=4090-209 NodeHostName=4090-209 Version=24.05.4
   OS=Linux 5.4.0-144-generic #161-Ubuntu SMP Fri Feb 3 14:49:04 UTC 2023 
   RealMemory=256000 AllocMem=0 FreeMem=1017990 Sockets=2 Boards=1
   State=IDLE ThreadsPerCore=2 TmpDisk=0 Weight=1 Owner=N/A MCS_label=N/A
   Partitions=cpu-node,gpu-node 
   BootTime=2024-12-10T12:07:15 SlurmdStartTime=2024-12-12T09:56:13
   LastBusyTime=2024-12-12T10:16:44 ResumeAfterTime=None
   CfgTRES=cpu=72,mem=250G,billing=72,gres/gpu=8
   AllocTRES=
   CurrentWatts=0 AveWatts=0
   

NodeName=4090-210 Arch=x86_64 CoresPerSocket=36 
   CPUAlloc=0 CPUEfctv=72 CPUTot=72 CPULoad=0.00
   AvailableFeatures=(null)
   ActiveFeatures=(null)
   Gres=gpu:4090:8
   NodeAddr=4090-210 NodeHostName=4090-210 Version=24.05.4
   OS=Linux 5.4.0-144-generic #161-Ubuntu SMP Fri Feb 3 14:49:04 UTC 2023 
   RealMemory=256000 AllocMem=0 FreeMem=1017828 Sockets=2 Boards=1
   State=IDLE ThreadsPerCore=2 TmpDisk=0 Weight=1 Owner=N/A MCS_label=N/A
   Partitions=cpu-node,gpu-node 
   BootTime=2024-12-10T12:07:33 SlurmdStartTime=2024-12-12T09:56:13
   LastBusyTime=2024-12-12T10:16:44 ResumeAfterTime=None
   CfgTRES=cpu=72,mem=250G,billing=72,gres/gpu=8
   AllocTRES=
   CurrentWatts=0 AveWatts=0
   

NodeName=4090-211 Arch=x86_64 CoresPerSocket=36 
   CPUAlloc=0 CPUEfctv=72 CPUTot=72 CPULoad=0.00
   AvailableFeatures=(null)
   ActiveFeatures=(null)
   Gres=gpu:4090:8
   NodeAddr=4090-211 NodeHostName=4090-211 Version=24.05.4
   OS=Linux 5.4.0-144-generic #161-Ubuntu SMP Fri Feb 3 14:49:04 UTC 2023 
   RealMemory=256000 AllocMem=0 FreeMem=1017826 Sockets=2 Boards=1
   State=IDLE ThreadsPerCore=2 TmpDisk=0 Weight=1 Owner=N/A MCS_label=N/A
   Partitions=cpu-node,gpu-node 
   BootTime=2024-12-10T12:07:14 SlurmdStartTime=2024-12-12T10:00:03
   LastBusyTime=2024-12-12T09:59:36 ResumeAfterTime=None
   CfgTRES=cpu=72,mem=250G,billing=72,gres/gpu=8
   AllocTRES=
   CurrentWatts=0 AveWatts=0
   

NodeName=4090-212 Arch=x86_64 CoresPerSocket=36 
   CPUAlloc=0 CPUEfctv=72 CPUTot=72 CPULoad=0.00
   AvailableFeatures=(null)
   ActiveFeatures=(null)
   Gres=gpu:4090:8
   NodeAddr=4090-212 NodeHostName=4090-212 Version=24.05.4
   OS=Linux 5.4.0-144-generic #161-Ubuntu SMP Fri Feb 3 14:49:04 UTC 2023 
   RealMemory=256000 AllocMem=0 FreeMem=1017886 Sockets=2 Boards=1
   State=IDLE ThreadsPerCore=2 TmpDisk=0 Weight=1 Owner=N/A MCS_label=N/A
   Partitions=cpu-node,gpu-node 
   BootTime=2024-12-10T12:07:14 SlurmdStartTime=2024-12-12T10:00:24
   LastBusyTime=2024-12-12T10:00:24 ResumeAfterTime=None
   CfgTRES=cpu=72,mem=250G,billing=72,gres/gpu=8
   AllocTRES=
   CurrentWatts=0 AveWatts=0
   

NodeName=4090-213 Arch=x86_64 CoresPerSocket=36 
   CPUAlloc=0 CPUEfctv=72 CPUTot=72 CPULoad=0.00
   AvailableFeatures=(null)
   ActiveFeatures=(null)
   Gres=gpu:4090:8
   NodeAddr=4090-213 NodeHostName=4090-213 Version=24.05.4
   OS=Linux 5.4.0-144-generic #161-Ubuntu SMP Fri Feb 3 14:49:04 UTC 2023 
   RealMemory=256000 AllocMem=0 FreeMem=1017887 Sockets=2 Boards=1
   State=IDLE ThreadsPerCore=2 TmpDisk=0 Weight=1 Owner=N/A MCS_label=N/A
   Partitions=cpu-node,gpu-node 
   BootTime=2024-12-10T12:07:15 SlurmdStartTime=2024-12-12T10:00:31
   LastBusyTime=2024-12-12T10:00:31 ResumeAfterTime=None
   CfgTRES=cpu=72,mem=250G,billing=72,gres/gpu=8
   AllocTRES=
   CurrentWatts=0 AveWatts=0

cpu+gpu同时调度


```bash
在这里插入代#!/bin/bash
#SBATCH --job-name=gpu_multi_node_job     # 作业名称
#SBATCH --output=gpu_multi_node_output_%j.log  # 作业输出日志
#SBATCH --error=gpu_multi_node_error_%j.log    # 作业错误日志
#SBATCH --ntasks=2                        # 任务数:请求 2 个任务
#SBATCH --cpus-per-task=4                 # 每个任务使用 4 个 CPU 核
#SBATCH --gres=gpu:1                      # 每个任务请求 1 个 GPU
#SBATCH --time=72:00:00                   # 最大运行时间:72 小时
#SBATCH --mem=32G                         # 请求内存:32GB
#SBATCH --nodes=2                         # 请求 2 个节点
#SBATCH --ntasks-per-node=1               # 每个节点 1 个任务
#SBATCH --partition=gpu-node                   # GPU 资源的分区名称

# 输出节点信息
echo "Job started on $(date)"
echo "Running on nodes: $(hostname)"

# 加载环境模块(如果需要)
# module load cuda/11.2
# module load python/3.8

pip install numpy torch
# 在每个节点上执行 GPU 计算任务
srun python3 /mnt/volume/slurm/long_gpu_task.py

echo "Job completed on $(date)"
import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
import time

# 确保 GPU 可用
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
if not torch.cuda.is_available():
    print("No GPU found, exiting...")
    exit()

# 模拟一些训练数据
num_samples = 1000
num_features = 100
X_train = torch.randn(num_samples, num_features).to(device)
y_train = torch.randint(0, 2, (num_samples,)).to(device)

# 构建一个简单的神经网络
class SimpleNN(nn.Module):
    def __init__(self):
        super(SimpleNN, self).__init__()
        self.layer1 = nn.Linear(num_features, 64)
        self.layer2 = nn.Linear(64, 32)
        self.layer3 = nn.Linear(32, 1)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        x = torch.relu(self.layer1(x))
        x = torch.relu(self.layer2(x))
        x = self.sigmoid(self.layer3(x))
        return x

model = SimpleNN().to(device)

# 定义损失函数和优化器
criterion = nn.BCELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

# 模拟训练过程
print("Training started...")
for epoch in range(50):  # 模拟训练 50 个 epoch
    optimizer.zero_grad()
    outputs = model(X_train)
    loss = criterion(outputs.squeeze(), y_train.float())
    loss.backward()
    optimizer.step()
    if (epoch + 1) % 10 == 0:
        print(f"Epoch {epoch+1}/50, Loss: {loss.item():.4f}")

# 模拟一个长时间的计算任务
print("Training complete, starting long computation...")
time.sleep(1800)  # 模拟 1 小时的计算(可调整为需要的时间)

print("Task completed!")

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

初识Java 2

目录 一.方法&#xff08;函数&#xff09; 1.方法的定义 2.方法的调用过程 3.实参与形参的关系 4.方法的重载 5.方法签名&#xff08;了解&#xff09; 6.递归&#xff08;常用于数列&#xff0c;阶乘&#xff09; 二.数组 1.定义方法&#xff1a; 2.初始化&#xff…

react-quill 富文本组件编写和应用

index.tsx文件 import React, { useRef, useState } from react; import { Modal, Button } from antd; import RichEditor from ./RichEditor;const AnchorTouchHistory: React.FC () > {const editorRef useRef<any>(null);const [isModalVisible, setIsModalVis…

关于扫描模型 拓扑 和 传递贴图工作流笔记

关于MAYA拓扑和传递贴图的操作笔记 一、拓扑低模: 1、拓扑工作区位置: 1、准备出 目标 高模。 (高模的状态如上 ↑ )。 2、打开顶点吸附,和建模工具区,选择四边形绘制. 2、拓扑快捷键使…

【Rust自学】11.9. 单元测试

喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 11.9.1. 测试的分类 Rust把测试分为两类&#xff0c;一个是单元测试&#xff0c;一个是集成…

【竞技宝】CS2:HLTV2024选手排名TOP4-NiKo

北京时间2025年1月11日,HLTV年度选手排名正在持续公布中,今日凌晨正式公布了今年的TOP4选手为G2(目前已转为至Falcons)战队的NiKo。 选手简介 NiKo是一名来自波黑的CS职业选手,现年26岁。作为DOTA2饱负盛名的职业选手,NiKo在CS1.6时代就已经开始征战职业赛场。2012年,年仅15岁…

rom定制系列------小米max3安卓12 miui14批量线刷 默认开启usb功能选项 插电自启等

小米Max3是小米公司于2018年7月19日发布的机型。此机型后在没有max新型号。采用全金属一体机身设计&#xff0c;配备6.9英寸全面屏.八核处理器骁龙636&#xff0c;后置双摄像头1200万500万像素&#xff0c;前置800万像素.机型代码 &#xff1a;nitrogen.官方最终版为稳定版12.5…

Linux第一课:c语言 学习记录day06

四、数组 冒泡排序 两两比较&#xff0c;第 j 个和 j1 个比较 int a[5] {5, 4, 3, 2, 1}; 第一轮&#xff1a;i 0 n&#xff1a;n个数&#xff0c;比较 n-1-i 次 4 5 3 2 1 // 第一次比较 j 0 4 3 5 2 1 // 第二次比较 j 1 4 3 2 5 1 // 第三次比较 j 2 4 3 2 1 5 // …

Cline(原Claude Dev)开源的IDE AI插件,如何搭配OpenRouter实现cursor功能,Cline怎么使用

Cline&#xff08;原Claude Dev&#xff09;是一个开源的IDE AI插件&#xff0c;可以使用你的命令行界面和编辑器的人工智能助手。 你可以直接在VS Code编辑器进行安装。如果你使用过Cursor AI IDE的话&#xff0c;可以尝试最新发布的Cline3.1版本。 在OpenRouter上&#xff0…

arcgis的合并、相交、融合、裁剪、联合、标识操作的区别和使用

1、相交 需要输入两个面要素&#xff0c;最终得到的是两个输入面要素相交部分的结果面要素。 2、合并 合并能将两个单独存放的两个要素类的内容&#xff0c;汇集到一个要素类里面。 3、融合 融合能将一个要素类内的所有元素融合成一个整体。 4、裁剪 裁剪需要输入两个面要…

【Rust自学】11.7. 按测试的名称运行测试

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 11.7.1. 按名称运行测试的子集 如果想要选择运行的测试&#xff0c;就将测试的名称&#xff08;一个或多个&#xff09;作为cargo test的…

利用Java爬虫获取义乌购店铺所有商品列表:技术探索与实践

在当今数字化时代&#xff0c;数据的重要性不言而喻。对于采购商和市场分析师而言&#xff0c;能够快速获取并分析供应商店铺内的所有商品信息&#xff0c;是制定有效采购策略和市场分析的关键。义乌购作为国内知名的在线批发平台&#xff0c;拥有海量的商品数据。本文将介绍如…

An FPGA-based SoC System——RISC-V On PYNQ项目复现

本文参考&#xff1a; &#x1f449; 1️⃣ 原始工程 &#x1f449; 2️⃣ 原始工程复现教程 &#x1f449; 3️⃣ RISCV工具链安装教程 1.准备工作 &#x1f447;下面以LOCATION代表本地源存储库的安装目录&#xff0c;以home/xilinx代表在PYNQ-Z2开发板上的目录 ❗ 下载Vivad…

Photoshop PS批处理操作教程(批量修改图片尺寸、参数等)

前言 ‌Photoshop批处理的主要作用‌是通过自动化处理一系列相似的操作来同时应用于多张图片&#xff0c;从而节省时间和精力&#xff0c;提高工作效率。批处理功能特别适用于需要批量处理的任务&#xff0c;如图像尺寸调整、颜色校正、水印添加等‌。 操作步骤 1.创建动作 …

互联网架构变迁:从 TCP/IP “呼叫” 到 NDN “内容分发” 的逐浪之旅

本文将给出关于互联网架构演进的一个不同视角。回顾一下互联网的核心理论基础产生的背景&#xff1a; 左边是典型的集中控制通信网络&#xff0c;很容易被摧毁&#xff0c;而右边的网络则没有单点问题&#xff0c;换句话说它很难被全部摧毁&#xff0c;与此同时&#xff0c;分…

nvim 打造成可用的IDE(2)

上一个 文章写的太长了&#xff0c; 后来再写东西 就一卡一卡的&#xff0c;所以新开一个。 主要是关于 bufferline的。 之前我的界面是这样的。 这个图标很不舒服有。 后来发现是在这里进行配置。 我也不知道&#xff0c;这个配置 我是从哪 抄过来的。 测试结果&#xff1…

drawDB docker部属

docker pull xinsodev/drawdb docker run --name some-drawdb -p 3000:80 -d xinsodev/drawdb浏览器访问&#xff1a;http://192.168.31.135:3000/

Redis--20--大Key问题解析

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 大Key问题1.什么是 Redis 大 Key&#xff1f;在 Redis 中&#xff0c;大 Key 是指单个键值对的数据量非常大&#xff0c;可能包含大量数据。 2. Redis大Key的危害3.…

自动驾驶---E2E架构演进

1 背景 模型最早应用的自动驾驶模块就是感知层面&#xff0c;随着技术的发展&#xff0c;逐渐开始应用到决策规划等其它模块。端到端自动驾驶架构是一种基于深层神经网络模型和方法的自动驾驶技术模式。目前一段式端到端系统只有在英伟达早期所做的demo中实现&#xff0c;再者就…

如何优雅地绘制时序图

说到时序图&#xff0c;相信所有从事嵌入式开发的伙伴都非常熟悉&#xff0c;在各种元器件手册以及处理器说明书中&#xff0c;但凡涉及到通信、接口、交互等内容&#xff0c;都会涉及到时序图。时序图可以非常详细且明确地描述硬件及软件接口中各个信号的时序关系&#xff0c;…

SpringCloud系列教程:微服务的未来(十一)服务注册、服务发现、OpenFeign快速入门

本篇博客将通过实例演示如何在 Spring Cloud 中使用 Nacos 实现服务注册与发现&#xff0c;并使用 OpenFeign 进行服务间调用。你将学到如何搭建一个完整的微服务通信框架&#xff0c;帮助你快速开发可扩展、高效的分布式系统。 目录 前言 服务注册和发现 服务注册 ​编辑 …