RDMA 高性能通信技术原理

目录

文章目录

  • 目录
  • DMA 与 RDMA
  • RDMA 特性和优势
    • 大带宽
    • 低延时
  • RDMA 协议栈标准
  • RDMA 运行原理
    • 通信通路
    • 通信模型
    • 通信方式
    • 内存注册
    • QP 建链
    • 常规流程
    • 双向控制 Send-Receive API 流程
    • 单向数据 Write API 流程
    • 单向数据 Read API 流程
  • RDMA Verbs API 编程
    • 基础网络连通性
    • RDMA C/S 程序

DMA 与 RDMA

DMA(Direct Memory Access,直接内存访问)让 PCIe I/O 外设可以直接访问 Main Memory。外设跟主存之间的数据交互主要由 DMA Controller/Engine 来完成的,从而避免了 CPU(包括 MMU)的参与。I/O 外设初始化时,DMA Controller 即完成了 Device Address 和 Host Physical Address(ZONE_DMA)之间的直接映射,使得 Kernel 和 User Process 可以直接访问这些外设的存储器。

在这里插入图片描述

DMA 技术出现之前,NIC 和 CPU 之间的 Frames(二层数据帧)收发依赖 CPU 先从 NIC Rx/Tx Queue 逐个 Copy 到 Kernel Space 内存空间,然后再从 Kernel Space 中 Copy 到 Application 的 User Space 中。每个 Frames 的读/写都需要单向的两次 CPU Copy,非常消耗资源。

DMA 技术出现后,NIC 增加了 DMA Controller(DMA Engine)功能模块,首先将 NIC Rx/Tx Queue 与 Main Memory 中的 ZONE_DMA 建立映射关系,然后当 Frames 进入 NIC Rx/Tx Queue 时,DMA Controller 就会将这些 Frames 通过 DMA Copy 的方式存放到 ZONE_DMA 中,期间完全不需要 CPU 的参与。同时因为 Kernel Space 和 ZONE_DMA 是直接物理映射的关系,所以 Kernel Space 可以直接访问这些 Frames。

通过 DNA Controller 来完成 NIC 和 Main Memory 之间的高速数据传输,在 CPU 读/写报文的单向处理中,减少了一次 CPU Copy 的工作负载。在 32bit Linux 中,ZONE_DMA 默认只有 16MB;而在 64bit Linux 中,ZONE_DMA 默认可以有 4GB,得到了非常大的提升。

在这里插入图片描述

在这里插入图片描述

RDMA 特性和优势

RDMA 的技术特点:

  1. Remote(远程):数据在 2 台服务器之间进行 P2P 传输。
  2. Direct(直接):不需要 CPU 和 Kernel 的参与,控制信令和数据传输相关的处理都卸载到 RNIC 中完成。
  3. Memory(内存):2 台服务器上的 Application 之间的内存地址直接传输,延迟最低、带宽最大(服务器内延迟降至 10μs 微秒以下)。
  4. Access(访问):访问操作有 Send/Receive、Read/Write 等。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

大带宽

相对于 TCP,在使用 RDMA 的 100Gbps 场景下,CPU 占用率从 100% 下降到 10%。CPU 处理能力不再是带宽的限制,网卡自身的硬件规格才是。

  1. TCP 网络中,100Gbps 网络带宽处理需要消耗 64 颗 2.5GHz Core(按 1MHz CPU 处理 1Mbps Net I/O 计算);
  2. RDMA 网络中,CPU 无需再做收发包中断处理,不仅降低延迟,也节省了 CPU。

在这里插入图片描述

低延时

相对于 TCP,网络时延从 ms 级降低到 10μs 以下。

  1. TCP 网络中,对于一个数据报文,内核协议栈会执行多次内存拷贝、中断处理,上下文切换等会产生数十微秒的固定时延;
  2. RDMA 网络中,Application 直接操作 RNIC Verbs API,不再经过 System-call 切换到内核态,没有内核切换开销。另外,由于数据报文头都在 RNIC 上处理,不用拷贝到内核态处理,Zero-Copy 延迟会显著减少。

在这里插入图片描述

RDMA 协议栈标准

目前主要有 RDMAC和 IBTA(InfiniBand Trade Association)两大组织主导着 RDMA 协议栈标准的发展。

  1. IBTA(InfiniBand Trade Association):RDMA 协议栈最早由 InfiniBand 实现,InfiniBand 发展的初衷就是把服务器的 DMA 总线网络化,即 RDMA。总线技术中采用的 DMA(Direct Memory Access)技术在 InfiniBand 中以 RDMA(Remote Direct Memory Access)的形式得以实现。最初的 RDMA 是 IBTA 在 2000 年发布的基于 InfiniBand 的 RDMA 规范。由于这是一种闭源的网络技术,因此需要支持该技术的 NIC 和 Switch。
  2. RDMAC(RDMA Consortium)/ IETF:后来随着复用高性价比 Ethernet 网络架构大趋势下出现的 RoCE 和 iWARP 技术方向。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

RDMA 运行原理

通信通路

RDMA 采用了 “数控分离” 通信通路:

  1. 控制通路:需要 Kernel 的参与,使用 Socket API 传输控制信令,用于创建和管理 “数据通路” 数据传输时所需要的资源。例如:Channel、QP(Queue Pairs)、MR(Memory Region)等。
  2. 数据通路:不需要 Kernel 的参与,使用 Verbs API 传输业务数据。

在这里插入图片描述

通信模型

RDMA 采用了基于 MQ Channel(消息队列通道)的 P2P 全双工通信模型,定义了 2 大类型的队列:

  1. WQ(Work Queue):App 要收/发数据,就会放置一个 WR(Work Request)到 WQ 作为 WQE(WQ Element)。WQE 是 RNIC 硬件执行任务单元,包含了软件需要硬件执行的动作。RNIC 会获取到 WQE 进行处理。
  2. CQ(Complete Queue):RNIC 每处理完一个 WQE 之后,就会写入一个 CQE 到 CQ,App 从 CQE 中确认一个 WC(Worker Completion)。

在这里插入图片描述

因为 RDMA 支持全双工通信,所以 WQ 进一步细分为 SQ 和 RQ,并称为 QP(Queue Pairs)。通信双方使用一对 QP,通过 BTH QPN 唯一标识,并以此创建 Channel。1 个 RDMA App 可以按需创建多对不同的 QPs 和 Channels。这些 QP 可以用于不同的通信目的,例如:使用不同的服务类型。

  1. SQ(Send Queue):存放 Send WQE。
  2. RQ(Receive Queue):存放 Receive WQE。

在这里插入图片描述

通信方式

RDMA 支持 2 大通信类型:

  1. 双边通信(Messaging verbs)

    1. Send-Receive API:双端操作,通过控制通路互相感知,Receiver 需要先下发 Receive WQE,然后 Sender 才会下发 Send WQE。
  2. 单边通信(Memory verbs)

    1. Write API:单端操作,Sender 主动执行,只需要本端明确源和目的内存地址,不需要告知 Receiver,Receiver 的 CPU 也不参与,也不会被通知数据的到达。适用于大批量数据传输。
    2. Read API:同上。

通常在进行 Read / Write API 等单边操作之前,都需要先完成 Send-Receive API 双边操作,交换一些 QP 配置控制信令,包括:

  1. Local 和 Remote Memory Region 信息
  2. Local 和 Remote rkey(内存钥匙,控制内存的访问权限)信息
  3. etc…

内存注册

和内存注册相关的两个重要概念是 PD(Protection Domain,保护域)和 MR(Memory Region,内存区域)。

  • MR: 是 RDMA 通信中注册的一块特殊内存区域,需通过 API 显式注册后才能被 RDMA 网卡访问。其主要作用包括:虚拟地址到物理地址的转换、基于 lkey 和 rkey 的访问权限控制、避免换页(锁页)。
  • PD:是 RDMA 中用于资源隔离的安全机制,通过将 QP(队列对)和 MR 绑定到同一 PD 中,限制不同 QP 对 MR 的访问权限。其核心作用包括:安全隔离、资源分组管理。同一 PD 内的 QP 只能访问同组的 MR,避免未授权的跨组内存访问。

更详细的,MR 包括以下属性:

  1. context:上下文
  2. addr:MR 的 Buffer 首地址
  3. length:MR 的 Buffer 长度
  4. lkey:MR 的 local key,唯一标识,在本端执行 RDMA API 操作中用来验证访问权限。
  5. rkey:MR 的 remote key,唯一标识,在远端执行 RDMA API 操作中用来验证访问权限。

MR 是 Application 的虚拟内存,RNIC 操作的是 Main Memory 的物理内存。所以 Application 创建 MR 时,操作系统的 MMU(内存管理单元)会参与到 MR 的初始化,确保每个虚拟地址都能正确映射到物理地址。
在这里插入图片描述

在这里插入图片描述

注:

  • RNIC 中包含的 MPT(Memory Protection Tables)、MTT(Memory Translation Tables)模块,本质上是一个 Cached Page Table(缓存页表)元件,Page Table Entry 就是用来将 Virtual Address(虚拟内存)映射到相应的 Physical Address(物理内存)。
  • RNIC 需要通过 rkey 找到相应的 MPT、然后基于 MPT 的信息再找到相应的 MTT,进而完成 VA 到 PA 的转换。

在这里插入图片描述

QP 建链

建立一对 QP 之间的 Channel,过程中协商通信参数。包括:

  1. GID(Global Identifier,全局 ID):GID 是 IB 网络的唯一标识。IB 网络中用于标识和寻址网络中的节点或端口。
  2. QPN:QP 的唯一标识,确定建链的对象,GID+QPN 可以在 IB 网络中确定唯一的一个 QP。
  3. VA(虚拟地址):App 希望访问的虚拟地址。
  4. rkey:同上。
  5. qkey:是 UD(不可靠数据报)服务类型中专用的 Key,用于校验数据报的合法性。

NOTE:QP 建立 “链路(Channel)” 和 “连接(Connection)” 是两个不同的概念,RDMA 支持 4 种基本的服务类型,以满足不同服务对可靠性和传输速率的不同需求。
在这里插入图片描述

其中,RC、UC 是存在 Connection 的,而 RD、UD 则不存在 Connection,而是直接传输 Datagram。
RC 服务类型类比 TCP 协议,进行通信的 QP 之间需要建立一对一 Connection。RC 通过 ACK 确认、重传、保序等机制,确保数据能在 QP 间进行有序、可靠的传输,适用于对数据可靠性和完整性较高的场景。但相对的,由于连接机制和可靠性保障机制的存在,导致 RC 的通信开销较大。当节点数增加时,将占用更多的网卡和内存等资源。
在这里插入图片描述

常规流程

在这里插入图片描述

在这里插入图片描述

  1. 提交任务:App 通过将 WQE 放入 SQ / RQ 来提交一个任务。
  2. 完成任务:RNIC 根据 WQE 执行任务,然后生成一个 CQE,包含该任务的完成信息,并放入 CQ。
  3. 检查结果:App 检查 CQ,确认任务完成情况。如果失败,则可以查看 CQE 信息来了解失败的原因。

双向控制 Send-Receive API 流程

在这里插入图片描述

  1. App B(Receive 端)下发 WQE 到 RQ,描述了一个请求接受任务。
  2. RNIC B 从 RQ 获取到 WQE 并准备开始接收数据。
  3. App A(Send 端)下发 WQE 到 SQ,描述了一个请求发送任务。
  4. RNIC A 从 SQ 获取到 WQE,然后通过 DMA 的方式访问 Main Memory 的指定位置,并获得数据并封装成数据报文。
  5. RNIC A 将数据报文发送到 RNIC B。
  6. RNIC B 收到数据报文后进行校验,然后发送 ACK 到 RNIC A。
  7. RNIC B 解封装数据报文获得数据,然后通过 DMA 的方式将数据存放到指定的 Main Memory 位置。然后生成 CQE 并下发到 CQ 中。
  8. App B 接收到 CQE 的反馈。
  9. RNIC A 接受到 ACK 后,生成 CEQ 并下发到 CQ 中。
  10. App A 接受到 CQE 的反馈。

单向数据 Write API 流程

在这里插入图片描述

  1. Local App 将 WQE 下发到 SQ,表示一个请求发送任务。
  2. Local RNIC 从 SQ 中获取到 WQE。
  3. Local RNIC 解析出 WQE 中包含的虚拟地址,并通过 RNIC 中的 MPT、MTT 表转换为相应的 Main Memory 物理地址,然后从 Main Memory 中取得数据,封装为数据包。
  4. Local RNIC 将数据包发送到 Remote RNIC。
  5. Remote RNIC 接收到数据包,并解析内含的 Payload 数据、虚拟地址、rkey 等信息,并根据 RNIC 的 MPT、MTT 表将虚拟地址转换为 Main Memory 得物理地址,然后通过 DMA 的方式将 Payload 写入到 Main Memory 想要的位置。
  6. Remote RNIC 返回 ACK 到 Local RNIC。
  7. Local RNIC 接收到 ACK 后,发送 CEQ 到 CQ。
  8. Local App 从 CQ 得到任务完成的反馈。

在这里插入图片描述

单向数据 Read API 流程

在这里插入图片描述

  1. Local App 将 WQE 下发到 SQ,表示一个请求读取任务。
  2. Local RNIC 从 SQ 中获取到 WQE。
  3. Local RNIC 解析 WQE 的内容,并封装成数据包发送到 Remote RNIC。
  4. Remote RNIC 接收到数据包,并解析内含的虚拟地址,然后将虚拟地址转换为物理地址,并通过 DMA 的方式从 Main Memory 获得相应的数据。
  5. Remote RNIC 将获取到的数据封装成数据包发送到 Local RNIC。
  6. Local RNIC 接收到数据包后对其进行解封装,获取到内含的数据之后,根据 WQE 的描述,通过 DMA 将数据放置到指定的 Main Memory 中。
  7. Local RNIC 发送 CEQ 到 CQ。
  8. Local App 从 CQ 得到任务完成的反馈。

RDMA Verbs API 编程

在这里插入图片描述

基础网络连通性

以 RoCEv2 为例,因为 RoCEv2 的 L2、L3 依旧使用传统以太网,所以可以使用 UDP/IP 进行寻址。

# HostA
$ ifconfig eth2
eth2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 4200inet 25.0.0.162  netmask 255.255.255.224  broadcast 25.0.0.191inet6 fe80::5aa2:e1ff:fe2d:8578  prefixlen 64  scopeid 0x20<link>ether 58:a2:e1:2d:85:78  txqueuelen 1000  (Ethernet)RX packets 151  bytes 10282 (10.0 KiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 231  bytes 17350 (16.9 KiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0# HostB
$ ifconfig eth2
eth2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 4200inet 25.0.0.34  netmask 255.255.255.224  broadcast 25.0.0.63inet6 fe80::966d:aeff:fefd:1c2c  prefixlen 64  scopeid 0x20<link>ether 94:6d:ae:fd:1c:2c  txqueuelen 1000  (Ethernet)RX packets 130  bytes 9416 (9.1 KiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 180  bytes 13688 (13.3 KiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0# HostA ping B
$ ping -I eth2 25.0.0.34
PING 25.0.0.34 (25.0.0.34) from 25.0.0.162 eth2: 56(84) bytes of data.
64 bytes from 25.0.0.34: icmp_seq=1 ttl=63 time=0.108 ms

RDMA C/S 程序

  • 代码:https://github.com/JmilkFan/rdma-example.git
# RDMA Server
$ ./bin/rdma_server -a 172.16.0.4 -p 20886
RDMA connection management CM event channel is created successfully at 0x22b83a0 
A RDMA connection id (36414192) for the server is created 
Server RDMA CM id is successfully binded 
Server is listening successfully at: 172.16.0.4 , port: 20886 A new RDMA client connection id is stored at 0x22bdda0
A new protection domain is allocated at 0x22bc7f0 
An I/O completion event channel is created at 0x22b8380 
Completion queue (CQ) is created at 0x22be000 with 31 elements 
Client QP created at 0x22be268
Receive buffer pre-posting is successful 
Going to wait for : RDMA_CM_EVENT_ESTABLISHED event 
A new connection is accepted from 172.16.0.102 
Client side buffer information is received...
---------------------------------------------------------
buffer attr, addr: 0x15f43a0 , len: 9 , stag : 0x1ff8b7 
---------------------------------------------------------
The client has requested buffer length of : 9 bytes 
Local buffer metadata has been sent to the client 
Waiting for cm event: RDMA_CM_EVENT_DISCONNECTED
A disconnect event is received from the client...
Server shut-down is complete# RDMA Client
$ ./rdma_client -a 172.16.0.4 -p 20886 -s rdma_test 
Passed string is : rdma_test , with count 9 
RDMA CM event channel is created at : 0x15f4500 
waiting for cm event: RDMA_CM_EVENT_ADDR_RESOLVED
RDMA address is resolved 
waiting for cm event: RDMA_CM_EVENT_ROUTE_RESOLVED
Trying to connect to server at : 172.16.0.4 port: 20886 
protection domain allocated at 0x15f48f0 
completion event channel created at : 0x15f48b0 
CQ created at 0x15f9d30 with 31 elements 
QP created at 0x15fb018 
Receive buffer pre-posting is successful 
waiting for cm event: RDMA_CM_EVENT_ESTABLISHED
The client is connected successfully 
Server sent us its buffer location and credentials, showing 
---------------------------------------------------------
buffer attr, addr: 0x22bc850 , len: 9 , stag : 0x1ff9b8 
---------------------------------------------------------
Client side WRITE is complete 
Client side READ is complete 
...
SUCCESS, source and destination buffers match 
Client resource clean up is complete 

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

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

相关文章

HCIA项目实践(网络)---NAT地址转化技术

十三 NAT网络地址转换技术 13.1 什么是NAT NAT&#xff08;Network Address Translation&#xff09;地址转换技术&#xff0c;是一种将内部网络的私有 IP 地址转换为外部网络的公有 IP 地址的技术。其主要作用是实现多个内部网络设备通过一个公有 IP 地址访问外部网络&#x…

【JAVA工程师从0开始学AI】,第四步:闭包与高阶函数——用Python的“魔法函数“重构Java思维

副标题&#xff1a;当严谨的Java遇上"七十二变"的Python函数式编程 历经变量战争、语法迷雾、函数对决&#xff0c;此刻我们将踏入Python最迷人的领域——函数式编程。当Java工程师还在用接口和匿名类实现回调时&#xff0c;Python的闭包已化身"智能机器人"…

el-tree选中数据重组成树

vueelement-ui 实现el-tree选择重新生成一个已选中的值组成新的数据树&#xff0c;效果如下 <template><div class"flex"><el-tree class"tree-row" :data"list" ref"tree" :props"{children: children, label: …

测试常见问题汇总-检查表(持续完善)

WEB页面常见的问题 按钮功能的实现&#xff1a;返回按钮是否可以正常返回 信息保存提交后&#xff0c;系统是否给出“成功”的提示信息&#xff0c;列表数据是否自动刷新 没有勾选任何记录直接点【删除】&#xff0c;是否给出“请先选择记录”的提示 删除是否有删除确认框 …

java后端开发day16--字符串(二)

&#xff08;以下内容全部来自上述课程&#xff09; 1.StringBuilder 因为StringBuilder是Java已经写好的类。 java在底层对他进行了一些特殊处理。 打印对象不是地址值而是属性值。 1.概述 StringBuilder可以看成是一个容器&#xff0c;创建之后里面的内容是可变的。 作用…

C++效率掌握之STL库:vector函数全解

文章目录 1.为什么要学习vector&#xff1f;什么是vector&#xff1f;2.vector类对象的常见构造3.vector类对象的容量操作4.vector类对象的迭代器5.vector类对象的元素修改6.vector类对象的元素访问7.vector迭代器失效问题希望读者们多多三连支持小编会继续更新你们的鼓励就是我…

人工智障的软件开发-容器化编码环境就绪-java-env

指令接收&#xff1a;「需要万能开发环境」 系统警报&#xff1a;检测到主人即将陷入"环境配置地狱" 启动救赎协议&#xff1a;构建量子化开发容器 终极目标&#xff1a;让"在我机器上能跑"成为历史文物 需求分析&#xff1a;碳基生物的先天缺陷 人类开发…

kkFileView二开之pdf转图片接口

kkFileView二开之Pdf转图片接口 kkFileView二开系列文章&#xff1a;1 kkFileView源码下载及编译2 Pdf转图片接口2.1 背景2.2 分析2.2 接口开发2.2.1 编写Pdf转图片方法2.2.2 编写转换接口 2.3 接口测试2.3.1 Pdf文件准备2.3.2 pdf2Image 3 部署 kkFileView二开系列文章&#x…

阅读论文笔记《Efficient Estimation of Word Representations in Vector Space》

这篇文章写于2013年&#xff0c;对理解 word2vec 的发展历程挺有帮助。 本文仅适用于 Word2Vect 的复盘 引言 这篇论文致力于探索从海量数据中学习高质量单词向量的技术。当时已发现词向量能保留语义特征&#xff0c;例如 “国王 - 男人 女人≈女王”。论文打算借助该特性&am…

SQL注入(SQL Injection)详解与实战

文章目录 一、什么是SQL注入&#xff1f;二、常见SQL注入类型三、手动注入步骤&#xff08;以CTF题目为例&#xff09;四、CTF实战技巧五、自动化工具&#xff1a;SQLMap六、防御措施七、CTF例题八、资源推荐 一、什么是SQL注入&#xff1f; SQL注入是一种通过用户输入构造恶意…

维护ceph集群

1. set: 设置标志位 # ceph osd set <flag_name> # ceph osd set noout # ceph osd set nodown # ceph osd set norecover 2. unset: 清除标志位 # ceph osd unset <flag_name> # ceph osd unset noout # ceph osd unset nodown # ceph osd unset norecover 3. 标志…

学习threejs,使用PointLight点光源

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.PointLight 二、&…

java连接redis

1.使用 1.创建java工程 2.引入依赖 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>5.2.0</version> </dependency> 3. //1.获取jedis对象&#xff0c;把所有对redis的操作都封装到…

论文笔记(七十二)Reward Centering(一)

Reward Centering&#xff08;一&#xff09; 文章概括摘要1 奖励中心化理论 文章概括 引用&#xff1a; article{naik2024reward,title{Reward Centering},author{Naik, Abhishek and Wan, Yi and Tomar, Manan and Sutton, Richard S},journal{arXiv preprint arXiv:2405.0…

强化学习笔记7——DDPG到TD3

前提&#xff1a;基于TD 的方法多少都会有高估问题&#xff0c;即Q值偏大。原因两个&#xff1a;一、TD目标是真实动作的高估。 二&#xff1a;自举法高估。 DDPG 属于AC方法&#xff1a;异策略&#xff0c;适合连续动作空间&#xff0c;因为他的策略网络直接输出的动作&#…

算法——结合实例了解Minimax算法(极小化极大算法)

计算机科学中最有趣的事情之一就是编写一个人机博弈的程序。有大量的例子&#xff0c;最出名的是编写一个国际象棋的博弈机器。但不管是什么游戏&#xff0c;程序趋向于遵循一个被称为Minimax算法&#xff0c;伴随着各种各样的子算法在一块。本篇将简要介绍 minimax 算法&#…

腿足机器人之四- 卡尔曼滤波

腿足机器人之四卡尔曼滤波 概率学基础贝叶斯准则熵 卡尔曼滤波扩展卡尔曼滤波信息滤波器 在机器人&#xff08;四足、人形&#xff09;领域&#xff0c;感知和行动的不确定性可能由多种因素引起&#xff0c;如传感器噪声、外部环境的变化、非精确控制以及实时性算力限制等。 和…

基于AWS云平台的法律AI应用系统开发方案

该方案可实现法律文档处理速度提升300%&#xff0c;关键信息提取准确率可达92%以上&#xff08;基于实际测试数据&#xff09;&#xff0c;适合构建企业级法律智能中台。建议采用分阶段实施策略&#xff0c;优先实现文档解析和智能问答模块。 一、技术栈规划 层级技术组件说明…

使用 GPT-SoVITS 克隆声音,很详细

使用 GPT-SoVITS 克隆声音&#xff0c;很详细 一、前言二、下载三、启动四、克隆声音1、准备克隆音频2、分离人声伴奏3、音频分割4、语音降噪5、ASR工具6、语音文本校对标注工具7、训练模型8、微调训练9、推理 一、前言 最近对文本转语言很感兴趣&#xff0c;但对直接在网站上…

基于Python的Flask微博话题舆情分析可视化系统

2024数据 ✅️标价源码 远程部署加 20 ✅️爬虫可用 有六月数据 ✅️修复bug不会突然打不开网页 系统稳定 系统的功能如下: 1.数据的爬取 2.用户的登录注册 3.热词统计&#xff0c;舆情统计 4.文章统计分析 5.发布地址统计 6.评论统计 7.情感分类统计 编程语言&#xff1a;py…