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

单边通信 - CANN / docs

单边通信

【免费下载链接】docs该仓库用于维护cann公共文档项目地址: https://gitcode.com/cann/docs

HIXL(Huawei Xfer Library)是一个灵活、高效的昇腾单边通信库,面向集群场景提供简单、可靠、高效的点对点数据传输能力,并通过简易API开放给用户, 在多AI应用和多传输链路之间建立了桥梁。可用于构建大模型PD分离、RL后训练参数切换、模型参数缓存等多种业务场景。

本节仅针对HIXL做简要介绍,关于HIXL的详细使用方法可参见《HIXL单边通信库》。

核心优势

  • 支持单边零拷贝(One-Sided Zero-Copy)通信机制:单边通信库提供简易、可靠的单边通信接口,可在本地内存数据准备就绪之后,通过单边操作完成向远端内存的直接数据传输。该机制无需远端节点执行任何操作,为用户构建通信与计算重叠掩盖的调度机制提供核心技术支撑。同时,零拷贝能力实现用户内存间的直接数据传输,避免冗余数据搬运,不仅可以降低内存带宽占用,还可以减少内存容量消耗。
  • 屏蔽硬件差异,兼容多链路实现跨设备高速互联:单边通信库屏蔽了昇腾系列芯片的底层硬件差异,用户无需针对不同芯片架构进行代码适配。在通信链路层面,该技术原生支持RDMA,HCCS等多种高速互联协议,通信带宽最高可达119GB/s,可实现跨架构设备的无缝高速互联,满足低时延、 高吞吐的需求。
  • 极简API设计,深度适配开源生态框架:单边通信库采用极简式API接口设计,接口数量精简至10余个核心调用,降低开发者集成门槛,同时提供完善的C++/Python语言接口支持。目前已实现与Mooncake、DeepLink等开源框架的深度集成,vLLM、SGLang等主流推理引擎也可以直接调用单边通信库API完成KV Cache的跨设备高效传输,将大模型推理过程中的内存访问延迟降低20%,提升推理吞吐。

软件架构

单边通信库如图1所示。

图 1单边通信库软件架构图
![](https://raw.gitcode.com/cann/docs/raw/a173bdbfa81bbfd36d1c4da672d78301fb678d36/docs/app-dev/zh/figures/单边通信库软件架构图.png "单边通信库软件架构图"?utm_source=gitcode_repo_files)

核心组件

  • HIXL Engine:作为核心传输引擎,提供了基础传输接口,支持多种内存类型传输,比如D2D、D2H、H2D。同时兼容多种传输协议,包括HCCS、RDMA等。可实现高速、可靠的数据传输。原生支持多类型数据链路,可适用于同构集群和异构集群的复杂场景。面对集群节点动态扩缩容需求时,可高效完成链路适配与资源调度,为集群整体运行构建可靠通信基础。
  • LLM-DataDist:基于HIXL Engine构建,提供了一套携带KV Cache语义的数据传输接口。可快速、灵活对接vLLM、SGLang等推理引擎。

快速体验

该样例场景为H2RD(指数据从Host设备往远端Device设备传输),描述了Client向Server单边发起数据读写。

  1. 在Client侧和Server侧分别绑定本进程使用的昇腾设备,并初始化HIXL对象,同时申请内存并向HIXL注册。

    • Client侧:

      // 绑定本进程使用的昇腾设备。 CHECK_ACL(aclrtSetDevice(device)); // 以local_engine为标识初始化HIXL引擎(Client侧一般为无端口IP字符串)。 Hixl hixl_engine; std::map<AscendString, AscendString> options; CHECK_HIXL(hixl_engine.Initialize(local_engine, options)); // 分配Host侧传输缓冲区,供MEM_HOST注册与单边读写的本地一端使用。 int32_t *host_buf = nullptr; CHECK_ACL(aclrtMallocHost(reinterpret_cast<void **>(&host_buf), sizeof(int32_t))); // 将Host地址注册给HIXL,使对端可通过已建链的链路做单边访问。 MemDesc reg_desc{}; reg_desc.addr = reinterpret_cast<uintptr_t>(host_buf); reg_desc.len = sizeof(int32_t); MemHandle handle = nullptr; CHECK_HIXL(hixl_engine.RegisterMem(reg_desc, MEM_HOST, handle));
    • Server侧:

      // 绑定本进程使用的昇腾设备。 CHECK_ACL(aclrtSetDevice(device)); // 在带端口的local_engine上初始化HIXL,作为被连接端。 Hixl hixl_engine; std::map<AscendString, AscendString> options; CHECK_HIXL(hixl_engine.Initialize(local_engine, options)); // 在Device上分配内存,并通过H2D写入初值1,供Client READ验证。 constexpr int32_t kInit = 1; int32_t *dev_buf = nullptr; CHECK_ACL(aclrtMalloc(reinterpret_cast<void **>(&dev_buf), sizeof(int32_t), ACL_MEM_MALLOC_HUGE_ONLY)); CHECK_ACL(aclrtMemcpy(dev_buf, sizeof(int32_t), &kInit, sizeof(int32_t), ACL_MEMCPY_HOST_TO_DEVICE)); // 将Device地址注册给HIXL,使Client可单边读写该地址区间。 MemDesc reg_desc{}; reg_desc.addr = reinterpret_cast<uintptr_t>(dev_buf); reg_desc.len = sizeof(int32_t); MemHandle handle = nullptr; CHECK_HIXL(hixl_engine.RegisterMem(reg_desc, MEM_DEVICE, handle));
  2. 在Client侧向Server侧发起建链。

    // 与remote_engine(Server侦听地址)建立传输链路。 CHECK_HIXL(hixl_engine.Connect(remote_engine));
  3. 在Client侧向Server侧发起数据读写。并分别在Client侧和Server侧检查读写值是否正常。

    • Client侧:

      // 单边读:从对端Server的MEM_DEVICE读取预写的1到本地Host内存。 TransferOpDesc xfer{reinterpret_cast<uintptr_t>(&host_buf), dev_buf, sizeof(int32_t)}; CHECK_HIXL(hixl_engine.TransferSync(remote_engine, READ, {xfer})); printf("after READ: %d\n", *host_buf); // 单边写:向对端Server的MEM_DEVICE写本地预设的Host内存2。 *host_buf = 2; CHECK_HIXL(hixl_engine.TransferSync(remote_engine, WRITE, {xfer}));
    • Server侧:

      // 在Client完成单边写之后,Server侧将Device上该值读回Host,校验Client WRITE后应为2。 int32_t host_val = 0; CHECK_ACL(aclrtMemcpy(&host_val, sizeof(int32_t), dev_buf, sizeof(int32_t), ACL_MEMCPY_DEVICE_TO_HOST)); printf("after transfer: %d\n", host_val);
  4. 在Client侧释放链路。

    CHECK_HIXL(hixl_engine.Disconnect(remote_engine));
  5. 在Client侧和Server侧分别内存解注册、释放内存并销毁HIXL引擎,最后与设备解绑。

    • Client侧:

      CHECK_HIXL(hixl_engine.DeregisterMem(handle)); CHECK_ACL(aclrtFreeHost(host_buf)); hixl_engine.Finalize(); CHECK_ACL(aclrtResetDevice(device));
    • Server侧:

      CHECK_HIXL(hixl_engine.DeregisterMem(handle)); CHECK_ACL(aclrtFree(dev_buf)); hixl_engine.Finalize(); CHECK_ACL(aclrtResetDevice(device));

【免费下载链接】docs该仓库用于维护cann公共文档项目地址: https://gitcode.com/cann/docs

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

http://www.jsqmd.com/news/1130214/

相关文章:

  • MongoDB数据透视镜:90%的数据分析师不知道的10倍速度秘诀!
  • IOIO Java API完全手册:解锁Android与硬件通信的强大功能
  • Obsidian Banners YAML配置完全指南:手动编辑横幅数据的技巧
  • ProperTree:终极跨平台plist编辑器指南 - 3步解决配置文件管理难题
  • 鸣潮自动化终极指南:5分钟掌握后台自动战斗系统
  • 5分钟掌握苹果苹方字体:Windows用户的终极字体美化方案
  • 终极指南:如何在Minecraft中1:1重建你的家乡?Arnis开源工具完整教程
  • SD_PixelArt_SpriteSheet_Generator:AI驱动的像素艺术精灵表自动化生成实战指南
  • 告别消息撤回困扰:RevokeMsgPatcher防撤回工具完整指南
  • Zotero Plugin Template:快速构建专业级Zotero插件的终极指南
  • 5个技巧打造个性化Ventoy启动界面:从背景图片到字体全攻略
  • 用AI写的Python项目想发布到网上?这5个部署踩坑实录帮你绕开所有弯路
  • PasteMD多语言支持:如何为全球用户定制中文、英文、日文界面的本地化指南
  • 国家中小学智慧教育平台电子课本下载神器:一键获取全学科教材PDF
  • Scan Tailor终极指南:让老旧扫描文档重获新生的免费神器
  • OpCore-Simplify:OpenCore EFI配置自动化解决方案与黑苹果技术简化实践
  • Justice.js源码探秘:揭秘高性能前端监控工具的实现原理
  • 如何用markitdown实现智能图像处理:OCR识别与AI描述生成完全指南
  • AI Agent 工具描述:让模型知道能做什么,也知道不能做什么
  • OpenCore Legacy Patcher:让旧Mac焕发新生的终极免费方案
  • Redis Hash冲突:5个“骚操作“让你告别半夜被报警叫醒!
  • STM32G4与ICM-42605实现高精度运动追踪方案
  • CANN/docs头文件库文件说明
  • httpcache性能优化:内存管理和缓存淘汰策略的终极指南
  • Connector与1С:Предприятие 8集成指南:提升系统API调用效率
  • 5个意想不到的直播场景,obs-multi-rtmp如何重塑你的内容分发策略
  • 解密智慧教育平台电子课本下载:教师必备的高效备课工具
  • GESP学习相关书籍(2026.07)
  • 一句话生成生产级AI智能体:Nexent如何用自然语言重构AI开发范式
  • 如何系统优化Audiobookshelf容器性能:实战调优方案