在亚马逊云科技上开启您的多机多卡分布式训练之旅

a0fe1a9ccd732b3d89a59bbd6a1053d3.gif

随着机器学习模型规模的扩大和数据量的增加,单个设备的计算能力和内存容量逐渐成为瓶颈。这导致训练过程变得缓慢且耗时长,限制了模型的进一步发展和改进。为了解决这个问题,分布式训练应运而生。它利用多个计算资源并行地执行计算任务,将数据和计算负载分布到不同的节点上,大大加快训练速度从而使得更复杂的模型可以进行训练。目前,分布式训练已成为机器学习领域的重要技术,许多大型公司和研究机构都在采用分布式训练来加速模型训练,取得更好的性能和效果。现在主要的分布式训练有很多框架可以选择,例如 Horovod,Megatron-LM,DeepSpeed,Apache Spark,PyTorch DDP 等,在本篇文章中,我们会介绍使用 Horovod 和 Pytorch 利用 Amazon EC2 GPU 资源,进行多机多卡分布式训练。

本文主要分为 3 部分:

  • 方案概述,包括 3 种我们根据不同的用户场景设计的方案;

  • 配置细节;

  • 实战中碰到的问题分享和最佳实践。

方案概述

本文中,我们基于观察到的 3 种用户的场景给出方案和具体的配置建议。

540207d0ec74c802838677d13192820d.png

配置细节

本文提到的 3 种方案,我们都会进行详细地描述。请提前准备下面两个环境:

  1. 创建两台 g4dn.xlarge 实例

  2. 创建 Amazon Fsx for Lustre 存储,请参考官方文档:

    https://docs.aws.amazon.com/fsx/latest/LustreGuide/getting-started-step1.html

Amazon EKS 和 Kubeflow 的方案

进行分布式训练

Kubeflow 是 Kubernetes 的机器学习工具包,目标是利用 Kubernetes 的优点,尽可能简单地扩展机器学习(ML)模型并将它们部署到生产环境。它提供了很多个不同的训练 Operator 支持训练,包括 TensorFlow,MPIJob,Pytorch 等。Kubeflow 训练的 Operator 是一个 Kubernetes 自定义资源,用于在 Kubernetes 上运行 PyTorch,Tensorflow 等培训任务。同时,每一个训练任务都是配置文件,我们需要在配置文件里指定训练需要的资源,依赖的镜像,训练代码等。我们会在今天的配置中使用 MPIJob 去做 Tensorflow 的分布式训练,PytorchJob 去做 Pytorch 的训练,如果您是其他的训练方式,请参考 Kubeflow Training Operators:

https://www.kubeflow.org/docs/components/training/

Kubeflow 的环境建立,这里我不再赘述,在亚马逊云科技海外区请参考 Kubeflow on EKS:

https://awslabs.github.io/kubeflow-manifests/docs/

中国区请参考三剑客 EKS + Kubeflow + Karpenter 助力构建弹性机器学习平台:

https://aws.amazon.com/cn/blogs/china/three-swordsmen-eks-kubeflow-karpenter-help-build-an-elastic-machine-learning-platform/

MPIJob

1. 创建 MPIJob CRD,请不要按照 Kubeflow 的官网提示创建,会报错,建议指定 MPIJob 的 release 版本去添加。成功后我们可以看到“mpijobs.kubeflow.org”。 

kubectl apply -f https://raw.githubusercontent.com/kubeflow/mpi-operator/v0.4.0/deploy/v2beta1/mpi-operator.yaml
kubectl get crd

1f7048084d66e55d82a3aa8662928a81.png

2. 我们还是会使用 Horovod 0.28.1 和 Tensorflow 的代码,但是请注意,我们需要基于 horovod/horovod:0.28.1 去打包一个新的镜像,请参考下面的 Dockerfile 创建新的 Docker 镜像。 

  1. mpi-operator 通过 Secret 将 .ssh 文件夹挂载进来。为了使其正常工作,我们需要禁用 UserKnownHostsFile,以避免写入权限的问题,同时禁用 StrictModes 可以避免目录和文件的读取权限检查。

  2. 我加了测试的代码,简单起见,我直接克隆了 Horovod 的官方代码。 

FROM horovod/horovod:0.28.1
RUN echo "    UserKnownHostsFile /dev/null" >> /etc/ssh/ssh_config && \
    sed -i 's/#\(StrictModes \).*/\1no/g' /etc/ssh/sshd_config
RUN mkdir /tensorflow
WORKDIR "/tensorflow"
RUN git clone https://github.com/horovod/horovod
WORKDIR "/tensorflow/"

3. 编辑自己的训练任务,代码如下,替换<YOUR_IMAGE_REPO>为您自己的镜像连接。 

apiVersion: kubeflow.org/v2beta1
kind: MPIJob
metadata:
  name: tf-test
spec:
  slotsPerWorker: 1
  runPolicy:
    cleanPodPolicy: Running
  mpiReplicaSpecs:
    Launcher:
      replicas: 1
      template:
         spec:
           containers:
           - image:<YOUR_IMAGE_REPO>
             name: tf-test
             command:
             - mpirun
             - --allow-run-as-root
             - -np
             - "2"
             - -bind-to
             - none
             - -map-by
             - slot
             - -x
             - NCCL_DEBUG=INFO
             - -x
             - LD_LIBRARY_PATH
             - -x
             - PATH
             - -mca
             - pml
             - ob1
             - -mca
             - btl
             - ^openib
             - python
             - /horovod/examples/tensorflow2/tensorflow2_mnist.py
    Worker:
      replicas: 2
      template:
        spec:
         nodeSelector: 
           computetype: gpu
         containers:
          - image: <YOUR_IMAGE_REPO>
            name: tf-test
            resources:
              limits:
                nvidia.com/gpu: 1

4. 通过 kubectl apply -f tf-test.yaml 提交您的训练任务。

77d8cf192e4987aa3a8d4af0d065df05.png

5. 提交后可以看到两台 EKS GPU 节点的用量,提交后也可以通过 kubectl logs -f tf-test-launcher-b9fx5 查看训练日志。

0af1991c8a56c11c281a00ee77a91ec7.png

5ca2132c825afbd611d67e56ebb40257.png

PytorchJob 去执行 Pytorch 的训练任务

1. Kubeflow 在安装成功后,默认会有 pytorchjobs.kubeflow.org ,您可以通过 kubectl get crd 查看。额外,请通过 kubectl get pods -n kubeflow 查看 TrainingOperator 是否正常运行。 

training-operator-7589458f95-kjmh2 1/1 Running 0 2d

2. 准备本次 PytorchJob 的训练镜像,请参考下面我做实验的 Dockerfile,其分布式训练代码 mnist.py 可以在 Training Operator Github 上下载:

https://github.com/kubeflow/training-operator/blob/master/examples/pytorch/mnist/mnist.py

通过以下 Dockerfile 创建镜像后,上传至您的仓库。 

FROM pytorch/pytorch:2.1.2-cuda11.8-cudnn8-devel


RUN pip install tensorboardX


RUN mkdir -p /opt/mnist


WORKDIR /opt/mnist/src
ADD mnist.py /opt/mnist/src/mnist.py


RUN chgrp -R 0 /opt/mnist \
&& chmod -R g+rwX /opt/mnist


ENTRYPOINT ["python", "/opt/mnist/src/mnist.py"]

3. 和 MPIJob 一样,提交 Pytorch 任务也是通过定义配置文件的方式,请替换您的仓库地址。使用 kubectl apply -f kubeflow_pytorchjob.yaml 提交作业。 

kind: "PyTorchJob"
metadata:
  name: "pytorch-dist-mnist-gloo"
spec:
  pytorchReplicaSpecs:
    Master:
      replicas: 1
      restartPolicy: OnFailure
      template:
        metadata:
          annotations:
            sidecar.istio.io/inject: "false"
        spec:
          containers:
            - name: pytorch
              image:<YOUR_IMAGE_REPO>
              args: ["--backend", "gloo"]
              #resources: 
              # limits:
              #   nvidia.com/gpu: 1
    Worker:
      replicas: 2
      restartPolicy: OnFailure
      template:
        metadata:
          annotations:
            sidecar.istio.io/inject: "false"
        spec:
          nodeSelector: 
           computetype: gpu
          containers: 
            - name: pytorch
              image: <YOUR_IMAGE_REPO>
              args: ["--backend", "gloo"]
              resources: 
                limits:
                  nvidia.com/gpu: 1

4. 我们在作业提交后,可以通过 kubectl get pod 去查看 Pod 的情况,以及训练的日志。

4669aaf667411e131cf76a708f270cf0.png

GPU EC2 上直接配置

在 EC2 上直接配置时,我们包含了两个框架, Tensorflow 配合 Horovod 和 Pytorch DDP。EC2 上的配置环境,我们使用的是 CUDA 11.8, 一般 EC2 上面默认的很有可能不是 11.8,那请通过下面的命令进行修改或指定您需要的 CUDA 版本。

sudo rm /usr/local/cuda
sudo ln -s /usr/local/cuda-11.8 /usr/local/cuda

修改软连接后,把下面的命令写入到 ~/.bashrc 中,并执行 source ~/.bashrc。

export PATH="/usr/local/cuda-11.8/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH"

Horovod  TensorFlow 分布式

我们建议安装在虚拟环境中安装需要的依赖,以避免需求版本与其他环境发生冲突。通过以下命令创建虚拟环境并使用,可以把虚拟环境创建在 /fsx 下,方便共享使用。

python3 -m virtualenv /fsx/horovod_gpu_ve
source horovod_gpu_ve/bin/activate

d46e58040276f735fbf277b4f6e2dbfa.png

1. 下载您的依赖,我这里使用的 Tensorflow 2.4.0 和 Horovod 0.28.1 版本,CUDA,Python, Tensorflow 的版本兼容性问题,可以查看 Tensorflow 的官网:https://www.tensorflow.org/install/source#tested_build_configurations

pip install tensorflow==2.4.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
HOROVOD_WITH_MPI=1 HOROVOD_WITH_TENSORFLOW=1 pip install --no-cache-dir horovod -i https://pypi.tuna.tsinghua.edu.cn/simple
2. 配置两个节点的 /etc/hosts 文件,如下图:

8490964b42635a3530b69e20588c721d.png

3. 配置两台机器的免密登录,在 node0 和 node1 上分别执行 ssh-keygen ,复制生成的 id_rsa.pub 文件中密钥,复制到对方的 ~/.ssh/authorized_keys 中,复制之后通过 ssh 登录验证是否成功。

4. Horovod 可以通过下面两种命令开启分布式训练, horovodrun 和 mpirun 。 np 为指定的总 GPU 节点数目, -H node0:1,node1:1 指定每节点上的 GPU 数目。 tensorflow2_mnist.py 为训练代码:

https://github.com/horovod/horovod/blob/master/examples/tensorflow2/tensorflow2_mnist.py

horovodrun -np 2 -H node0:1,node1:1 python code-horovod-gpu/tensorflow2_mnist.py

773392c7fd341df5027de42202bf53ce.png

b22097900dc3ad1a7f50f89258b24168.png

训练已经开始,我们可以通过 nvidia-smi 查看到两个节点都已经开始训练任务。

3f6bb4b374ad65da989569cb1027f5bd.png

b24293a6487d45401cc574226448c7a7.png

下面是 mpirun 的命令行,通过 -x 指定环境变量, —mca btl_tcp_if_include 指定网卡。

mpirun -np 2 -H node0:1,node1:1 -x NCCL_DEBUG=INFO -x LD_LIBRARY_PATH -x PATH —mca btl_tcp_if_include ens5 python code-horovod-gpu/tensorflow2_mnist.py

训练开始后,我们可以通过 nvidia-smi 查看到两个节点的 GPU 使用量。

1e5db489ec5efd47ab76fd48a96fa627.png

4269c7ebce0e52bdb07816fe8e40348a.png

Pytorch 分布式

Pytorch 的分布式多机多卡训练相对比较简单,但下面的命令需要在两个机器上分别运行,训练代码连接为 Pytorch 的官方代码:

https://github.com/pytorch/examples/blob/main/distributed/ddp-tutorial-series/multinode.py

nproc_per_node:每个节点的 GPU 数量
nnodes:节点数量
node_rank: 当前节点的 rank
master_addr:主节点 ip
master_port:10086
torchrun —nproc_per_node=1 —nnodes=2 —node_rank=0 —master_addr='172.31.17.254' —master_port='10086' /fsx/multinode.py —total_epochs=2000 —save_every=1

36df745f79e05f4cf606a540f9349d5e.png

torchrun —nproc_per_node=1 —nnodes=2 —node_rank=1 —master_addr='172.31.17.254' —master_port='10086' /fsx/multinode.py —total_epochs=2000 —save_every=1

e62a2f139fc7b4f268925e72074af295.png

通过 Docker 在 EC2 上配置

我们通过利用 Docker host 网络的方式,让两个节点互相通信。首先按照 EC2 上的配置方法,配置 /etc/hosts 中的两个节点。

  1. 两节点免密登录,请首先 sudo su 后,执行 EC2 上的免密配置方法

  2. 在两个节点上启动 Docker 容器,我这里使用的也同样是 horovod/horovod:0.28.1 版本的镜像,训练脚本依旧是 tensorflow2_mnist.py ,这里需要映射环境变量和 ssh 的配置 

nvidia-docker run -it —ipc=host —network=host -v /fsx/code-horovod-gpu/:/vol/ -v /root/.ssh/:/root/.ssh/ -e LD_LIBRARY_PATH=/usr/local/lib horovod/horovod:0.28.1

c46f6804be8ccc41f5198ade204ea3a8.png

3. 在两个 Docker 镜像中, 重新设置 ssh 端口为 2022,这个是为了避免宿主机的 22 端口冲突。配置后可以通过 ssh -p 2022 node0 去测试两个 Docker 镜像是否可以 ssh 登录成功 

echo "Port 2022" >> /etc/ssh/sshd_config
/usr/sbin/sshd -D&

12e8fc8982d2fa7dc8233d0f898ecf0c.png

4. 配置成功后,我们可以选择下面的两个命令去执行分布式训练 

horovodrun -np 2 -H node0:1,node1:1 -p 2022 python /vol/tensorflow2_mnist.py
mpirun —allow-run-as-root -np 2 -H node0:1,node1:1 -x NCCL_DEBUG=INFO —mca plm_rsh_args "-p 2022" -x LD_LIBRARY_PATH -x PATH —mca btl_tcp_if_include ens5 python /vol/tensorflow2_mnist.py

7cda12bc9e4858556295c47ee564b214.png

60e68459c16316fb4432bd56dee58052.png

510c93c274dfd80cb2cb4f7945d85c5e.png

实战中碰到的问题分享

和最佳实践

在实际操作的时候,因为训练环境的依赖和训练代码等版本的问题,肯定会碰到各种各样的问题。我们把碰到的问题总结了下,您可以作为参考。

1. 在使用 mpirun 的时候, 我们经常碰到的问题。提示没有对应的可执行程序,例如 cannot find /usr/bin/orted,这时候您可以通过两个方面进行筛查:

  1. 如果您是通过 docker 的方式运行的,可以查看是否是两个 docker 容器在互相访问,因为有一种情况是 docker 容器 ssh 直接登录到的是另一个节点。如果是这种情况,我们建议避免掉 22 端口复用,例如您可以修改 docker 容器的 ssh 端口为 2022,并且 mpirun 命令 —mca plm_rsh_args "-p 2022" ,我们发现可能和 mpirun 的版本有关系,有的时候 mpirun 不指定 2022 端口可以正常训练,但有的版本会出错。

  2. 还有一种情况是,mpirun 需要通过 -x 设置环境变量,所以我们在测试过程中通过 -x LD_LIBRARY_PATH -x PATH 把两端的环境变量设置好。我们建议把您需要的环境变量放在一个文件中,在第一台机器上 source 后,通过-x 进行设置。

2. 使用 mpirun 的时候,最初没有加—mca btl_tcp_if_include ens5 , 会提示下面的错误,一直不进行训练。

491ca40ab89eea0ba2e294c17ed377e4.png

3. 使用 mpirun 的情况, 提示错误 BLAS: Program is Terminated. Because you tried to allocate too many memory regions . 这个可以通过 OPENBLAS_NUM_THREADS,GOTO_NUM_THREADS , OMP_NUM_THREADS 这几个值设置为 1 解决,但一定注意要通过 mpirun -x 在多台机器上配置,我们在这个上面浪费了一段时间。

4. 我们在执行的时候碰到了这个错误提示, "One or more tensors were submitted to be reduced, which will cause deadlock" ,训练任务一直 Pending,后来通过换了镜像版本解决了这个问题,建议大家一定要根据 Tensorflow 官方建议的兼容版本进行使用。

5. 观察训练性能时,我们最开始是通过每步 Step 花费的时间去统计,但后来发现 Horovod 的 Step 是根据每个 GPU 去统计的,我们的代码里只输出了第一个 GPU 的 Step 值,所以造成对亚马逊云科技的 GPU 性能有了误解,在转变成观察收敛速度后,确实是会快的。

总结

在本文中,我们详细总结了用户在日常工作中可能会遇到的多机多卡分布式训练的 3 种方式,并提供了几种不同的方案配置细节,正在考虑在亚马逊云科技上开始分布式训练的用户可以根据这些方案涵盖的技术栈和适用场景,并对它们的优缺点进行了全面评估,选择合适自己的方案。

近年来,亚马逊云科技也发布了一系列服务帮助用户构建分布式训练环境,比如 Amazon ParallelCluster 和 Amazon SageMaker HyperPod,感兴趣的读者也可以联系作者,共同探讨相关的技术话题。

本篇作者

3a36a33e0874095570cb766b05a998e8.jpeg

冯秋爽

亚马逊云科技解决方案架构师,负责跨国企业级客户基于亚马逊云科技的技术架构设计、咨询和设计优化工作。在加入亚马逊云科技之前曾就职于 IBM、甲骨文等 IT 企业,积累了丰富的程序开发和数据库的实践经验。

1cc8c732cf0046bfd17faa7cf2c22366.jpeg

张铮

亚马逊云科技机器学习产品技术专家,负责基于亚马逊云科技加速计算和 GPU 实例的咨询和设计工作。专注于机器学习大规模模型训练和推理加速等领域,参与实施了国内多个机器学习项目的咨询与设计工作。

ca688bdbcb5509e87222dea1b272c261.gif

星标不迷路,开发更极速!

关注后记得星标「亚马逊云开发者」

2ecaefa0add811ef43c2d9f6d157539c.gif

听说,点完下面4个按钮

就不会碰到bug了!

71cf818d4bcd29000ed5ac7058070880.gif

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

爬虫逆向网站案例

一、相关网页 东方财富人气排行榜 二、查找url 三、寻找curl并复制 四、打开Convert curl commands to code (curlconverter.com) 五、修改并执行代码 import requestscookies {st_si: 73974981954644,st_pvi: 39724919122964,st_sp: 2024-03-05%2018%3A27%3A22,st_inirUrl:…

EdgeX Foundry - 连接 MQTT 设备

文章目录 一、概述1.安装说明2.MQTT 设备模拟器2.1.模拟器设计2.2.Spring Boot 程序源码2.2.1.MQTT2.2.2.JsonUtils2.2.3.Device 2.3.程序配置 二、连接 MQTT 设备1.docker-comepse2.设备配置文件3.启动 EdgeX Foundry4.访问 UI4.1. consul4.2. EdgeX Console 5.创建 MQTT 设备…

国产电脑替代后,办公软件不兼容,国产机成了摆设如何解决?

随着国家信创战略的推进&#xff0c;许多党政机关、行政事业单位、央国企已经采购了大量的国产CPU和国产操作系统的办公电脑&#xff0c;然而&#xff0c;在替代Windows系统电脑的过程中&#xff0c;许多企业遇到了一个严重的问题&#xff1a;办公软件的不兼容性。这导致许多国…

dolphinescheduler调用API

&#xff08;作者&#xff1a;陈玓玏&#xff09; 1. 打开api文档 api文档地址&#xff1a;http://{api server ip}:12345/dolphinscheduler/swagger-ui/index.html?languagezh_CN&langcn&#xff0c;我是用k8s部署的&#xff0c;所以ip和端口是由service决定的&#xf…

人事档案转出需要注意哪些方面

人事档案转出是指将员工的人事档案从一个部门、公司或组织转移到另一个部门、公司或组织的过程。这个过程需要注意以下几个方面&#xff1a; 1.法律合规&#xff1a;在进行人事档案转出前&#xff0c;要确保遵守相关的法律法规和公司内部规定。例如&#xff0c;要确保有合法的授…

华为Web举例:私网用户通过三元组NAT访问Internet

Web举例&#xff1a;私网用户通过三元组NAT访问Internet 介绍私网用户通过三元组NAT访问Internet的配置举例。 组网需求 某公司在网络边界处部署了FW作为安全网关。为了使私网中10.1.1.0/24网段的用户可以正常访问Internet&#xff0c;需要在FW上配置源NAT策略。除了公网接口…

JavaScript的for循环与双重for循环,前端游戏开发

学习路线 第一阶段&#xff1a;网页制作 HTML&#xff1a;常用标签&#xff0c;锚点&#xff0c;列表标签&#xff0c;表单标签&#xff0c;表格标签&#xff0c;标签分类&#xff0c;标签语义化&#xff0c;注释&#xff0c;字符实体 CSS&#xff1a;CSS介绍&#xff0c;全局…

【SpringBoot3.x教程02】SpringBoot配置文件详解

前言&#xff1a;什么是配置文件 SpringBoot的配置文件是指用于定义和管理SpringBoot应用程序配置的文件。这些配置文件允许开发者调整和控制应用程序的行为&#xff0c;而无需改变代码。主要有两种格式的配置文件&#xff1a; 1、application.properties&#xff1a;这是一种使…

Spring Security的API Key实现SpringBoot 接口安全

Spring Security的API Key实现SpringBoot 接口安全 Spring Security 提供了各种机制来保护我们的 REST API。其中之一是 API 密钥。API 密钥是客户端在调用 API 调用时提供的令牌。 在本教程中&#xff0c;我们将讨论如何在Spring Security中实现基于API密钥的身份验证。 API…

vue2+vite+@vitejs/plugin-vue2可以使用require引用图片资源

很多文章都说vite不能用require&#xff0c;vue3vite确实是这样的&#xff0c;但今天无意间发现vue2vite中是可以使用require引用资源的 vue3搭配vite一般使用的是vitejs/plugin-vue解析vue语法&#xff0c;而vue2使用的则是另一个插件vitejs/plugin-vue2插件解析vue语法 看下…

易基因:NAR:RCMS编辑系统在特定细胞RNA位点的靶向m5C甲基化和去甲基化研究|项目文章

喜讯&#xff01;易基因表观转录组学RNA-BS技术服务见刊《核酸研究》 大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 2024年2月15日&#xff0c;吉林大学张涛、赵飞宇、李金泽为共同第一作者&#xff0c;吉林大学李占军、隋婷婷及赖良…

Oracle 的同义词(Synonym) 作用

Oracle 同义词(Synonym) 是数据库对象的一个别名&#xff0c;Oracle 可以为表、视图、序列、过程、函数、程序包等指定一个别名。同义词有两种类型&#xff1a; 私有同义词&#xff1a;拥有 CREATE SYNONYM 权限的用户(包括非管理员用户)即可创建私有同义词&#xff0c;创建的…

蓝桥杯嵌入式省赛模板构建——测量两路频率和占空比

结合测量一路PWM频率编程 测量占空比&#xff1a;测量高电平持续时间和周期 思路&#xff1a; ①.第一次上升沿中断&#xff0c;清零计数器&#xff0c;开始计时并改成下降沿中断 ②.下降沿中断&#xff0c;获取计数值T1&#xff0c;并改为上升沿中断 ③.第二次上升沿中断…

一个本科渣渣是怎么逆袭从咸鱼到Offer收割机的,Android开发了解这些自然无惧面试

面试题 一般Android面试分为两部分&#xff1a;Java部分和Android部分&#xff0c;下面说一下自己面试过程遇到的一些具体题目和一些相关知识点。 一 JAVA相关 点击领取完整开源项目《安卓学习笔记总结最新移动架构视频大厂安卓面试真题项目实战源码讲义》 1&#xff09;JAVA…

RabbitMQ(任务模型,交换机(广播,订阅,通配符订阅))

一.WorkQueues模型 WorkQueues(任务模式):让多个消费者绑定到一个队列&#xff0c;共同消费队列中的消息。 架构: 所需场景: 当消息处理比较耗时的时候&#xff0c;可能生产消息的速度会远远大于消息的消费速度。长此以往&#xff0c;消息就会堆积越来越多&#xff0c;无法及…

工业镜头的重要参数之视场、放大倍率、芯片尺寸--51camera

今天来简单介绍下工业镜头中常用的参数中的三个&#xff1a; 1、视场 视场&#xff08;FOV&#xff09;也称视野,是指能被视觉系统观察到的物方可视范围。 对于镜头而言&#xff0c;可观察到的视场跟镜头放大倍率及相机芯片选择有关。因此需要根据被观察物体的尺寸&#xff…

docker安装和配置minio

1. 安装镜像 docker pull minio/minio:latest上方的命令是拉取最新版本, 目前我的版本为1.29.0 2. 运行minio 客户端端口号: 29000 ,服务端端口号: 29090 docker run -p 29000:29000 -p 29090:29090 \--name minio \-d --restartalways \-e "MINIO_ACCESS_KEYminioadm…

《花书》学习:LeNet

# LeNet网络架构 正常的应该是&#xff1a;输入→操作→输出 但都简化 要么省略 操作 要么省略 输出 # LeNet第一个卷积层详解

华为OD七日集训第1期 - 按算法分类,由易到难,循序渐进,玩转OD

目录 一、适合人群二、本期训练时间三、如何参加四、七日集训第 1 期&#xff0c;极简题&#xff0c;培养刷题兴趣五、精心挑选21道高频100分经典题目&#xff0c;作为入门。第1天、逻辑分析第2天、字符串处理第3天、数组第4天、数据结构第5天、栈第6天、双指针第7天、二分查找…

Java面试题【必知必会】Spring常见面试题(2024)

近期一直在准备面试&#xff0c;所以为了巩固知识&#xff0c;也为了梳理&#xff0c;整理了一些java的基础面试题&#xff01;同时也希望各位英雄和女侠能够补充&#xff01;不胜荣幸&#xff01;&#xff01;&#xff01; 1.spring是什么&#xff1f;它的优点是什么&#xff…