关于打包与发布#

创建源码或二进制发行包的过程类似于基于源码来构建和安装的过程。 打包过程包括对前端(如 pipbuild)的调用以及将命令发送给后端 (主包 flag-gems 使用 setuptoolscpp/ C++ 扩展包使用 scikit-build-core)。

1. 使用 build 构建前端#

要使用 build 包(建议)来构建一个 wheel 包,执行以下命令:

pip install -U build
python -m build --no-isolation --no-deps .

这一命令会首先基于源码创建一个源码发行包(sdist),之后构建一个二进制发行包(wheel)。

如果你希望禁用默认的构建过程(源码目录 -> sdist -> wheel),你可以

  • 指定 --sdist 选项从源码构建源码发行包(源码目录 -> sdist),或者
  • 指定 --wheel 选项从源码构建二进制发行包(源码目录 -> wheel),或者
  • 指定 --sdist 的同时指定 --wheel 来基于源码目录构建源码发行包和二进制发行包 (源码目录 -> sdist,源码目录 -> wheel)。

构建的输出会存放在 .dist/ 目录下:

2. 使用 pip 构建前端#

另一种方式是使用 pip 来生成 wheel 包:

pip wheel --no-build-isolation --no-deps -w dist .

用来配置 setuptools 的环境变量的工作方式与安装说明文档中的方式一致。

构建二进制包(wheel)的动作完成之后,你可以使用 pip 命令来安装。

cd FlagGems
python -m build --no-isolation --wheel .

3. 构建 C++ 扩展 wheel#

C++ 封装算子以按硬件厂商区分的原生扩展 wheel 的形式进行打包, 构建入口为 cpp/ 子目录。每个厂商对应一个独立的包 (flag-gems-cpp-cudaflag-gems-cpp-musa 等), 这些包将其 .so 文件安装到 flag_gems/ 命名空间中。

构建之前,先向 cpp/pyproject.toml 注入厂商标识:

tools/set_cpp_vendor.sh cuda    # 或 musa、npu、gcu、ix

然后从 cpp/ 子目录进行构建。构建需要对应厂商的 SDK 和工具链 (CMake、C++ 编译器以及该后端的 PyTorch):

cd cpp/
CMAKE_ARGS="-DFLAGGEMS_BACKEND=CUDA" python -m build --no-isolation --wheel .

该命令会在 cpp/dist/ 目录下生成平台相关的 wheel 包 (例如 flag_gems_cpp_cuda-x.y.z-cp312-cp312-linux_x86_64.whl)。

用于配置 scikit-build-core 的环境变量(参见 安装说明) 在从 cpp/ 构建时适用。