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

Tiny Cluster(1)——搭建树莓派小型计算集群

1 硬件说明

1.1 软硬件环境
k8s-master-0192.168.5.78Debian 12树莓派58G / 4核 / 64G TF卡 & 512G SSD控制节点
k8s-worker-0192.168.5.48Debian 12树莓派4B4G / 4核 / 64G TF卡工作节点
k8s-worker-1192.168.5.16Debian 11BTT-CB11G / 4核 / 64G TF卡工作节点
  • 实现 K8s 集群 (基于 containerd V1.62 和 K8s V1.27)
  • 一个 master,两个 worker

2 搭建

2.1 硬件连接

三块开发板连接在同一交换机上,硬件连接完成后如图:

在这里插入图片描述

2.2 准备工作
2.2.1 树莓派5(k8s-master-0)
  • 换源

这里使用的是清华源,将/etc/apt/sources.list内容替换成:

deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bookworm-security main contrib non-free non-free-firmware
  • 添加加载的内核模块
tee /etc/modules-load.d/containerd.conf<<EOF
overlay
br_netfilter
EOF
  • 加载内核模块
sudo modprobe overlay && sudo modprobe br_netfilter
  • 设置并应用内核参数
tee /etc/sysctl.d/kubernetes.conf<<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOFsudo sysctl --system
2.2.2 树莓派4B(k8s-worker-0)
  • 换源

这里使用的是清华源,将/etc/apt/sources.list内容替换成:

deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bookworm-security main contrib non-free non-free-firmware
2.2.3 BTT-BC1(k8s-worker-1)
  • 换源

这里使用的是中科大源,将/etc/apt/sources.list内容替换成:

deb https://mirrors.ustc.edu.cn/debian/ bullseye main contrib non-free
deb-src https://mirrors.ustc.edu.cn/debian/ bullseye main contrib non-freedeb https://mirrors.ustc.edu.cn/debian/ bullseye-updates main contrib non-free
deb-src https://mirrors.ustc.edu.cn/debian/ bullseye-updates main contrib non-freedeb https://mirrors.ustc.edu.cn/debian/ bullseye-backports main contrib non-free
deb-src https://mirrors.ustc.edu.cn/debian/ bullseye-backports main contrib non-freedeb https://mirrors.ustc.edu.cn/debian-security/ bullseye-security main contrib non-free
deb-src https://mirrors.ustc.edu.cn/debian-security/ bullseye-security main contrib non-free
2.3 所有节点都需要设置
2.3.1 修改/etc/hosts文件
192.168.5.78 k8s-master-0
192.168.5.48 k8s-worker-0
192.168.5.16 k8s-worker-1
20.205.243.166 raw.githubusercontent.com # 以便kubectl apply 时能找到
2.3.2 加k8s
curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat > /etc/apt/sources.list.d/kubernetes.list <<EOF
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
2.3.3 检查更新及安装更新
apt update && apt upgrade -y
2.3.4 安装所需附件
apt install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates
2.3.5 containerd 安装与设置
  • 启用 docker 存储库
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmour -o /etc/apt/trusted.gpg.d/docker.gpg## ubuntu
# 支持x86架构64位cpu
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"# 支持arm64架构cpu
add-apt-repository "deb [arch=arm64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"## debian
# 支持x86架构64位cpu
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"# 支持arm64架构cpu
add-apt-repository "deb [arch=arm64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"apt update && apt install -y containerd.io
  • 生成containerd的配置文件
containerd config default | tee /etc/containerd/config.toml >/dev/null 2>&1
  • 修改cgroup Driver为systemd
sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml
  • 编辑 /etc/containerd/config.toml,修改镜像路径
 #sandbox_image = "registry.k8s.io/pause:3.6"=>sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
systemctl daemon-reload
systemctl start containerd
systemctl enable containerd.service
  • CTR容器代理设置,避免镜像发生拉取问题
    编辑/lib/systemd/system/containerd.service
[Service]
Environment="HTTP_PROXY=http://192.168.0.108:1081"
Environment="HTTPS_PROXY=http://192.168.0.108:1081"
Environment="NO_PROXY=aliyun.com,aliyuncs.com,huaweicloud.com,k8s-master-0,k8s-master-1,k8s-worker-0,localhost,127.0.0.1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16"
systemctl daemon-reload && systemctl restart containerd
pi5@k8s-master-0:~$ kubectl get ingress,services,pods -A
NAMESPACE     NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
default       service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP                  57m
kube-system   service/kube-dns     ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   57mNAMESPACE      NAME                                       READY   STATUS    RESTARTS       AGE
kube-flannel   pod/kube-flannel-ds-vxf4q                  1/1     Running   1 (20m ago)    56m
kube-flannel   pod/kube-flannel-ds-wp995                  1/1     Running   1 (22m ago)    55m
kube-flannel   pod/kube-flannel-ds-zq2j7                  1/1     Running   0              39m
kube-system    pod/coredns-7bdc4cb885-8rw4l               1/1     Running   1 (20m ago)    57m
kube-system    pod/coredns-7bdc4cb885-brx7j               1/1     Running   1 (20m ago)    57m
kube-system    pod/etcd-k8s-master-0                      1/1     Running   15 (20m ago)   57m
kube-system    pod/etcd-k8s-master-1                      1/1     Running   2 (22m ago)    55m
kube-system    pod/kube-apiserver-k8s-master-0            1/1     Running   22 (20m ago)   57m
kube-system    pod/kube-apiserver-k8s-master-1            1/1     Running   3 (22m ago)    55m
kube-system    pod/kube-controller-manager-k8s-master-0   1/1     Running   22 (20m ago)   57m
kube-system    pod/kube-controller-manager-k8s-master-1   1/1     Running   2 (22m ago)    55m
kube-system    pod/kube-proxy-9hmj5                       1/1     Running   1 (20m ago)    57m
kube-system    pod/kube-proxy-l2wk2                       1/1     Running   0              39m
kube-system    pod/kube-proxy-sf9xv                       1/1     Running   1 (22m ago)    55m
kube-system    pod/kube-scheduler-k8s-master-0            1/1     Running   19 (20m ago)   57m
kube-system    pod/kube-scheduler-k8s-master-1            1/1     Running   2 (22m ago)    55m

3 使用 K3S 搭建集群

  • 主节点(树莓派5)安装 K3S

Lightweight Kubernetes (K3S) 是一个面向IoT及边缘计算的Kubernetes版本,比较适合树莓派等资源有限的硬件。

使用二进制文件进行配置:

# 安装 k3s
curl -sfL https://get.k3s.io | sh -

可能会遇到如下的安装报错:

[INFO]  Failed to find memory cgroup, you may need to add "cgroup_memory=1 cgroup_enable=memory" to your linux cmdline (/boot/cmdline.txt on a Raspberry Pi)

此时可以按照报错提示,在 /boot/cmdline.txt文件末尾添加如下内容:

cgroup_memory=1 cgroup_enable=memory

重启之后再重新安装即可。

安装完成之后,如果只有一台服务器,作为单节点模式,就搭建完了。

kubectl get nodes       # 这个命令不可以用 sudo 执行,否则会出现这里的报错:https://discuss.kubernetes.io/t/couldnt-get-current-server-api-group-list-get-http-localhost-8080-api-timeout-32s-dial-tcp-127-0-0-1-connect-connection-refused/25471/7NAME   STATUS   ROLES                  AGE   VERSION
pi5    Ready    control-plane,master   67m   v1.31.6+k3s1

但作为集群,还需要搭建worker节点,所以需要查看node-token给worker节点使用,运行结果如下:

sudo cat /var/lib/rancher/k3s/server/node-token
K1064a9edf4298d67e83d35be3bfb7962b445753681618b2a57db49c8b678267ead::server:ccd45d0d4f8b85abecff220a0596b99e
  • worker 节点

根据在master得到的token在worker节点服务器运行。

curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | K3S_URL=https://<master-node-ip>:6443 K3S_TOKEN=<token> sh -

例如我这里测试的主节点 ip 为:192.168.5.78,那么在其余 worker 节点上运行:

sudo curl -sfL https://get.k3s.io | K3S_URL=https://192.168.5.78:6443 K3S_TOKEN=K1064a9edf4298d67e83d35be3bfb7962b445753681618b2a57db49c8b678267ead sh -

注意:服务器主机名不能相同,如果服务器名相同,需要加参数 INSTALL_K3S_EXEC="–with-node-id"标记主机唯一标识

安装完成之后,可以用以下命令查看集群是否全部启动:


kubectl get nodes
NAME              STATUS   ROLES                  AGE   VERSION
bigtreetech-cb1   Ready    <none>                 54s   v1.31.6+k3s1
pi4b              Ready    <none>                 72s   v1.31.6+k3s1
pi5               Ready    control-plane,master   71m   v1.31.6+k3s1

设置两个 worker 节点角色为 worker:

kubectl label node pi4b node-role.kubernetes.io/worker=worker
kubectl label node bigtreetech-cb1 node-role.kubernetes.io/worker=workerkubectl get nodes
NAME              STATUS   ROLES                  AGE     VERSION
bigtreetech-cb1   Ready    worker                 9m26s   v1.31.6+k3s1
pi4b              Ready    worker                 9m44s   v1.31.6+k3s1
pi5               Ready    control-plane,master   79m     v1.31.6+k3s1

卸载 k3s:

#master节点:
/usr/local/bin/k3s-uninstall.sh#worker节点:
/usr/local/bin/k3s-agent-uninstall.sh

4 K3S 基本操作

  • 查看 k3s 服务状态
#master节点:
systemctl status k3s.service#worker节点:
systemctl status k3s-agent.service
  • 日志查看命令,如果安装有问题,可以查看实时输出日志
#master节点
sudo journalctl -u k3s.service -f#worker节点
sudo journalctl -u k3s-agent.service -f
  • K3s 内置了 kubectl,直接使用 kubectl 命令管理集群资源
# 检查集群状态
kubectl get nodes
kubectl get pods -A
kubectl get svc -A# 查看集群的详细信息
kubectl cluster-info# 部署应用
kubectl apply -f <yaml-file># 删除资源
kubectl delete -f <yaml-file>
kubectl delete pod <pod-name># 进入 Pod 调试
kubectl exec -it <pod-name> -- /bin/bash# 查看资源详情
kubectl describe pod <pod-name>
kubectl describe svc <svc-name>

5 部署MPI支持

为了能够充分利用集群的算力来跑一些计算量较大的计算代码,需要通过分布式计算框架高效地分配任务。

以计算 pi 的 10,000,000 位为例,来部署环境。

计算方案:

  • 选择计算方法:采用高效的Chudnovsky算法来计算π。
  • ​分布式计算框架:使用mpi4py库实现并行计算,将任务分配给K3s集群中的各个节点。
  • 容器化部署:利用Kubernetes(K3s)的Pod来运行计算任务,确保资源隔离和管理。
  • ​结果收集:将各节点计算的部分结果汇总,生成完整的π值。
5.1 在 K3s 集群中部署 MPI 支持

为了在 K3s 集群中使用 MPI,需要确保所有节点上安装了 MPI 环境,并且节点之间可以通过 MPI 进行通信:

sudo apt-get update
sudo apt-get install -y openmpi-bin openmpi-common libopenmpi-dev

确保所有节点之间可以通过SSH无密码访问,这对于MPI启动是必要的:

  • 生成 SSH 密钥对

在主节点上执行以下命令生成 SSH 密钥对:

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

按回车接受默认路径(~/.ssh/id_rsa 和 ~/.ssh/id_rsa.pub),​不要设置密码​(直接回车两次),否则后续自动化操作会失败。

  • 将公钥复制到所有节点

使用 ssh-copy-id 命令将主节点的公钥自动复制到其他节点:

ssh-copy-id -i ~/.ssh/id_rsa.pub user@node2_ip
ssh-copy-id -i ~/.ssh/id_rsa.pub user@node3_ip
  • 验证免密登录

测试从主节点到其他节点的免密登录:

ssh user@node2_ip
ssh user@node3_ip

如果成功,会直接进入远程 shell 而不需要输入密码。

  • 配置所有节点间的免密互访

两种方法:
* 在每个节点上生成密钥对,并将公钥复制到其他所有节点。
* 强制所有节点使用主节点的密钥进行认证(适用于简单集群)。

方法一:每个节点生成独立密钥

# 在 node2 上生成密钥对:
ssh-keygen -t rsa -b 4096# 将 node2 的公钥复制到 node1 和 node3:
ssh-copy-id -i ~/.ssh/id_rsa.pub user@node1_ip
ssh-copy-id -i ~/.ssh/id_rsa.pub user@node3_ip

方法二:统一使用主节点密钥

在 node2 和 node3 上手动添加主节点的公钥:

cat ~/.ssh/id_rsa.pub | ssh user@node2_ip "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
cat ~/.ssh/id_rsa.pub | ssh user@node3_ip "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
5.2 编写并行计算π的Python脚本
# pi_mpi.py
from mpi4py import MPI
import decimal
import mathdef compute_pi_part(start, end, precision):"""计算Chudnovsky算法的一部分项来求和。"""decimal.getcontext().prec = precision + 2  # 额外保留两位以避免舍入误差C = 426880 * decimal.Decimal(10005).sqrt()K = decimal.Decimal(6)M = decimal.Decimal(1)X = decimal.Decimal(1)L = decimal.Decimal(13591409)S = Lfor k in range(1, end + 1):if k < start:continue# 这里需要实现Chudnovsky算法的项计算# 由于实现复杂,建议参考优化后的库或简化计算# 此处仅为示例,实际需要正确实现M = (K**3 - 16*K) * M // (k**3)L += 545140134X *= -262537412640768000S += decimal.Decimal(M * L) / XK += 12pi = C / Sreturn str(pi)def main():comm = MPI.COMM_WORLDrank = comm.Get_rank()size = comm.Get_size()# 设置计算精度为10,000,000位precision = 10_000_000# 为了简化,每个进程计算不同范围的项(需要根据算法调整)# 实际应用中需要更合理的任务划分terms_per_process = 100000  # 示例值,需根据算法调整start = rank * terms_per_process + 1end = (rank + 1) * terms_per_processpi_part = compute_pi_part(start, end, precision)# 收集所有部分结果到根进程all_parts = comm.gather(pi_part, root=0)if rank == 0:# 合并所有部分(需要实际合并逻辑)full_pi = "..."  # 实际合并后的π值with open("pi_10m_digits.txt", "w") as f:f.write(full_pi)print("π的计算已完成并保存到pi_10m_digits.txt")else:passif __name__ == "__main__":main()
5.3 容器化Python脚本

为了在 K3s 集群中运行该脚本,将其容器化。以下是一个简单的 Dockerfile 示例:

# Dockerfile
FROM python:3.9-slimRUN apt-get update && apt-get install -y openmpi-bin openmpi-common libopenmpi-devCOPY pi_mpi.py /app/pi_mpi.pyWORKDIR /appCMD ["mpirun", "-np", "3", "python3", "pi_mpi.py"]

构建并推送镜像到你的Docker仓库:

docker build -t your_dockerhub_username/pi-mpi:latest .
docker push your_dockerhub_username/pi-mpi:latest
5.4 编写Kubernetes部署文件

创建一个Kubernetes的Deployment配置文件,以在K3s集群中运行容器化的Python脚本。

# pi-mpi-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: pi-mpi-deployment
spec:replicas: 3selector:matchLabels:app: pi-mpitemplate:metadata:labels:app: pi-mpispec:containers:- name: pi-mpi-containerimage: your_dockerhub_username/pi-mpi:latest# 如果需要共享存储,可以配置PersistentVolumerestartPolicy: Never

注意:由于MPI需要在多个Pod之间进行通信,上述简单的Deployment可能无法满足需求。更复杂的设置可能需要使用StatefulSets或其他控制器,并配置网络策略以允许Pod间通信。

5.5 运行并行计算任务

由于Kubernetes的Pod之间通信复杂,推荐使用支持MPI的Kubernetes Operator或专门的MPI部署工具,如MPI Operator。以下是使用MPI Operator的简要步骤:

  • 安装MPI Operator:
kubectl apply -f https://raw.githubusercontent.com/kubeflow/mpi-operator/master/deploy/deployment.yaml
  • 创建MPI Job配置文件:
# pi-mpi-job.yaml
apiVersion: batch/v1
kind: Job
metadata:name: pi-mpi-job
spec:completions: 1parallelism: 3template:spec:containers:- name: pi-mpiimage: your_dockerhub_username/pi-mpi:latestcommand: ["mpirun", "--allow-run-as-root", "-np", "3", "python", "pi_mpi.py"]# 如果需要共享存储,可以挂载PersistentVolumerestartPolicy: Never
  • 提交MPI Job:
kubectl apply -f pi-mpi-job.yaml
  • 监控Job状态:
kubectl get pods
kubectl logs -l job-name=pi-mpi-job
5.6 结果收集与验证

计算完成后,π的结果将保存在容器内的pi_10m_digits.txt文件中, 可以通过以下方式收集结果:

  • ​挂载持久存储:在Deployment或Job配置中挂载PersistentVolume,使结果文件可以被多个Pod访问或持久化存储。

  • ​从容器中复制文件:

kubectl cp <pod-name>:/app/pi_10m_digits.txt ./pi_10m_digits.txt

6 基于 MPI 的原生分布式调度

直接在集群节点上安装 MPI 环境即可。

6.1 安装 MPI 和 mpi4py

在所有节点上安装 OpenMPI 和 Python 的 MPI 库:

# Ubuntu/Debian
sudo apt-get update
sudo apt-get install openmpi-bin openmpi-common libopenmpi-devpip install mpi4py
# pip 如果报错的话,就用 conda 安装
conda install mpi4py
6.2 编写 MPI 计算 π 的代码​(compute_pi_mpi.py)
from mpi4py import MPI
import numpy as npcomm = MPI.COMM_WORLD
rank = comm.Get_rank()
size = comm.Get_size()# 每个节点计算一部分积分
def compute_integral(a, b, n):x = np.linspace(a, b, n+1)sum_ = 0.0for i in range(1, n):x_i = (a + b * i) / nsum_ += 4 * (1 / (1 + x_i**2))return sum_ * (b - a) / na, b = 0.0, 1.0
n = 10**6  # 总采样点数
chunk = n // sizestart = rank * chunk
end = (rank + 1) * chunk
integral = compute_integral(start, end, n)# 收集所有节点的结果
total = 0.0
comm.Allreduce(integral, total, op=MPI.SUM)
pi = totalif rank == 0:print(f"Computed PI: {pi}")
6.3 使用 mpiexec 运行

在任意节点上执行以下命令(自动分发到所有节点):

mpiexec -np 4 python3 pi_origin_mpi.py
  • -np 4:指定使用 4 个进程(节点数需匹配集群规模)。
  • 如果节点间网络不通,需指定主机列表(如 -hostfile hosts.txt)。

相关文章:

Tiny Cluster(1)——搭建树莓派小型计算集群

1 硬件说明 1.1 软硬件环境 k8s-master-0192.168.5.78Debian 12树莓派58G / 4核 / 64G TF卡 & 512G SSD控制节点k8s-worker-0192.168.5.48Debian 12树莓派4B4G / 4核 / 64G TF卡工作节点k8s-worker-1192.168.5.16Debian 11BTT-CB11G / 4核 / 64G TF卡工作节点 实现 K8s …...

【软考系统架构设计师】信息安全技术基础

1、 信息安全包括5个基本要素&#xff1a;机密性、完整性、可用性、可控性与可审查性。 机密性&#xff1a;确保信息不暴露给未授权的实体或进程。&#xff08;采取加密措施&#xff09; 完整性&#xff1a;只有得到允许的人才能修改数据&#xff0c;并且能够判断出数据是否已…...

CCF CSP 第35次(2024.09)(2_字符串变换_C++)(哈希表+getline)

CCF CSP 第35次&#xff08;2024.09&#xff09;&#xff08;2_字符串变换_C&#xff09; 解题思路&#xff1a;思路一&#xff08;哈希表getline&#xff09;&#xff1a; 代码实现代码实现&#xff08;思路一&#xff08;哈希表getline&#xff09;&#xff09;&#xff1a; …...

oracle怎么查看是否走了索引

SELECT * FROM CRM_STATION_APPEAL_RESULT WHERE COMPLAINT_ID ce1a1d8f-e2a2-4126-8cb7-14384cb24468; 这是查询语句&#xff0c;怎么看这个查询是否走了索引呢 EXPLAIN PLAN FOR SELECT * FROM CRM_STATION_APPEAL_RESULT WHERE COMPLAINT_ID ce1a1d8f-e2a2-4126-8cb7-14…...

八股系列(分布式与微服务)持续更新!

八股系列&#xff08;分布式与微服务&#xff09; 分布式系统的概念 分布式系统是由多个节点组成&#xff0c;节点之间通过网络协议传递数据&#xff0c;对外表现为一个统一的整体&#xff0c;一个节点可以是一台机器或一个进程&#xff1b;分布式系统的核心功能 资源共享&…...

19【动手学深度学习】卷积层

1. 从全连接到卷积 2. 图像卷积 3. 图形卷积代码 互相关操作 import torch from torch import nn from d2l import torch as d2ldef corr2d(X, K):"""计算2维互相关运算"""h, w K.shapeY torch.zeros((X.shape[0]-h1, X.shape[1]-w 1))for …...

Linux基础9

一、日志管理 > 日志配置文件&#xff1a; > > ​ /var/log/messages #内核的消息以及各种服务的公共信息 > > ​ /var/log/dmesg #系统启动过程信息 > > ​ /var/log/cron #cron计划任务相关信息 > > ​ /var…...

[创业之路-366]:投资尽职调查 - 尽调核心逻辑与核心影响因素:价值、估值、退出、风险、策略

目录 一、VC投资的本质是冒着不确定性风险进行买卖、生意&#xff0c;为了赚取高额回报 1、VC投资的核心本质 2、VC投资的运作机制 3、VC投资的风险与挑战 4、VC投资的底层逻辑 5、总结&#xff1a;VC投资的本质再定义 二、尽调核心逻辑 1、尽调的含义 2、尽调的逻辑方…...

Raymarching Textures In Depth

本节课最主要的就是学会hlsl中使用纹理采样 float4 color Texture2DSample(Texobj, TexobjSampler, uv); return color; 课程中的代码&#xff08;没有这张图我就没做&#xff09; 课程代码产生深度的原因是uv偏移&#xff0c;黑色区域会不断向左偏移&#xff0c;直到找到白色…...

条件变量condition_variable

条件变量 条件变量是一个对象&#xff0c;能够阻止调用线程&#xff0c;直到通知恢复。 std::condition_variable 是 C 标准库中的一个同步原语&#xff0c;它与互斥锁&#xff08;std::mutex&#xff09;配合使用&#xff0c;用于线程间的等待和通知机制。 成员函数 wait(…...

301.找出3位偶数

2094. 找出 3 位偶数 - 力扣&#xff08;LeetCode&#xff09; class Solution {List<Integer> resnew ArrayList<>();List<Integer> linew ArrayList<>();public int[] findEvenNumbers(int[] digits) {Arrays.sort(digits);boolean[] numsnew boolea…...

改进神经风格迁移

改进神经风格迁移&#xff08;Neural Style Transfer, NST&#xff09;可以从多个方向入手&#xff0c;包括模型结构优化、损失函数设计、计算效率提升、应用场景扩展等。以下是一些关键的改进方向及具体方法&#xff1a; 1. 模型结构优化 &#xff08;1&#xff09;轻量化网络…...

零基础上手Python数据分析 (11):DataFrame 数据清洗与预处理 (上) - 搞定缺失值、重复值和异常值

写在前面 上一篇博客,我们学习了如何灵活地索引和选取 DataFrame 中的数据,这为我们深入操作数据打下了基础。 然而,在我们拿到原始数据,准备开始大展身手进行分析之前,往往需要先进行一个至关重要的步骤:数据清洗与预处理 (Data Cleaning and Preprocessing)。 “脏数…...

StateFlow 在 XML(传统View)和 Compose 中的统一数据流管理

在 Android 开发中&#xff0c;XML&#xff08;传统 View 系统&#xff09; 和 Jetpack Compose 的混合使用越来越常见。如何让它们共享同一份数据源&#xff0c;并实现自动 UI 更新&#xff1f; StateFlow 是 Kotlin 协程提供的一种响应式数据流&#xff0c;可以完美适配 XML …...

【JVM】运行时数据区域

文章目录 1. 程序计数器补充 2. 虚拟机栈2.1 栈帧1. 局部变量表2. 操作数栈3. 动态链接4. 方法返回地址补充 3. 本地方法栈4. 堆5. 方法区静态常量池&#xff08;Class常量池&#xff09;运行时常量池字符串常量池&#xff08;1&#xff09;位置变化&#xff08;2&#xff09;放…...

【场景应用5】深入探讨去噪扩散概率模型及训练推理过程

在这篇博客文章中,我们将深入探讨去噪扩散概率模型(Denoising Diffusion Probabilistic Models,简称DDPMs,扩散模型,基于评分的生成模型,或简单的自编码器),因为研究人员在(无条件或有条件的)图像/音频/视频生成任务中,已经取得了显著的成果。流行的例子(在撰写本文…...

TCP 如何在网络 “江湖” 立威建交?

一、特点&#xff1a; &#xff08;一&#xff09;面向连接 在进行数据传输之前&#xff0c;TCP 需要在发送方和接收方之间建立一条逻辑连接。这一过程类似于打电话&#xff0c;双方在通话前需要先拨号建立连接。建立连接的过程通过三次握手来完成&#xff0c;确保通信双方都…...

mysql:重置表自增字段序号

情况一&#xff1a;清空表数据后重置自增 ID 如果你希望清空表中的所有数据&#xff0c;并将自增 ID 重置为初始值&#xff08;通常为 1&#xff09; 1、truncate truncate table tb_dict; 2、delete 配合 alter 语句 delete from tb_dict; alter table tb_dict AUTO_INCR…...

【Code】《代码整洁之道》笔记-Chapter13-并发编程

第13章 并发编程 “对象是过程的抽象。线程是调度的抽象。” 编写整洁的并发程序很难——非常难&#xff0c;而编写在单线程中执行的代码却简单得多。编写表面上看似不错、深入进去却支离破碎的多线程代码也简单&#xff0c;但是系统一旦遭受压力&#xff0c;这种代码就扛不…...

TDengine 可靠性保障:数据持久化与容灾备份(一)

一、引言 在数字化浪潮席卷全球的当下&#xff0c;数据已成为企业和组织最为关键的资产之一。无论是互联网企业记录用户的行为数据&#xff0c;还是金融机构存储交易信息&#xff0c;又或是工业领域监测设备的运行状态&#xff0c;数据的可靠性直接关乎到业务的正常运转、决策…...

AWTK-MVVM 如何让多个View复用一个Model记录+关于app_conf的踩坑

前言 有这么一个业务&#xff0c;主界面点击应用窗口进入声纳显示界面&#xff0c;声纳显示界面再通过按钮进入菜单界面&#xff0c;菜单界面有很多关于该声纳显示界面的设置项&#xff0c;比如量程&#xff0c;增益&#xff0c;时间显示&#xff0c;亮度&#xff0c;对比度等…...

第四节:React Hooks进阶篇-useEffect依赖项为空数组[]与不写的区别

陷阱题&#xff1a;闭包问题、Stale Closure举例 一、依赖项为空数组[]与不写的核心区别 行为空数组[]不写依赖项执行时机仅在组件挂载时执行一次&#xff08;类似componentDidMount&#xff09;组件每次渲染后都执行&#xff08;类似componentDidUpdate&#xff09;更新触发…...

25级总分413数学一142专业124东南大学820考研经验电子信息通信工程,真题,大纲,参考书。

我是南京理工大学的本科生&#xff0c;25 考研一战东大&#xff0c;政治 69&#xff0c;英一 78&#xff0c;数一 142&#xff0c;专业课&#xff08;820&#xff09;124&#xff0c;总分 413。我从 3 月正式开始备考&#xff0c;专业课跟着无线电论坛jenny 老师进行学习&#…...

Docker Desktop磁盘镜像位置用途解析

在设置里面的资源中有个磁盘镜像位置的配置&#xff0c;这个目录默认位置是&#xff1a;C:\Users\haitao.luo\AppData\Local\Docker\wsl\disk&#xff0c;这里面对应的是一个docker_data.vhdx&#xff0c;虚拟磁盘文件&#xff0c;因为是在c盘上&#xff0c;所以可能后面下载镜…...

android display 笔记(十)surfaceflinger与HWC的关系

在 Android 图形系统中&#xff0c;SurfaceFlinger 和 Hardware Composer (HWC) 是紧密协作的两个核心组件&#xff0c;共同负责屏幕内容的合成与显示。它们的关系可以用 “决策者与执行者” 来概括&#xff1a; 首先HWC中 DEVICE&#xff1a;指“显示设备硬件”&#xff08;…...

#MES系统运维问题分析思路

一套适用于90% MES运维现场问题的排查分析思维模型&#xff0c;叫做&#xff1a; &#x1f50d; MES系统问题分析七步法&#xff08;现场实战适用&#xff09; ✅ 第一步&#xff1a;明确问题现象&#xff08;What&#xff09; 问题要说清楚&#xff0c;“不能操作”这种模糊描…...

基于FPGA的六层电梯智能控制系统 矩阵键盘-数码管 上板仿真均验证通过

基于FPGA的六层电梯智能控制系统 前言一、整体方案二、软件设计总结 前言 本设计基于FPGA实现了一个完整的六层电梯智能控制系统&#xff0c;旨在解决传统电梯控制系统在别墅环境中存在的个性化控制不足、响应速度慢等问题。系统采用Verilog HDL语言编程&#xff0c;基于Cyclo…...

FPGA上实现SD卡连续多块读的命令

在FPGA上实现SD卡连续多块读的命令 CMD17命令一次只能读取1个块 CMD18命令一次可以连续读取多个块&#xff0c;直到停止命令CMD12 CMD18命令读的块数程序可任意设置 目录 前言 一、SD卡多块读命令CMD18 二、停止读命令CMD12 三、SD卡初始化SD卡连续块读操作的verilog代码 …...

AI 大语言模型 (LLM) 平台的整体概览与未来发展

&#x1f4cb; 分析报告&#xff1a;AI 大语言模型 (LLM) 平台的整体概览与未来发展 自动生成的结构化分析报告 &#x1f4bb; 整体概述&#xff1a;AI LLM 平台的市场现状与发展动力 随着人工智能技术的飞速发展&#xff0c;大语言模型&#xff08;Large Language Models, L…...

【技术派部署篇】Windows本地部署技术派

一、技术派简介 技术派是一个采用 Spring Boot、MyBatis-Plus、MySQL、Redis、ElasticSearch、MongoDB、Docker、RabbitMQ 等技术栈的社区系统&#xff0c;其 1.0 版已正式上线。该项目的技术栈按阶段集成引入&#xff0c;开发者可根据自身需求选择不同版本进行学习。 二、环…...

asm汇编语言源代码之-获取环境变量

提供1个子程序: 1. 读取环境变量 GETENVSTR 具体功能及参数描述如下 GETENVSTR PROC FAR ;IN: DSPSP SEG. ;   ES:BX -> ENV VAR NAME ;OUT: DS:DX -> ENV VAR VALUE; IF DX0FFFFH, NOT FOUND   ; more source code at http://www.ahjoe.com/source/srcdown.aspPU…...

消失的它:揭开 CoreData 托管对象神秘的消失之谜(上)

概述 使用 CoreData 作为 App 持久存储“定海神针”的小伙伴们想必都知道&#xff0c;我们需要将耗时的数据库查询操作乖巧的放到后台线程中&#xff0c;以便让主线程负责的 UI 获得风驰电掣般地享受。 不过&#xff0c;如何将后台线程中查询获得的托管对象稳妥的传送至主线程…...

Python中如何用正则表达式精准匹配IP地址?

在网络编程和数据处理时&#xff0c;我们经常需要从文本中提取或验证IP地址。Python的正则表达式(re模块)是完成这个任务的利器。但你知道怎么写才能准确匹配各种合法的IP地址吗&#xff1f;今天我们就来详细探讨这个问题。 为什么需要IP正则表达式&#xff1f; 假设你正在分…...

初识华为防火墙

防火墙配置与应用 一、防火墙的基本概念 1&#xff0e;防火墙的网络区域&#xff08;一般认为三个区域&#xff1a;trust、DMZ、untrust&#xff09; &#xff08;1&#xff09;本地区域(安全级别 100&#xff0c;local)&#xff08;防火墙内部区域&#xff0c;一般不说明此…...

十二、C++速通秘籍—静态库,动态库

上一章节&#xff1a; 十一、C速通秘籍—多线程-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/147055932?spm1001.2014.3001.5502 本章节代码&#xff1a; cpp2/library CuiQingCheng/cppstudy - 码云 - 开源中国https://gitee.com/cuiqingcheng/cppst…...

我爱学算法之——滑动窗口攻克子数组和子串难题(下)

这几道题可以说是有一点难度的&#xff0c;但是掌握方法以后可以说非常简单了&#xff1b; 一、找到字符串中所有字母异位词 题目解析 题目给定了两个字符串s和p&#xff0c;让我们在s中找到p的异位词的字串&#xff0c;并且返回这些字串的索引 **异位词&#xff1a;**简单来说…...

leaflet 之 获取中国某个行政区的经纬度边界(latLngBounds)

思路 在json文件中获取下面的四个点 组成东北,西南两组 { “southwest”: { “lat”: 35.950, “lng”: 120.000 },//西南方 “northeast”: { “lat”: 36.200, “lng”: 120.300 }//东北方 } 最西点经度&#xff08;minLng&#xff09; 最东点经度&#xff08;maxLng&#x…...

鸢尾花分类的6种机器学习方法综合分析与实现

鸢尾花分类的6种机器学习方法综合分析与实现 首先我们来看一下对应的实验结果。 数据准备与环境配置 在开始机器学习项目前&#xff0c;首先需要准备编程环境和加载数据。以下代码导入必要的库并加载鸢尾花数据集&#xff1a; import numpy as np import pandas as pd impo…...

基于李永乐线性代数基础的行列式的起源于理解

起源于解方程组的过程 对于解一个二元方程组&#xff0c;很自然的会通过加减消元&#xff0c;变成下面这样 对于三元方程组&#xff0c;也是一样&#xff1a; 这一大长串&#xff0c;是A*x1b1这个形式时&#xff0c;A的值 人们为了方便记忆x未知数前这一大坨相乘后相加减的数…...

MacOs java环境配置+maven环境配置踩坑实录

oracl官网下载jdk 1.8的安装包 注意可能需要注册&#xff01;&#xff01;&#xff01; 下载链接&#xff1a;下载地址点击 注意晚上就不要下载了 报错400 &#xff01;&#xff01;&#xff01; 1.点击安装嘛 2.配置环境变量 export JAVA_HOME/Library/Java/Java…...

LeetCode 3272.统计好整数的数目:枚举+排列组合+哈希表

【LetMeFly】3272.统计好整数的数目&#xff1a;枚举排列组合哈希表 力扣题目链接&#xff1a;https://leetcode.cn/problems/find-the-count-of-good-integers/ 给你两个 正 整数 n 和 k 。 如果一个整数 x 满足以下条件&#xff0c;那么它被称为 k 回文 整数 。 x 是一个…...

蓝桥杯嵌入式历年省赛客观题

一.第十五届客观题 第十四届省赛 十三届 十二届...

RFID 在制造业的深度应用与未来趋势

一、引言 制造业作为国民经济的核心支柱&#xff0c;正面临着全球供应链重构、个性化需求激增、成本压力加剧等多重挑战。RFID&#xff08;射频识别&#xff09;技术以其非接触式自动识别、数据实时传输、环境适应性强等特性&#xff0c;成为推动制造业数字化转型的关键引擎。…...

spring--声明式事务

声明式事务 1、回顾事务 要么都成功&#xff0c;要么都失败&#xff01; 事务在项目开发中&#xff0c;十分重要&#xff0c;涉及数据的一致性问题 确保完整性和一致性 事务ACID&#xff1a; 原子性&#xff1a;事务是原子性操作&#xff0c;由一系列动作组成&#xff0c;…...

java爬虫案例

以下是一个简单的Java爬虫案例&#xff0c;使用了 Jsoup 和 Apache HttpClient 两个常用的库来实现网页内容的爬取和解析。这个案例会演示如何获取网页的HTML内容、解析HTML并提取所需数据。 示例&#xff1a;使用Jsoup爬取网页内容 1. 添加依赖 在项目中添加以下依赖&#xff…...

博途 TIA Portal之1200做主站与有意思的板子做MODBUS_RTU通讯

做为博途的硬件,1200和1500本体都不具有串口通讯功能,只能使用扩展板或是通讯模块完成。 其中1200使用CB1241或CM1241进行串口通讯,本文将使用CM1241进行演示。 1、硬件介绍 1200的PLC一台,有意思的板子(以下简单4D板)一台。 其中1200带扩展模块CM1241 RS232;4D板使…...

01_核心系统下的技术原理解析

15年前&#xff0c;基本上国内的核心系统被C垄断&#xff0c;基本上是IBM的那套东西&#xff0c;场景也是比价复杂&#xff0c;这里不再赘述&#xff0c;TPS太过于庞大&#xff0c;技术上确实比较复杂。为此我这里抛砖引玉&#xff0c;说下对应的支付系统&#xff1a; &#x…...

【力扣hot100题】(092)最长回文串

有点难度&#xff0c;一开始想到的两种方法都不对&#xff0c;花了不少时间。 先说之前的方法&#xff1a; ① 遍历每个点&#xff0c;每个点向外扩张&#xff0c;如果左等于右就一直扩展直到不等。 这个方法可是可以&#xff0c;但我没有考虑到两个相同字母也是回文串的情况…...

第一期:[特殊字符] 深入理解MyBatis[特殊字符]从JDBC到MyBatis——持久层开发的转折点[特殊字符]

前言 &#x1f31f; 在软件开发的过程中&#xff0c;持久层&#xff08;或数据访问层&#xff09;是与数据库进行交互的关键部分。早期&#xff0c;开发者通常使用 JDBC&#xff08;Java Database Connectivity&#xff09;来实现与数据库的连接与操作。虽然 JDBC 在一定程度上…...

指针的进阶2

六、函数指针数组 字符指针数组 - 存放字符指针的数组 char* arr[10] 整型指针数组 - 存放整型指针的数组 int* arr[10] 函数指针数组 - 存放函数指针的数组 void my_strlen() {} int main() {//指针数组char* ch[5];int arr[10] {0};//pa是是数组指针int (*pa)[10] &…...