Tiny Cluster(1)——搭建树莓派小型计算集群
1 硬件说明
1.1 软硬件环境
k8s-master-0 | 192.168.5.78 | Debian 12 | 树莓派5 | 8G / 4核 / 64G TF卡 & 512G SSD | 控制节点 |
k8s-worker-0 | 192.168.5.48 | Debian 12 | 树莓派4B | 4G / 4核 / 64G TF卡 | 工作节点 |
k8s-worker-1 | 192.168.5.16 | Debian 11 | BTT-CB1 | 1G / 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个基本要素:机密性、完整性、可用性、可控性与可审查性。 机密性:确保信息不暴露给未授权的实体或进程。(采取加密措施) 完整性:只有得到允许的人才能修改数据,并且能够判断出数据是否已…...
CCF CSP 第35次(2024.09)(2_字符串变换_C++)(哈希表+getline)
CCF CSP 第35次(2024.09)(2_字符串变换_C) 解题思路:思路一(哈希表getline): 代码实现代码实现(思路一(哈希表getline)): …...
oracle怎么查看是否走了索引
SELECT * FROM CRM_STATION_APPEAL_RESULT WHERE COMPLAINT_ID ce1a1d8f-e2a2-4126-8cb7-14384cb24468; 这是查询语句,怎么看这个查询是否走了索引呢 EXPLAIN PLAN FOR SELECT * FROM CRM_STATION_APPEAL_RESULT WHERE COMPLAINT_ID ce1a1d8f-e2a2-4126-8cb7-14…...
八股系列(分布式与微服务)持续更新!
八股系列(分布式与微服务) 分布式系统的概念 分布式系统是由多个节点组成,节点之间通过网络协议传递数据,对外表现为一个统一的整体,一个节点可以是一台机器或一个进程;分布式系统的核心功能 资源共享&…...
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
一、日志管理 > 日志配置文件: > > /var/log/messages #内核的消息以及各种服务的公共信息 > > /var/log/dmesg #系统启动过程信息 > > /var/log/cron #cron计划任务相关信息 > > /var…...
[创业之路-366]:投资尽职调查 - 尽调核心逻辑与核心影响因素:价值、估值、退出、风险、策略
目录 一、VC投资的本质是冒着不确定性风险进行买卖、生意,为了赚取高额回报 1、VC投资的核心本质 2、VC投资的运作机制 3、VC投资的风险与挑战 4、VC投资的底层逻辑 5、总结:VC投资的本质再定义 二、尽调核心逻辑 1、尽调的含义 2、尽调的逻辑方…...
Raymarching Textures In Depth
本节课最主要的就是学会hlsl中使用纹理采样 float4 color Texture2DSample(Texobj, TexobjSampler, uv); return color; 课程中的代码(没有这张图我就没做) 课程代码产生深度的原因是uv偏移,黑色区域会不断向左偏移,直到找到白色…...
条件变量condition_variable
条件变量 条件变量是一个对象,能够阻止调用线程,直到通知恢复。 std::condition_variable 是 C 标准库中的一个同步原语,它与互斥锁(std::mutex)配合使用,用于线程间的等待和通知机制。 成员函数 wait(…...
301.找出3位偶数
2094. 找出 3 位偶数 - 力扣(LeetCode) class Solution {List<Integer> resnew ArrayList<>();List<Integer> linew ArrayList<>();public int[] findEvenNumbers(int[] digits) {Arrays.sort(digits);boolean[] numsnew boolea…...
改进神经风格迁移
改进神经风格迁移(Neural Style Transfer, NST)可以从多个方向入手,包括模型结构优化、损失函数设计、计算效率提升、应用场景扩展等。以下是一些关键的改进方向及具体方法: 1. 模型结构优化 (1)轻量化网络…...
零基础上手Python数据分析 (11):DataFrame 数据清洗与预处理 (上) - 搞定缺失值、重复值和异常值
写在前面 上一篇博客,我们学习了如何灵活地索引和选取 DataFrame 中的数据,这为我们深入操作数据打下了基础。 然而,在我们拿到原始数据,准备开始大展身手进行分析之前,往往需要先进行一个至关重要的步骤:数据清洗与预处理 (Data Cleaning and Preprocessing)。 “脏数…...
StateFlow 在 XML(传统View)和 Compose 中的统一数据流管理
在 Android 开发中,XML(传统 View 系统) 和 Jetpack Compose 的混合使用越来越常见。如何让它们共享同一份数据源,并实现自动 UI 更新? StateFlow 是 Kotlin 协程提供的一种响应式数据流,可以完美适配 XML …...
【JVM】运行时数据区域
文章目录 1. 程序计数器补充 2. 虚拟机栈2.1 栈帧1. 局部变量表2. 操作数栈3. 动态链接4. 方法返回地址补充 3. 本地方法栈4. 堆5. 方法区静态常量池(Class常量池)运行时常量池字符串常量池(1)位置变化(2)放…...
【场景应用5】深入探讨去噪扩散概率模型及训练推理过程
在这篇博客文章中,我们将深入探讨去噪扩散概率模型(Denoising Diffusion Probabilistic Models,简称DDPMs,扩散模型,基于评分的生成模型,或简单的自编码器),因为研究人员在(无条件或有条件的)图像/音频/视频生成任务中,已经取得了显著的成果。流行的例子(在撰写本文…...
TCP 如何在网络 “江湖” 立威建交?
一、特点: (一)面向连接 在进行数据传输之前,TCP 需要在发送方和接收方之间建立一条逻辑连接。这一过程类似于打电话,双方在通话前需要先拨号建立连接。建立连接的过程通过三次握手来完成,确保通信双方都…...
mysql:重置表自增字段序号
情况一:清空表数据后重置自增 ID 如果你希望清空表中的所有数据,并将自增 ID 重置为初始值(通常为 1) 1、truncate truncate table tb_dict; 2、delete 配合 alter 语句 delete from tb_dict; alter table tb_dict AUTO_INCR…...
【Code】《代码整洁之道》笔记-Chapter13-并发编程
第13章 并发编程 “对象是过程的抽象。线程是调度的抽象。” 编写整洁的并发程序很难——非常难,而编写在单线程中执行的代码却简单得多。编写表面上看似不错、深入进去却支离破碎的多线程代码也简单,但是系统一旦遭受压力,这种代码就扛不…...
TDengine 可靠性保障:数据持久化与容灾备份(一)
一、引言 在数字化浪潮席卷全球的当下,数据已成为企业和组织最为关键的资产之一。无论是互联网企业记录用户的行为数据,还是金融机构存储交易信息,又或是工业领域监测设备的运行状态,数据的可靠性直接关乎到业务的正常运转、决策…...
AWTK-MVVM 如何让多个View复用一个Model记录+关于app_conf的踩坑
前言 有这么一个业务,主界面点击应用窗口进入声纳显示界面,声纳显示界面再通过按钮进入菜单界面,菜单界面有很多关于该声纳显示界面的设置项,比如量程,增益,时间显示,亮度,对比度等…...
第四节:React Hooks进阶篇-useEffect依赖项为空数组[]与不写的区别
陷阱题:闭包问题、Stale Closure举例 一、依赖项为空数组[]与不写的核心区别 行为空数组[]不写依赖项执行时机仅在组件挂载时执行一次(类似componentDidMount)组件每次渲染后都执行(类似componentDidUpdate)更新触发…...
25级总分413数学一142专业124东南大学820考研经验电子信息通信工程,真题,大纲,参考书。
我是南京理工大学的本科生,25 考研一战东大,政治 69,英一 78,数一 142,专业课(820)124,总分 413。我从 3 月正式开始备考,专业课跟着无线电论坛jenny 老师进行学习&#…...
Docker Desktop磁盘镜像位置用途解析
在设置里面的资源中有个磁盘镜像位置的配置,这个目录默认位置是:C:\Users\haitao.luo\AppData\Local\Docker\wsl\disk,这里面对应的是一个docker_data.vhdx,虚拟磁盘文件,因为是在c盘上,所以可能后面下载镜…...
android display 笔记(十)surfaceflinger与HWC的关系
在 Android 图形系统中,SurfaceFlinger 和 Hardware Composer (HWC) 是紧密协作的两个核心组件,共同负责屏幕内容的合成与显示。它们的关系可以用 “决策者与执行者” 来概括: 首先HWC中 DEVICE:指“显示设备硬件”(…...
#MES系统运维问题分析思路
一套适用于90% MES运维现场问题的排查分析思维模型,叫做: 🔍 MES系统问题分析七步法(现场实战适用) ✅ 第一步:明确问题现象(What) 问题要说清楚,“不能操作”这种模糊描…...
基于FPGA的六层电梯智能控制系统 矩阵键盘-数码管 上板仿真均验证通过
基于FPGA的六层电梯智能控制系统 前言一、整体方案二、软件设计总结 前言 本设计基于FPGA实现了一个完整的六层电梯智能控制系统,旨在解决传统电梯控制系统在别墅环境中存在的个性化控制不足、响应速度慢等问题。系统采用Verilog HDL语言编程,基于Cyclo…...
FPGA上实现SD卡连续多块读的命令
在FPGA上实现SD卡连续多块读的命令 CMD17命令一次只能读取1个块 CMD18命令一次可以连续读取多个块,直到停止命令CMD12 CMD18命令读的块数程序可任意设置 目录 前言 一、SD卡多块读命令CMD18 二、停止读命令CMD12 三、SD卡初始化SD卡连续块读操作的verilog代码 …...
AI 大语言模型 (LLM) 平台的整体概览与未来发展
📋 分析报告:AI 大语言模型 (LLM) 平台的整体概览与未来发展 自动生成的结构化分析报告 💻 整体概述:AI LLM 平台的市场现状与发展动力 随着人工智能技术的飞速发展,大语言模型(Large Language Models, L…...
【技术派部署篇】Windows本地部署技术派
一、技术派简介 技术派是一个采用 Spring Boot、MyBatis-Plus、MySQL、Redis、ElasticSearch、MongoDB、Docker、RabbitMQ 等技术栈的社区系统,其 1.0 版已正式上线。该项目的技术栈按阶段集成引入,开发者可根据自身需求选择不同版本进行学习。 二、环…...
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 持久存储“定海神针”的小伙伴们想必都知道,我们需要将耗时的数据库查询操作乖巧的放到后台线程中,以便让主线程负责的 UI 获得风驰电掣般地享受。 不过,如何将后台线程中查询获得的托管对象稳妥的传送至主线程…...
Python中如何用正则表达式精准匹配IP地址?
在网络编程和数据处理时,我们经常需要从文本中提取或验证IP地址。Python的正则表达式(re模块)是完成这个任务的利器。但你知道怎么写才能准确匹配各种合法的IP地址吗?今天我们就来详细探讨这个问题。 为什么需要IP正则表达式? 假设你正在分…...
初识华为防火墙
防火墙配置与应用 一、防火墙的基本概念 1.防火墙的网络区域(一般认为三个区域:trust、DMZ、untrust) (1)本地区域(安全级别 100,local)(防火墙内部区域,一般不说明此…...
十二、C++速通秘籍—静态库,动态库
上一章节: 十一、C速通秘籍—多线程-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/147055932?spm1001.2014.3001.5502 本章节代码: cpp2/library CuiQingCheng/cppstudy - 码云 - 开源中国https://gitee.com/cuiqingcheng/cppst…...
我爱学算法之——滑动窗口攻克子数组和子串难题(下)
这几道题可以说是有一点难度的,但是掌握方法以后可以说非常简单了; 一、找到字符串中所有字母异位词 题目解析 题目给定了两个字符串s和p,让我们在s中找到p的异位词的字串,并且返回这些字串的索引 **异位词:**简单来说…...
leaflet 之 获取中国某个行政区的经纬度边界(latLngBounds)
思路 在json文件中获取下面的四个点 组成东北,西南两组 { “southwest”: { “lat”: 35.950, “lng”: 120.000 },//西南方 “northeast”: { “lat”: 36.200, “lng”: 120.300 }//东北方 } 最西点经度(minLng) 最东点经度(maxLng&#x…...
鸢尾花分类的6种机器学习方法综合分析与实现
鸢尾花分类的6种机器学习方法综合分析与实现 首先我们来看一下对应的实验结果。 数据准备与环境配置 在开始机器学习项目前,首先需要准备编程环境和加载数据。以下代码导入必要的库并加载鸢尾花数据集: import numpy as np import pandas as pd impo…...
基于李永乐线性代数基础的行列式的起源于理解
起源于解方程组的过程 对于解一个二元方程组,很自然的会通过加减消元,变成下面这样 对于三元方程组,也是一样: 这一大长串,是A*x1b1这个形式时,A的值 人们为了方便记忆x未知数前这一大坨相乘后相加减的数…...
MacOs java环境配置+maven环境配置踩坑实录
oracl官网下载jdk 1.8的安装包 注意可能需要注册!!! 下载链接:下载地址点击 注意晚上就不要下载了 报错400 !!! 1.点击安装嘛 2.配置环境变量 export JAVA_HOME/Library/Java/Java…...
LeetCode 3272.统计好整数的数目:枚举+排列组合+哈希表
【LetMeFly】3272.统计好整数的数目:枚举排列组合哈希表 力扣题目链接:https://leetcode.cn/problems/find-the-count-of-good-integers/ 给你两个 正 整数 n 和 k 。 如果一个整数 x 满足以下条件,那么它被称为 k 回文 整数 。 x 是一个…...
蓝桥杯嵌入式历年省赛客观题
一.第十五届客观题 第十四届省赛 十三届 十二届...
RFID 在制造业的深度应用与未来趋势
一、引言 制造业作为国民经济的核心支柱,正面临着全球供应链重构、个性化需求激增、成本压力加剧等多重挑战。RFID(射频识别)技术以其非接触式自动识别、数据实时传输、环境适应性强等特性,成为推动制造业数字化转型的关键引擎。…...
spring--声明式事务
声明式事务 1、回顾事务 要么都成功,要么都失败! 事务在项目开发中,十分重要,涉及数据的一致性问题 确保完整性和一致性 事务ACID: 原子性:事务是原子性操作,由一系列动作组成,…...
java爬虫案例
以下是一个简单的Java爬虫案例,使用了 Jsoup 和 Apache HttpClient 两个常用的库来实现网页内容的爬取和解析。这个案例会演示如何获取网页的HTML内容、解析HTML并提取所需数据。 示例:使用Jsoup爬取网页内容 1. 添加依赖 在项目中添加以下依赖ÿ…...
博途 TIA Portal之1200做主站与有意思的板子做MODBUS_RTU通讯
做为博途的硬件,1200和1500本体都不具有串口通讯功能,只能使用扩展板或是通讯模块完成。 其中1200使用CB1241或CM1241进行串口通讯,本文将使用CM1241进行演示。 1、硬件介绍 1200的PLC一台,有意思的板子(以下简单4D板)一台。 其中1200带扩展模块CM1241 RS232;4D板使…...
01_核心系统下的技术原理解析
15年前,基本上国内的核心系统被C垄断,基本上是IBM的那套东西,场景也是比价复杂,这里不再赘述,TPS太过于庞大,技术上确实比较复杂。为此我这里抛砖引玉,说下对应的支付系统: &#x…...
【力扣hot100题】(092)最长回文串
有点难度,一开始想到的两种方法都不对,花了不少时间。 先说之前的方法: ① 遍历每个点,每个点向外扩张,如果左等于右就一直扩展直到不等。 这个方法可是可以,但我没有考虑到两个相同字母也是回文串的情况…...
第一期:[特殊字符] 深入理解MyBatis[特殊字符]从JDBC到MyBatis——持久层开发的转折点[特殊字符]
前言 🌟 在软件开发的过程中,持久层(或数据访问层)是与数据库进行交互的关键部分。早期,开发者通常使用 JDBC(Java Database Connectivity)来实现与数据库的连接与操作。虽然 JDBC 在一定程度上…...
指针的进阶2
六、函数指针数组 字符指针数组 - 存放字符指针的数组 char* arr[10] 整型指针数组 - 存放整型指针的数组 int* arr[10] 函数指针数组 - 存放函数指针的数组 void my_strlen() {} int main() {//指针数组char* ch[5];int arr[10] {0};//pa是是数组指针int (*pa)[10] &…...