资讯动态

MLX 分布式通信完全指南:四种后端、启动工具与实战配置

发布时间:2026/9/11 2:32:25 来源:尧图企业网站定制
MLX 分布式通信完全指南四种后端、启动工具与实战配置【免费下载链接】mlxMLX: An array framework for Apple silicon项目地址: https://gitcode.com/GitHub_Trending/ml/mlxMLX 是面向 Apple Silicon 的数组框架本文档以 docs/src/usage/distributed.rst 为主体系统讲解 MLX 的分布式通信能力如何用几行代码把训练或推理的计算成本分摊到多台物理机器上如何用mlx.launch与mlx.distributed_config两个辅助工具启动与配置多节点任务以及 MPI、RING、JACCL、NCCL 四种通信后端各自的适用场景、hostfile 格式与环境变量。读完本文你将能独立搭建从单机多进程到多机多 GPU含 Thunderbolt RDMA 全互联 mesh的分布式 MLX 程序。分布式通信概述与 API 骨架MLX 的核心分布式抽象是一个Group通信组它把一组参与通信的进程组织起来并提供统一的集体通信collective communication原语。C 侧的定义位于 mlx/distributed/distributed.hPython 侧通过mlx.core.distributed模块暴露。每个 Group 至少提供以下能力rank()当前进程在组内的编号从 0 开始size()组内进程总数集体通信原语all_sum、all_max、all_min、all_gather、sum_scatter、send、recv对应声明见 mlx/distributed/ops.h。一个分布式 MLX 程序最短只需三行import mlx.core as mx world mx.distributed.init() x mx.distributed.all_sum(mx.ones(10)) print(world.rank(), x)这段代码在所有分布式进程间对mx.ones(10)求和。关键设计当只用python直接运行脚本时只启动一个进程通信组大小为 1此时mx.distributed下的所有操作都是 noop空操作。这一特性让你免去如下所示的手动判断import mlx.core as mx x ... world mx.distributed.init() # 无需这个判断直接写 x mx.distributed.all_sum(x) 即可 if world.size() 1: x mx.distributed.all_sum(x)从源码层面看单进程时init()会返回一个EmptyGroup见 mlx/distributed/distributed.cpp 中的detail::EmptyGroup其size()恒为 1、rank()恒为 0不过它内部的通信方法如all_sum会抛出Communication not implemented in an empty distributed group.异常——也就是说只要进程真正加入了分布式组操作就会真实执行。支持的通信后端一览MLX 当前支持四种后端分别面向不同硬件与网络环境后端说明MPI功能完善、成熟的分布式通信库适合已有 MPI 生态的集群RING基于 TCP socket 的环形 all reduce 与 all gather始终可用不依赖第三方库通常比 MPI 更快JACCL基于 Thunderbolt 上的 RDMA 实现低延迟通信是张量并行tensor parallelism等场景的必需项NCCLCUDA 环境下的首选后端支持多 GPU 与多节点所有已支持操作的完整 API 文档见 MLX 的mlx.core.distributed模块文档。后端初始化逻辑init的语义mx.distributed.init()通过backend参数选择后端合法取值为{any, ring, jaccl, mpi, nccl}传any时MLX 会依次尝试所有可用后端全部失败则创建单例组singleton group。注意一旦某个后端成功初始化后续不带参数或 backend 为any调用init()会返回同一个后端不会重复探测。C 侧 mlx/distributed/distributed.cpp 的init()实现印证了这一逻辑backends是一个静态的unordered_mapinit命中缓存直接返回已注册的 Groupbackendany时按nccl → ring → mpi → jaccl的顺序尝试CUDA 环境优先 NCCL并把成功者注册到any键下。以下示例帮助理解# Case 1: 强制 MPI无论 ring 是否可用 world mx.distributed.init(backendmpi) world2 mx.distributed.init() # 后续调用返回 MPI 后端 # Case 2: 初始化任意可用后端 world mx.distributed.init(backendany) # 等价于不带参数 world2 mx.distributed.init() # 同上 # Case 3: 同时初始化两个后端 world_mpi mx.distributed.init(backendmpi) world_ring mx.distributed.init(backendring) world_any mx.distributed.init() # 返回 MPI因为它先被初始化此外init()还支持strict参数C 签名init(bool strict, const std::string bk)stricttrue时若any无法初始化任何后端会抛出Couldnt initialize any backend异常非法 backend 名会抛出invalid_argument。分布式程序实战示例MLX 官方文档提供了两个完整的分布式程序范式数据并行Data Parallelism张量并行Tensor Parallelism数据并行中常用的梯度平均可以直接复用mlx.nn.average_gradients实现见 python/mlx/nn/utils.py它会把多个小张量的梯度按字节数分组合并成少数几次大 all reduce 调用避免大量小通信拖慢性能详见下文「Tips and Tricks」。运行分布式程序mlx.launchMLX 提供mlx.launch辅助脚本入口实现见 python/mlx/_distributed_utils/launch.py它负责 ssh 到各节点、按 rank 启动进程、注入环境变量并汇聚输出。沿用开头的例子在 localhost 上以 4 个进程运行$ mlx.launch -n 4 my_script.py 3 array([4, 4, 4, ..., 4, 4, 4], dtypefloat32) 2 array([4, 4, 4, ..., 4, 4, 4], dtypefloat32) 1 array([4, 4, 4, ..., 4, 4, 4], dtypefloat32) 0 array([4, 4, 4, ..., 4, 4, 4], dtypefloat32)-n即--repeat-hosts表示每个 host 重复启动的进程数。也可以直接给出远程主机 IP前提是脚本存在于所有主机上且可 ssh 访问$ mlx.launch --hosts ip1,ip2,ip3,ip4 my_script.py 3 array([4, 4, 4, ..., 4, 4, 4], dtypefloat32) 2 array([4, 4, 4, ..., 4, 4, 4], dtypefloat32) 1 array([4, 4, 4, ..., 4, 4, 4], dtypefloat32) 0 array([4, 4, 4, ..., 4, 4, 4], dtypefloat32)mlx.launch的完整行为与参数hostfile、各后端特有问题见专门的启动指南文档 docs/src/usage/launching_distributed.rst下文各后端小节也会展开。从源码看launch.py的main()会做这些事--print-python打印当前 Python 可执行文件路径排查远程主机路径不一致很有用解析--hostfile或--hosts默认127.0.0.1并支持--env注入任意环境变量如--env MLX_METAL_FAST_SYNCH1自动选择后端未显式指定时CUDA 可用则默认nccl否则默认ring通过RemoteProcess用ssh -tt建立交互式会话把用户 stdin 广播给所有进程、把各进程 stdout/stderr 汇聚到本地输出某个进程异常退出或mlx.launch被终止时会终止其余所有进程对应make_kill_script的 pidfile 机制。远程主机的准备清单要让mlx.launch在远程主机上成功拉起脚本需要满足ssh hostname无密码、无 host 确认提示即可登录Python 二进制在所有主机上位于相同路径可用mlx.launch --print-python查看本机路径待运行的脚本在所有主机上位于相同路径。RING 后端TCP 环始终可用RING 后端不依赖任何第三方库因此始终可用。它基于 TCP socket节点间通过网络可达即可。顾名思义节点按环排列rank 1 只能与 rank 0 和 rank 2 通信rank 2 只能与 rank 1 和 rank 3 通信以此类推。因此 RING 后端不支持任意发送者/接收者的send/recv。实现层面mlx/distributed/ring/ring.cpp 基于非阻塞 socket 与线程池实现通信内部将单次大于 1 GiBMAX_IO_BYTES的传输拆分为多次send(2)/recv(2)以规避send/recv对超过INT_MAX长度返回EINVAL的限制all sum 默认使用 8 MiB 分块、双缓冲ALL_SUM_SIZE/ALL_SUM_BUFFERS流水线化。用 JSON hostfile 定义环定义环最方便的方式是写一个 JSON hostfile 配合mlx.launch。对每个节点指定一个用于 ssh 的主机名hostname以及一个或多个该节点监听连接的 IP。下面的 hostfile 定义了一个 4 节点环hostname1是 rank 0hostname2是 rank 1依此类推[ {ssh: hostname1, ips: [123.123.123.1]}, {ssh: hostname2, ips: [123.123.123.2]}, {ssh: hostname3, ips: [123.123.123.3]}, {ssh: hostname4, ips: [123.123.123.4]} ]运行mlx.launch --hostfile ring-4.json my_script.py会 ssh 到每个节点并运行脚本脚本会在每个提供的 IP 上监听连接。具体地hostname1会主动连接123.123.123.2并接受来自123.123.123.4的连接以此类推。RING 后端的启动参数mlx.launch中与 RING 强相关的参数见 launch.py 的launch_ring--hosts只接受 IP 而非主机名如果需要 ssh 的主机名与要绑定的 IP 不一致必须改用 hostfile--starting-port-p默认32323远程主机上绑定的起始端口rank 0 的第一个 IP 使用该端口后续每个 IP 或 rank 端口号 1--connections-per-ip默认 1增加相邻节点间的连接数等价于mpirun的--mca btl_tcp_links 2。launch_ring会把最终的[[ip:port, ...], ...]结构写入MLX_HOSTFILE环境变量并传给每个进程详细格式见下文「不使用 mlx.launch」一节。Thunderbolt 环高速场景虽然 RING 后端在以太网上也能比 MPI 有优势但其主要用途是借助Thunderbolt 环获得更高带宽。手动配置 Thunderbolt 环比较繁琐MLX 提供了mlx.distributed_config工具来简化。使用前提各台电脑能通过以太网或 Wi-Fi 被 ssh 访问随后用 Thunderbolt 线互联执行mlx.distributed_config --verbose --hosts host1,host2,host3,host4 --backend ring默认情况下脚本会尝试发现 Thunderbolt 环并给出配置每个节点的命令以及可供mlx.launch使用的hostfile.json。如果节点上配置了免密sudo可用--auto-setup自动配置。若想手动配置步骤如下禁用 Thunderbolt bridge 接口对连接 ranki与 ranki 1的线缆在节点i和i 1上找到该线缆对应的网络接口为两个节点的对应接口配置一个独立的子网。例如线缆在节点i上对应en2、在节点i 1上也对应en2则可以分别为两个节点分配192.168.0.1和192.168.0.2。更多细节可参考工具脚本生成的命令。使用mlx.distributed_config配置网络工具脚本的完整流程记录在 python/mlx/_distributed_utils/config.py 中其main()会通过 ssh 检查所有节点可达对应check_ssh_connections同时探测免密 sudo通过system_profiler SPThunderboltDataType -json与networksetup -listallhardwareports提取各节点的 Thunderbolt 连接关系对应extract_connectivity并用 UUID 反向索引构建连接矩阵用extract_ringsDFS 找环或check_valid_mesh全互联校验确认拓扑通过IPConfigurator为每条 Thunderbolt 线缆分配192.168.x.y形式的独立子网地址并生成ifconfig/route命令--auto-setup时自动执行否则逐节点打印等待确认写出 hostfilesave_hostfile可用--output-hostfile指定路径否则打印到 stdout。JACCL 后端Thunderbolt RDMA 低延迟通信从 macOS 26.2 开始Thunderbolt 支持 RDMA可实现 Thunderbolt 5 Mac 之间的低延迟通信。MLX 提供的 JACCL 后端利用该能力通信延迟比 RING 后端低一个数量级。名字由来JACCL读作 Jackal豺狼是Jack and Angelos Collective Communication Library的缩写既是向 NVIDIA NCCL 的致敬式双关也纪念主导 Apple RDMA over Thunderbolt 研发的Jack Beasley。启用 RDMA该功能尚未完全成熟启用 RDMA 需要一定步骤并且即使有 sudo 也无法远程完成必须在 macOS 恢复模式recovery中操作将电脑启动到恢复模式通过 Utilities → Terminal 打开终端运行rdma_ctl enable重启。验证是否启用成功可运行ibv_devices以 M3 Ultra 为例输出类似~ % ibv_devices device node GUID ------ ---------------- rdma_en2 8096a9d9edbaac05 rdma_en3 8196a9d9edbaac05 rdma_en5 8396a9d9edbaac05 rdma_en4 8296a9d9edbaac05 rdma_en6 8496a9d9edbaac05 rdma_en7 8596a9d9edbaac05定义 Mesh全互联拓扑JACCL 后端只支持全互联fully connected拓扑任意两台 Mac 之间都必须有 Thunderbolt 线缆直连。下图左侧是合法的 4 节点 mesh任意节点两两相连右侧则不合法M3 Ultra 1 与 M3 Ultra 2 之间没有连接四台 M3 Ultra 的全互联 mesh合法拓扑。非法 meshM3 Ultra 1 未与 M3 Ultra 2 相连。与 RING 类似使用 JACCL 最简单的方式是写一个供mlx.launch使用的 JSON hostfile。hostfile 需要包含用于 ssh 启动脚本的主机名rank 0 的一个 IP要求所有节点都能访问连接每个节点到其他每个节点的 RDMA 设备列表。下面这个 JSON 定义了上图中合法的 4 节点 mesh[ { ssh: m3-ultra-1, ips: [123.123.123.1], rdma: [null, rdma_en5, rdma_en4, rdma_en3] }, { ssh: m3-ultra-2, ips: [], rdma: [rdma_en5, null, rdma_en3, rdma_en4] }, { ssh: m3-ultra-3, ips: [], rdma: [rdma_en4, rdma_en3, null, rdma_en5] }, { ssh: m3-ultra-4, ips: [], rdma: [rdma_en3, rdma_en4, rdma_en5, null] } ]rdma是一个 N×N 矩阵第i行第j列表示节点i用于连接节点j的 RDMA 设备名对角线上是null自己连自己没有意义。尽管 Thunderbolt RDMA 通信不走 TCP/IP仍然需要禁用 Thunderbolt bridge并为每条 Thunderbolt 连接设置隔离的本地网络这正是IPConfigurator做的事。mlx.launch的launch_jaccl会对 hostfile 做校验要求每个 host 的rdma列表长度与节点数一致、对角线必须为null、且每对节点都必须有 RDMA 设备缺失时会报错并列出前三个缺失的对随后把MLX_JACCL_COORDINATORip:port和MLX_IBV_DEVICESrdma 矩阵 JSON注入各进程。上述所有配置也可改用mlx.distributed_config完成该脚本会ssh 到每个节点提取 Thunderbolt 连接关系检查是否为合法 mesh提供配置每个节点的命令有 sudo 则直接执行生成供mlx.launch使用的 hostfile。端到端实战JACCL 分布式推理假设节点均可 ssh 访问且配置了免密 sudo启动一个使用 JACCL 的分布式脚本非常直接。首先连接所有 Thunderbolt 线缆然后用mlx.distributed_config可视化验证连接mlx.distributed_config --verbose \ --hosts m3-ultra-1,m3-ultra-2,m3-ultra-3,m3-ultra-4 \ --over thunderbolt --dot | dot -Tpng | open -f -a Preview确认拓扑无误后自动配置节点并把 hostfile 保存为m3-ultra-jaccl.jsonmlx.distributed_config --verbose \ --hosts m3-ultra-1,m3-ultra-2,m3-ultra-3,m3-ultra-4 \ --over thunderbolt --backend jaccl \ --auto-setup --output m3-ultra-jaccl.json之后即可运行分布式脚本例如用 MLX LM 对超大模型做分布式推理mlx.launch --verbose --backend jaccl --hostfile m3-ultra-jaccl.json -- \ /path/to/remote/python -m mlx_lm chat --model mlx-community/DeepSeek-R1-0528-4bit关于MLX_METAL_FAST_SYNCH通过--env MLX_METAL_FAST_SYNCH1设置该环境变量可启用一种不同的、更快的 GPU 与 CPU 同步方式。它并非 JACCL 专用任何需要 CPU 与 GPU 协作计算的场景都适用对低延迟通信尤为重要因为 RDMA 通信由 CPU 执行。但该机制不可靠可能导致死锁并使 GPU 卡死因此默认关闭最好保持不设置。自定义 side channel侧信道JACCL 初始化时会在各 rank 之间通过一条侧信道side channel交换 RDMA 连接元数据。默认是一条简单的 TCP 星型 all-gather你可以通过mlx.core.distributed.init的all_gather_factory参数提供自定义的侧信道 all-gather仅backendjaccl时可用。该 factory 会以(rank, size)为参数在每个 rank 上调用一次必须返回一个签名为f(src: bytes, n_bytes: int) - bytes的可调用对象。返回的 bytes 长度必须为size * n_bytes内容是按 rank 顺序拼接的所有 rank 的输入。def make_side_channel(rank, size): def all_gather(src: bytes, n_bytes: int) - bytes: # 与所有 rank 交换 src并返回 size * n_bytes 字节 ... return all_gather world mx.distributed.init( backendjaccl, all_gather_factorymake_side_channel, )C 侧对应 mlx/distributed/distributed.cpp 的init(bool strict, const std::string bk, AllGatherFactory factory)重载非jaccl后端传入 factory 会抛出invalid_argument且后端已初始化时 factory 会被忽略返回缓存的 Group。NCCL 后端CUDA 环境的首选MLX 的 CUDA 版本内置了与 NCCL 通信的能力。NCCL 是高性能集体通信库支持多 GPU 与多节点。在 CUDA 环境中NCCL 是mlx.launch的默认后端运行分布式任务只需mlx.launch -n 8 test.py # 适合交互式脚本 mlx.launch -n 8 python -m mlx_lm chat --model my-model也可以用mlx.launch以同样方式 ssh 到远程节点启动mlx.launch --hosts my-cuda-node -n 8 test.py实现上mlx/distributed/nccl/nccl.cpp 通过 NCCL 的 C API 封装了通信原语并把 MLX 的 dtype 映射为 NCCL 类型int8_t→ncclChar、float16_t→ncclHalf、bfloat16_t→ncclBfloat16等超时可通过MLX_NCCL_TIMEOUT环境变量调整默认 300000 毫秒。launch_nccl在--verbose时会自动追加NCCL_DEBUGINFO。很多场景下你可能不想用mlx.launch而是由集群调度器直接拉起进程此时需要手动设置 NCCL 后端初始化所需的环境变量见下文「不使用 mlx.launch」。从 Mac 发起、在 Linux CUDA 节点执行mlx.launch的 NCCL 后端默认针对 CUDA 环境当从 Mac 启动、目标是带 CUDA 的 Linux 机器时应显式指定--backend nccl。--repeat-hosts, -n用于多节点多 GPU 作业例如mlx.launch --backend nccl --hosts linux-1,linux-2 -n 8 -- ./my-job.sh会尝试启动 16 个进程每个节点 8 个全部运行my-job.sh。launch_nccl会为每个进程设置NCCL_HOST_IP、NCCL_PORT--nccl-port默认 12345、MLX_WORLD_SIZE并按rank % repeat_hosts为进程分配CUDA_VISIBLE_DEVICES。MPI 后端成熟生态与mpirun集成只要机器上安装了 MPIMLX 就具备“讲 MPI 语言”的能力。可以用mpirun启动但下文示例使用mlx.launch --backend mpi它会代为处理一些麻烦事例如为mpirun可执行文件和libmpi.dyld共享库设置绝对路径。最简单的用法沿用本文开头的求和示例$ mlx.launch --backend mpi -n 2 test.py 1 array([2, 2, 2, ..., 2, 2, 2], dtypefloat32) 0 array([2, 2, 2, ..., 2, 2, 2], dtypefloat32)上述命令在本机启动两个进程可以看到两个进程的 stdout进程把全 1 数组发给对方并求和后打印。用mlx.launch -n 4 ...则会打印 4。launch_mpi的实现见 launch.py会用which mpirun找到可执行文件通过otool/ldd探测libmpi的真实库名兼容 Homebrew 与 pip 安装自动注入DYLD_LIBRARY_PATH与MLX_MPI_LIBNAME并生成临时 hostfilehostname slotsN格式后以--output :raw模式调用mpirun保证输出不被行缓冲。安装 MPIMPI 可以通过 Homebrew、pip、Anaconda 包管理器安装或从源码编译。官方测试大多使用 Anaconda 安装的openmpi$ conda install conda-forge::openmpi用 Homebrew 或 pip 安装时需要指定libmpi.dyld的位置以便 MLX 在运行时加载只需通过DYLD_LIBRARY_PATH环境变量传给mpirun即可mlx.launch会自动完成。某些环境使用非标准库文件名可通过MPI_LIBNAME环境变量指定mlx.launch同样自动处理$ mpirun -np 2 -x DYLD_LIBRARY_PATH/opt/homebrew/lib/ -x MPI_LIBNAMElibmpi.40.dylib python test.py $ # 或简写为 $ mlx.launch -n 2 test.py配置远程主机MPI 可以自动连接远程主机并建立网络通信前提是远程主机可通过 ssh 访问。排查连通性问题的检查清单从所有机器到所有机器执行ssh hostname都不要求密码或 host 确认所有机器上都能找到mpirun确保 MPI 使用的hostname与所有机器~/.ssh/config中配置的一致。调优 MPI All Reduce提示需要更快的 all reduce 时可考虑使用 RING 后端无论是 Thunderbolt 连接还是以太网。通过--mca btl_tcp_links N配置每对主机间使用 N 条 TCP 连接以提升带宽通过--mca btl_tcp_if_include iface强制 MPI 使用性能最优的网络接口iface换成目标接口名。在mlx.launch中可通过--mpi-arg透传这些参数给mpirun例如mlx.launch --backend mpi --mpi-arg --mca btl_tcp_if_include en0 --hostfile hosts.json my_script.py使用 MPI 后端时注意三点launch.py的launch_mpi逻辑hostfile 中的 IP 会被忽略ssh 连通性要求更强每个节点必须能连到其他所有节点mpirun必须在每个节点上位于相同路径。不使用mlx.launch手动设置环境变量没有任何一个分布式后端要求必须用mlx.launch启动。mlx.launch本质上只是连接到各主机、按 rank 启动进程、设置必要的环境变量然后委托给你的 MLX 脚本。很多场景下手动设置环境变量反而是最简单的方式——典型的例子是使用集群调度器调度器在任务排定时主机尚未确定由它来拉起所有进程。下面列出每个后端所需的环境变量。RING 后端MLX_RANK单个 0 起始的整数定义本进程的 rank。MLX_HOSTFILEJSON 文件路径内容为每个 rank 要监听的 IP 与端口列表例如[ [123.123.1.1:5000, 123.123.1.2:5000], [123.123.2.1:5000, 123.123.2.2:5000], [123.123.3.1:5000, 123.123.3.2:5000], [123.123.4.1:5000, 123.123.4.2:5000] ]MLX_RING_VERBOSE可选设为 1 时启用更多分布式后端日志。JACCL 后端MLX_RANK单个 0 起始的整数定义本进程的 rank。MLX_JACCL_COORDINATORrank 0 监听的 IP 与端口其他 rank 连接它以建立 RDMA 连接。MLX_IBV_DEVICESJSON 文件路径内容为连接每对节点的 ibverbs 设备名矩阵例如[ [null, rdma_en5, rdma_en4, rdma_en3], [rdma_en5, null, rdma_en3, rdma_en4], [rdma_en4, rdma_en3, null, rdma_en5], [rdma_en3, rdma_en4, rdma_en5, null] ]NCCL 后端MLX_RANK单个 0 起始的整数定义本进程的 rank。MLX_WORLD_SIZE将要启动的进程总数。NCCL_HOST_IP、NCCL_PORT所有主机都能访问、用于建立 NCCL 通信的 IP 与端口。CUDA_VISIBLE_DEVICES本进程对应的本地 GPU 索引。当然NCCL 使用的其他任何环境变量也都可以照常设置。Tips and Tricks分布式实践建议以下技巧有助于更好利用 MLX 的分布式通信能力。先在本地小规模测试。用mlx.launch -n2 -- my_script.py在单节点上先跑通小规模测试。批量合并通信。如数据并行训练示例所述大量小通信会拖累性能。参考mlx.nn.average_gradients的做法把许多小通信合并成一次大通信该函数python/mlx/nn/utils.py默认把梯度按all_reduce_size32MiB分组——先提取所有梯度的形状、大小、dtype将 dtype 一致的梯度连续拼接后一次 all reduce再按形状切分还原dtype 混杂时会退化为逐张量 all reduceall_reduce_size0禁用分组。单进程组size()1时直接原样返回梯度不做任何通信。可视化连接。用mlx.distributed_config --hosts h1,h2,h3 --over thunderbolt --dot导出节点连接图GraphViz DOT 格式确保线缆连接正确tb_connectivity_to_dot会输出带接口标签的图例如en2/en2。善用调试器。mlx.launch专为交互式使用设计它把 stdin 广播给所有进程、汇总所有进程的 stdout这让pdb调试变得非常轻松。参考路径速查分布式使用指南本文主体docs/src/usage/distributed.rst启动工具专项文档docs/src/usage/launching_distributed.rst环境变量说明docs/src/usage/environment_variables.rst启动器实现python/mlx/_distributed_utils/launch.py配置工具实现python/mlx/_distributed_utils/config.pyhostfile 解析python/mlx/_distributed_utils/common.py核心分布式实现mlx/distributed/distributed.cpp、mlx/distributed/ops.hRING 实现mlx/distributed/ring/ring.cppNCCL 实现mlx/distributed/nccl/nccl.cpp数据并行示例docs/src/examples/data_parallelism.rst张量并行示例docs/src/examples/tensor_parallelism.rst梯度平均工具python/mlx/nn/utils.py /DSMLparameter /DSMLinvoke /DSMLtool_calls【免费下载链接】mlxMLX: An array framework for Apple silicon项目地址: https://gitcode.com/GitHub_Trending/ml/mlx创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价