新闻详情

新闻详情

首页 / 资讯中心 / 详情

ColossalAI Accelerator 加速器抽象层:一套 `auto_set_accelerator()` API 跨 NVIDIA GPU / 华为 NPU / CPU 运行分布式训练

发布时间:2026/9/10 2:38:07来源:尧图网络
ColossalAI Accelerator 加速器抽象层:一套 `auto_set_accelerator()` API 跨 NVIDIA GPU / 华为 NPU / CPU 运行分布式训练
ColossalAI Accelerator 加速器抽象层一套auto_set_accelerator()API 跨 NVIDIA GPU / 华为 NPU / CPU 运行分布式训练【免费下载链接】ColossalAIMaking large AI models cheaper, faster and more accessible项目地址: https://gitcode.com/GitHub_Trending/co/ColossalAI本篇技术指南以 ColossalAI 的accelerator模块 为主体深入讲解其作为硬件加速器抽象层Accelerator Abstraction Layer的设计动机、源码结构与三大内置后端实现。读完本文将掌握auto_set_accelerator()/set_accelerator()/get_accelerator()三件套 API 的用法与探测优先级理解BaseAccelerator如何按 PyTorch 原生语义统合设备管理、随机数、显存、流/事件与混合精度接口并能在自己需要移植大模型到不同硬件平台时快速接入这一抽象层。一、为什么 ColossalAI 需要一层加速器抽象当前 AI 硬件生态高度碎片化既有 NVIDIA GPUCUDA也有华为昇腾 NPUCANN/torch_npu还有纯 CPU 调试环境。若代码中到处硬编码torch.cuda.*一旦要迁移到昇腾等平台就得大面积修改训练与推理代码维护成本极高。ColossalAI 的做法是在colossalai/accelerator/目录下提供一层统一的抽象用户代码只面向抽象接口书写底层实际调用哪个后端的实现由模块在运行时决定。正如模块 README 所描述其核心目标是以极简单的auto_set_accelerator()API 让用户代码在不同硬件平台间可移植可在 NVIDIA GPU、华为 NPU 等后端之间轻松切换。该模块对外导出的全部符号见__init__.py共包含三种内置加速器实现与三个全局管理函数导出的符号类型作用BaseAccelerator抽象基类定义加速器统一接口契约CudaAccelerator具体实现NVIDIA CUDA GPU 后端NpuAccelerator具体实现华为昇腾 NPU 后端CpuAccelerator具体实现CPU 后端调试/无卡环境set_accelerator()全局管理 API显式指定当前进程使用的加速器auto_set_accelerator()全局管理 API按可用性自动探测并设置加速器get_accelerator()全局管理 API获取当前进程的加速器单例二、三个全局 API设置、自动探测与获取核心逻辑集中在colossalai/accelerator/api.py模块内部通过进程级全局变量_ACCELERATOR保存当前加速器实例。2.1 加速器注册表与探测优先级关键代码是使用OrderedDict维护的映射表见 api.py# we use ordered dictionary here to associate the # order with device check priority # i.e. auto_set_accelerator will check cuda first _ACCELERATOR_MAPPING OrderedDict(cudaCudaAccelerator, npuNpuAccelerator, cpuCpuAccelerator)这里的注释揭示了设计要点字典的插入顺序即设备检测优先级。auto_set_accelerator()会先探测 CUDA再探测 NPU最后回落到 CPU从而保证在同时具备多类硬件的机器上优先选择算力更强的后端。2.2auto_set_accelerator()自动探测逻辑auto_set_accelerator()的实现见 api.py逐类实例化并调用后端的is_available()def auto_set_accelerator() - None: global _ACCELERATOR for accelerator_name, accelerator_cls in _ACCELERATOR_MAPPING.items(): try: accelerator accelerator_cls() if accelerator_name cpu or accelerator.is_available(): _ACCELERATOR accelerator break except: pass if _ACCELERATOR is None: raise RuntimeError(No accelerator is available.)两点值得注意CPU 是兜底CpuAccelerator.is_available()恒返回True见 cpu_accelerator.py因此只要前两类都不满足条件最终一定能选中 CPU保证在无 GPU/NPU 的环境中代码也能跑起来。兜底失败会报错若循环结束后_ACCELERATOR仍为空例如映射表被自定义逻辑改空直接抛出RuntimeError(No accelerator is available.)。2.3set_accelerator()显式指定后端set_accelerator()见 api.py支持两种入参比字符串更安全的是直接传后端实例def set_accelerator(accelerator: Union[str, BaseAccelerator]) - None: global _ACCELERATOR if isinstance(accelerator, str): _ACCELERATOR _ACCELERATOR_MAPPING[accelerator]() elif isinstance(accelerator, BaseAccelerator): _ACCELERATOR accelerator else: raise TypeError(accelerator must be either a string or an instance of BaseAccelerator)传入字符串时以该字符串为 key 从_ACCELERATOR_MAPPING取类并实例化传入BaseAccelerator子类实例时直接采纳便于注入自定义实现其他类型抛出TypeError。2.4get_accelerator()惰性单例获取全仓库范围内业务代码并不需要关心加速器是如何被初始化的统一通过get_accelerator()拿到实例见 api.py。若此前未初始化它会自动调用auto_set_accelerator()完成探测def get_accelerator() - BaseAccelerator: global _ACCELERATOR if _ACCELERATOR is None: auto_set_accelerator() return _ACCELERATOR三、BaseAccelerator按 PyTorch 原生语义划分的五类抽象接口BaseAccelerator是全部后端的抽象基类base_accelerator.py继承自abc.ABC通过abstractmethod强制每个后端实现完整接口。它在设计上有意让API 命名与 PyTorch 原生 API 对齐例如current_device()、synchronize()、manual_seed()、empty_cache()、Stream()、Event()、autocast()等用户只需把torch.cuda.xxx换成get_accelerator().xxx即可完成适配。3.1 不可变属性后端的身份证基类构造时接收三个参数并对外暴露为只读属性见 base_accelerator.py同时实现了__repr__便于调试输出属性含义各后端取值name加速器名称cuda/npu/cpucommunication_backend对应的分布式通信库nccl/hccl/gloois_synchronous是否为同步设备三者当前均为False另外基类定义了类属性support_set_device: bool True用于标示该设备是否支持进程绑定设备操作CPU 后端会将其覆写为False见 cpu_accelerator.py。3.2 五类抽象接口基类把加速器能力抽象为五组接口每一组都能在 PyTorch 原生 API 中找到一一对应1) 设备管理 APIDevice APIsget_version()、get_current_device()、current_device()、set_device()、get_device_name()、synchronize()、is_available()、device_count()、get_device_capability()、get_device_properties()、utilization()外加一个非抽象工具方法set_to_device()见 base_accelerator.py它支持把单个模型或模型列表统一搬到当前设备def set_to_device(self, models: Any) - Any: if isinstance(models, list) and len(models) 1: ret [] for model in models: ret.append(model.to(self.get_current_device())) return ret elif isinstance(models, list): return models[0].to(self.get_current_device()) else: return models.to(self.get_current_device())2) 随机数发生器 APIRandom Number Generator APIsget_rng_state()/get_rng_state_all()、set_rng_state()/set_rng_state_all()、manual_seed()/manual_seed_all()、seed()/seed_all()、initial_seed()。这些接口保证了跨后端做分布式训练时随机性可复现、各进程随机状态可同步。3) 内存管理 APIMemory Management APIsempty_cache()、memory_stats()、memory_summary()、memory_snapshot()、memory_allocated()、max_memory_allocated()、reset_max_memory_allocated()、memory_reserved()、max_memory_reserved()、set_per_process_memory_fraction()、reset_peak_memory_stats()。这些是 Gemini、低比特 Zero 等显存优化策略做内存监控的数据来源。4) 流与事件 APIStreams and Events APIsStream()、Event()、current_stream()、default_stream()、set_stream()、stream()用于内核并行调度与异步执行。5) 混合精度 APIAMP APIsautocast(enabledTrue, dtypetorch.float16, cache_enabledTrue)见 base_accelerator.py返回当前设备上的自动混精度上下文管理器。四、三大内置后端实现对比4.1CudaAcceleratorNVIDIA GPU 后端cuda_accelerator.py的构造参数为namecuda、communication_backendnccl、is_synchronousFalse第 19 行。所有方法都是对torch.cuda.*的直接转发get_version()返回torch.version.cuda即当前 PyTorch 编译所基于的 CUDA 版本get_current_device()返回torch.device(fcuda:{torch.cuda.current_device()})autocast()最终落到torch.amp.autocast(device_typecuda, ...)set_device()在未传入具体设备时有一个分布式约定若dist已初始化则用dist.get_rank() % self.device_count()推导本进程应绑定的卡号见 cuda_accelerator.py该逻辑与 NPU 后端完全一致。4.2NpuAccelerator华为昇腾 NPU 后端npu_accelerator.py的构造参数为namenpu、communication_backendhccl。它在上层做了可选依赖保护——文件开头try: import torch_npu except ImportError: pass第 10-13 行即只有安装torch_npu的环境中相关 API 才会真正可用。NPU 后端的实现几乎与 CUDA 后端一一镜像只是把命名空间换成torch.npu.*并新增两类差异设备字符串为npu:{index}版本号取自torch.version.cannCANN 版本autocast()对应昇腾实现torch.npu.amp.autocast(enabled..., dtype..., cache_enabled...)。注意NpuAccelerator一旦被实例化即可能触发对torch_npu的访问因此该后端应与torch_npu环境配套使用。4.3CpuAcceleratorCPU 兜底后端cpu_accelerator.py与前两者风格不同它把support_set_device覆写为False并且对设备强相关的操作统一抛出RuntimeError如current_device()、set_device()、synchronize()、device_count()、各类显存统计与 Stream/Event。可以推断CPU 后端主要用于无卡环境下的代码调试与纯数据流水线测试而不是模拟真正的设备行为。它真正实现的能力包括is_available()恒为True兜底语义RNG 部分退化为torch.get_rng_state()/torch.set_rng_state()的 CPU 语义内存统计被映射为主机内存memory_reserved()返回psutil.Process().memory_info().rssmax_memory_reserved()返回resource.getrusage(...).ru_maxrssset_per_process_memory_fraction()通过resource.setrlimit(resource.RLIMIT_AS, ...)限制进程地址空间见 cpu_accelerator.pyautocast()返回nullcontext空上下文管理器即 CPU 上不做任何自动精度转换。下表汇总三个内置后端的核心差异维度CudaAcceleratorNpuAcceleratorCpuAcceleratornamecudanpucpu通信后端ncclhcclgloo底层命名空间torch.cudatorch.npu需torch_npu主机资源psutil/resourceis_available()torch.cuda.is_available()torch.npu.is_available()恒Trueset_device()支持可据 rank 推导支持可据 rank 推导抛RuntimeErrorautocast()torch.amp.autocast(cuda, ...)torch.npu.amp.autocast(...)nullcontextsupport_set_deviceTrueTrueFalse五、抽象层在 ColossalAI 各模块中的落地证据这套抽象并非纸面设计而是贯穿于 ColossalAI 训练、零冗余优化、混合精度与推理等核心链路。仓库内大量模块统一通过from colossalai.accelerator import get_accelerator获取设备能力例如Gemini/Chunk 显存管理在 chunk.py 中Chunk 的device_type属性通过get_accelerator().name上报当前设备类型供显存统计与调度策略判断张量驻留位置。低比特 Zero在 low_level_optim.py 中直接断言get_accelerator().name in [cuda, npu]从源码结构看该模块的算子实现目前仅覆盖 CUDA 与 NPU 两类后端。Booster 插件gemini_plugin.py 会在get_accelerator().name npu时走昇腾专属的初始化分支而 Chunk 的chunk_init_device默认值直接取自get_accelerator().get_current_device()。类似模式同样出现在 hybrid_parallel_plugin.py 中。AMP 梯度缩放naive AMP 的梯度缩放器 base_grad_scaler.py 与 dynamic_grad_scaler.py 均依赖加速器抽象完成设备同步。Kernel 适配与 JITkernel/jit/option.py 在选项探测阶段通过get_accelerator().get_current_device()把输入张量放到正确设备上做基准测试这印证了 README 中kernel 模块会自动匹配加速器与其对应内核实现的模块解耦思路。可以看到同一份高层代码如 Gemini、梯度缩放在换用不同set_accelerator后就可在不同硬件上获得对应语义这正是抽象层价值的直接体现。六、与 DeepSpeed accelerator 的关系及两处本地化改进README 明确说明本模块的接口设计深受 DeepSpeed accelerator 启发并致谢 DeepSpeed 团队ColossalAI 的实现在此基础上从零编写并做了两点针对性改造API 命名与 PyTorch 原生 API 对齐相比 DeepSpeed 自有的抽象命名ColossalAI 的接口set_device、synchronize、manual_seed、Stream、Event、autocast等让熟悉 PyTorch 的开发者几乎零成本迁移也降低了各后端实现之间的心智负担。不在 accelerator 中内嵌 op builderDeepSpeed 将算子构建器一并收敛进 acceleratorColossalAI 则将其从 accelerator 中剥离独立维护kernel模块colossalai/kernel由内核模块按当前加速器自动选择对应的 CUDA/Triton 扩展实现使各模块职责更清晰、耦合更低。七、如何在代码中使用这套抽象7.1 最小使用范式在训练脚本入口处通常在initialize前后让 ColossalAI 自动完成后端选择from colossalai.accelerator import auto_set_accelerator, get_accelerator auto_set_accelerator() # 自动探测cuda - npu - cpu acc get_accelerator() # 之后全代码共享同一个加速器实例 print(acc) # 例如 CudaAccelerator(namecuda, communication_backendnccl, is_synchronousFalse) print(acc.name) # cuda / npu / cpu7.2 与既有分布式初始化的配合ColossalAI 的分布式启动通常经由colossalai.launch/colossalai.initialize完成其中会按上述探测流程设置好全局加速器。若需手动指定可显式调用set_accelerator(cuda)或set_accelerator(npu)在分布式已初始化且未指定具体设备时CUDA/NPU 后端的set_device()会按local_rank dist.get_rank() % device_count自动绑定设备。7.3 典型迁移写法对比PyTorch 硬编码写法跨平台写法推荐torch.cuda.set_device(rank)get_accelerator().set_device(rank)torch.device(cuda)get_accelerator().get_current_device()torch.cuda.is_available()get_accelerator().is_available()torch.cuda.manual_seed_all(seed)get_accelerator().manual_seed_all(seed)torch.cuda.empty_cache()get_accelerator().empty_cache()torch.cuda.amp.autocast()get_accelerator().autocast()八、如何为新的硬件后端做扩展从源码结构可以推断要接入一个新后端例如 XPU、TPU 或自研加速器只需完成四步继承抽象基类新建xxx_accelerator.py实现BaseAccelerator中全部abstractmethod方法覆盖设备、RNG、内存、流/事件、AMP 五组接口对不适用的能力直接抛RuntimeError可参考CpuAccelerator的写法。补齐可选依赖仿照NpuAccelerator对torch_npu的处理用try: import xxx except ImportError: pass声明新硬件的 Python 绑定。注册到映射表将新类按探测优先级从高到低插入 api.py 的_ACCELERATOR_MAPPING使auto_set_accelerator()与字符串形式的set_accelerator()均可识别。在对外__init__.py中导出参照init.py 补全__all__。九、使用与扩展时的注意事项CPU 后端的语义限定CpuAccelerator并非模拟 GPU其set_device、Stream、Event、显存分配统计等一律抛RuntimeError。若希望跑通真正的前向/反向训练仍应依赖 CUDA/NPU 后端或纯 PyTorch CPU 逻辑。NPU 后端依赖昇腾软件栈使用前需确认环境已安装torch_npu且 CANN 版本与 PyTorch 匹配否则导入相关路径会在调用时失败。分布式后端与硬件要对应name与communication_backendnccl/hccl/gloo是绑定的在异构集群中启动分布式训练时应保证进程组后端与所选加速器匹配例如 NPU 场景使用 HCCL 而非 NCCL。第三方后端需先自测接入新加速器时建议先用get_accelerator()的__repr__输出与is_available()做冒烟验证再接入 Gemini、Low-Level Zero 等对设备类型有显式断言如assert name in [cuda, npu]的模块。总而言之ColossalAI 的accelerator模块把设备能力收敛为一份与 PyTorch 对齐的统一契约让上层大规模训练、优化与推理代码可以做到硬件无关是理解 ColossalAI 多硬件兼容性设计的核心入口。【免费下载链接】ColossalAIMaking large AI models cheaper, faster and more accessible项目地址: https://gitcode.com/GitHub_Trending/co/ColossalAI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

洛阳钼业7年矿山无人化演进:最稳的矿区自动驾驶落地路径 2026/9/10 3:14:12

洛阳钼业7年矿山无人化演进:最稳的矿区自动驾驶落地路径

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
如何用 RxJava 的 ParallelFlowable 做并行数据处理?parallel、runOn 与 sequential 用法及适用边界 2026/9/10 3:14:12

如何用 RxJava 的 ParallelFlowable 做并行数据处理?parallel、runOn 与 sequential 用法及适用边界

如何用 RxJava 的 ParallelFlowable 做并行数据处理?parallel、runOn 与 sequential 用法及适用边界 【免费下载链接】RxJava RxJava – Reactive Extensions for the JVM – a library for composing asynchronous and event-based programs using observable sequ…

阅读更多 →
Starship Nerd Font Symbols 预设:为每个模块换上 Nerd Font 图标 2026/9/10 3:14:12

Starship Nerd Font Symbols 预设:为每个模块换上 Nerd Font 图标

Starship Nerd Font Symbols 预设:为每个模块换上 Nerd Font 图标 【免费下载链接】starship ☄🌌️ The minimal, blazing-fast, and infinitely customizable prompt for any shell! 项目地址: https://gitcode.com/GitHub_Trending/st/starship …

阅读更多 →
Hugging Face被英伟达收购:开源AI基础设施的中心化转折点 2026/9/10 3:14:12

Hugging Face被英伟达收购:开源AI基础设施的中心化转折点

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
思源笔记 v2.10.16 版本深度解析:闪卡进度重置、同步完整性校验与桌面端独立显卡优化 2026/9/10 3:14:12

思源笔记 v2.10.16 版本深度解析:闪卡进度重置、同步完整性校验与桌面端独立显卡优化

思源笔记 v2.10.16 版本深度解析:闪卡进度重置、同步完整性校验与桌面端独立显卡优化 【免费下载链接】siyuan An open-source, privacy-first, self-hosted knowledge workspace where humans and AI agents work together 开源、隐私优先、自托管的知识工作空间&a…

阅读更多 →
基于证据的每日工作报告:用 OpenViking `ov compile` 与 daily-report Skill 重建“当天究竟发生了什么“ 2026/9/10 3:11:12

基于证据的每日工作报告:用 OpenViking `ov compile` 与 daily-report Skill 重建“当天究竟发生了什么“

基于证据的每日工作报告:用 OpenViking ov compile 与 daily-report Skill 重建"当天究竟发生了什么" 【免费下载链接】OpenViking Self-evolving Context Database for AI Agents. Unify Agent Memory, Knowledge RAG and Skills. 项目地址: https://g…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞