DeepSeek 开源昇腾基础组件:从 TileLang 到自主可控的软件栈

2026-09-30 17 预计阅读时间: 1 分钟
来源: oschina.net AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:11 分钟

DeepSeek 正式开源面向华为昇腾算力平台的基础设施组件,覆盖 TileLang 高级语言编译工具、计算库和分布式通信库。更值得关注的是,这些组件与此前面向英伟达平台的开源组件形成对应关系,目标不是提供一个孤立的适配层,而是把开发、计算和多卡通信连接成一套相对完整的软件栈。

其中,昇腾版本 TileLang 是这次开源内容里最重要的一部分。它代表了一种清晰的工程思路:如果要构建自主可控的 GPU 软件生态,硬件之外还需要一套通用、易编程、可优化并且能够支撑分布式训练的开发基础。

为什么 TileLang 是核心

深度学习算子通常同时受到几个因素约束:计算表达方式、内存访问、线程或核执行模型,以及不同硬件上的编译优化。直接为每一种硬件手写底层 kernel,性能可能很高,但开发和维护成本也会快速上升。

高级 DSL 的价值在于把算子描述和硬件映射拆开。开发者可以用相对统一的方式表达矩阵乘、归约、布局变换等计算,再由编译器针对目标平台生成更合适的实现。这样做并不意味着硬件差异消失了,而是把差异集中到编译器、后端和计算库中。

昇腾版本 TileLang 的意义,正是让这套编程模型能够覆盖昇腾平台。对于算子开发者而言,重要的不只是“代码能运行”,还包括以下几个问题:

  • 算子描述是否足够接近常见的 GPU 编程模型;
  • 编译器能否把高级表达转换为昇腾可执行的实现;
  • 关键计算是否能复用经过优化的计算库;
  • 单卡算子与多卡通信之间是否存在一致的工程接口。

这些问题共同决定了一个硬件平台的软件生态能否从“支持某个模型”发展到“持续支持更多模型”。

三类组件对应三个层次

这次开源内容可以按照软件栈分成三层。

1. TileLang:面向算子开发的编译工具

TileLang 处在开发者和底层硬件之间。它试图提供更高级的计算表达方式,让开发者不必从每一条底层指令开始构造完整算子,同时保留对数据分块、布局和计算过程的控制能力。

对大模型而言,矩阵乘、注意力、归一化、激活和量化相关算子往往需要反复调优。一个通用的编程与编译入口,可以降低这些算子迁移到新平台时的重复工作。

2. 计算库:承接高频基础算子

并非所有算子都应该由业务团队现场编写。矩阵乘、归一化、集合操作等高频路径通常应该沉淀到计算库中,由库负责性能优化、版本适配和边界条件处理。

因此,TileLang 和计算库并不是替代关系。前者适合表达和生成新的计算逻辑,后者适合承载已经验证过、被大量模型重复使用的基础能力。

3. 分布式通信库:把单卡能力扩展到集群

大模型训练很少停留在单卡场景。数据并行、张量并行和流水线并行都需要稳定的集合通信能力,例如 AllReduce、AllGather 和 ReduceScatter。

通信库的作用不只是提供 API,还要处理拓扑、同步、带宽利用率以及不同并行策略下的执行效率。没有通信层,单卡算子再快,也难以转化为大规模训练效率。

一个可落地的工程组织方式

下面的配置是一个可以改造成项目模板的示例。它不是 DeepSeek 官方配置格式,而是用于说明如何把后端、算子实现、计算库和通信库纳入同一个实验入口。运行前需要把命令替换成所在环境中实际安装的昇腾编译和运行命令。

# experiment.yaml
backend: ascend

tilelang:
  source: kernels/matmul.tl
  compile_command: "<replace-with-local-tilelang-ascend-command>"
  flags:
    - "--dtype=bf16"
    - "--target=ascend"

libraries:
  compute: "<replace-with-local-ascend-compute-library>"
  communication: "<replace-with-local-ascend-communication-library>"

runtime:
  devices: 8
  collective: all_reduce
  warmup: 20
  iterations: 100

可以用一个简单的 Python 脚本先验证实验配置,避免把设备数量、后端和通信操作散落在多个启动脚本中:

# check_experiment.py
from pathlib import Path
import sys

try:
    import yaml
except ImportError:
    raise SystemExit("Install PyYAML first: python -m pip install pyyaml")

config_path = Path(sys.argv[1] if len(sys.argv) > 1 else "experiment.yaml")
config = yaml.safe_load(config_path.read_text(encoding="utf-8"))

if config.get("backend") != "ascend":
    raise SystemExit("This example expects backend: ascend")

runtime = config.get("runtime", {})
devices = runtime.get("devices", 0)
if not isinstance(devices, int) or devices < 1:
    raise SystemExit("runtime.devices must be a positive integer")

required = ["compute", "communication"]
missing = [name for name in required if not config.get("libraries", {}).get(name)]
if missing:
    raise SystemExit(f"Missing library settings: {', '.join(missing)}")

print(f"backend={config['backend']}")
print(f"devices={devices}")
print(f"collective={runtime.get('collective', 'undefined')}")
print("Configuration looks usable; invoke the local compiler and launcher next.")

运行方式:

python -m pip install pyyaml
python check_experiment.py experiment.yaml

这个例子刻意没有伪造具体的 TileLang 或昇腾命令。不同代码仓库、CANN 版本和运行时环境可能采用不同的编译入口,实际接入时应以对应项目的构建说明为准。工程上更重要的原则是:把后端选择、编译参数、计算库版本、通信策略和设备数量集中管理,并让单卡测试和多卡测试共享同一份配置。

开源之后真正的挑战

开源基础组件只是生态建设的起点,能否形成长期生产力,还取决于几个方面。

第一是工具链稳定性。高级语言需要清晰的语义、可诊断的编译错误和可重复的构建流程。否则,开发者仍然会在底层指令和平台细节中消耗大量时间。

第二是性能可预测性。迁移一个算子时,“能够编译”只是最低要求。还需要知道内存访问是否合理、计算单元是否被充分利用,以及不同输入形状下的性能变化。算子基准测试、性能分析器和回归测试应当成为配套工作的一部分。

第三是版本协同。TileLang、计算库、通信库、驱动和运行时之间存在依赖关系。若缺少明确的兼容矩阵,用户遇到问题时很难判断故障来自代码、编译器还是运行环境。

第四是社区复用。只有当算子模板、调优经验、模型适配案例和问题诊断方法不断沉淀,基础组件才会从“能用的代码”变成“开发者愿意依赖的生态”。

采用时的检查清单

可以从一个小型算子或单个模型模块开始验证,而不是一开始就迁移完整训练系统:

  • 确认目标昇腾设备、驱动、运行时和编译工具版本;
  • 先用计算库覆盖高频基础算子,再评估哪些算子需要 TileLang 自定义实现;
  • 为单卡算子准备正确性测试和固定形状的性能基准;
  • 用小规模多卡任务验证 AllReduce、AllGather 等通信路径;
  • 记录编译参数、库版本、设备数量和输入形状,确保结果可以复现;
  • 将性能回归纳入持续集成,避免升级工具链后出现隐性退化。

DeepSeek 这次开源的价值,不只在于增加了几个昇腾平台组件,更在于展示了一条完整的软件栈路径:用高级编译工具降低算子开发门槛,用计算库承接通用性能,用通信库支撑分布式扩展。自主可控的算力生态最终比拼的,不只是硬件峰值,更是这套软件体系能否让开发者稳定、高效地把模型变成可运行的系统。


相关推荐